{"version":3,"sources":["utils.js"],"names":["initDESKPaper","paper","fillColor","width","height","yPos","scrollTop","percent","deskOffset","deskOffsetStart","path","canvas","document","getElementById","setup","Path","pathHeight","view","size","pushDown","window","pageYOffset","documentElement","getBoundingClientRect","top","segments","add","bounds","bottomLeft","i","point","Point","bottomRight","onscroll","map","repaintOnce","onFrame","event","sinSeed","count","sinHeight","Math","sin","y","smooth","type","onResize","Number","prototype","in_min","in_max","out_min","out_max","this","initPaper","canvasElement","button","mouseInside","isRunning","initializePath","onmouseout","onmouseover","$","ready","$searchField","isIndexing","$searchForm","removeClass","IMAGE_SIZES","xxs","xs","s","m","l","xl","STATIC_IMAGE_URL_PREFIX","imageSizeHelper","imagePath","prefixIfPresent","prefix","string","imgBlogUrl","imageName","split","sizeDirectoryName","join","isSafari","ua","navigator","userAgent","toLowerCase","indexOf","disableScroll","body","style","overflow","closeSearch","val","html","clear","addClass","ghostHunter","results","onPageLoad","displaySearchInfo","result_template","before","console","log","search_text","item_preprocessor","item","title","feature_image","ret","featureImageRendered","indexing_start","prop","indexing_end","callback","ms","timer","focus","keyup","e","trigger","context","args","arguments","clearTimeout","setTimeout","apply","onComplete","length","click","scrollTo","value","on","keyCode","hasClass","offset","screenWidth","innerWidth","wrapperWidth","computedLeft","css","blogArticle","nav","querySelector","navToggle","lastScrollY","scrollY","ticking","update","myOffset","triggerOffset","offsetHeight","classList","remove","addEventListener","requestAnimationFrame","requestTick","passive","slides","querySelectorAll","currentSlide","setInterval","moveToNext","className","baseHeader","headerGradient","fadeContent","contentHolder","componentToHex","c","hex","parseInt","toString","rgbToHex","r","g","b","getContrastYIQ","hexcolor","replace","substr","dynamicHeaderColors","contains","display","fadeColor","getComputedStyle","getPropertyValue","rgb","substring","background","threshold","toggle","bottomOfContent","offsetTop","banners","getRandomInt","min","max","ceil","floor","random","num"],"mappings":"AAAA,aAEA,SAASA,cAAcC,EAAOC,GAC1B,IAAIC,EAAOC,EAAQC,EAAMC,EAAWC,EAASC,EAAYC,EAA4BC,EAEjFC,EAASC,SAASC,eAAe,mBAErCZ,EAAMa,MAAMH,IAEZD,EAAO,IAAIT,EAAMc,MACZb,UAAYA,GAAa,aAE9B,IAAIc,EAAaf,EAAMgB,KAAKC,KAAKd,OAAS,EAItCe,EAAW,IAEflB,EAAMgB,KAAKH,MAAQ,WACfR,EAAYc,OAAOC,aAAeT,SAASU,gBAAgBhB,UAC3DE,EAAaG,EAAOY,wBAAwBC,IAC5CrB,EAAQF,EAAMgB,KAAKC,KAAKf,MACxBC,EAASH,EAAMgB,KAAKC,KAAKd,OAAS,EAClCM,EAAKe,SAAW,GAChBf,EAAKgB,IAAIzB,EAAMgB,KAAKU,OAAOC,YAE3B,IAAK,IAAIC,EAAI,EAAGA,EAtBP,GAsBmBA,IAAK,CAC7B,IAAIC,EAAQ,IAAI7B,EAAM8B,MAAM5B,EAvBvB,GAuBwC0B,EAAGb,EAAaG,GAC7DT,EAAKgB,IAAII,GAEbpB,EAAKgB,IAAIzB,EAAMgB,KAAKU,OAAOK,cAG/B/B,EAAMgB,KAAKH,QAEXM,OAAOa,SAAW,WACd3B,EAAYc,OAAOC,aAAeT,SAASU,gBAAgBhB,UAC3DE,EAAaI,SAASC,eAAe,mBAAmBU,wBAAwBC,IAChFf,EAAkBH,EAAYE,EAC9BW,EAAW,IAAMX,EAAW0B,IAAI,EAAGzB,EAAiB,EAAG,GACvDF,EAAUD,EAAU4B,IAAI,EAAqB,IAAlBzB,EAAwB,EAAG,IAG1D,IAAI0B,GAAc,EAElBlC,EAAMgB,KAAKmB,QAAU,SAAUC,GAC3B,GAAI9B,GAAW,EAAG,CACd4B,GAAc,EAEd,IAAK,IAAIN,EAAI,EAAGA,EA7CX,GA6CuBA,IAAK,CAC7B,IAAIS,EAAUD,EAAME,MAnChB,GAmCyBV,EAAIA,EAAI,IACjCW,EAAYC,KAAKC,IAAIJ,EArCzB,IAqC4CtB,EAC5CX,EAAOmC,EAAYrB,EACnBT,EAAKe,SAASI,GAAGC,MAAMa,EAAItC,EAAOD,EAASe,EAE/CT,EAAKkC,OAAO,CAAEC,KAAM,oBACjB,IAAKV,EAAa,CACrB,IAASN,EAAI,EAAGA,EArDX,GAqDuBA,IAAK,CACzBS,EAAUD,EAAME,MA3ChB,GA2CyBV,EAAIA,EAAI,IACjCW,EAAYC,KAAKC,IAAIJ,EA7CzB,IA6C4CtB,EAC5CX,EAAOmC,EAAYrB,EACnBT,EAAKe,SAASI,GAAGC,MAAMa,EAAItC,EAAOD,EAASe,EAE/CgB,GAAc,IAKtBlC,EAAMgB,KAAK6B,SAAW,SAAUT,GAC5BpC,EAAMgB,KAAKmB,QAAQC,IAGvBU,OAAOC,UAAUd,IAAM,SAAUe,EAAQC,EAAQC,EAASC,GACtD,OAAQC,KAAOJ,IAAWG,EAAUD,IAAYD,EAASD,GAAUE,GAI3E,SAASG,UAAUrD,EAAOsD,EAAeC,EAAQtD,GAG7C,IAAIC,EAAOE,EAFXJ,EAAMa,MAAMyC,GAGZ,IACI7C,EAAO,IAAIT,EAAMc,KAEjB0C,GAAc,EACdC,GAAY,EACZvC,EAAW,IACXH,EAAaf,EAAMgB,KAAKC,KAAKd,OAAS,EAE1CM,EAAKR,UAAYA,EAEjBD,EAAMgB,KAAK0C,eAAiB,WACxBxD,EAAQF,EAAMgB,KAAKC,KAAKf,MACxBO,EAAKe,SAAW,GAChBf,EAAKgB,IAAIzB,EAAMgB,KAAKU,OAAOC,YAE3B,IAAK,IAAIC,EAAI,EAAGA,EAfP,EAemBA,IAAK,CAC7B,IAAIC,EAAQ,IAAI7B,EAAM8B,MAAM5B,EAhBvB,EAgBwC0B,EAAGb,EAAaG,GAC7DT,EAAKgB,IAAII,GAEbpB,EAAKgB,IAAIzB,EAAMgB,KAAKU,OAAOK,cAG/B/B,EAAMgB,KAAK0C,iBAEX1D,EAAMgB,KAAKmB,QAAU,SAAUC,GAC3B,GAAKoB,IAAgBA,EAActC,EAAW,IAAM,CAChD,IAAK,IAAIU,EAAI,EAAGA,EA1BX,EA0BuBA,IAAK,CAC7B,IAAIS,EAAUD,EAAME,MAAuB,GAAdV,EAAIA,EAAI,IACjCW,EAAYC,KAAKC,IAAIJ,EAAU,IAAMtB,EAErCyC,EAActC,EAAW,GACzBuC,GAAY,EACZvC,GAAY,OACJsC,EAActC,EAAW,KACjCuC,GAAY,EACZvC,GAAY,MAEZuC,GAAY,EAGZA,IACArD,EAAOmC,EAAYrB,EACnBT,EAAKe,SAASI,GAAGC,MAAMa,EAAItC,GAGnCK,EAAKkC,OAAO,CAAEC,KAAM,iBAI5BW,EAAOI,WAAa,WAChBH,GAAc,GAElBD,EAAOK,YAAc,WACjBJ,GAAc,GAItBK,EAAElD,UAAUmD,OAAM,WACd,IAGIC,EAHAC,GAAa,EACb3D,EAAY,EACZ4D,EAAcJ,EAAE,0BAIpBA,EAAE,SAASK,YAAY,eAMvB,MAAMC,EAAc,CAChBC,IAAK,CACDlE,MAAO,IAEXmE,GAAI,CACAnE,MAAO,KAEXoE,EAAG,CACCpE,MAAO,KAEXqE,EAAG,CACCrE,MAAO,KAEXsE,EAAG,CACCtE,MAAO,MAEXuE,GAAI,CACAvE,MAAO,MAKTwE,EAA0B,iBAM1BC,EAAkB,CAACC,EAAW3D,KAChC,MAAM4D,EAAkB,CAACC,EAAQC,IAAYA,EAASD,EAASC,EAAS,IAClE7E,MAAEA,EAAKC,OAAEA,GAAWgE,EAAYlD,IAC/B+D,EAAYC,GAAaL,EAAUM,MAAMR,GAE1CS,EAAoBN,EAAgB,IAAK3E,GAAS2E,EAAgB,IAAK1E,GAE7E,MAAO,CAAC6E,EAAYN,EAAyB,SAASS,EAAqBF,GAAWG,KAAK,KA4F/F,SAASC,IACL,IAAIC,EAAKC,UAAUC,UAAUC,cAC7B,OAA6B,GAAzBH,EAAGI,QAAQ,aACPJ,EAAGI,QAAQ,WAAa,GASpC,SAASC,IACLhF,SAASiF,KAAKC,MAAMC,SAAW,SAC/BnF,SAASU,gBAAgBwE,MAAMC,SAAW,SAEtCT,MACAhF,EAAYM,SAASiF,KAAKvF,UAC1BM,SAASiF,KAAKC,MAAM1F,OAAS,QAC7BQ,SAASiF,KAAKvF,UAAYA,GAclC,SAAS0F,IACLlC,EAAE,cAAcmC,IAAI,IACpBnC,EAAE,YAAYoC,KAAK,IACnBlC,EAAamC,QACbrC,EAAE,eAAesC,SAAS,UAC1BtC,EAAE,uCAAuCK,YAAY,WAdrDvD,SAASiF,KAAKC,MAAMC,SAAW,SAC/BnF,SAASU,gBAAgBwE,MAAMC,SAAW,SAEtCT,MACA1E,SAASiF,KAAKC,MAAM1F,OAAS,OAC7BQ,SAASiF,KAAKvF,UAAYA,GA/FlC0D,EAAeF,EAAE,cAAcuC,YAAY,CACvCC,QAAS,WACTC,YAAY,EACZC,mBAAmB,EAGnBC,gBAAiB,8RACjBC,OAAQ,WACJC,QAAQC,IAAI,UACZ,IAAIC,EAAc/C,EAAE,cAAcmC,MAClCjC,EAAamC,QACbrC,EAAE,cAAcmC,IAAIY,IAExBC,kBAAmB,SAAUC,GACzBJ,QAAQC,IAAI,gBACZ,IAtCoBI,EAAOC,EAsCvBC,EAAM,GAGV,OADAA,EAAIC,sBAxCgBH,EAwC0BD,EAAKC,OAxCxBC,EAwC+BF,EAAKE,eApC5D,iLAGWrC,EAAgBqC,EAAe,wCAC/BrC,EAAgBqC,EAAe,uCAC/BrC,EAAgBqC,EAAe,6FAElCrC,EAAgBqC,EAAe,+DAE/BD,wFAXJ,IAuCAE,GAEXE,eAAgB,WACZnD,GAAa,EACbH,EAAE,cAAcuD,KAAK,YAAY,GAEjCV,QAAQC,IAAI,qBAEhBU,aAAc,WA4BlB,IAAwBC,EAAUC,EAC1BC,EA5BA3D,EAAE,cAAcuD,KAAK,YAAY,GACjCvD,EAAE,qBAAqBoC,KAAK,wBAC5BS,QAAQC,IAAI,yBAIR3C,IACAH,EAAE,cAAc4D,QAEhB5D,EAAE,cAAc6D,OAkBJJ,EAlByB,SAAUK,GAC3C9D,EAAE,qBAAqB+D,QAAQ,UAiBbL,EAhBnB,IAiBPC,EAAQ,EACL,WACH,IAAIK,EAAUzE,KAAM0E,EAAOC,UAC3BC,aAAaR,GACbA,EAAQS,YAAW,WACfX,EAASY,MAAML,EAASC,KACzBP,GAAM,MAtBLvD,GAAa,IAGrBmE,WAAY,SAAU9B,GAClBK,QAAQC,IAAI,YACPN,GAAWA,EAAQ+B,QAAU,GAAMvE,EAAE,cAAcmC,MAAMoC,QAC1DvE,EAAE,eAAeK,YAAY,UAC7BL,EAAE,YAAYsC,SAAS,YAEvBtC,EAAE,YAAYK,YAAY,UAC1BL,EAAE,eAAesC,SAAS,cA4DtCtC,EAAE,qBAAqBwE,OAAM,WACzB,GAAIxE,EAAE,UAAUuE,OAAS,EAAG,CACxB,IAAI/H,EAAYM,SAASiF,KAAKvF,UAC9BwD,EAAE,eAAegC,MAAMtE,IAAMlB,EAAY,KACzCwD,EAAE,eAAesC,SAAS,WAC1BR,IACA9B,EAAE,cAAc4D,QAChBtG,OAAOmH,SAAS,EAAG,QAEnBzE,EAAE,eAAesC,SAAS,WAC1BR,IAEAsC,YAAW,WACPpE,EAAE,cAAc4D,UACjB,QAKX5D,EAAE,cAAc6D,OAAM,SAAUC,GACxBvE,KAAKmF,MAAMH,OAAS,EACpBnE,EAAYkC,SAAS,WAErB8B,YAAW,WACPhE,EAAYC,YAAY,aACzB,QAKXL,EAAE,kBAAkBwE,OAAM,WACtBtC,OAIJlC,EAAElD,UAAU6H,GAAG,SAAS,SAAUb,GACb,IAAbA,EAAEc,SAAiB5E,EAAE,+DACrBkC,OAILlC,EAAE,QAAQ6E,SAAS,gBAClBT,WAAW,KACP,IAGIU,EAHAC,EAAczH,OAAO0H,WACrBC,EAAejF,EAAE,8BAA8B3D,QAM/CyI,EADDC,GAAe,MAAQA,GAAe,KAC5B,IAELA,EAAc,IACT,GAGA,GAGb,IAAIG,GAdiBlF,EAAE,4BAA4B3D,QAcd4I,GAAgB,EAAIH,EACzD9E,EAAE,4BAA4BmF,IAAI,cAAe,IAAID,OACrDlF,EAAE,4BAA4BsC,SAAS,aACxC,QAOX,SAAWhF,EAAQR,GACf,IAAIsI,EAActI,EAASC,eAAe,yBACtCsI,EAAMvI,EAASwI,cAAc,qBAC7BpC,EAAQpG,EAASwI,cAAc,uBAC/BC,EAAYzI,EAASC,eAAe,oBAGpCyI,EAAclI,EAAOmI,QACrBC,GAAU,EAEd,GAAIxC,EAAO,CAaP,SAASyC,IACL,IAAIC,EAGAA,EADAtI,EAAO0H,WAAa,IACT,GACJ1H,EAAO0H,WAAa,KAAOI,EACvB,KAEC,IAGhB,IAAIrB,EAAUb,EAAMzF,wBAAwBC,IAAMJ,EAAOmI,QACrDI,EAAgB3C,EAAM4C,aAAeF,EAGrCJ,GAAezB,EAAU8B,GACzBR,EAAIU,UAAUnI,IAlCR,cAmCF2H,GACAA,EAAUQ,UAAUnI,IApClB,gBAuCNyH,EAAIU,UAAUC,OAvCR,cAwCFT,GACAA,EAAUQ,UAAUC,OAzClB,eA6CVN,GAAU,EAGdpI,EAAO2I,iBAAiB,UA1CxB,WACIT,EAAclI,EAAOmI,QAIzB,WACSC,GACDQ,sBAAsBP,GAE1BD,GAAU,EAPVS,KAwCwC,CAAEC,SAAS,IAEvDT,KAvDR,CA0DGrI,OAAQR,UAKX,IAAIuJ,OAASvJ,SAASwJ,iBAAiB,qBAEvC,GAAGD,OAAO9B,OAAQ,CACd,IAAIgC,EAAe,EACCC,YAAYC,WAAY,KAE5C,SAASA,aACLJ,OAAOE,GAAcG,UAAY,QACjCH,GAAgBA,EAAa,GAAGF,OAAO9B,OACvC8B,OAAOE,GAAcG,UAAY,gBAOzC,GAAGpJ,OAAO0H,WAAa,IAAK,CACxB,IAAI2B,EAAa7J,SAASwI,cAAc,4BAEpCsB,GADiB9J,SAASwI,cAAc,qBACvBxI,SAASwI,cAAc,+BACxCuB,EAAc/J,SAASwI,cAAc,uBACrCwB,EAAgBhK,SAASwI,cAAc,+BAc3C,SAASyB,eAAeC,GACtB,IAAIC,EAAMC,SAASF,GAAGG,SAAS,IAC/B,OAAqB,GAAdF,EAAI1C,OAAc,IAAM0C,EAAMA,EAGvC,SAASG,SAASC,EAAGC,EAAGC,GACtB,MAAO,IAAMR,eAAeM,GAAKN,eAAeO,GAAKP,eAAeQ,GAGtE,SAASC,eAAeC,GAMpB,OALAA,EAAWA,EAASC,QAAQ,IAAK,KAInB,IAHNR,SAASO,EAASE,OAAO,EAAE,GAAG,IAGhB,IAFdT,SAASO,EAASE,OAAO,EAAE,GAAG,IAER,IADtBT,SAASO,EAASE,OAAO,EAAE,GAAG,KACF,KACrB,IAAO,QAAU,QAGpC,SAASC,sBACL,GAAG9K,SAASiF,KAAKgE,UAAU8B,SAAS,gBAChCjB,EAAe5E,MAAM8F,QAAU,WAE9B,CACD,IAAIC,EAAYzK,OAAO0K,iBAAiBnB,EAAa,MAAMoB,iBAAiB,oBACxEC,EAAMH,EAAUI,UAAU,EAAGJ,EAAUxD,OAAO,GAC9BmD,QAAQ,KAAM,IACdrG,MAAM,KAE6B,SAApDmG,eAAeJ,SAASc,EAAI,GAAIA,EAAI,GAAIA,EAAI,OAC3CpL,SAASwI,cAAc,UAAUS,UAAUnI,IAAI,WAC/Cd,SAASwI,cAAc,sBAAsBS,UAAUnI,IAAI,aAER,SAApD4J,eAAeJ,SAASc,EAAI,GAAIA,EAAI,GAAIA,EAAI,OACvCpL,SAASiF,KAAKgE,UAAU8B,SAAS,mBACjB,sBAAbE,EACCjL,SAASwI,cAAc,UAAUS,UAAUnI,IAAI,cAG/B,sBAAbmK,GACCjL,SAASwI,cAAc,UAAUS,UAAUnI,IAAI,YAM3Dd,SAASiF,KAAKgE,UAAU8B,SAAS,iBACjCE,EAAYA,EAAUL,QAAQ,IAAK,UAAUA,QAAQ,MAAO,QAC5Dd,EAAe5E,MAAMoG,WAAa,0BAA0BL,gCA3DxEH,sBAEAtK,OAAO2I,iBAAiB,SAAU,KAC9B,IAAIoC,EAAY1B,EAAaA,EAAWb,aAAe,EAGvD,GAFAhJ,SAASiF,KAAKgE,UAAUuC,OAAO,kBAAmBxL,SAASU,gBAAgBhB,UAAY6L,GAEpFvB,EAAe,CACd,IAAIyB,EAAkBzB,EAAc0B,UAAY1B,EAAchB,aAC9Dc,EAAeb,UAAUuC,OAAO,YAAaxL,SAASU,gBAAgBhB,WAAa+L,EAAkB,OA4DjH,IAAIE,QAAU3L,SAASwJ,iBAAiB,qBAExC,GAAGmC,QAAQlE,OAAQ,CACf,SAASmE,aAAaC,EAAKC,GAGvB,OAFAD,EAAMhK,KAAKkK,KAAKF,GAChBC,EAAMjK,KAAKmK,MAAMF,GACVjK,KAAKmK,MAAMnK,KAAKoK,UAAYH,EAAMD,EAAM,IAAMA,EAGzD,IAAIK,EAAMN,aAAa,EAAG,GAC1B5L,SAASC,eAAe,oBAAoBiM,GAAOhH,MAAM8F,QAAU","file":"utils.js","sourcesContent":["'use strict';\n\nfunction initDESKPaper(paper, fillColor) {\n var width, height, yPos, scrollTop, percent, deskOffset, deskOffsetStart, fillColor, path;\n var points = 20;\n var canvas = document.getElementById('wavecanvas-desk');\n\n paper.setup(canvas);\n\n path = new paper.Path();\n path.fillColor = fillColor || 'rgb(0,0,0)';\n\n var pathHeight = paper.view.size.height / 6;\n\n var speed = 22;\n var amplitude = 5;\n var pushDown = 1000;\n\n paper.view.setup = function () {\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n deskOffset = canvas.getBoundingClientRect().top;\n width = paper.view.size.width;\n height = paper.view.size.height / 2;\n path.segments = [];\n path.add(paper.view.bounds.bottomLeft);\n\n for (var i = 1; i < points; i++) {\n var point = new paper.Point(width / points * i, pathHeight + pushDown);\n path.add(point);\n }\n path.add(paper.view.bounds.bottomRight);\n }\n\n paper.view.setup();\n\n window.onscroll = function () {\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n deskOffset = document.getElementById('wavecanvas-desk').getBoundingClientRect().top;\n deskOffsetStart = scrollTop + deskOffset;\n pushDown = 2.5 - deskOffset.map(0, deskOffsetStart, 3, 0);\n percent = scrollTop.map(0, deskOffsetStart * 0.95, 0, 1);\n };\n\n var repaintOnce = false;\n\n paper.view.onFrame = function (event) {\n if (percent >= 0) {\n repaintOnce = false;\n\n for (var i = 1; i < points; i++) {\n var sinSeed = event.count + (i + i % 10) * amplitude;\n var sinHeight = Math.sin(sinSeed / speed) * pathHeight;\n yPos = sinHeight + pushDown;\n path.segments[i].point.y = yPos + height * pushDown;\n }\n path.smooth({ type: 'continuous' });\n } else if (!repaintOnce) {\n for (var i = 1; i < points; i++) {\n var sinSeed = event.count + (i + i % 10) * amplitude;\n var sinHeight = Math.sin(sinSeed / speed) * pathHeight;\n yPos = sinHeight + pushDown;\n path.segments[i].point.y = yPos + height * pushDown;\n }\n repaintOnce = true;\n }\n }\n\n // Reposition the path whenever the window is resized:\n paper.view.onResize = function (event) {\n paper.view.onFrame(event);\n }\n\n Number.prototype.map = function (in_min, in_max, out_min, out_max) {\n return (this - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;\n }\n}\n\nfunction initPaper(paper, canvasElement, button, fillColor) {\n paper.setup(canvasElement);\n\n var width, yPos;\n var points = 8;\n var path = new paper.Path();\n\n var mouseInside = false;\n var isRunning = false;\n var pushDown = 160;\n var pathHeight = paper.view.size.height / 6;\n\n path.fillColor = fillColor;\n\n paper.view.initializePath = function () {\n width = paper.view.size.width;\n path.segments = [];\n path.add(paper.view.bounds.bottomLeft);\n\n for (var i = 1; i < points; i++) {\n var point = new paper.Point(width / points * i, pathHeight + pushDown);\n path.add(point);\n }\n path.add(paper.view.bounds.bottomRight);\n }\n\n paper.view.initializePath();\n\n paper.view.onFrame = function (event) {\n if ((mouseInside || !mouseInside & pushDown < 180)) {\n for (var i = 1; i < points; i++) {\n var sinSeed = event.count + (i + i % 10) * 5;\n var sinHeight = Math.sin(sinSeed / 11) * pathHeight;\n\n if (mouseInside & pushDown > 0) {\n isRunning = true;\n pushDown -= 1.75;\n } else if (!mouseInside & pushDown < 180) {\n isRunning = true;\n pushDown += 1.75;\n } else {\n isRunning = false;\n }\n\n if (isRunning) {\n yPos = sinHeight + pushDown;\n path.segments[i].point.y = yPos;\n }\n }\n path.smooth({ type: 'continuous' });\n }\n }\n\n button.onmouseout = function () {\n mouseInside = false;\n }\n button.onmouseover = function () {\n mouseInside = true;\n }\n}\n\n$(document).ready(function () {\n var isIndexing = false;\n var scrollTop = 0;\n var $searchForm = $('.js-layout--searchform');\n var $searchField;\n\n // fade animation on series pages\n $('.fade').removeClass('fade-hidden');\n\n /**\n * Image sizes config\n * This is currently a duplicate of the config in package.json\n */\n const IMAGE_SIZES = {\n xxs: {\n width: 30,\n },\n xs: {\n width: 100,\n },\n s: {\n width: 300,\n },\n m: {\n width: 600,\n },\n l: {\n width: 1200,\n },\n xl: {\n width: 2000,\n },\n };\n\n // The default path to access images from Ghost storage\n const STATIC_IMAGE_URL_PREFIX = 'content/images';\n\n /**\n * Image Size helper\n * Creates the correct path to Ghost's image directory for the required size\n */\n const imageSizeHelper = (imagePath, size) => {\n const prefixIfPresent = (prefix, string) => (string ? prefix + string : '');\n const { width, height } = IMAGE_SIZES[size];\n const [imgBlogUrl, imageName] = imagePath.split(STATIC_IMAGE_URL_PREFIX);\n\n const sizeDirectoryName = prefixIfPresent('w', width) + prefixIfPresent('h', height);\n\n return [imgBlogUrl, STATIC_IMAGE_URL_PREFIX, `/size/${sizeDirectoryName}`, imageName].join('');\n };\n\n const renderFeatureImage = (title, feature_image) => {\n if (!feature_image) {\n return '';\n }\n return `\n
\n \"${title}\"\n\n
\n
\n `;\n };\n\n /**\n * GhostHunter Search\n */\n $searchField = $(\"#bigsearch\").ghostHunter({\n results: '#results',\n onPageLoad: true,\n displaySearchInfo: false,\n // TODO: uncomment when subdirectory is activated\n // subpath: '/blog',\n result_template: `
{{featureImageRendered}}

{{title}}

`,\n before: function() {\n console.log(\"before\");\n var search_text = $('#bigsearch').val();\n $searchField.clear();\n $('#bigsearch').val(search_text);\n },\n item_preprocessor: function (item) {\n console.log(\"preprocessor\");\n var ret = {};\n // Add feature image to results\n ret.featureImageRendered = renderFeatureImage(item.title, item.feature_image);\n return ret;\n },\n indexing_start: function () {\n isIndexing = true;\n $('#bigsearch').prop('disabled', true);\n // $('.label--bigsearch').html('Loading...');\n console.log(\"started indexing\");\n },\n indexing_end: function () {\n $('#bigsearch').prop('disabled', false);\n $('.label--bigsearch').html('Just start typing...');\n console.log(\"finished indexing now\");\n\n // if we don't use this safety, the focus event will\n // bubble inifinitely.\n if (isIndexing) {\n $(\"#bigsearch\").focus();\n\n $('#bigsearch').keyup(throttleSearch(function (e) {\n $('#bigsearch-submit').trigger('click');\n }, 800));\n isIndexing = false;\n }\n },\n onComplete: function (results) {\n console.log(\"complete\");\n if ((results && results.length <= 0) && $('#bigsearch').val().length) {\n $('#no-results').removeClass('hidden');\n $('#results').addClass('hidden');\n } else {\n $('#results').removeClass('hidden');\n $('#no-results').addClass('hidden');\n }\n }\n });\n\n function throttleSearch(callback, ms) {\n var timer = 0;\n return function() {\n var context = this, args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n callback.apply(context, args);\n }, ms || 0);\n };\n }\n\n //prevent scrolling of background of the overlay\n function isSafari() {\n var ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf('safari') != -1) {\n if (ua.indexOf('chrome') > -1) {\n return false;\n } else {\n return true\n }\n }\n return false;\n }\n\n function disableScroll() {\n document.body.style.overflow = 'hidden';\n document.documentElement.style.overflow = 'hidden';\n\n if (isSafari()) {\n scrollTop = document.body.scrollTop;\n document.body.style.height = '100vh';\n document.body.scrollTop = scrollTop;\n }\n }\n\n function enableScroll() {\n document.body.style.overflow = 'hidden';\n document.documentElement.style.overflow = 'scroll';\n\n if (isSafari()) {\n document.body.style.height = 'auto';\n document.body.scrollTop = scrollTop;\n }\n }\n\n function closeSearch() {\n $('#bigsearch').val('');\n $('#results').html('');\n $searchField.clear();\n $('#no-results').addClass('hidden');\n $('#searchwave, .js-layout--searchform').removeClass('lets-go');\n enableScroll();\n }\n\n // open search\n $('.js-enable-search').click(function () {\n if ($('.touch').length > 0) {\n var scrollTop = document.body.scrollTop;\n $('#searchwave').style.top = scrollTop + \"px\";\n $('#searchwave').addClass('lets-go');\n disableScroll();\n $(\"#bigsearch\").focus();\n window.scrollTo(0, 0);\n } else {\n $('#searchwave').addClass('lets-go');\n disableScroll();\n\n setTimeout(function () {\n $(\"#bigsearch\").focus();\n }, 500);\n }\n });\n\n //KeyUp event for the big search field\n $('#bigsearch').keyup(function (e) {\n if (this.value.length > 0) {\n $searchForm.addClass('lets-go');\n } else {\n setTimeout(function () {\n $searchForm.removeClass('lets-go');\n }, 500);\n }\n })\n\n // close search\n $('.js-close-icon').click(function () {\n closeSearch();\n });\n\n // close search when esc key is pressed\n $(document).on('keyup', function (e) {\n if (e.keyCode == 27 && $('#searchwave.fullscreen-wave.fullscreen-wave--black.lets-go')) {\n closeSearch();\n }\n });\n\n if($('body').hasClass('single-post')) {\n setTimeout(() => {\n let screenWidth = window.innerWidth;\n let wrapperWidth = $('.layout--max-width-wrapper').width();\n let fullImageWidth = $('.kg-width-full .kg-image').width();\n let offset;\n\n\n if(screenWidth >= 1099 && screenWidth <= 1199) {\n offset = 100;\n }\n else if(screenWidth > 768) {\n offset = 50;\n }\n else {\n offset = 30;\n }\n\n let computedLeft = (fullImageWidth - wrapperWidth) / 2 + offset;\n $('.kg-width-full .kg-image').css('margin-left', `-${computedLeft}px`);\n $('.kg-width-full .kg-image').addClass('is-shown');\n }, 500);\n }\n});\n\n/**\n * Sticky nav\n */\n(function (window, document) {\n var blogArticle = document.getElementById('js-blog-article-title');\n var nav = document.querySelector('.js-sticky-header');\n var title = document.querySelector('.js-sticky-waypoint');\n var navToggle = document.getElementById('nav-toggle-label');\n var activeClass = 'is-visible';\n\n var lastScrollY = window.scrollY;\n var ticking = false;\n\n if (title) {\n function onScroll() {\n lastScrollY = window.scrollY;\n requestTick();\n }\n\n function requestTick() {\n if (!ticking) {\n requestAnimationFrame(update);\n }\n ticking = true;\n }\n\n function update() {\n var myOffset;\n\n if (window.innerWidth > 767) { //tablet-port-and-up\n myOffset = 20;\n } else if (window.innerWidth < 768 && blogArticle) { //mobile article\n myOffset = 100;\n } else { //mobile normal\n myOffset = -120;\n }\n\n var trigger = title.getBoundingClientRect().top + window.scrollY;\n var triggerOffset = title.offsetHeight + myOffset;\n\n // show/hide post title\n if (lastScrollY >= trigger + triggerOffset) {\n nav.classList.add(activeClass);\n if (navToggle) {\n navToggle.classList.add(activeClass);\n }\n } else {\n nav.classList.remove(activeClass);\n if (navToggle) {\n navToggle.classList.remove(activeClass);\n }\n }\n\n ticking = false;\n }\n\n window.addEventListener('scroll', onScroll, { passive: true });\n\n update();\n }\n\n})(window, document);\n\n/**\n* Rotating sidebar ads\n*/\nlet slides = document.querySelectorAll('.js-slides .slide');\n\nif(slides.length) {\n let currentSlide = 0;\n let slideInterval = setInterval(moveToNext, 5000);\n\n function moveToNext() {\n slides[currentSlide].className = 'slide';\n currentSlide = (currentSlide+1)%slides.length;\n slides[currentSlide].className = 'slide active';\n }\n}\n\n/**\n* Floating header for Article pages\n*/\nif(window.innerWidth > 768) {\n let baseHeader = document.querySelector('.layout--blog-navigation');\n let floatingHeader = document.querySelector('.js-sticky-header');\n let headerGradient = document.querySelector('.js-sticky-header-gradient');\n let fadeContent = document.querySelector('.fade-content--blog');\n let contentHolder = document.querySelector('.layout--author-and-content');\n\n dynamicHeaderColors();\n \n window.addEventListener('scroll', () => {\n let threshold = baseHeader ? baseHeader.offsetHeight : 0;\n document.body.classList.toggle('floating-header', document.documentElement.scrollTop > threshold);\n \n if(contentHolder) {\n let bottomOfContent = contentHolder.offsetTop + contentHolder.offsetHeight;\n headerGradient.classList.toggle('is-hidden', document.documentElement.scrollTop >= bottomOfContent - 80);\n }\n });\n\n function componentToHex(c) {\n var hex = parseInt(c).toString(16);\n return hex.length == 1 ? \"0\" + hex : hex;\n }\n\n function rgbToHex(r, g, b) {\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\n }\n\n function getContrastYIQ(hexcolor){\n hexcolor = hexcolor.replace('#', '');\n var r = parseInt(hexcolor.substr(0,2),16);\n var g = parseInt(hexcolor.substr(2,2),16);\n var b = parseInt(hexcolor.substr(4,2),16);\n var yiq = ((r*299)+(g*587)+(b*114))/1000;\n return (yiq >= 128) ? 'black' : 'white';\n }\n\n function dynamicHeaderColors() {\n if(document.body.classList.contains('tag-template')) {\n headerGradient.style.display = 'none';\n }\n else {\n let fadeColor = window.getComputedStyle(fadeContent, null).getPropertyValue('background-color');\n let rgb = fadeColor.substring(4, fadeColor.length-1)\n .replace(/ /g, '')\n .split(',');\n\n if(getContrastYIQ(rgbToHex(rgb[0], rgb[1], rgb[2])) == 'white') {\n document.querySelector('.stamp').classList.add('lighten');\n document.querySelector('.layout--blog-menu').classList.add('is-white');\n }\n if(getContrastYIQ(rgbToHex(rgb[0], rgb[1], rgb[2])) == 'black') {\n if(!document.body.classList.contains('home-template')) {\n if(fadeColor == 'rgb(255, 255, 255)') {\n document.querySelector('.stamp').classList.add('difference');\n }\n else {\n if(fadeColor != 'rgb(241, 241, 241)') {\n document.querySelector('.stamp').classList.add('darken');\n }\n }\n }\n }\n\n if(!document.body.classList.contains('page-series')) {\n fadeColor = fadeColor.replace(')', ', 0.8)').replace('rgb', 'rgba');\n headerGradient.style.background = `linear-gradient(180deg,${fadeColor} 20.15%,hsla(0,0%,100%,0))`;\n }\n }\n }\n}\n\n/**\n* Randomized homepage banner\n*/\nlet banners = document.querySelectorAll('.js-random-banner');\n\nif(banners.length) {\n function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n\n let num = getRandomInt(1, 3);\n document.getElementById(`js-random-banner-${num}`).style.display = 'flex';\n}\n"]}