From 65762fc00599d5ace0ce2f63510c1a680950f878 Mon Sep 17 00:00:00 2001 From: Stefan Bohacek Date: Tue, 13 Apr 2021 11:06:21 -0400 Subject: [PATCH] More subtle tilt animation. --- js/scripts.min.js | 2 +- js/scripts.min.js.map | 2 +- src/scripts/tiltfx.js | 19 +++++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/js/scripts.min.js b/js/scripts.min.js index 0e34a77..c6024f5 100644 --- a/js/scripts.min.js +++ b/js/scripts.min.js @@ -1,2 +1,2 @@ -"use strict";$=jQuery.noConflict(!0),$(function(){$(window).scroll(function(){var t=document.getElementById("back-to-top");(window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0)>screen.height/2?(t.classList.add("slide-up"),t.classList.remove("slide-down")):(t.classList.remove("slide-up"),t.classList.add("slide-down"))})}),$(function(){}),window.bwHelpers={randomFromArray:function(t,e){var o=[];e=e||1;for(var r=0;r';for(var r=1,i=1,n=Math.floor(t.offsetHeight/100),a=Math.floor(t.offsetWidth/100)*n,s="",l=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style"),u=0;u<=a;u++)s+=".robot:nth-child("+u+") { animation-delay: "+60/a/200*u+"s; }";for(l.appendChild(c),c.type="text/css",c.appendChild(document.createTextNode(s));i',r
'),$("#resource-name").val("One cool resource"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),$("#resource-url").val("https://coolresource.github.com/"),$("#resource-selected-tweets").val("https://twitter.com/mycoolresource/status/123456789\nhttps://twitter.com/mycoolresource/status/987654321"),$("#resource-tagline").val("This is a cool resource."),$("#resource-networks").val(["twitter-bots"]),$("#resource-networks").trigger("change"),$("#resource-tags").val(["generative","images","nodejs"]),$("#resource-tags").trigger("change"),$("#resource-is-opensource").click(),$("#resource-source-url").val("https://github.com/resourcewiki/resourcewiki.org"),$("#resource-source-language").val("nodejs"),$("#resource-source-language").trigger("change"),$("html, body").animate({scrollTop:e.offset().top-500},450),!1}),$("#submit-resource-form").submit(function(){e.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){e.html("Still working...")},4700)});var i=$('[name="resource-type'),n=$(".resource-type-name");i.on("change",function(t){var e=$(this).children("option").filter(":selected").text().toLowerCase();-1===["tutorial","tool","starter project","library/framework"].indexOf(e)&&(e="resource"),n.html(e),$("#resource-name").attr("placeholder","My "+e+"..."),$("#resource-tagline").attr("placeholder","A useful "+e+".")}),$("#add-author-fields").click(function(t){t.preventDefault();var e=$(".author-fields").length+1;return $(this).before('
'),!1});var a=$("#resource-network").html();$("#add-resource-info-fields").click(function(t){t.preventDefault();var e=$(".resource-info-fields").length+1;return $(this).before('
'),$("#resource-info-"+e+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),o(),!1});var s=$("#resource-source-info");$("#resource-is-opensource").click(function(t){$(this).is(":checked")?s.removeClass("d-none"):s.addClass("d-none")});var l=$("#apply-for-botmaker-badge"),c=$("#botmaker-badge-application");l.click(function(t){$(this).is(":checked")?c.removeClass("d-none"):c.addClass("d-none")}),o()}}),$(function(){var t=$("body"),o=$("#bot-form-submit");function r(){var t=$('[name="bot-networks[]'),e=$("#bot-selected-tweets-field"),r=$("#bot-selected-tweets-label");t.on("change",function(){var o=!1;t.each(function(t){var e=$(this).children("option").filter(":selected").text();-1
'),$("#bot-name").val("@coolbot"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),window.bot_description_editor.setContent("generates random images.");var e=$("#bot-info-1-network").html();return $("#add-bot-info-fields").before('
"),$("#bot-info-2-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),$("#bot-info-1-network").val("twitter-bots").trigger("change"),$("#bot-info-2-network").val("tumblr-bots").trigger("change"),$("#bot-info-1-url").val("https://twitter.com/coolbot"),$("#bot-info-2-url").val("https://coolbot.tumblr.com/"),$("#bot-selected-tweets").val("https://twitter.com/mycoolbot/status/123456789\nhttps://twitter.com/mycoolbot/status/987654321"),$("#bot-tagline").val("This is a cool bot."),$("#bot-tags").append('\n ').val(["generative","images"]).trigger("change"),$("#bot-is-opensource").click(),$("#bot-source-url").val("https://github.com/botwiki/botwiki.org"),$("#bot-source-language").val("nodejs").trigger("change"),$("html, body").animate({scrollTop:o.offset().top-500},450),!1}),$(".js-select2").each(function(t){var e=$(this),o=e.data("ajax");o?(window.processSearchResults=function(t){var r=[];return $.each(t,function(t,e){var o=e.name;r[t]={id:o,text:o}}),r},e.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3,ajax:{url:o,dataType:"json",data:function(t){return{search:t.term}},processResults:function(t,o,e){return{results:window.processSearchResults(t).sort(function(t,e){return window.levenshteinDistance(t.text,o.term)-window.levenshteinDistance(e.text,o.term)})}}}})):e.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3})}),$("#submit-bot-form").submit(function(){o.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){o.html("Still working...")},4700)}),$("#add-author-fields").click(function(t){t.preventDefault();var e=$(".author-fields").length+1;return $(this).before('
'),!1});var n=$("#bot-info-1-network").html();$("#add-bot-info-fields").click(function(t){t.preventDefault();var e=$(".bot-info-fields").length+1;return $(this).before('
\n
\n \n
\n
\n \n
\n
"),$("#bot-info-"+e+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),r(),!1});var e=$("#bot-source-info");$("#bot-is-opensource").click(function(t){$(this).is(":checked")?e.removeClass("d-none"):e.addClass("d-none")});var a=$("#bot-submitted-output");$(document).on("change input propertychange",'[name="bot-urls[]"]',function(t){var e=$(this),o=e.parents(".bot-info-fields").find('[name="bot-networks[]"]'),r=e.attr("id"),i=e.val().trim();-1!==i.indexOf("twitter.com")?o.val("twitter-bots").trigger("change"):-1!==i.indexOf("tumblr.com")?o.val("tumblr-bots").trigger("change"):-1!==i.indexOf("mastodon.social")?o.val("mastodon").trigger("change"):-1!==i.indexOf("botsin.space")?o.val("mastodon").trigger("change"):-1!==i.indexOf("reddit.com")?o.val("reddit-bots").trigger("change"):-1!==i.indexOf("youtube.com")&&o.val("youtube-bots").trigger("change"),-1!==r.indexOf("bot-")&&-1!==r.indexOf("-url")&&(i&&5\n \n Screenshot of '+t.title.rendered+'\n \n
\n
'+t.title.rendered+"
\n

"+t.excerpt.rendered+"

\n
\n "}),a.html(e).parent().removeClass("d-none")}}}):a.html("").parent().addClass("d-none"))});var s=$("#apply-for-botmaker-badge"),l=$("#botmaker-badge-application");s.click(function(t){$(this).is(":checked")?l.removeClass("d-none"):l.addClass("d-none")}),r()}"undefined"!=typeof MediumEditor&&(window.bot_description_editor=new MediumEditor("#bot-description",{placeholder:{text:"This bot makes...",hideOnClick:!0},toolbar:{buttons:["anchor","pre","quote"]}}))}),function(k){$("blockquote").tilt({maxTilt:.5}),$(".card").tilt({maxTilt:1}),$(".author-card").tilt({maxTilt:.4}),$(".hover-box > a").tilt({maxTilt:10}),$(".botwiki-logo").tilt({maxTilt:2}),$("#menu-wrapper .menu-container").tilt({maxTilt:.8}),$(".thumbnail-wrapper img").tilt({maxTilt:.5}),$(document).on("tembeds_tweets_processed",function(){$(".twitter-tweet").tilt({maxTilt:2})});for(var n=0,t="webkit moz ms o".split(" "),e=k.requestAnimationFrame,o=k.cancelAnimationFrame,r=void 0,i=0;iscreen.height/2?(t.classList.add("slide-up"),t.classList.remove("slide-down")):(t.classList.remove("slide-up"),t.classList.add("slide-down"))})}),$(function(){}),window.bwHelpers={randomFromArray:function(t,e){var o=[];e=e||1;for(var r=0;r';for(var r=1,i=1,n=Math.floor(t.offsetHeight/100),a=Math.floor(t.offsetWidth/100)*n,s="",l=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style"),u=0;u<=a;u++)s+=".robot:nth-child("+u+") { animation-delay: "+60/a/200*u+"s; }";for(l.appendChild(c),c.type="text/css",c.appendChild(document.createTextNode(s));i',r
'),$("#resource-name").val("One cool resource"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),$("#resource-url").val("https://coolresource.github.com/"),$("#resource-selected-tweets").val("https://twitter.com/mycoolresource/status/123456789\nhttps://twitter.com/mycoolresource/status/987654321"),$("#resource-tagline").val("This is a cool resource."),$("#resource-networks").val(["twitter-bots"]),$("#resource-networks").trigger("change"),$("#resource-tags").val(["generative","images","nodejs"]),$("#resource-tags").trigger("change"),$("#resource-is-opensource").click(),$("#resource-source-url").val("https://github.com/resourcewiki/resourcewiki.org"),$("#resource-source-language").val("nodejs"),$("#resource-source-language").trigger("change"),$("html, body").animate({scrollTop:e.offset().top-500},450),!1}),$("#submit-resource-form").submit(function(){e.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){e.html("Still working...")},4700)});var i=$('[name="resource-type'),n=$(".resource-type-name");i.on("change",function(t){var e=$(this).children("option").filter(":selected").text().toLowerCase();-1===["tutorial","tool","starter project","library/framework"].indexOf(e)&&(e="resource"),n.html(e),$("#resource-name").attr("placeholder","My "+e+"..."),$("#resource-tagline").attr("placeholder","A useful "+e+".")}),$("#add-author-fields").click(function(t){t.preventDefault();var e=$(".author-fields").length+1;return $(this).before('
'),!1});var a=$("#resource-network").html();$("#add-resource-info-fields").click(function(t){t.preventDefault();var e=$(".resource-info-fields").length+1;return $(this).before('
'),$("#resource-info-"+e+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),o(),!1});var s=$("#resource-source-info");$("#resource-is-opensource").click(function(t){$(this).is(":checked")?s.removeClass("d-none"):s.addClass("d-none")});var l=$("#apply-for-botmaker-badge"),c=$("#botmaker-badge-application");l.click(function(t){$(this).is(":checked")?c.removeClass("d-none"):c.addClass("d-none")}),o()}}),$(function(){var t=$("body"),o=$("#bot-form-submit");function r(){var t=$('[name="bot-networks[]'),e=$("#bot-selected-tweets-field"),r=$("#bot-selected-tweets-label");t.on("change",function(){var o=!1;t.each(function(t){var e=$(this).children("option").filter(":selected").text();-1
'),$("#bot-name").val("@coolbot"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),window.bot_description_editor.setContent("generates random images.");var e=$("#bot-info-1-network").html();return $("#add-bot-info-fields").before('
"),$("#bot-info-2-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),$("#bot-info-1-network").val("twitter-bots").trigger("change"),$("#bot-info-2-network").val("tumblr-bots").trigger("change"),$("#bot-info-1-url").val("https://twitter.com/coolbot"),$("#bot-info-2-url").val("https://coolbot.tumblr.com/"),$("#bot-selected-tweets").val("https://twitter.com/mycoolbot/status/123456789\nhttps://twitter.com/mycoolbot/status/987654321"),$("#bot-tagline").val("This is a cool bot."),$("#bot-tags").append('\n ').val(["generative","images"]).trigger("change"),$("#bot-is-opensource").click(),$("#bot-source-url").val("https://github.com/botwiki/botwiki.org"),$("#bot-source-language").val("nodejs").trigger("change"),$("html, body").animate({scrollTop:o.offset().top-500},450),!1}),$(".js-select2").each(function(t){var e=$(this),o=e.data("ajax");o?(window.processSearchResults=function(t){var r=[];return $.each(t,function(t,e){var o=e.name;r[t]={id:o,text:o}}),r},e.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3,ajax:{url:o,dataType:"json",data:function(t){return{search:t.term}},processResults:function(t,o,e){return{results:window.processSearchResults(t).sort(function(t,e){return window.levenshteinDistance(t.text,o.term)-window.levenshteinDistance(e.text,o.term)})}}}})):e.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3})}),$("#submit-bot-form").submit(function(){o.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){o.html("Still working...")},4700)}),$("#add-author-fields").click(function(t){t.preventDefault();var e=$(".author-fields").length+1;return $(this).before('
'),!1});var n=$("#bot-info-1-network").html();$("#add-bot-info-fields").click(function(t){t.preventDefault();var e=$(".bot-info-fields").length+1;return $(this).before('
\n
\n \n
\n
\n \n
\n
"),$("#bot-info-"+e+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),r(),!1});var e=$("#bot-source-info");$("#bot-is-opensource").click(function(t){$(this).is(":checked")?e.removeClass("d-none"):e.addClass("d-none")});var a=$("#bot-submitted-output");$(document).on("change input propertychange",'[name="bot-urls[]"]',function(t){var e=$(this),o=e.parents(".bot-info-fields").find('[name="bot-networks[]"]'),r=e.attr("id"),i=e.val().trim();-1!==i.indexOf("twitter.com")?o.val("twitter-bots").trigger("change"):-1!==i.indexOf("tumblr.com")?o.val("tumblr-bots").trigger("change"):-1!==i.indexOf("mastodon.social")?o.val("mastodon").trigger("change"):-1!==i.indexOf("botsin.space")?o.val("mastodon").trigger("change"):-1!==i.indexOf("reddit.com")?o.val("reddit-bots").trigger("change"):-1!==i.indexOf("youtube.com")&&o.val("youtube-bots").trigger("change"),-1!==r.indexOf("bot-")&&-1!==r.indexOf("-url")&&(i&&5\n \n Screenshot of '+t.title.rendered+'\n \n
\n
'+t.title.rendered+"
\n

"+t.excerpt.rendered+"

\n
\n "}),a.html(e).parent().removeClass("d-none")}}}):a.html("").parent().addClass("d-none"))});var s=$("#apply-for-botmaker-badge"),l=$("#botmaker-badge-application");s.click(function(t){$(this).is(":checked")?l.removeClass("d-none"):l.addClass("d-none")}),r()}"undefined"!=typeof MediumEditor&&(window.bot_description_editor=new MediumEditor("#bot-description",{placeholder:{text:"This bot makes...",hideOnClick:!0},toolbar:{buttons:["anchor","pre","quote"]}}))}),function(k){function t(t){t.tilt({maxTilt:200/t.outerWidth()})}$(".card, blockquote").each(function(){t($(this))}),$(".hover-box > a").tilt({maxTilt:10}),$(".botwiki-logo").tilt({maxTilt:2}),$("#menu-wrapper .menu-container").tilt({maxTilt:.8}),$(".thumbnail-wrapper img").tilt({maxTilt:.5}),$(document).on("tembeds_tweets_processed",function(){$(".twitter-tweet").each(function(){t($(this))})});for(var n=0,e="webkit moz ms o".split(" "),o=k.requestAnimationFrame,r=k.cancelAnimationFrame,i=void 0,a=0;a (screen.height/2)){\n backToTop.classList.add('slide-up');\n backToTop.classList.remove('slide-down');\n }\n else{\n backToTop.classList.remove('slide-up');\n backToTop.classList.add('slide-down');\n }\n });\n});","$(function() {\n 'use strict';\n // $('.expand-image').click(function(ev){\n // ev.preventDefault();\n // $(this).toggleClass('image-expanded');\n // $(this).parents('.thumbnail-wrapper').toggleClass('image-expanded');\n // return false;\n // });\n});\n","window.bwHelpers = {\n randomFromArray: function( arr, count ) {\n let newArray = [];\n count = count || 1;\n for ( let i = 0; i < count; i++){\n arr.sort( function(){ return Math.round( Math.random() ) ; } );\n newArray.push( arr.pop() );\n }\n return newArray;\n }\n}\n","$( function(){\n 'use strict';\n if ( typeof hljs !== 'undefined' ){\n hljs.initHighlighting.called = false;\n hljs.initHighlighting();\n }\n} );\n","/*\n Lazy Load Images without jQuery\n http://kaizau.github.com/Lazy-Load-Images-without-jQuery/\n Original by Mike Pulaski - http://www.mikepulaski.com\n Modified by Kai Zau - http://kaizau.com\n*/\n(function() {\n var addEventListener = window.addEventListener || function(n,f) { window.attachEvent('on'+n, f); },\n removeEventListener = window.removeEventListener || function(n,f,b) { window.detachEvent('on'+n, f); };\n\n // For IE7 compatibility\n // Adapted from http://www.quirksmode.org/js/findpos.html\n function getOffsetTop(el) {\n var val = 0;\n if (el.offsetParent) {\n do {\n val += el.offsetTop;\n } while (el = el.offsetParent);\n return val;\n }\n } \n\n var lazyLoader = {\n cache: [],\n mobileScreenSize: 500,\n //tinyGif: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n\n addObservers: function() {\n addEventListener('scroll', lazyLoader.throttledLoad);\n addEventListener('resize', lazyLoader.throttledLoad);\n },\n\n removeObservers: function() {\n removeEventListener('scroll', lazyLoader.throttledLoad, false);\n removeEventListener('resize', lazyLoader.throttledLoad, false);\n },\n\n throttleTimer: new Date().getTime(),\n\n throttledLoad: function() {\n var now = new Date().getTime();\n if ((now - lazyLoader.throttleTimer) >= 200) {\n lazyLoader.throttleTimer = now;\n lazyLoader.loadVisibleImages();\n }\n },\n\n loadVisibleImages: function() {\n var scrollY = window.pageYOffset || document.documentElement.scrollTop;\n var pageHeight = window.innerHeight || document.documentElement.clientHeight;\n var range = {\n min: scrollY - 200,\n max: scrollY + pageHeight + 200\n };\n\n var i = 0;\n while (i < lazyLoader.cache.length) {\n var image = lazyLoader.cache[i];\n var imagePosition = getOffsetTop(image);\n var imageHeight = image.height || 0;\n\n if ((imagePosition >= range.min - imageHeight) && (imagePosition <= range.max)) {\n var mobileSrc = image.getAttribute('data-src-mobile');\n\n // image.onload = function() {\n // this.className = this.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n // };\n// Temporary fix for Safari!\n\n image.className = image.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n\n\n if (mobileSrc && screen.width <= lazyLoader.mobileScreenSize) {\n image.src = mobileSrc;\n }\n else {\n image.src = image.getAttribute('data-src');\n }\n\n image.removeAttribute('data-src');\n image.removeAttribute('data-src-mobile');\n\n lazyLoader.cache.splice(i, 1);\n continue;\n }\n\n i++;\n }\n\n if (lazyLoader.cache.length === 0) {\n lazyLoader.removeObservers();\n }\n },\n\n init: function() {\n // Patch IE7- (querySelectorAll)\n if (!document.querySelectorAll) {\n document.querySelectorAll = function(selector) {\n var doc = document,\n head = doc.documentElement.firstChild,\n styleTag = doc.createElement('STYLE');\n head.appendChild(styleTag);\n doc.__qsaels = [];\n styleTag.styleSheet.cssText = selector + '{x:expression(document.__qsaels.push(this))}';\n window.scrollBy(0, 0);\n return doc.__qsaels;\n };\n }\n\n addEventListener('load', function _lazyLoaderInit() {\n var imageNodes = document.querySelectorAll('img[data-src]');\n\n for (var i = 0; i < imageNodes.length; i++) {\n var imageNode = imageNodes[i];\n\n // Add a placeholder if one doesn't exist\n //imageNode.src = imageNode.src || lazyLoader.tinyGif;\n\n lazyLoader.cache.push(imageNode);\n }\n\n lazyLoader.addObservers();\n lazyLoader.loadVisibleImages();\n\n removeEventListener('load', _lazyLoaderInit, false);\n });\n }\n };\n\n lazyLoader.init();\n})();\n","var levenshteinDistance = function( s, t ) {\n if ( !s || !t ){\n return;\n }\n /*\n https://stackoverflow.com/a/11958496/2207606\n */\n var d = []; //2d matrix\n\n // Step 1\n var n = s.length;\n var m = t.length;\n\n if ( n === 0 ){\n return m;\n }\n\n if ( m === 0 ){\n return n;\n }\n\n //Create an array of arrays in javascript ( a descending loop is quicker )\n for ( var i = n; i >= 0; i-- ){\n d[i] = [];\n }\n\n // Step 2\n for ( var i = n; i >= 0; i-- ){\n d[i][0] = i;\n }\n for ( var j = m; j >= 0; j-- ){\n d[0][j] = j;\n }\n\n // Step 3\n for ( var i = 1; i <= n; i++ ) {\n var s_i = s.charAt( i - 1 );\n\n // Step 4\n for ( var j = 1; j <= m; j++ ) {\n\n //Check the jagged ld total so far\n if ( i === j && d[i][j] > 4 ){\n return n;\n }\n\n var t_j = t.charAt( j - 1 );\n var cost = ( s_i === t_j ) ? 0 : 1; // Step 5\n\n //Calculate the minimum\n var mi = d[i - 1][j] + 1;\n var b = d[i][j - 1] + 1;\n var c = d[i - 1][j - 1] + cost;\n\n if ( b < mi ){\n mi = b;\n }\n if ( c < mi ){\n mi = c;\n }\n\n d[i][j] = mi; // Step 6\n\n //Damerau transposition\n if ( i > 1 && j > 1 && s_i === t.charAt( j - 2 ) && s.charAt( i - 2 ) === t_j ) {\n d[i][j] = Math.min( d[i][j], d[i - 2][j - 2] + cost );\n }\n }\n }\n\n // Step 7\n return d[n][m];\n};","$(function() {\n 'use strict';\n var $body = $('body'),\n $menu_toggle = $('#menu-toggle');\n\n $('#menu-icon').on('click', function(ev){\n var $menu_icon = $menu_icon || $('#menu-icon');\n\n if ($('#menu-toggle').is(':checked') === true){\n $('body').removeClass('menu-open');\n $menu_icon.html('b').removeClass('mr-3 mt-0');\n }\n else{\n $('body').addClass('menu-open'); \n $menu_icon.html('×').addClass('mr-3 mt-0');\n }\n });\n});\n","$(function() {\n 'use strict';\n \n /* Close site menu with Escape key. */\n\n let $menuToggle = $( '#menu-toggle' );\n $( document ).keyup( function( ev ) {\n if ( ev.key === 'Escape' ) {\n if ( $menuToggle.is( ':checked') ){\n $menuToggle.click();\n }\n }\n });\n});\n","$(function() {\n 'use strict';\n if (window.location.hash) {\n if ($('.twitter-tweet').length > 0){\n $('.twitter-tweet-rendered').waitUntilExists(function(){\n $('html, body').animate({\n scrollTop: $(window.location.hash).offset().top - 20\n });\n });\n }\n }\n});","/* globals MediumEditor */\n\n$( function() {\n function randomFromArray( arr ){\n return arr[Math.floor( Math.random() * arr.length )];\n }\n\n const images = [\n '/wp-content/themes/botwiki/images/robots/EFFCy_oX4AESj3i.jpeg',\n '/wp-content/themes/botwiki/images/robots/EFKMZbiX4AcQCbN.png',\n '/wp-content/themes/botwiki/images/robots/EFQM7GoXoAAQN6r.png',\n '/wp-content/themes/botwiki/images/robots/EGUA_S0WsAIE03o.png',\n '/wp-content/themes/botwiki/images/robots/EHqDhb3X0AIgaSX.png',\n '/wp-content/themes/botwiki/images/robots/EI54X3oXUAA-i8k.png',\n '/wp-content/themes/botwiki/images/robots/EIFTnxIXkAAKlnM.png',\n '/wp-content/themes/botwiki/images/robots/EIIvWWBWsAUGDtX.png',\n '/wp-content/themes/botwiki/images/robots/EJYIvKRXUAATZt7.png',\n '/wp-content/themes/botwiki/images/robots/EKrm5zOWsAAAwIQ.png',\n '/wp-content/themes/botwiki/images/robots/EMzpr0WX0AUPKAD.png',\n '/wp-content/themes/botwiki/images/robots/ENV--axWoAE2R95.png',\n '/wp-content/themes/botwiki/images/robots/EOzcyTKWAAEIr8u.png',\n '/wp-content/themes/botwiki/images/robots/EP9_Xa7X0AE9-nz.png',\n '/wp-content/themes/botwiki/images/robots/EQMlNajWkAA83Sw.png',\n '/wp-content/themes/botwiki/images/robots/ERA8F2LUwAAdnOI.png',\n '/wp-content/themes/botwiki/images/robots/ERbVQjfXsAAwDRB.png',\n '/wp-content/themes/botwiki/images/robots/ERYwdhZXsAAcYuL.png',\n '/wp-content/themes/botwiki/images/robots/EUlexoMUwAYuMj_.jpeg',\n '/wp-content/themes/botwiki/images/robots/EUQBeAeXgAYxhP5.png',\n '/wp-content/themes/botwiki/images/robots/EV17armWoAM3cMw.png',\n '/wp-content/themes/botwiki/images/robots/EVIPh3sWAAMgwXN.png',\n '/wp-content/themes/botwiki/images/robots/EWspV_dUcAAqkTF.png',\n '/wp-content/themes/botwiki/images/robots/EYTv8FDX0AIBNFo.jpeg',\n '/wp-content/themes/botwiki/images/robots/EZq_8QTX0AYo6wn.jpeg'\n ];\n\n let robotsContainer = document.getElementById( 'robots' );\n let firstRobot = document.querySelector( '.robot-1' );\n\n if ( robotsContainer ){\n robotsContainer.innerHTML = ``; \n\n let index = 1,\n totalCount = 1,\n colSize = Math.floor( robotsContainer.offsetHeight / 100 ),\n rowSize = Math.floor( robotsContainer.offsetWidth / 100 ),\n totalCountFinal = rowSize * colSize;\n\n let css = '',\n head = document.head || document.getElementsByTagName('head')[0],\n style = document.createElement( 'style' );\n\n for ( let i = 0; i <= totalCountFinal; i++ ) {\n css += `.robot:nth-child(${ i }) { animation-delay: ${ 60/totalCountFinal/200 * i }s; }`;\n }\n\n head.appendChild( style );\n style.type = 'text/css';\n style.appendChild( document.createTextNode( css ) );\n\n\n while ( totalCount < totalCountFinal ){\n document.getElementById( 'robots' ).innerHTML = document.getElementById( 'robots' ).innerHTML + ``;\n if ( index < images.length - 1 ){\n index++;\n } else {\n index = 0;\n }\n totalCount++;\n }\n\n\n // let imageEls = document.querySelectorAll( '.robot img' );\n\n // let mouseenterIntervals = [];\n\n // imageEls.forEach( function( img, i ){\n // img.addEventListener( 'mouseenter', function( event ) {\n // event.target.src = randomFromArray( images );\n\n // mouseenterIntervals.push(\n // setInterval( function() {\n // event.target.src = randomFromArray( images );\n // }, 100 ) );\n // }, false )\n\n // img.addEventListener( 'mouseleave', function( event ) {\n // clearInterval( mouseenterIntervals[i] );\n // }, false )\n\n // } );\n\n setTimeout( function(){\n [300, 750, 1250].forEach( function( interval ){\n setInterval( function(){\n let robots = document.querySelectorAll('.robot');\n let robot = randomFromArray( robots );\n robot.src = randomFromArray( images );\n }, interval );\n } );\n }, 1000 );\n }\n\n} );","$(function() {\n 'use strict';\n var $search_filter_checkboxes = $('#search-filters').find('input[type=\"checkbox\"]'),\n $search_filter_tutorials = $('#search-filters-tutorials'),\n $search_filter_resources = $('#search-filters-resources');\n\n $('#search-input').click(function(ev){\n $('#search-filters').removeClass('slide-up-hidden').addClass('slide-up');\n });\n});\n","$(function() {\n 'use strict';\n\n let $select2Els = $( '.js-select2' );\n\n if ( $select2Els && $select2Els.length ){\n $select2Els.each(function(i){\n var $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( $this.select2 ){\n if ( ajax_url){\n window.processSearchResults = function(results){\n var data = [];\n\n $.each(results, function (k, v) {\n var tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n });\n return data;\n };\n\n let options = {};\n\n $this.select2({\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function (params) {\n var query = {\n search: params.term\n };\n return query;\n },\n processResults: function (data, page, query) {\n var results = window.processSearchResults(data);\n\n return {\n results: results.sort(function(a,b){\n return window.levenshteinDistance(a.text, page.term) - window.levenshteinDistance(b.text, page.term);\n })\n };\n }\n }\n });\n }\n else{\n let options = {\n tags: $( this ).data( 'tags' ),\n multiple: $( this ).data( 'multiple' ),\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3\n };\n\n if ( !$this.attr( 'required' ) ){\n options.allowClear = true;\n }\n\n $this.select2( options );\n\n if ( $this.data( 'clear' ) ){\n $this.val(null).trigger( 'change' );\n }\n }\n }\n });\n }\n\n});\n","//$ = jQuery.noConflict(true);\n// Source: https://css-tricks.com/snippets/jquery/smooth-scrolling/\n$(function() {\n 'use strict';\n $('a[href*=\"#\"]')\n .not('[href=\"#\"]')\n .not('[href=\"#0\"]')\n .click(function(event) {\n if (\n location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '') \n && \n location.hostname === this.hostname\n ) {\n var target = $(this.hash);\n\n if (window.history && window.history.pushState && target.selector){\n if (target.selector === '#header'){\n history.pushState(null, null, window.location.pathname);\n }\n else{\n history.pushState(null, null, target.selector);\n }\n }\n\n target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');\n if (target.length) {\n event.preventDefault();\n $('html, body').animate({\n scrollTop: target.offset().top\n }, 500, function() {\n var $target = $(target);\n $target.focus();\n if ($target.is(':focus')) {\n return false;\n } else {\n $target.attr('tabindex','-1');\n $target.focus();\n }\n });\n }\n }\n });\n});","/* globals MediumEditor */\n\n$( function() {\n var $body = $( 'body' ),\n $form_submit_button = $( '#resource-form-submit' );\n\n function enable_selected_tweets_field(){\n var $resource_networks_select = $( '[name=\"resource-networks[]' ),\n $selected_tweets_field = $( '#resource-selected-tweets-field' );\n\n $resource_networks_select.on( 'change', function(){\n var show_selected_tweets_field = false;\n $resource_networks_select.each( function( i ){\n var $this = $( this );\n if ( $this.children( \"option\" ).filter( \":selected\" ).text().indexOf( 'Twitter' ) > -1 ){\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-resource' ) ){\n /* Disassociate resource author to allow logged in users to submit other people's resources. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#resource-name' ).val( 'One cool resource' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n $( '#resource-url' ).val( 'https://coolresource.github.com/' );\n\n $( '#resource-selected-tweets' ).val( 'https://twitter.com/mycoolresource/status/123456789\\nhttps://twitter.com/mycoolresource/status/987654321' );\n $( '#resource-tagline' ).val( 'This is a cool resource.' );\n $( '#resource-networks' ).val( ['twitter-bots'] );\n $( '#resource-networks' ).trigger( 'change' );\n\n $( '#resource-tags' ).val( ['generative', 'images', 'nodejs'] );\n $( '#resource-tags' ).trigger( 'change' );\n\n $( '#resource-is-opensource' ).click();\n\n $( '#resource-source-url' ).val( 'https://github.com/resourcewiki/resourcewiki.org' );\n $( '#resource-source-language' ).val( 'nodejs' );\n $( '#resource-source-language' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '#submit-resource-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n var $resource_type_select = $( '[name=\"resource-type' ),\n $resource_type_name = $( '.resource-type-name' );\n\n $resource_type_select.on( 'change', function( ev ){\n var resource_type_name = $( this ).children( \"option\" ).filter( \":selected\" ).text().toLowerCase();\n\n if ( ['tutorial', 'tool', 'starter project', 'library/framework'].indexOf( resource_type_name ) === -1 ){\n resource_type_name = 'resource';\n }\n\n $resource_type_name.html( resource_type_name );\n $( '#resource-name' ).attr( 'placeholder', `My ${resource_type_name}...` );\n $( '#resource-tagline' ).attr( 'placeholder', `A useful ${resource_type_name}.` );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n var resource_info_network_select_html = $( '#resource-network' ).html();\n\n $( '#add-resource-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.resource-info-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n $( `#resource-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n var $resource_source_info = $( '#resource-source-info' );\n\n $( '#resource-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resource_source_info.removeClass( 'd-none' );\n }\n else{\n $resource_source_info.addClass( 'd-none' );\n }\n } );\n\n var $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $resourceaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resourceaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $resourceaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n} );","/* globals MediumEditor */\n\n$( function() {\n let $body = $( 'body' ),\n $form_submit_button = $( '#bot-form-submit' );\n\n function enable_selected_tweets_field(){\n let $bot_networks_select = $( '[name=\"bot-networks[]' ),\n $selected_tweets_field = $( '#bot-selected-tweets-field' ),\n $selected_tweets_label = $( '#bot-selected-tweets-label' );\n\n\n $bot_networks_select.on( 'change', function(){\n let show_selected_tweets_field = false;\n $bot_networks_select.each( function( i ){\n let $this = $( this ),\n selected_network = $this.children( \"option\" ).filter( \":selected\" ).text();\n\n if ( selected_network.indexOf( 'Twitter' ) > -1 ){\n $selected_tweets_label.html( 'tweets' );\n show_selected_tweets_field = true;\n }\n if ( selected_network.indexOf( 'Mastodon' ) > -1 ){\n $selected_tweets_label.html( 'toots' );\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-your-bot' ) ){\n\n /* Disassociate bot author to allow logged in users to submit other people's bots. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n \n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#bot-name' ).val( '@coolbot' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n window.bot_description_editor.setContent('generates random images.');\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).before( `
` );\n\n $( '#bot-info-2-network' ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n $( '#bot-info-1-network' ).val( 'twitter-bots' ).trigger( 'change' );\n\n $( '#bot-info-2-network' ).val( 'tumblr-bots' ).trigger( 'change' );\n\n $( '#bot-info-1-url' ).val( 'https://twitter.com/coolbot' );\n $( '#bot-info-2-url' ).val( 'https://coolbot.tumblr.com/' );\n\n $( '#bot-selected-tweets' ).val( 'https://twitter.com/mycoolbot/status/123456789\\nhttps://twitter.com/mycoolbot/status/987654321' );\n $( '#bot-tagline' ).val( 'This is a cool bot.' );\n\n $( '#bot-tags' ).append(\n `\n `\n ).val( ['generative', 'images'] ).trigger( 'change' );\n\n $( '#bot-is-opensource' ).click();\n\n $( '#bot-source-url' ).val( 'https://github.com/botwiki/botwiki.org' );\n $( '#bot-source-language' ).val( 'nodejs' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '.js-select2' ).each( function( i ){\n let $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( ajax_url ){\n window.processSearchResults = function( results ){\n let data = [];\n\n $.each( results, function ( k, v ) {\n let tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n } );\n return data;\n };\n\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function ( params ) {\n let query = {\n search: params.term\n };\n return query;\n },\n processResults: function ( data, page, query ) {\n let results = window.processSearchResults( data );\n\n return {\n results: results.sort( function( a,b ){\n return window.levenshteinDistance( a.text, page.term ) - window.levenshteinDistance( b.text, page.term );\n } )\n };\n }\n }\n } );\n }\n else{\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3\n } );\n }\n } );\n\n $( '#submit-bot-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.bot-info-fields' ).length + 1;\n\n $( this ).before( `
\n
\n \n
\n
\n \n
\n
` );\n\n $( `#bot-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n let $bot_source_info = $( '#bot-source-info' );\n\n $( '#bot-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $bot_source_info.removeClass( 'd-none' );\n }\n else{\n $bot_source_info.addClass( 'd-none' );\n }\n } );\n\n let $botSubmittedNotice = $( '#bot-submitted-output' );\n\n $( document ).on( 'change input propertychange', '[name=\"bot-urls[]\"]', function( ev ){\n let $inputField = $( this ),\n $networkField = $inputField.parents( '.bot-info-fields' ).find( '[name=\"bot-networks[]\"]'),\n inputFieldId = $inputField.attr( 'id' ),\n inputFieldValue = $inputField.val().trim();\n\n if ( inputFieldValue.indexOf( 'twitter.com' ) !== -1 ){\n $networkField.val( 'twitter-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'tumblr.com' ) !== -1 ){\n $networkField.val( 'tumblr-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'mastodon.social' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'botsin.space' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'reddit.com' ) !== -1 ){\n $networkField.val( 'reddit-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'youtube.com' ) !== -1 ){\n $networkField.val( 'youtube-bots' ).trigger( 'change' );\n }\n\n if ( inputFieldId.indexOf( 'bot-' ) !== -1 && inputFieldId.indexOf( '-url' ) !== -1 ){\n if ( inputFieldValue && inputFieldValue.length > 5 && inputFieldValue.indexOf( 'http' ) !== -1 ){\n $.ajax( {\n url: `/wp-json/wp/v2/bot?bot_url=${ inputFieldValue }`,\n success: function( data ) {\n if ( typeof data !== 'undefined' && data && data.length > 0 && data.length < 3 ) {\n let resultsHtml = '';\n\n try{\n data = JSON.parse( data );\n } catch( err ){ /* noop */ }\n\n data.forEach( function( bot ){\n resultsHtml += `
\n \n \"Screenshot\n \n
\n
${ bot.title.rendered }
\n

${ bot.excerpt.rendered }

\n
\n
`;\n } );\n $botSubmittedNotice.html( resultsHtml ).parent().removeClass( 'd-none' );\n }\n }\n } );\n } else {\n $botSubmittedNotice.html( '' ).parent().addClass( 'd-none' );\n }\n }\n } );\n\n let $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $botaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $botaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $botaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n if ( typeof MediumEditor !== \"undefined\" ){\n window.bot_description_editor = new MediumEditor( '#bot-description', {\n placeholder: {\n text: 'This bot makes...',\n hideOnClick: true\n },\n toolbar: {\n buttons: ['anchor', 'pre', 'quote']\n }\n } );\n }\n} );","/**\n * tiltfx.js\n * http://www.codrops.com\n *\n * Licensed under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n * \n * Copyright 2015, Codrops\n * http://www.codrops.com\n */\n;( function( window ) {\n\t\n\t'use strict';\n\n\t$( 'blockquote' ).tilt( {\n\t maxTilt: 0.5\n\t} );\n\n\t$( '.card' ).tilt( {\n\t maxTilt: 1\n\t} );\n\n\t$( '.author-card' ).tilt( {\n\t maxTilt: 0.4\n\t} );\t\n\n\t$( '.hover-box > a' ).tilt( {\n\t maxTilt: 10\n\t} );\n\n\t$( '.botwiki-logo' ).tilt( {\n\t maxTilt: 2\n\t} );\n\n\t$( '#menu-wrapper .menu-container' ).tilt( {\n\t maxTilt: 0.8\n\t} );\t\n\n\t$( '.thumbnail-wrapper img' ).tilt( {\n\t maxTilt: 0.5\n\t} );\n\n\t$( document ).on( 'tembeds_tweets_processed', function(){\n\t\t$( '.twitter-tweet' ).tilt( {\n\t\t maxTilt: 2\n\t\t} );\n\t} );\t\n\n\t/**\n\t * **************************************************************************\n\t * utils\n\t * **************************************************************************\n\t */\n\t\n\t// from https://gist.github.com/desandro/1866474\n\tlet lastTime = 0;\n\tlet prefixes = 'webkit moz ms o'.split( ' ' );\n\t// get unprefixed rAF and cAF, if present\n\tlet requestAnimationFrame = window.requestAnimationFrame;\n\tlet cancelAnimationFrame = window.cancelAnimationFrame;\n\t// loop through vendor prefixes and get prefixed rAF and cAF\n\tlet prefix;\n\tfor( let i = 0; i < prefixes.length; i++ ) {\n\t\tif ( requestAnimationFrame && cancelAnimationFrame ) {\n\t\t\tbreak;\n\t\t}\n\t\tprefix = prefixes[i];\n\t\trequestAnimationFrame = requestAnimationFrame || window[ prefix + 'RequestAnimationFrame' ];\n\t\tcancelAnimationFrame = cancelAnimationFrame || window[ prefix + 'CancelAnimationFrame' ] ||\n\t\twindow[ prefix + 'CancelRequestAnimationFrame' ];\n\t}\n\n\t// fallback to setTimeout and clearTimeout if either request/cancel is not supported\n\tif ( !requestAnimationFrame || !cancelAnimationFrame ) {\n\t\trequestAnimationFrame = function( callback, element ) {\n\t\t\tlet currTime = new Date().getTime();\n\t\t\tlet timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );\n\t\t\tlet id = window.setTimeout( function() {\n\t\t\t\tcallback( currTime + timeToCall );\n\t\t\t}, timeToCall );\n\t\t\tlastTime = currTime + timeToCall;\n\t\t\treturn id;\n\t\t};\n\n\t\tcancelAnimationFrame = function( id ) {\n\t\t\twindow.clearTimeout( id );\n\t\t};\n\t}\n\n\tfunction extend( a, b ) {\n\t\tfor( let key in b ) { \n\t\t\tif( b.hasOwnProperty( key ) ) {\n\t\t\t\ta[key] = b[key];\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t}\n\n\t// from http://www.quirksmode.org/js/events_properties.html#position\n\tfunction getMousePos( e ) {\n\t\tlet posx = 0;\n\t\tlet posy = 0;\n\t\tif ( !e ) var e = window.event;\n\t\tif ( e.pageX || e.pageY ) \t{\n\t\t\tposx = e.pageX;\n\t\t\tposy = e.pageY;\n\t\t}\n\t\telse if ( e.clientX || e.clientY ) \t{\n\t\t\tposx = e.clientX + document.body.scrollLeft\n\t\t\t\t+ document.documentElement.scrollLeft;\n\t\t\tposy = e.clientY + document.body.scrollTop\n\t\t\t\t+ document.documentElement.scrollTop;\n\t\t}\n\t\treturn {\n\t\t\tx : posx,\n\t\t\ty : posy\n\t\t}\n\t}\n\n\t// from http://www.sberry.me/articles/javascript-event-throttling-debouncing\n\tfunction throttle( fn, delay ) {\n\t\tlet allowSample = true;\n\n\t\treturn function( e ) {\n\t\t\tif ( allowSample ) {\n\t\t\t\tallowSample = false;\n\t\t\t\tsetTimeout( function() { allowSample = true; }, delay );\n\t\t\t\tfn( e );\n\t\t\t}\n\t\t};\n\t}\n\n\t/***************************************************************************/\n\n\t/**\n\t * TiltFx fn\n\t * @param {HTMLElement} img element\n\t * @param {object} options\n\t */\n\tfunction TiltFx( el, options ) {\n\t\tif( el ) {\n\t\t\tthis.el = el;\n\t\t\tthis.options = extend( {}, this.options );\n\t\t\textend( this.options, options );\n\t\t\tthis._init();\n\t\t\tthis._initEvents();\n\t\t}\n\t}\n\n\t/**\n\t * TiltFx options.\n\t */\n\tTiltFx.prototype.options = {\n\t\t// number of extra image elements ( div with background-image ) to add to the DOM - min:0, max:64 ( for a higher number, it's recommended to remove the transitions of .tilt__front in the stylesheet.\n\t\textraImgs : 2,\n\t\t// set scale factor - value what use to set scale gradients for each extra img\n\t\textraImgsScaleGrade: 0,\n\t\t// the opacity value for all the image elements.\n\t\topacity : 0.7,\n\t\t// when use set array of opacity for each image from bottom to top\n\t\tcustomImgsOpacity: false,\n\t\t// by default the first layer does not move.\n\t\tbgfixed : true,\n\t\t// use reset style for mouseleave event\n\t\tresetOnLeave: true,\n\t\t// image element's movement configuration\n\t\tmovement : {\n\t\t\tperspective : 1000, // perspective value\n\t\t\ttranslateX : -10, // a relative movement of -10px to 10px on the x-axis ( setting a negative value reverses the direction )\n\t\t\ttranslateY : -10, // a relative movement of -10px to 10px on the y-axis \n\t\t\ttranslateZ : 20, // a relative movement of -20px to 20px on the z-axis ( perspective value must be set ). Also, this specific translation is done when the mouse moves vertically.\n\t\t\trotateX : 2, // a relative rotation of -2deg to 2deg on the x-axis ( perspective value must be set )\n\t\t\trotateY : 2, // a relative rotation of -2deg to 2deg on the y-axis ( perspective value must be set )\n\t\t\trotateZ : 0 // z-axis rotation; by default there's no rotation on the z-axis ( perspective value must be set )\n\t\t},\n\t\t// element for relative custom position offset\n\t\telement : {\n\t\t\t// element what will be bind to mousemove\n\t\t\tmouseMoveWatcher: null,\n\t\t\t// element for set bounds of mousemove\n\t\t\tviewWatcher: null,\n\t\t\t// watch for orientation changes\n\t\t\torientationWatcher: window\n\t\t}\n\t}\n\n\t/**\n\t * Initialize: build the necessary structure for the image elements and replace it with the HTML img element.\n\t */\n\tTiltFx.prototype._init = function() {\n\t\tthis.tiltWrapper = document.createElement( 'div' );\n\t\tthis.tiltWrapper.className = 'tilt';\n\n\t\t// main image element.\n\t\tthis.tiltImgBack = document.createElement( 'div' );\n\t\tthis.tiltImgBack.className = 'tilt__back';\n\t\tthis.tiltImgBack.tiltFxType = 'back';\n\t\tthis.tiltImgBack.style.backgroundImage = 'url( ' + this.el.querySelector( 'img' ).src + ' )';\n\t\tthis.tiltWrapper.appendChild( this.tiltImgBack );\n\n\t\t// image elements limit.\n\t\tif( this.options.extraImgs < 1 ) {\n\t\t\tthis.imgCount = 0;\n\t\t}\n\t\telse if( this.options.extraImgs > 64 ) {\n\t\t\tthis.imgCount = 64;\n\t\t}\n\t\telse {\n\t\t\tthis.imgCount = this.options.extraImgs;\n\t\t}\n\n\t\tif( !this.options.movement.perspective ) {\n\t\t\tthis.options.movement.perspective = 0;\n\t\t}\n\n\t\t// add the extra image elements.\n\t\tthis.imgElems = [];\n\t\tlet frontExtraImagesCount = this.imgCount;\n\t\tlet customImgsOpacity = this.options.customImgsOpacity;\n\n\t\tif( !this.options.bgfixed ) {\n\t\t\tthis.imgElems.push( this.tiltImgBack );\n\t\t\t++this.imgCount;\n\t\t}\n\n\t\tfor( let i = 0; i < frontExtraImagesCount; ++i ) {\n\t\t\tlet el = document.createElement( 'div' );\n\t\t\tel.className = 'tilt__front';\n\t\t\tel.style.backgroundImage = 'url( ' + this.el.querySelector( 'img' ).src + ' )';\n\t\t\tthis.tiltWrapper.appendChild( el );\n\t\t\tthis.imgElems.push( el );\n\t\t}\n\n\t\t// set opacity for images\n\t\tthis._initSetImagesOpacity();\n\n\t\t// add it to the DOM and remove original img element.\n\t\tthis.el.parentNode.insertBefore( this.tiltWrapper, this.el );\n\t\tthis.el.parentNode.removeChild( this.el );\n\n\t\t// set mosemove element area and view restrictions\n\t\t// console.log( this );\n\t\tthis._setViewWatcher( this );\n\t\tthis._setMouseMoveWatcher( this );\n\n\t\t// viewWatcher properties: width/height/left/top\n\t\tthis._calcView( this );\n\t};\n\n\t/**\n\t * Set images opacity.\n\t * @private\n\t */\n\tTiltFx.prototype._initSetImagesOpacity = function() {\n\t\tif( this.options.customImgsOpacity ) {\n\t\t\tfor( let i = 0, len = this.imgElems.length; i < len; ++i ) {\n\t\t\t\tlet opacity = ( this.options.customImgsOpacity[i] )\n\t\t\t\t\t? this.options.customImgsOpacity[i]\n\t\t\t\t\t: this.options.opacity;\n\n\t\t\t\tthis.imgElems[i].style.opacity = opacity;\n\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\tfor( let i = 0, len = this.imgElems.length; i < len; ++i ) {\n\t\t\t\tif( this.imgElems[i].tiltFxType === 'back' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.imgElems[i].style.opacity = this.options.opacity;\n\t\t\t}\n\n\t\t}\n\t};\n\n\tTiltFx.prototype._calcView = function( self ) {\n\t\tself.view = {\n\t\t\twidth : self.viewWatcher.offsetWidth,\n\t\t\theight : self.viewWatcher.offsetHeight\n\t\t};\n\t};\n\n\tTiltFx.prototype._setMouseMoveWatcher = function( self ) {\n\t\tlet isSet = false;\n\n\t\tif( self.options.element && self.options.element.mouseMoveWatcher ) {\n\t\t\tlet mouseMoveWatcherElement = document.querySelector( self.options.element.mouseMoveWatcher );\n\n\t\t\tself.mouseMoveWatcher = mouseMoveWatcherElement;\n\t\t\tisSet = true;\n\t\t}\n\n\t\tif( !isSet ) {\n\t\t\tself.mouseMoveWatcher = self.viewWatcher;\n\t\t}\n\t};\n\n\tTiltFx.prototype._setViewWatcher = function( self ) {\n\t\tlet isSet = false;\n\n\t\tif( self.options.element && self.options.element.viewWatcher ) {\n\t\t\tlet customElementRelative = document.querySelector( self.options.element.viewWatcher );\n\n\t\t\tif( customElementRelative ) {\n\t\t\t\tself.viewWatcher = customElementRelative;\n\t\t\t\tisSet = true;\n\t\t\t}\n\t\t}\n\n\t\tif( !isSet ) {\n\t\t\tself.viewWatcher = self.tiltWrapper;\n\t\t}\n\t};\n\n\t/**\n\t * Initialize the events on the main wrapper.\n\t */\n\tTiltFx.prototype._initEvents = function() {\n\t\tlet self = this,\n\t\t\tmoveOpts = self.options.movement;\n\n\t\t// mousemove event..\n\n\t\tself.mouseMoveWatcher.parentNode.parentNode.parentNode.addEventListener( 'mousemove', function( ev ) {\n\t\t\trequestAnimationFrame( function() {\n\t\t\t\t\t// mouse position relative to the document.\n\t\t\t\tlet mousepos = getMousePos( ev ),\n\t\t\t\t\t// document scrolls.\n\t\t\t\t\tdocScrolls = {\n\t\t\t\t\t\tleft : document.body.scrollLeft + document.documentElement.scrollLeft,\n\t\t\t\t\t\ttop : document.body.scrollTop + document.documentElement.scrollTop\n\t\t\t\t\t},\n\t\t\t\t\tbounds = self.tiltWrapper.getBoundingClientRect(),\n\t\t\t\t\t// mouse position relative to the main element ( tiltWrapper ).\n\t\t\t\t\trelmousepos = {\n\t\t\t\t\t\tx : mousepos.x - bounds.left - docScrolls.left,\n\t\t\t\t\t\ty : mousepos.y - bounds.top - docScrolls.top\n\t\t\t\t\t};\n\n\t\t\t\t\t// console.log( { relmousepos } );\n\t\t\t\t\t// console.table( {\n\t\t\t\t\t// \t'relmousepos.x': relmousepos.x,\n\t\t\t\t\t// \t'relmousepos.y': relmousepos.y\n\t\t\t\t\t// } );\n\n\t\t\t\t// configure the movement for each image element.\n\t\t\t\tfor( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\t\t\t\t\tlet el = self.imgElems[i],\n\t\t\t\t\t\trotX = moveOpts.rotateX ? 2 * ( ( i+1 )*moveOpts.rotateX/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.rotateX/self.imgCount ) : 0,\n\t\t\t\t\t\trotY = moveOpts.rotateY ? 2 * ( ( i+1 )*moveOpts.rotateY/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateY/self.imgCount ) : 0,\n\t\t\t\t\t\trotZ = moveOpts.rotateZ ? 2 * ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) : 0,\n\t\t\t\t\t\ttransX = moveOpts.translateX ? 2 * ( ( i+1 )*moveOpts.translateX/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.translateX/self.imgCount ) : 0,\n\t\t\t\t\t\ttransY = moveOpts.translateY ? 2 * ( ( i+1 )*moveOpts.translateY/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateY/self.imgCount ) : 0,\n\t\t\t\t\t\ttransZ = moveOpts.translateZ ? 2 * ( ( i+1 )*moveOpts.translateZ/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateZ/self.imgCount ) : 0,\n\n\t\t\t\t\t\tscale = 1 + ( self.options.extraImgsScaleGrade * ( len - ( i+1 ) ) ),\n\t\t\t\t\t\tscaleCss = ( scale !== 1 ) ? ' scale( ' + scale + ', ' + scale + ' )' : '';\n\n\t\t\t\t\tel.style.WebkitTransform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\tel.style.transform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// reset all when mouse leaves the main wrapper.\n\t\tif( self.options.resetOnLeave ) {\n\t\t\tself.mouseMoveWatcher.parentNode.parentNode.parentNode.addEventListener( 'mouseleave', function () {\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tfor ( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\t\t\t\t\t\tlet el = self.imgElems[i];\n\t\t\t\t\t\tel.style.WebkitTransform = 'perspective( ' + moveOpts.perspective + 'px ) translate3d( 0,0,0 ) rotate3d( 1,1,1,0deg )';\n\t\t\t\t\t\tel.style.transform = 'perspective( ' + moveOpts.perspective + 'px ) translate3d( 0,0,0 ) rotate3d( 1,1,1,0deg )';\n\t\t\t\t\t}\n\t\t\t\t}, 60 );\n\n\t\t\t} );\n\t\t}\n\n\t\t// window resize\n\t\twindow.addEventListener( 'resize', throttle( function() {\n\t\t\t// recalculate viewWatcher properties: width/height/left/top\n\t\t\tself._calcView( self );\n\t\t}, 50 ) );\n\n\n\n\t\twindow.addEventListener( 'deviceorientation', function( ev ) {\n\t\t\trequestAnimationFrame( function() {\n\t\t\t let alpha = ev.alpha; \n\t\t\t let beta = ev.beta;\n\t\t\t let gamma = ev.gamma;\n\n\t\t\t let betaR = beta / 180 * Math.PI;\n\t\t\t let gammaR = gamma / 180 * Math.PI;\n\t\t\t let spinR = Math.atan2( Math.cos( betaR ) * Math.sin( gammaR ), Math.sin( betaR ) );\n\n\t\t\t let spin = spinR * 180 / Math.PI;\n\n\t\t\t\tfor( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\n\t\t\t\t\tlet relmousepos = {\n\t\t\t\t\t\tx: ( self.view.width / 2 ) * ( 1 - gammaR ),\n\t\t\t\t\t\ty: ( self.view.height / 2 ) * ( 1 - betaR )\n\t\t\t\t\t};\n\n\t\t\t\t\tlet el = self.imgElems[i],\n\t\t\t\t\t\trotX = moveOpts.rotateX ? 2 * ( ( i+1 )*moveOpts.rotateX/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.rotateX/self.imgCount ) : 0,\n\t\t\t\t\t\trotY = moveOpts.rotateY ? 2 * ( ( i+1 )*moveOpts.rotateY/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateY/self.imgCount ) : 0,\n\t\t\t\t\t\trotZ = moveOpts.rotateZ ? 2 * ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) : 0,\n\t\t\t\t\t\ttransX = moveOpts.translateX ? 2 * ( ( i+1 )*moveOpts.translateX/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.translateX/self.imgCount ) : 0,\n\t\t\t\t\t\ttransY = moveOpts.translateY ? 2 * ( ( i+1 )*moveOpts.translateY/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateY/self.imgCount ) : 0,\n\t\t\t\t\t\ttransZ = moveOpts.translateZ ? 2 * ( ( i+1 )*moveOpts.translateZ/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateZ/self.imgCount ) : 0,\n\n\t\t\t\t\t\tscale = 1 + ( self.options.extraImgsScaleGrade * ( len - ( i+1 ) ) ),\n\t\t\t\t\t\tscaleCss = ( scale !== 1 ) ? ' scale( ' + scale + ', ' + scale + ' )' : '';\n\n\n\t\t\t\t\tel.style.WebkitTransform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\tel.style.transform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\t// console.table( {\n\t\t\t\t\t// \t'device.betaR': betaR,\n\t\t\t\t\t// \t'device.gammaR': gammaR,\n\t\t\t\t\t// \t'device.spinR': spinR,\n\t\t\t\t\t// \t'relmousepos.x': relmousepos.x,\n\t\t\t\t\t// \t'relmousepos.y': relmousepos.y\n\t\t\t\t\t// } );\n\n\t\t\t\t\t// console.log( {\n\t\t\t\t\t// \tdevice:{\n\t\t\t\t\t// \t\talpha,\n\t\t\t\t\t// \t\tbeta,\n\t\t\t\t\t// \t\tgamma,\n\t\t\t\t\t// \t\tbetaR,\n\t\t\t\t\t// \t\tgammaR,\n\t\t\t\t\t// \t\tspinR,\n\t\t\t\t\t// \t\tspin,\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \telement:{\n\t\t\t\t\t// \t\tel,\n\t\t\t\t\t// \t\trotX,\n\t\t\t\t\t// \t\trotY,\n\t\t\t\t\t// \t\trotZ,\n\t\t\t\t\t// \t\ttransX,\n\t\t\t\t\t// \t\ttransY,\n\t\t\t\t\t// \t\ttransZ\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \trelmousepos\n\t\t\t\t\t// } );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, true );\t\t\n\t};\n\n\t/**\n\t * Init tiltFx on each imgs with the class \"tilt-effect\"\n\t */\n\tTiltFx.prototype.init = function() {\n\t\t// search for imgs with the class \"tilt-effect\"\n\t\t[].slice.call( document.querySelectorAll( 'picture' ) ).forEach( function( img ) {\n\t\t\ttry{\n\t\t\t\tnew TiltFx( img, JSON.parse( img.querySelector( 'img' ).getAttribute( 'data-tilt-options' ).replaceAll( '\\'', '\"' ) ) );\n\t\t\t} catch( err ){ /* console.log( err ) */ }\n\t\t} );\n\t};\n\n\t( new TiltFx() ).init();\n\n\twindow.TiltFx = TiltFx;\n\n} )( window );\n","// Source: https://gist.github.com/buu700/4200601\n/**\n* @function\n* @property {object} jQuery plugin which runs handler function once specified element is inserted into the DOM\n* @param {function} handler A function to execute at the time when the element is inserted\n* @param {bool} shouldRunHandlerOnce Optional: if true, handler is unbound after its first invocation\n* @example $(selector).waitUntilExists(function);\n*/\n\n$.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) {\n var found = 'found';\n var $this = $(this.selector);\n var $elements = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);\n \n if (!isChild){\n (window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =\n window.setInterval(function () { $this.waitUntilExists(handler, shouldRunHandlerOnce, true); }, 500);\n }\n else if (shouldRunHandlerOnce && $elements.length){\n window.clearInterval(window.waitUntilExists_Intervals[this.selector]);\n }\n \n return $this;\n};\n"]} \ No newline at end of file +{"version":3,"sources":["back-to-top.js","expand-image.js","helpers.js","highlight-js.js","lazy-load-images.js","levenshtein_distance.js","menu-toggle.js","misc.js","on-load-scroll.js","robots.js","search.js","select2-init.js","smooth-scroll.js","submit-resource.js","submit-your-bot.js","tiltfx.js","waitUntilExists.jquery.js"],"names":["$","jQuery","noConflict","window","scroll","backToTop","document","getElementById","pageYOffset","documentElement","scrollTop","body","screen","height","classList","add","remove","bwHelpers","randomFromArray","arr","count","newArray","i","sort","Math","round","random","push","pop","hljs","initHighlighting","called","addEventListener","n","f","attachEvent","removeEventListener","b","detachEvent","getOffsetTop","el","val","offsetParent","offsetTop","lazyLoader","cache","mobileScreenSize","addObservers","throttledLoad","removeObservers","throttleTimer","Date","getTime","now","loadVisibleImages","scrollY","range","innerHeight","clientHeight","length","image","imagePosition","mobileSrc","getAttribute","className","replace","width","src","removeAttribute","splice","init","querySelectorAll","selector","doc","head","firstChild","styleTag","createElement","appendChild","__qsaels","styleSheet","cssText","scrollBy","_lazyLoaderInit","imageNodes","imageNode","levenshteinDistance","s","t","d","m","j","s_i","charAt","t_j","cost","mi","c","min","on","ev","$menu_icon","is","removeClass","html","addClass","$menuToggle","keyup","key","click","location","hash","waitUntilExists","animate","offset","top","floor","images","robotsContainer","querySelector","innerHTML","index","totalCount","colSize","offsetHeight","totalCountFinal","offsetWidth","css","getElementsByTagName","style","type","createTextNode","setTimeout","forEach","interval","setInterval","find","$select2Els","each","$this","this","ajax_url","data","select2","processSearchResults","results","k","v","tag_name","name","id","text","tags","placeholder","attr","minimumInputLength","parseInt","ajax","url","dataType","params","search","term","processResults","page","query","a","options","multiple","allowClear","trigger","not","event","pathname","hostname","target","history","pushState","slice","preventDefault","$target","focus","$body","$form_submit_button","enable_selected_tweets_field","$resource_networks_select","$selected_tweets_field","show_selected_tweets_field","children","filter","indexOf","hasClass","$disassociateAuthorBtn","before","submit","$resource_type_select","$resource_type_name","resource_type_name","toLowerCase","new_id","resource_info_network_select_html","$resource_source_info","$apply_for_botmaker_badge","$resourceaker_badge_application","$bot_networks_select","$selected_tweets_label","selected_network","bot_description_editor","setContent","bot_info_network_select_html","append","$bot_source_info","$botSubmittedNotice","$inputField","$networkField","parents","inputFieldId","inputFieldValue","trim","success","resultsHtml","JSON","parse","err","bot","link","featured_image_url","title","rendered","excerpt","parent","$botaker_badge_application","MediumEditor","hideOnClick","toolbar","buttons","addTiltEffect","$el","tilt","maxTilt","outerWidth","lastTime","prefixes","split","requestAnimationFrame","cancelAnimationFrame","prefix","extend","hasOwnProperty","TiltFx","_init","_initEvents","callback","element","currTime","timeToCall","max","clearTimeout","prototype","extraImgs","extraImgsScaleGrade","opacity","customImgsOpacity","bgfixed","resetOnLeave","movement","perspective","translateX","translateY","translateZ","rotateX","rotateY","rotateZ","mouseMoveWatcher","viewWatcher","orientationWatcher","tiltWrapper","tiltImgBack","tiltFxType","backgroundImage","imgCount","imgElems","frontExtraImagesCount","_initSetImagesOpacity","parentNode","insertBefore","removeChild","_setViewWatcher","_setMouseMoveWatcher","_calcView","len","self","view","isSet","mouseMoveWatcherElement","customElementRelative","moveOpts","mousepos","e","posx","posy","pageX","pageY","clientX","clientY","scrollLeft","x","y","getMousePos","docScrolls","bounds","getBoundingClientRect","relmousepos","left","rotX","rotY","rotZ","transX","transY","transZ","scale","scaleCss","WebkitTransform","transform","fn","delay","allowSample","throttle","alpha","beta","gamma","betaR","PI","gammaR","atan2","cos","sin","call","img","replaceAll","handler","shouldRunHandlerOnce","isChild","$elements","clearInterval","waitUntilExists_Intervals"],"mappings":"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","file":"scripts.min.js","sourcesContent":["$ = jQuery.noConflict(true);\n\n$(function() {\n 'use strict';\n $(window).scroll(function(){\n /* TODO: Legacy script, rewrite with jQuery. */\n var backToTop = document.getElementById('back-to-top'),\n documentScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n if (documentScrollTop > (screen.height/2)){\n backToTop.classList.add('slide-up');\n backToTop.classList.remove('slide-down');\n }\n else{\n backToTop.classList.remove('slide-up');\n backToTop.classList.add('slide-down');\n }\n });\n});","$(function() {\n 'use strict';\n // $('.expand-image').click(function(ev){\n // ev.preventDefault();\n // $(this).toggleClass('image-expanded');\n // $(this).parents('.thumbnail-wrapper').toggleClass('image-expanded');\n // return false;\n // });\n});\n","window.bwHelpers = {\n randomFromArray: function( arr, count ) {\n let newArray = [];\n count = count || 1;\n for ( let i = 0; i < count; i++){\n arr.sort( function(){ return Math.round( Math.random() ) ; } );\n newArray.push( arr.pop() );\n }\n return newArray;\n }\n}\n","$( function(){\n 'use strict';\n if ( typeof hljs !== 'undefined' ){\n hljs.initHighlighting.called = false;\n hljs.initHighlighting();\n }\n} );\n","/*\n Lazy Load Images without jQuery\n http://kaizau.github.com/Lazy-Load-Images-without-jQuery/\n Original by Mike Pulaski - http://www.mikepulaski.com\n Modified by Kai Zau - http://kaizau.com\n*/\n(function() {\n var addEventListener = window.addEventListener || function(n,f) { window.attachEvent('on'+n, f); },\n removeEventListener = window.removeEventListener || function(n,f,b) { window.detachEvent('on'+n, f); };\n\n // For IE7 compatibility\n // Adapted from http://www.quirksmode.org/js/findpos.html\n function getOffsetTop(el) {\n var val = 0;\n if (el.offsetParent) {\n do {\n val += el.offsetTop;\n } while (el = el.offsetParent);\n return val;\n }\n } \n\n var lazyLoader = {\n cache: [],\n mobileScreenSize: 500,\n //tinyGif: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n\n addObservers: function() {\n addEventListener('scroll', lazyLoader.throttledLoad);\n addEventListener('resize', lazyLoader.throttledLoad);\n },\n\n removeObservers: function() {\n removeEventListener('scroll', lazyLoader.throttledLoad, false);\n removeEventListener('resize', lazyLoader.throttledLoad, false);\n },\n\n throttleTimer: new Date().getTime(),\n\n throttledLoad: function() {\n var now = new Date().getTime();\n if ((now - lazyLoader.throttleTimer) >= 200) {\n lazyLoader.throttleTimer = now;\n lazyLoader.loadVisibleImages();\n }\n },\n\n loadVisibleImages: function() {\n var scrollY = window.pageYOffset || document.documentElement.scrollTop;\n var pageHeight = window.innerHeight || document.documentElement.clientHeight;\n var range = {\n min: scrollY - 200,\n max: scrollY + pageHeight + 200\n };\n\n var i = 0;\n while (i < lazyLoader.cache.length) {\n var image = lazyLoader.cache[i];\n var imagePosition = getOffsetTop(image);\n var imageHeight = image.height || 0;\n\n if ((imagePosition >= range.min - imageHeight) && (imagePosition <= range.max)) {\n var mobileSrc = image.getAttribute('data-src-mobile');\n\n // image.onload = function() {\n // this.className = this.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n // };\n// Temporary fix for Safari!\n\n image.className = image.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n\n\n if (mobileSrc && screen.width <= lazyLoader.mobileScreenSize) {\n image.src = mobileSrc;\n }\n else {\n image.src = image.getAttribute('data-src');\n }\n\n image.removeAttribute('data-src');\n image.removeAttribute('data-src-mobile');\n\n lazyLoader.cache.splice(i, 1);\n continue;\n }\n\n i++;\n }\n\n if (lazyLoader.cache.length === 0) {\n lazyLoader.removeObservers();\n }\n },\n\n init: function() {\n // Patch IE7- (querySelectorAll)\n if (!document.querySelectorAll) {\n document.querySelectorAll = function(selector) {\n var doc = document,\n head = doc.documentElement.firstChild,\n styleTag = doc.createElement('STYLE');\n head.appendChild(styleTag);\n doc.__qsaels = [];\n styleTag.styleSheet.cssText = selector + '{x:expression(document.__qsaels.push(this))}';\n window.scrollBy(0, 0);\n return doc.__qsaels;\n };\n }\n\n addEventListener('load', function _lazyLoaderInit() {\n var imageNodes = document.querySelectorAll('img[data-src]');\n\n for (var i = 0; i < imageNodes.length; i++) {\n var imageNode = imageNodes[i];\n\n // Add a placeholder if one doesn't exist\n //imageNode.src = imageNode.src || lazyLoader.tinyGif;\n\n lazyLoader.cache.push(imageNode);\n }\n\n lazyLoader.addObservers();\n lazyLoader.loadVisibleImages();\n\n removeEventListener('load', _lazyLoaderInit, false);\n });\n }\n };\n\n lazyLoader.init();\n})();\n","var levenshteinDistance = function( s, t ) {\n if ( !s || !t ){\n return;\n }\n /*\n https://stackoverflow.com/a/11958496/2207606\n */\n var d = []; //2d matrix\n\n // Step 1\n var n = s.length;\n var m = t.length;\n\n if ( n === 0 ){\n return m;\n }\n\n if ( m === 0 ){\n return n;\n }\n\n //Create an array of arrays in javascript ( a descending loop is quicker )\n for ( var i = n; i >= 0; i-- ){\n d[i] = [];\n }\n\n // Step 2\n for ( var i = n; i >= 0; i-- ){\n d[i][0] = i;\n }\n for ( var j = m; j >= 0; j-- ){\n d[0][j] = j;\n }\n\n // Step 3\n for ( var i = 1; i <= n; i++ ) {\n var s_i = s.charAt( i - 1 );\n\n // Step 4\n for ( var j = 1; j <= m; j++ ) {\n\n //Check the jagged ld total so far\n if ( i === j && d[i][j] > 4 ){\n return n;\n }\n\n var t_j = t.charAt( j - 1 );\n var cost = ( s_i === t_j ) ? 0 : 1; // Step 5\n\n //Calculate the minimum\n var mi = d[i - 1][j] + 1;\n var b = d[i][j - 1] + 1;\n var c = d[i - 1][j - 1] + cost;\n\n if ( b < mi ){\n mi = b;\n }\n if ( c < mi ){\n mi = c;\n }\n\n d[i][j] = mi; // Step 6\n\n //Damerau transposition\n if ( i > 1 && j > 1 && s_i === t.charAt( j - 2 ) && s.charAt( i - 2 ) === t_j ) {\n d[i][j] = Math.min( d[i][j], d[i - 2][j - 2] + cost );\n }\n }\n }\n\n // Step 7\n return d[n][m];\n};","$(function() {\n 'use strict';\n var $body = $('body'),\n $menu_toggle = $('#menu-toggle');\n\n $('#menu-icon').on('click', function(ev){\n var $menu_icon = $menu_icon || $('#menu-icon');\n\n if ($('#menu-toggle').is(':checked') === true){\n $('body').removeClass('menu-open');\n $menu_icon.html('b').removeClass('mr-3 mt-0');\n }\n else{\n $('body').addClass('menu-open'); \n $menu_icon.html('×').addClass('mr-3 mt-0');\n }\n });\n});\n","$(function() {\n 'use strict';\n \n /* Close site menu with Escape key. */\n\n let $menuToggle = $( '#menu-toggle' );\n $( document ).keyup( function( ev ) {\n if ( ev.key === 'Escape' ) {\n if ( $menuToggle.is( ':checked') ){\n $menuToggle.click();\n }\n }\n });\n});\n","$(function() {\n 'use strict';\n if (window.location.hash) {\n if ($('.twitter-tweet').length > 0){\n $('.twitter-tweet-rendered').waitUntilExists(function(){\n $('html, body').animate({\n scrollTop: $(window.location.hash).offset().top - 20\n });\n });\n }\n }\n});","/* globals MediumEditor */\n\n$( function() {\n function randomFromArray( arr ){\n return arr[Math.floor( Math.random() * arr.length )];\n }\n\n const images = [\n '/wp-content/themes/botwiki/images/robots/EFFCy_oX4AESj3i.jpeg',\n '/wp-content/themes/botwiki/images/robots/EFKMZbiX4AcQCbN.png',\n '/wp-content/themes/botwiki/images/robots/EFQM7GoXoAAQN6r.png',\n '/wp-content/themes/botwiki/images/robots/EGUA_S0WsAIE03o.png',\n '/wp-content/themes/botwiki/images/robots/EHqDhb3X0AIgaSX.png',\n '/wp-content/themes/botwiki/images/robots/EI54X3oXUAA-i8k.png',\n '/wp-content/themes/botwiki/images/robots/EIFTnxIXkAAKlnM.png',\n '/wp-content/themes/botwiki/images/robots/EIIvWWBWsAUGDtX.png',\n '/wp-content/themes/botwiki/images/robots/EJYIvKRXUAATZt7.png',\n '/wp-content/themes/botwiki/images/robots/EKrm5zOWsAAAwIQ.png',\n '/wp-content/themes/botwiki/images/robots/EMzpr0WX0AUPKAD.png',\n '/wp-content/themes/botwiki/images/robots/ENV--axWoAE2R95.png',\n '/wp-content/themes/botwiki/images/robots/EOzcyTKWAAEIr8u.png',\n '/wp-content/themes/botwiki/images/robots/EP9_Xa7X0AE9-nz.png',\n '/wp-content/themes/botwiki/images/robots/EQMlNajWkAA83Sw.png',\n '/wp-content/themes/botwiki/images/robots/ERA8F2LUwAAdnOI.png',\n '/wp-content/themes/botwiki/images/robots/ERbVQjfXsAAwDRB.png',\n '/wp-content/themes/botwiki/images/robots/ERYwdhZXsAAcYuL.png',\n '/wp-content/themes/botwiki/images/robots/EUlexoMUwAYuMj_.jpeg',\n '/wp-content/themes/botwiki/images/robots/EUQBeAeXgAYxhP5.png',\n '/wp-content/themes/botwiki/images/robots/EV17armWoAM3cMw.png',\n '/wp-content/themes/botwiki/images/robots/EVIPh3sWAAMgwXN.png',\n '/wp-content/themes/botwiki/images/robots/EWspV_dUcAAqkTF.png',\n '/wp-content/themes/botwiki/images/robots/EYTv8FDX0AIBNFo.jpeg',\n '/wp-content/themes/botwiki/images/robots/EZq_8QTX0AYo6wn.jpeg'\n ];\n\n let robotsContainer = document.getElementById( 'robots' );\n let firstRobot = document.querySelector( '.robot-1' );\n\n if ( robotsContainer ){\n robotsContainer.innerHTML = ``; \n\n let index = 1,\n totalCount = 1,\n colSize = Math.floor( robotsContainer.offsetHeight / 100 ),\n rowSize = Math.floor( robotsContainer.offsetWidth / 100 ),\n totalCountFinal = rowSize * colSize;\n\n let css = '',\n head = document.head || document.getElementsByTagName('head')[0],\n style = document.createElement( 'style' );\n\n for ( let i = 0; i <= totalCountFinal; i++ ) {\n css += `.robot:nth-child(${ i }) { animation-delay: ${ 60/totalCountFinal/200 * i }s; }`;\n }\n\n head.appendChild( style );\n style.type = 'text/css';\n style.appendChild( document.createTextNode( css ) );\n\n\n while ( totalCount < totalCountFinal ){\n document.getElementById( 'robots' ).innerHTML = document.getElementById( 'robots' ).innerHTML + ``;\n if ( index < images.length - 1 ){\n index++;\n } else {\n index = 0;\n }\n totalCount++;\n }\n\n\n // let imageEls = document.querySelectorAll( '.robot img' );\n\n // let mouseenterIntervals = [];\n\n // imageEls.forEach( function( img, i ){\n // img.addEventListener( 'mouseenter', function( event ) {\n // event.target.src = randomFromArray( images );\n\n // mouseenterIntervals.push(\n // setInterval( function() {\n // event.target.src = randomFromArray( images );\n // }, 100 ) );\n // }, false )\n\n // img.addEventListener( 'mouseleave', function( event ) {\n // clearInterval( mouseenterIntervals[i] );\n // }, false )\n\n // } );\n\n setTimeout( function(){\n [300, 750, 1250].forEach( function( interval ){\n setInterval( function(){\n let robots = document.querySelectorAll('.robot');\n let robot = randomFromArray( robots );\n robot.src = randomFromArray( images );\n }, interval );\n } );\n }, 1000 );\n }\n\n} );","$(function() {\n 'use strict';\n var $search_filter_checkboxes = $('#search-filters').find('input[type=\"checkbox\"]'),\n $search_filter_tutorials = $('#search-filters-tutorials'),\n $search_filter_resources = $('#search-filters-resources');\n\n $('#search-input').click(function(ev){\n $('#search-filters').removeClass('slide-up-hidden').addClass('slide-up');\n });\n});\n","$(function() {\n 'use strict';\n\n let $select2Els = $( '.js-select2' );\n\n if ( $select2Els && $select2Els.length ){\n $select2Els.each(function(i){\n var $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( $this.select2 ){\n if ( ajax_url){\n window.processSearchResults = function(results){\n var data = [];\n\n $.each(results, function (k, v) {\n var tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n });\n return data;\n };\n\n let options = {};\n\n $this.select2({\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function (params) {\n var query = {\n search: params.term\n };\n return query;\n },\n processResults: function (data, page, query) {\n var results = window.processSearchResults(data);\n\n return {\n results: results.sort(function(a,b){\n return window.levenshteinDistance(a.text, page.term) - window.levenshteinDistance(b.text, page.term);\n })\n };\n }\n }\n });\n }\n else{\n let options = {\n tags: $( this ).data( 'tags' ),\n multiple: $( this ).data( 'multiple' ),\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3\n };\n\n if ( !$this.attr( 'required' ) ){\n options.allowClear = true;\n }\n\n $this.select2( options );\n\n if ( $this.data( 'clear' ) ){\n $this.val(null).trigger( 'change' );\n }\n }\n }\n });\n }\n\n});\n","//$ = jQuery.noConflict(true);\n// Source: https://css-tricks.com/snippets/jquery/smooth-scrolling/\n$(function() {\n 'use strict';\n $('a[href*=\"#\"]')\n .not('[href=\"#\"]')\n .not('[href=\"#0\"]')\n .click(function(event) {\n if (\n location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '') \n && \n location.hostname === this.hostname\n ) {\n var target = $(this.hash);\n\n if (window.history && window.history.pushState && target.selector){\n if (target.selector === '#header'){\n history.pushState(null, null, window.location.pathname);\n }\n else{\n history.pushState(null, null, target.selector);\n }\n }\n\n target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');\n if (target.length) {\n event.preventDefault();\n $('html, body').animate({\n scrollTop: target.offset().top\n }, 500, function() {\n var $target = $(target);\n $target.focus();\n if ($target.is(':focus')) {\n return false;\n } else {\n $target.attr('tabindex','-1');\n $target.focus();\n }\n });\n }\n }\n });\n});","/* globals MediumEditor */\n\n$( function() {\n var $body = $( 'body' ),\n $form_submit_button = $( '#resource-form-submit' );\n\n function enable_selected_tweets_field(){\n var $resource_networks_select = $( '[name=\"resource-networks[]' ),\n $selected_tweets_field = $( '#resource-selected-tweets-field' );\n\n $resource_networks_select.on( 'change', function(){\n var show_selected_tweets_field = false;\n $resource_networks_select.each( function( i ){\n var $this = $( this );\n if ( $this.children( \"option\" ).filter( \":selected\" ).text().indexOf( 'Twitter' ) > -1 ){\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-resource' ) ){\n /* Disassociate resource author to allow logged in users to submit other people's resources. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#resource-name' ).val( 'One cool resource' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n $( '#resource-url' ).val( 'https://coolresource.github.com/' );\n\n $( '#resource-selected-tweets' ).val( 'https://twitter.com/mycoolresource/status/123456789\\nhttps://twitter.com/mycoolresource/status/987654321' );\n $( '#resource-tagline' ).val( 'This is a cool resource.' );\n $( '#resource-networks' ).val( ['twitter-bots'] );\n $( '#resource-networks' ).trigger( 'change' );\n\n $( '#resource-tags' ).val( ['generative', 'images', 'nodejs'] );\n $( '#resource-tags' ).trigger( 'change' );\n\n $( '#resource-is-opensource' ).click();\n\n $( '#resource-source-url' ).val( 'https://github.com/resourcewiki/resourcewiki.org' );\n $( '#resource-source-language' ).val( 'nodejs' );\n $( '#resource-source-language' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '#submit-resource-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n var $resource_type_select = $( '[name=\"resource-type' ),\n $resource_type_name = $( '.resource-type-name' );\n\n $resource_type_select.on( 'change', function( ev ){\n var resource_type_name = $( this ).children( \"option\" ).filter( \":selected\" ).text().toLowerCase();\n\n if ( ['tutorial', 'tool', 'starter project', 'library/framework'].indexOf( resource_type_name ) === -1 ){\n resource_type_name = 'resource';\n }\n\n $resource_type_name.html( resource_type_name );\n $( '#resource-name' ).attr( 'placeholder', `My ${resource_type_name}...` );\n $( '#resource-tagline' ).attr( 'placeholder', `A useful ${resource_type_name}.` );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n var resource_info_network_select_html = $( '#resource-network' ).html();\n\n $( '#add-resource-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.resource-info-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n $( `#resource-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n var $resource_source_info = $( '#resource-source-info' );\n\n $( '#resource-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resource_source_info.removeClass( 'd-none' );\n }\n else{\n $resource_source_info.addClass( 'd-none' );\n }\n } );\n\n var $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $resourceaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resourceaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $resourceaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n} );","/* globals MediumEditor */\n\n$( function() {\n let $body = $( 'body' ),\n $form_submit_button = $( '#bot-form-submit' );\n\n function enable_selected_tweets_field(){\n let $bot_networks_select = $( '[name=\"bot-networks[]' ),\n $selected_tweets_field = $( '#bot-selected-tweets-field' ),\n $selected_tweets_label = $( '#bot-selected-tweets-label' );\n\n\n $bot_networks_select.on( 'change', function(){\n let show_selected_tweets_field = false;\n $bot_networks_select.each( function( i ){\n let $this = $( this ),\n selected_network = $this.children( \"option\" ).filter( \":selected\" ).text();\n\n if ( selected_network.indexOf( 'Twitter' ) > -1 ){\n $selected_tweets_label.html( 'tweets' );\n show_selected_tweets_field = true;\n }\n if ( selected_network.indexOf( 'Mastodon' ) > -1 ){\n $selected_tweets_label.html( 'toots' );\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-your-bot' ) ){\n\n /* Disassociate bot author to allow logged in users to submit other people's bots. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n \n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#bot-name' ).val( '@coolbot' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n window.bot_description_editor.setContent('generates random images.');\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).before( `
` );\n\n $( '#bot-info-2-network' ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n $( '#bot-info-1-network' ).val( 'twitter-bots' ).trigger( 'change' );\n\n $( '#bot-info-2-network' ).val( 'tumblr-bots' ).trigger( 'change' );\n\n $( '#bot-info-1-url' ).val( 'https://twitter.com/coolbot' );\n $( '#bot-info-2-url' ).val( 'https://coolbot.tumblr.com/' );\n\n $( '#bot-selected-tweets' ).val( 'https://twitter.com/mycoolbot/status/123456789\\nhttps://twitter.com/mycoolbot/status/987654321' );\n $( '#bot-tagline' ).val( 'This is a cool bot.' );\n\n $( '#bot-tags' ).append(\n `\n `\n ).val( ['generative', 'images'] ).trigger( 'change' );\n\n $( '#bot-is-opensource' ).click();\n\n $( '#bot-source-url' ).val( 'https://github.com/botwiki/botwiki.org' );\n $( '#bot-source-language' ).val( 'nodejs' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '.js-select2' ).each( function( i ){\n let $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( ajax_url ){\n window.processSearchResults = function( results ){\n let data = [];\n\n $.each( results, function ( k, v ) {\n let tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n } );\n return data;\n };\n\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function ( params ) {\n let query = {\n search: params.term\n };\n return query;\n },\n processResults: function ( data, page, query ) {\n let results = window.processSearchResults( data );\n\n return {\n results: results.sort( function( a,b ){\n return window.levenshteinDistance( a.text, page.term ) - window.levenshteinDistance( b.text, page.term );\n } )\n };\n }\n }\n } );\n }\n else{\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3\n } );\n }\n } );\n\n $( '#submit-bot-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.bot-info-fields' ).length + 1;\n\n $( this ).before( `
\n
\n \n
\n
\n \n
\n
` );\n\n $( `#bot-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n let $bot_source_info = $( '#bot-source-info' );\n\n $( '#bot-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $bot_source_info.removeClass( 'd-none' );\n }\n else{\n $bot_source_info.addClass( 'd-none' );\n }\n } );\n\n let $botSubmittedNotice = $( '#bot-submitted-output' );\n\n $( document ).on( 'change input propertychange', '[name=\"bot-urls[]\"]', function( ev ){\n let $inputField = $( this ),\n $networkField = $inputField.parents( '.bot-info-fields' ).find( '[name=\"bot-networks[]\"]'),\n inputFieldId = $inputField.attr( 'id' ),\n inputFieldValue = $inputField.val().trim();\n\n if ( inputFieldValue.indexOf( 'twitter.com' ) !== -1 ){\n $networkField.val( 'twitter-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'tumblr.com' ) !== -1 ){\n $networkField.val( 'tumblr-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'mastodon.social' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'botsin.space' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'reddit.com' ) !== -1 ){\n $networkField.val( 'reddit-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'youtube.com' ) !== -1 ){\n $networkField.val( 'youtube-bots' ).trigger( 'change' );\n }\n\n if ( inputFieldId.indexOf( 'bot-' ) !== -1 && inputFieldId.indexOf( '-url' ) !== -1 ){\n if ( inputFieldValue && inputFieldValue.length > 5 && inputFieldValue.indexOf( 'http' ) !== -1 ){\n $.ajax( {\n url: `/wp-json/wp/v2/bot?bot_url=${ inputFieldValue }`,\n success: function( data ) {\n if ( typeof data !== 'undefined' && data && data.length > 0 && data.length < 3 ) {\n let resultsHtml = '';\n\n try{\n data = JSON.parse( data );\n } catch( err ){ /* noop */ }\n\n data.forEach( function( bot ){\n resultsHtml += `
\n \n \"Screenshot\n \n
\n
${ bot.title.rendered }
\n

${ bot.excerpt.rendered }

\n
\n
`;\n } );\n $botSubmittedNotice.html( resultsHtml ).parent().removeClass( 'd-none' );\n }\n }\n } );\n } else {\n $botSubmittedNotice.html( '' ).parent().addClass( 'd-none' );\n }\n }\n } );\n\n let $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $botaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $botaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $botaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n if ( typeof MediumEditor !== \"undefined\" ){\n window.bot_description_editor = new MediumEditor( '#bot-description', {\n placeholder: {\n text: 'This bot makes...',\n hideOnClick: true\n },\n toolbar: {\n buttons: ['anchor', 'pre', 'quote']\n }\n } );\n }\n} );","/**\n * tiltfx.js\n * http://www.codrops.com\n *\n * Licensed under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n * \n * Copyright 2015, Codrops\n * http://www.codrops.com\n */\n;( function( window ) {\n\t\n\t'use strict';\n\n\tfunction addTiltEffect( $el ){\n\t\t$el.tilt( {\n\t\t maxTilt: 200 / $el.outerWidth()\n\t\t} );\n\t}\n\n\t$( '.card, blockquote' ).each( function(){\n\t\taddTiltEffect( $( this ) );\n\t} );\n\n\n\t$( '.hover-box > a' ).tilt( {\n\t maxTilt: 10\n\t} );\n\n\t$( '.botwiki-logo' ).tilt( {\n\t maxTilt: 2\n\t} );\n\n\t$( '#menu-wrapper .menu-container' ).tilt( {\n\t maxTilt: 0.8\n\t} );\t\n\n\t$( '.thumbnail-wrapper img' ).tilt( {\n\t maxTilt: 0.5\n\t} );\n\n\t$( document ).on( 'tembeds_tweets_processed', function(){\n\t\t$( '.twitter-tweet' ).each( function(){\n\t\t\taddTiltEffect( $( this ) );\n\t\t} );\n\t} );\t\n\n\t/**\n\t * **************************************************************************\n\t * utils\n\t * **************************************************************************\n\t */\n\t\n\t// from https://gist.github.com/desandro/1866474\n\tlet lastTime = 0;\n\tlet prefixes = 'webkit moz ms o'.split( ' ' );\n\t// get unprefixed rAF and cAF, if present\n\tlet requestAnimationFrame = window.requestAnimationFrame;\n\tlet cancelAnimationFrame = window.cancelAnimationFrame;\n\t// loop through vendor prefixes and get prefixed rAF and cAF\n\tlet prefix;\n\tfor( let i = 0; i < prefixes.length; i++ ) {\n\t\tif ( requestAnimationFrame && cancelAnimationFrame ) {\n\t\t\tbreak;\n\t\t}\n\t\tprefix = prefixes[i];\n\t\trequestAnimationFrame = requestAnimationFrame || window[ prefix + 'RequestAnimationFrame' ];\n\t\tcancelAnimationFrame = cancelAnimationFrame || window[ prefix + 'CancelAnimationFrame' ] ||\n\t\twindow[ prefix + 'CancelRequestAnimationFrame' ];\n\t}\n\n\t// fallback to setTimeout and clearTimeout if either request/cancel is not supported\n\tif ( !requestAnimationFrame || !cancelAnimationFrame ) {\n\t\trequestAnimationFrame = function( callback, element ) {\n\t\t\tlet currTime = new Date().getTime();\n\t\t\tlet timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );\n\t\t\tlet id = window.setTimeout( function() {\n\t\t\t\tcallback( currTime + timeToCall );\n\t\t\t}, timeToCall );\n\t\t\tlastTime = currTime + timeToCall;\n\t\t\treturn id;\n\t\t};\n\n\t\tcancelAnimationFrame = function( id ) {\n\t\t\twindow.clearTimeout( id );\n\t\t};\n\t}\n\n\tfunction extend( a, b ) {\n\t\tfor( let key in b ) { \n\t\t\tif( b.hasOwnProperty( key ) ) {\n\t\t\t\ta[key] = b[key];\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t}\n\n\t// from http://www.quirksmode.org/js/events_properties.html#position\n\tfunction getMousePos( e ) {\n\t\tlet posx = 0;\n\t\tlet posy = 0;\n\t\tif ( !e ) var e = window.event;\n\t\tif ( e.pageX || e.pageY ) \t{\n\t\t\tposx = e.pageX;\n\t\t\tposy = e.pageY;\n\t\t}\n\t\telse if ( e.clientX || e.clientY ) \t{\n\t\t\tposx = e.clientX + document.body.scrollLeft\n\t\t\t\t+ document.documentElement.scrollLeft;\n\t\t\tposy = e.clientY + document.body.scrollTop\n\t\t\t\t+ document.documentElement.scrollTop;\n\t\t}\n\t\treturn {\n\t\t\tx : posx,\n\t\t\ty : posy\n\t\t}\n\t}\n\n\t// from http://www.sberry.me/articles/javascript-event-throttling-debouncing\n\tfunction throttle( fn, delay ) {\n\t\tlet allowSample = true;\n\n\t\treturn function( e ) {\n\t\t\tif ( allowSample ) {\n\t\t\t\tallowSample = false;\n\t\t\t\tsetTimeout( function() { allowSample = true; }, delay );\n\t\t\t\tfn( e );\n\t\t\t}\n\t\t};\n\t}\n\n\t/***************************************************************************/\n\n\t/**\n\t * TiltFx fn\n\t * @param {HTMLElement} img element\n\t * @param {object} options\n\t */\n\tfunction TiltFx( el, options ) {\n\t\tif( el ) {\n\t\t\tthis.el = el;\n\t\t\tthis.options = extend( {}, this.options );\n\t\t\textend( this.options, options );\n\t\t\tthis._init();\n\t\t\tthis._initEvents();\n\t\t}\n\t}\n\n\t/**\n\t * TiltFx options.\n\t */\n\tTiltFx.prototype.options = {\n\t\t// number of extra image elements ( div with background-image ) to add to the DOM - min:0, max:64 ( for a higher number, it's recommended to remove the transitions of .tilt__front in the stylesheet.\n\t\textraImgs : 2,\n\t\t// set scale factor - value what use to set scale gradients for each extra img\n\t\textraImgsScaleGrade: 0,\n\t\t// the opacity value for all the image elements.\n\t\topacity : 0.7,\n\t\t// when use set array of opacity for each image from bottom to top\n\t\tcustomImgsOpacity: false,\n\t\t// by default the first layer does not move.\n\t\tbgfixed : true,\n\t\t// use reset style for mouseleave event\n\t\tresetOnLeave: true,\n\t\t// image element's movement configuration\n\t\tmovement : {\n\t\t\tperspective : 1000, // perspective value\n\t\t\ttranslateX : -10, // a relative movement of -10px to 10px on the x-axis ( setting a negative value reverses the direction )\n\t\t\ttranslateY : -10, // a relative movement of -10px to 10px on the y-axis \n\t\t\ttranslateZ : 20, // a relative movement of -20px to 20px on the z-axis ( perspective value must be set ). Also, this specific translation is done when the mouse moves vertically.\n\t\t\trotateX : 2, // a relative rotation of -2deg to 2deg on the x-axis ( perspective value must be set )\n\t\t\trotateY : 2, // a relative rotation of -2deg to 2deg on the y-axis ( perspective value must be set )\n\t\t\trotateZ : 0 // z-axis rotation; by default there's no rotation on the z-axis ( perspective value must be set )\n\t\t},\n\t\t// element for relative custom position offset\n\t\telement : {\n\t\t\t// element what will be bind to mousemove\n\t\t\tmouseMoveWatcher: null,\n\t\t\t// element for set bounds of mousemove\n\t\t\tviewWatcher: null,\n\t\t\t// watch for orientation changes\n\t\t\torientationWatcher: window\n\t\t}\n\t}\n\n\t/**\n\t * Initialize: build the necessary structure for the image elements and replace it with the HTML img element.\n\t */\n\tTiltFx.prototype._init = function() {\n\t\tthis.tiltWrapper = document.createElement( 'div' );\n\t\tthis.tiltWrapper.className = 'tilt';\n\n\t\t// main image element.\n\t\tthis.tiltImgBack = document.createElement( 'div' );\n\t\tthis.tiltImgBack.className = 'tilt__back';\n\t\tthis.tiltImgBack.tiltFxType = 'back';\n\t\tthis.tiltImgBack.style.backgroundImage = 'url( ' + this.el.querySelector( 'img' ).src + ' )';\n\t\tthis.tiltWrapper.appendChild( this.tiltImgBack );\n\n\t\t// image elements limit.\n\t\tif( this.options.extraImgs < 1 ) {\n\t\t\tthis.imgCount = 0;\n\t\t}\n\t\telse if( this.options.extraImgs > 64 ) {\n\t\t\tthis.imgCount = 64;\n\t\t}\n\t\telse {\n\t\t\tthis.imgCount = this.options.extraImgs;\n\t\t}\n\n\t\tif( !this.options.movement.perspective ) {\n\t\t\tthis.options.movement.perspective = 0;\n\t\t}\n\n\t\t// add the extra image elements.\n\t\tthis.imgElems = [];\n\t\tlet frontExtraImagesCount = this.imgCount;\n\t\tlet customImgsOpacity = this.options.customImgsOpacity;\n\n\t\tif( !this.options.bgfixed ) {\n\t\t\tthis.imgElems.push( this.tiltImgBack );\n\t\t\t++this.imgCount;\n\t\t}\n\n\t\tfor( let i = 0; i < frontExtraImagesCount; ++i ) {\n\t\t\tlet el = document.createElement( 'div' );\n\t\t\tel.className = 'tilt__front';\n\t\t\tel.style.backgroundImage = 'url( ' + this.el.querySelector( 'img' ).src + ' )';\n\t\t\tthis.tiltWrapper.appendChild( el );\n\t\t\tthis.imgElems.push( el );\n\t\t}\n\n\t\t// set opacity for images\n\t\tthis._initSetImagesOpacity();\n\n\t\t// add it to the DOM and remove original img element.\n\t\tthis.el.parentNode.insertBefore( this.tiltWrapper, this.el );\n\t\tthis.el.parentNode.removeChild( this.el );\n\n\t\t// set mosemove element area and view restrictions\n\t\t// console.log( this );\n\t\tthis._setViewWatcher( this );\n\t\tthis._setMouseMoveWatcher( this );\n\n\t\t// viewWatcher properties: width/height/left/top\n\t\tthis._calcView( this );\n\t};\n\n\t/**\n\t * Set images opacity.\n\t * @private\n\t */\n\tTiltFx.prototype._initSetImagesOpacity = function() {\n\t\tif( this.options.customImgsOpacity ) {\n\t\t\tfor( let i = 0, len = this.imgElems.length; i < len; ++i ) {\n\t\t\t\tlet opacity = ( this.options.customImgsOpacity[i] )\n\t\t\t\t\t? this.options.customImgsOpacity[i]\n\t\t\t\t\t: this.options.opacity;\n\n\t\t\t\tthis.imgElems[i].style.opacity = opacity;\n\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\tfor( let i = 0, len = this.imgElems.length; i < len; ++i ) {\n\t\t\t\tif( this.imgElems[i].tiltFxType === 'back' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.imgElems[i].style.opacity = this.options.opacity;\n\t\t\t}\n\n\t\t}\n\t};\n\n\tTiltFx.prototype._calcView = function( self ) {\n\t\tself.view = {\n\t\t\twidth : self.viewWatcher.offsetWidth,\n\t\t\theight : self.viewWatcher.offsetHeight\n\t\t};\n\t};\n\n\tTiltFx.prototype._setMouseMoveWatcher = function( self ) {\n\t\tlet isSet = false;\n\n\t\tif( self.options.element && self.options.element.mouseMoveWatcher ) {\n\t\t\tlet mouseMoveWatcherElement = document.querySelector( self.options.element.mouseMoveWatcher );\n\n\t\t\tself.mouseMoveWatcher = mouseMoveWatcherElement;\n\t\t\tisSet = true;\n\t\t}\n\n\t\tif( !isSet ) {\n\t\t\tself.mouseMoveWatcher = self.viewWatcher;\n\t\t}\n\t};\n\n\tTiltFx.prototype._setViewWatcher = function( self ) {\n\t\tlet isSet = false;\n\n\t\tif( self.options.element && self.options.element.viewWatcher ) {\n\t\t\tlet customElementRelative = document.querySelector( self.options.element.viewWatcher );\n\n\t\t\tif( customElementRelative ) {\n\t\t\t\tself.viewWatcher = customElementRelative;\n\t\t\t\tisSet = true;\n\t\t\t}\n\t\t}\n\n\t\tif( !isSet ) {\n\t\t\tself.viewWatcher = self.tiltWrapper;\n\t\t}\n\t};\n\n\t/**\n\t * Initialize the events on the main wrapper.\n\t */\n\tTiltFx.prototype._initEvents = function() {\n\t\tlet self = this,\n\t\t\tmoveOpts = self.options.movement;\n\n\t\t// mousemove event..\n\n\t\tself.mouseMoveWatcher.parentNode.parentNode.parentNode.addEventListener( 'mousemove', function( ev ) {\n\t\t\trequestAnimationFrame( function() {\n\t\t\t\t\t// mouse position relative to the document.\n\t\t\t\tlet mousepos = getMousePos( ev ),\n\t\t\t\t\t// document scrolls.\n\t\t\t\t\tdocScrolls = {\n\t\t\t\t\t\tleft : document.body.scrollLeft + document.documentElement.scrollLeft,\n\t\t\t\t\t\ttop : document.body.scrollTop + document.documentElement.scrollTop\n\t\t\t\t\t},\n\t\t\t\t\tbounds = self.tiltWrapper.getBoundingClientRect(),\n\t\t\t\t\t// mouse position relative to the main element ( tiltWrapper ).\n\t\t\t\t\trelmousepos = {\n\t\t\t\t\t\tx : mousepos.x - bounds.left - docScrolls.left,\n\t\t\t\t\t\ty : mousepos.y - bounds.top - docScrolls.top\n\t\t\t\t\t};\n\n\t\t\t\t\t// console.log( { relmousepos } );\n\t\t\t\t\t// console.table( {\n\t\t\t\t\t// \t'relmousepos.x': relmousepos.x,\n\t\t\t\t\t// \t'relmousepos.y': relmousepos.y\n\t\t\t\t\t// } );\n\n\t\t\t\t// configure the movement for each image element.\n\t\t\t\tfor( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\t\t\t\t\tlet el = self.imgElems[i],\n\t\t\t\t\t\trotX = moveOpts.rotateX ? 2 * ( ( i+1 )*moveOpts.rotateX/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.rotateX/self.imgCount ) : 0,\n\t\t\t\t\t\trotY = moveOpts.rotateY ? 2 * ( ( i+1 )*moveOpts.rotateY/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateY/self.imgCount ) : 0,\n\t\t\t\t\t\trotZ = moveOpts.rotateZ ? 2 * ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) : 0,\n\t\t\t\t\t\ttransX = moveOpts.translateX ? 2 * ( ( i+1 )*moveOpts.translateX/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.translateX/self.imgCount ) : 0,\n\t\t\t\t\t\ttransY = moveOpts.translateY ? 2 * ( ( i+1 )*moveOpts.translateY/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateY/self.imgCount ) : 0,\n\t\t\t\t\t\ttransZ = moveOpts.translateZ ? 2 * ( ( i+1 )*moveOpts.translateZ/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateZ/self.imgCount ) : 0,\n\n\t\t\t\t\t\tscale = 1 + ( self.options.extraImgsScaleGrade * ( len - ( i+1 ) ) ),\n\t\t\t\t\t\tscaleCss = ( scale !== 1 ) ? ' scale( ' + scale + ', ' + scale + ' )' : '';\n\n\t\t\t\t\tel.style.WebkitTransform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\tel.style.transform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// reset all when mouse leaves the main wrapper.\n\t\tif( self.options.resetOnLeave ) {\n\t\t\tself.mouseMoveWatcher.parentNode.parentNode.parentNode.addEventListener( 'mouseleave', function () {\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tfor ( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\t\t\t\t\t\tlet el = self.imgElems[i];\n\t\t\t\t\t\tel.style.WebkitTransform = 'perspective( ' + moveOpts.perspective + 'px ) translate3d( 0,0,0 ) rotate3d( 1,1,1,0deg )';\n\t\t\t\t\t\tel.style.transform = 'perspective( ' + moveOpts.perspective + 'px ) translate3d( 0,0,0 ) rotate3d( 1,1,1,0deg )';\n\t\t\t\t\t}\n\t\t\t\t}, 60 );\n\n\t\t\t} );\n\t\t}\n\n\t\t// window resize\n\t\twindow.addEventListener( 'resize', throttle( function() {\n\t\t\t// recalculate viewWatcher properties: width/height/left/top\n\t\t\tself._calcView( self );\n\t\t}, 50 ) );\n\n\n\n\t\twindow.addEventListener( 'deviceorientation', function( ev ) {\n\t\t\trequestAnimationFrame( function() {\n\t\t\t let alpha = ev.alpha; \n\t\t\t let beta = ev.beta;\n\t\t\t let gamma = ev.gamma;\n\n\t\t\t let betaR = beta / 180 * Math.PI;\n\t\t\t let gammaR = gamma / 180 * Math.PI;\n\t\t\t let spinR = Math.atan2( Math.cos( betaR ) * Math.sin( gammaR ), Math.sin( betaR ) );\n\n\t\t\t let spin = spinR * 180 / Math.PI;\n\n\t\t\t\tfor( let i = 0, len = self.imgElems.length; i < len; ++i ) {\n\n\t\t\t\t\tlet relmousepos = {\n\t\t\t\t\t\tx: ( self.view.width / 2 ) * ( 1 - gammaR ),\n\t\t\t\t\t\ty: ( self.view.height / 2 ) * ( 1 - betaR )\n\t\t\t\t\t};\n\n\t\t\t\t\tlet el = self.imgElems[i],\n\t\t\t\t\t\trotX = moveOpts.rotateX ? 2 * ( ( i+1 )*moveOpts.rotateX/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.rotateX/self.imgCount ) : 0,\n\t\t\t\t\t\trotY = moveOpts.rotateY ? 2 * ( ( i+1 )*moveOpts.rotateY/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateY/self.imgCount ) : 0,\n\t\t\t\t\t\trotZ = moveOpts.rotateZ ? 2 * ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.rotateZ/self.imgCount ) : 0,\n\t\t\t\t\t\ttransX = moveOpts.translateX ? 2 * ( ( i+1 )*moveOpts.translateX/self.imgCount ) / self.view.width * relmousepos.x - ( ( i+1 )*moveOpts.translateX/self.imgCount ) : 0,\n\t\t\t\t\t\ttransY = moveOpts.translateY ? 2 * ( ( i+1 )*moveOpts.translateY/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateY/self.imgCount ) : 0,\n\t\t\t\t\t\ttransZ = moveOpts.translateZ ? 2 * ( ( i+1 )*moveOpts.translateZ/self.imgCount ) / self.view.height * relmousepos.y - ( ( i+1 )*moveOpts.translateZ/self.imgCount ) : 0,\n\n\t\t\t\t\t\tscale = 1 + ( self.options.extraImgsScaleGrade * ( len - ( i+1 ) ) ),\n\t\t\t\t\t\tscaleCss = ( scale !== 1 ) ? ' scale( ' + scale + ', ' + scale + ' )' : '';\n\n\n\t\t\t\t\tel.style.WebkitTransform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\tel.style.transform =\n\t\t\t\t\t\t'perspective( ' + moveOpts.perspective + 'px )' +\n\t\t\t\t\t\t' translate3d( ' + transX + 'px,' + transY + 'px,' + transZ + 'px )' +\n\t\t\t\t\t\t' rotate3d( 1,0,0,' + rotX + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,1,0,' + rotY + 'deg )' +\n\t\t\t\t\t\t' rotate3d( 0,0,1,' + rotZ + 'deg )' +\n\t\t\t\t\t\tscaleCss;\n\n\t\t\t\t\t// console.table( {\n\t\t\t\t\t// \t'device.betaR': betaR,\n\t\t\t\t\t// \t'device.gammaR': gammaR,\n\t\t\t\t\t// \t'device.spinR': spinR,\n\t\t\t\t\t// \t'relmousepos.x': relmousepos.x,\n\t\t\t\t\t// \t'relmousepos.y': relmousepos.y\n\t\t\t\t\t// } );\n\n\t\t\t\t\t// console.log( {\n\t\t\t\t\t// \tdevice:{\n\t\t\t\t\t// \t\talpha,\n\t\t\t\t\t// \t\tbeta,\n\t\t\t\t\t// \t\tgamma,\n\t\t\t\t\t// \t\tbetaR,\n\t\t\t\t\t// \t\tgammaR,\n\t\t\t\t\t// \t\tspinR,\n\t\t\t\t\t// \t\tspin,\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \telement:{\n\t\t\t\t\t// \t\tel,\n\t\t\t\t\t// \t\trotX,\n\t\t\t\t\t// \t\trotY,\n\t\t\t\t\t// \t\trotZ,\n\t\t\t\t\t// \t\ttransX,\n\t\t\t\t\t// \t\ttransY,\n\t\t\t\t\t// \t\ttransZ\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \trelmousepos\n\t\t\t\t\t// } );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, true );\t\t\n\t};\n\n\t/**\n\t * Init tiltFx on each imgs with the class \"tilt-effect\"\n\t */\n\tTiltFx.prototype.init = function() {\n\t\t// search for imgs with the class \"tilt-effect\"\n\t\t[].slice.call( document.querySelectorAll( 'picture' ) ).forEach( function( img ) {\n\t\t\ttry{\n\t\t\t\tnew TiltFx( img, JSON.parse( img.querySelector( 'img' ).getAttribute( 'data-tilt-options' ).replaceAll( '\\'', '\"' ) ) );\n\t\t\t} catch( err ){ /* console.log( err ) */ }\n\t\t} );\n\t};\n\n\t( new TiltFx() ).init();\n\n\twindow.TiltFx = TiltFx;\n\n} )( window );\n","// Source: https://gist.github.com/buu700/4200601\n/**\n* @function\n* @property {object} jQuery plugin which runs handler function once specified element is inserted into the DOM\n* @param {function} handler A function to execute at the time when the element is inserted\n* @param {bool} shouldRunHandlerOnce Optional: if true, handler is unbound after its first invocation\n* @example $(selector).waitUntilExists(function);\n*/\n\n$.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) {\n var found = 'found';\n var $this = $(this.selector);\n var $elements = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);\n \n if (!isChild){\n (window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =\n window.setInterval(function () { $this.waitUntilExists(handler, shouldRunHandlerOnce, true); }, 500);\n }\n else if (shouldRunHandlerOnce && $elements.length){\n window.clearInterval(window.waitUntilExists_Intervals[this.selector]);\n }\n \n return $this;\n};\n"]} \ No newline at end of file diff --git a/src/scripts/tiltfx.js b/src/scripts/tiltfx.js index 96dfe2d..3363ae8 100644 --- a/src/scripts/tiltfx.js +++ b/src/scripts/tiltfx.js @@ -12,17 +12,16 @@ 'use strict'; - $( 'blockquote' ).tilt( { - maxTilt: 0.5 - } ); + function addTiltEffect( $el ){ + $el.tilt( { + maxTilt: 200 / $el.outerWidth() + } ); + } - $( '.card' ).tilt( { - maxTilt: 1 + $( '.card, blockquote' ).each( function(){ + addTiltEffect( $( this ) ); } ); - $( '.author-card' ).tilt( { - maxTilt: 0.4 - } ); $( '.hover-box > a' ).tilt( { maxTilt: 10 @@ -41,8 +40,8 @@ } ); $( document ).on( 'tembeds_tweets_processed', function(){ - $( '.twitter-tweet' ).tilt( { - maxTilt: 2 + $( '.twitter-tweet' ).each( function(){ + addTiltEffect( $( this ) ); } ); } );