Difference between revisions of "Team:Danzi Kesh 8"
Line 265: | Line 265: | ||
</script> | </script> | ||
+ | |||
+ | <script type="text/javascript"> | ||
+ | |||
+ | /*! | ||
+ | * Webflow: Front-end site library | ||
+ | * @license MIT | ||
+ | * Inline scripts may access the api using an async handler: | ||
+ | * var Webflow = Webflow || []; | ||
+ | * Webflow.push(readyFunction); | ||
+ | */ | ||
+ | /******/ (function(modules) { // webpackBootstrap | ||
+ | /******/ // The module cache | ||
+ | /******/ var installedModules = {}; | ||
+ | |||
+ | /******/ // The require function | ||
+ | /******/ function __webpack_require__(moduleId) { | ||
+ | |||
+ | /******/ // Check if module is in cache | ||
+ | /******/ if(installedModules[moduleId]) | ||
+ | /******/ return installedModules[moduleId].exports; | ||
+ | |||
+ | /******/ // Create a new module (and put it into the cache) | ||
+ | /******/ var module = installedModules[moduleId] = { | ||
+ | /******/ exports: {}, | ||
+ | /******/ id: moduleId, | ||
+ | /******/ loaded: false | ||
+ | /******/ }; | ||
+ | |||
+ | /******/ // Execute the module function | ||
+ | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||
+ | |||
+ | /******/ // Flag the module as loaded | ||
+ | /******/ module.loaded = true; | ||
+ | |||
+ | /******/ // Return the exports of the module | ||
+ | /******/ return module.exports; | ||
+ | /******/ } | ||
+ | |||
+ | |||
+ | /******/ // expose the modules object (__webpack_modules__) | ||
+ | /******/ __webpack_require__.m = modules; | ||
+ | |||
+ | /******/ // expose the module cache | ||
+ | /******/ __webpack_require__.c = installedModules; | ||
+ | |||
+ | /******/ // __webpack_public_path__ | ||
+ | /******/ __webpack_require__.p = "/"; | ||
+ | |||
+ | /******/ // Load entry module and return exports | ||
+ | /******/ return __webpack_require__(0); | ||
+ | /******/ }) | ||
+ | /************************************************************************/ | ||
+ | /******/ ([ | ||
+ | /* 0 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | __webpack_require__(4); | ||
+ | __webpack_require__(5); | ||
+ | __webpack_require__(6); | ||
+ | __webpack_require__(7); | ||
+ | __webpack_require__(8); | ||
+ | __webpack_require__(9); | ||
+ | __webpack_require__(1); | ||
+ | __webpack_require__(10); | ||
+ | __webpack_require__(11); | ||
+ | __webpack_require__(12); | ||
+ | __webpack_require__(13); | ||
+ | __webpack_require__(14); | ||
+ | __webpack_require__(15); | ||
+ | __webpack_require__(16); | ||
+ | module.exports = __webpack_require__(17); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 1 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Core site library | ||
+ | */ | ||
+ | |||
+ | var Webflow = {}; | ||
+ | var modules = {}; | ||
+ | var primary = []; | ||
+ | var secondary = window.Webflow || []; | ||
+ | var $ = window.jQuery; | ||
+ | var $win = $(window); | ||
+ | var $doc = $(document); | ||
+ | var isFunction = $.isFunction; | ||
+ | var _ = Webflow._ = __webpack_require__(18); | ||
+ | var tram = __webpack_require__(3) && $.tram; | ||
+ | var domready = false; | ||
+ | var destroyed = false; | ||
+ | var Modernizr = window.Modernizr; | ||
+ | var noop = function() {}; | ||
+ | tram.config.hideBackface = false; | ||
+ | tram.config.keepInherited = true; | ||
+ | |||
+ | /** | ||
+ | * Webflow.define - Define a named module | ||
+ | * @param {string} name | ||
+ | * @param {function} factory | ||
+ | * @return {object} | ||
+ | */ | ||
+ | Webflow.define = function(name, factory) { | ||
+ | if (modules[name]) unbindModule(modules[name]); | ||
+ | var instance = modules[name] = factory($, _) || {}; | ||
+ | bindModule(instance); | ||
+ | return instance; | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Webflow.require - Require a named module | ||
+ | * @param {string} name | ||
+ | * @return {object} | ||
+ | */ | ||
+ | Webflow.require = function(name) { | ||
+ | return modules[name]; | ||
+ | }; | ||
+ | |||
+ | function bindModule(module) { | ||
+ | // If running in Webflow app, subscribe to design/preview events | ||
+ | if (Webflow.env()) { | ||
+ | isFunction(module.design) && $win.on('__wf_design', module.design); | ||
+ | isFunction(module.preview) && $win.on('__wf_preview', module.preview); | ||
+ | } | ||
+ | // Subscribe to front-end destroy event | ||
+ | isFunction(module.destroy) && $win.on('__wf_destroy', module.destroy); | ||
+ | // Look for ready method on module | ||
+ | if (module.ready && isFunction(module.ready)) { | ||
+ | addReady(module); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function addReady(module) { | ||
+ | // If domready has already happened, run ready method | ||
+ | if (domready) { | ||
+ | module.ready(); | ||
+ | return; | ||
+ | } | ||
+ | // Otherwise add ready method to the primary queue (only once) | ||
+ | if (_.contains(primary, module.ready)) return; | ||
+ | primary.push(module.ready); | ||
+ | } | ||
+ | |||
+ | function unbindModule(module) { | ||
+ | // Unsubscribe module from window events | ||
+ | isFunction(module.design) && $win.off('__wf_design', module.design); | ||
+ | isFunction(module.preview) && $win.off('__wf_preview', module.preview); | ||
+ | isFunction(module.destroy) && $win.off('__wf_destroy', module.destroy); | ||
+ | // Remove ready method from primary queue | ||
+ | if (module.ready && isFunction(module.ready)) { | ||
+ | removeReady(module); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function removeReady(module) { | ||
+ | primary = _.filter(primary, function(readyFn) { | ||
+ | return readyFn !== module.ready; | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Webflow.push - Add a ready handler into secondary queue | ||
+ | * @param {function} ready Callback to invoke on domready | ||
+ | */ | ||
+ | Webflow.push = function(ready) { | ||
+ | // If domready has already happened, invoke handler | ||
+ | if (domready) { | ||
+ | isFunction(ready) && ready(); | ||
+ | return; | ||
+ | } | ||
+ | // Otherwise push into secondary queue | ||
+ | secondary.push(ready); | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Webflow.env - Get the state of the Webflow app | ||
+ | * @param {string} mode [optional] | ||
+ | * @return {boolean} | ||
+ | */ | ||
+ | Webflow.env = function(mode) { | ||
+ | var designFlag = window.__wf_design; | ||
+ | var inApp = typeof designFlag !== 'undefined'; | ||
+ | if (!mode) return inApp; | ||
+ | if (mode === 'design') return inApp && designFlag; | ||
+ | if (mode === 'preview') return inApp && !designFlag; | ||
+ | if (mode === 'slug') return inApp && window.__wf_slug; | ||
+ | if (mode === 'editor') return window.WebflowEditor; | ||
+ | if (mode === 'test') return window.__wf_test; | ||
+ | }; | ||
+ | |||
+ | // Feature detects + browser sniffs ಠ_ಠ | ||
+ | var userAgent = navigator.userAgent.toLowerCase(); | ||
+ | var appVersion = navigator.appVersion.toLowerCase(); | ||
+ | var touch = Webflow.env.touch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch; | ||
+ | var chrome = Webflow.env.chrome = /chrome/.test(userAgent) && /Google/.test(navigator.vendor) && parseInt(appVersion.match(/chrome\/(\d+)\./)[1], 10); | ||
+ | var ios = Webflow.env.ios = Modernizr && Modernizr.ios; | ||
+ | Webflow.env.safari = /safari/.test(userAgent) && !chrome && !ios; | ||
+ | |||
+ | // Maintain current touch target to prevent late clicks on touch devices | ||
+ | var touchTarget; | ||
+ | // Listen for both events to support touch/mouse hybrid devices | ||
+ | touch && $doc.on('touchstart mousedown', function(evt) { | ||
+ | touchTarget = evt.target; | ||
+ | }); | ||
+ | |||
+ | /** | ||
+ | * Webflow.validClick - validate click target against current touch target | ||
+ | * @param {HTMLElement} clickTarget Element being clicked | ||
+ | * @return {Boolean} True if click target is valid (always true on non-touch) | ||
+ | */ | ||
+ | Webflow.validClick = touch ? function(clickTarget) { | ||
+ | return clickTarget === touchTarget || $.contains(clickTarget, touchTarget); | ||
+ | } : function() { return true; }; | ||
+ | |||
+ | /** | ||
+ | * Webflow.resize, Webflow.scroll - throttled event proxies | ||
+ | */ | ||
+ | var resizeEvents = 'resize.webflow orientationchange.webflow load.webflow'; | ||
+ | var scrollEvents = 'scroll.webflow ' + resizeEvents; | ||
+ | Webflow.resize = eventProxy($win, resizeEvents); | ||
+ | Webflow.scroll = eventProxy($win, scrollEvents); | ||
+ | Webflow.redraw = eventProxy(); | ||
+ | |||
+ | // Create a proxy instance for throttled events | ||
+ | function eventProxy(target, types) { | ||
+ | |||
+ | // Set up throttled method (using custom frame-based _.throttle) | ||
+ | var handlers = []; | ||
+ | var proxy = {}; | ||
+ | proxy.up = _.throttle(function(evt) { | ||
+ | _.each(handlers, function(h) { h(evt); }); | ||
+ | }); | ||
+ | |||
+ | // Bind events to target | ||
+ | if (target && types) target.on(types, proxy.up); | ||
+ | |||
+ | /** | ||
+ | * Add an event handler | ||
+ | * @param {function} handler | ||
+ | */ | ||
+ | proxy.on = function(handler) { | ||
+ | if (typeof handler !== 'function') return; | ||
+ | if (_.contains(handlers, handler)) return; | ||
+ | handlers.push(handler); | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Remove an event handler | ||
+ | * @param {function} handler | ||
+ | */ | ||
+ | proxy.off = function(handler) { | ||
+ | // If no arguments supplied, clear all handlers | ||
+ | if (!arguments.length) { | ||
+ | handlers = []; | ||
+ | return; | ||
+ | } | ||
+ | // Otherwise, remove handler from the list | ||
+ | handlers = _.filter(handlers, function(h) { | ||
+ | return h !== handler; | ||
+ | }); | ||
+ | }; | ||
+ | |||
+ | return proxy; | ||
+ | } | ||
+ | |||
+ | // Webflow.location - Wrap window.location in api | ||
+ | Webflow.location = function(url) { | ||
+ | window.location = url; | ||
+ | }; | ||
+ | |||
+ | // Webflow.app - Designer-specific methods | ||
+ | Webflow.app = Webflow.env() ? {} : null; | ||
+ | if (Webflow.app) { | ||
+ | |||
+ | // Trigger redraw for specific elements | ||
+ | var redraw = new Event('__wf_redraw'); | ||
+ | Webflow.app.redrawElement = function(i, el) { el.dispatchEvent(redraw); }; | ||
+ | |||
+ | // Webflow.location - Re-route location change to trigger an event | ||
+ | Webflow.location = function(url) { | ||
+ | window.dispatchEvent(new CustomEvent('__wf_location', { detail: url })); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | // Webflow.ready - Call primary and secondary handlers | ||
+ | Webflow.ready = function() { | ||
+ | domready = true; | ||
+ | |||
+ | // Restore modules after destroy | ||
+ | if (destroyed) { | ||
+ | restoreModules(); | ||
+ | |||
+ | // Otherwise run primary ready methods | ||
+ | } else { | ||
+ | _.each(primary, callReady); | ||
+ | } | ||
+ | |||
+ | // Run secondary ready methods | ||
+ | _.each(secondary, callReady); | ||
+ | |||
+ | // Trigger resize | ||
+ | Webflow.resize.up(); | ||
+ | }; | ||
+ | |||
+ | function callReady(readyFn) { | ||
+ | isFunction(readyFn) && readyFn(); | ||
+ | } | ||
+ | |||
+ | function restoreModules() { | ||
+ | destroyed = false; | ||
+ | _.each(modules, bindModule); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Webflow.load - Add a window load handler that will run even if load event has already happened | ||
+ | * @param {function} handler | ||
+ | */ | ||
+ | var deferLoad; | ||
+ | Webflow.load = function(handler) { | ||
+ | deferLoad.then(handler); | ||
+ | }; | ||
+ | |||
+ | function bindLoad() { | ||
+ | // Reject any previous deferred (to support destroy) | ||
+ | if (deferLoad) { | ||
+ | deferLoad.reject(); | ||
+ | $win.off('load', deferLoad.resolve); | ||
+ | } | ||
+ | // Create deferred and bind window load event | ||
+ | deferLoad = new $.Deferred(); | ||
+ | $win.on('load', deferLoad.resolve); | ||
+ | } | ||
+ | |||
+ | // Webflow.destroy - Trigger a destroy event for all modules | ||
+ | Webflow.destroy = function(options) { | ||
+ | options = options || {}; | ||
+ | destroyed = true; | ||
+ | $win.triggerHandler('__wf_destroy'); | ||
+ | |||
+ | // Allow domready reset for tests | ||
+ | if (options.domready != null) { | ||
+ | domready = options.domready; | ||
+ | } | ||
+ | |||
+ | // Unbind modules | ||
+ | _.each(modules, unbindModule); | ||
+ | |||
+ | // Clear any proxy event handlers | ||
+ | Webflow.resize.off(); | ||
+ | Webflow.scroll.off(); | ||
+ | Webflow.redraw.off(); | ||
+ | |||
+ | // Clear any queued ready methods | ||
+ | primary = []; | ||
+ | secondary = []; | ||
+ | |||
+ | // If load event has not yet fired, replace the deferred | ||
+ | if (deferLoad.state() === 'pending') bindLoad(); | ||
+ | }; | ||
+ | |||
+ | // Listen for domready | ||
+ | $(Webflow.ready); | ||
+ | |||
+ | // Listen for window.onload and resolve deferred | ||
+ | bindLoad(); | ||
+ | |||
+ | // Export commonjs module | ||
+ | module.exports = window.Webflow = Webflow; | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 2 */ | ||
+ | /***/ function(module, exports) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: IX Event triggers for other modules | ||
+ | */ | ||
+ | |||
+ | var $ = window.jQuery; | ||
+ | var api = {}; | ||
+ | var eventQueue = []; | ||
+ | var namespace = '.w-ix'; | ||
+ | |||
+ | var eventTriggers = { | ||
+ | reset: function(i, el) { | ||
+ | el.__wf_intro = null; | ||
+ | }, | ||
+ | intro: function(i, el) { | ||
+ | if (el.__wf_intro) return; | ||
+ | el.__wf_intro = true; | ||
+ | $(el).triggerHandler(api.types.INTRO); | ||
+ | }, | ||
+ | outro: function(i, el) { | ||
+ | if (!el.__wf_intro) return; | ||
+ | el.__wf_intro = null; | ||
+ | $(el).triggerHandler(api.types.OUTRO); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | api.triggers = {}; | ||
+ | |||
+ | api.types = { | ||
+ | INTRO: 'w-ix-intro' + namespace, | ||
+ | OUTRO: 'w-ix-outro' + namespace | ||
+ | }; | ||
+ | |||
+ | // Trigger any events in queue + restore trigger methods | ||
+ | api.init = function() { | ||
+ | var count = eventQueue.length; | ||
+ | for (var i = 0; i < count; i++) { | ||
+ | var memo = eventQueue[i]; | ||
+ | memo[0](0, memo[1]); | ||
+ | } | ||
+ | eventQueue = []; | ||
+ | $.extend(api.triggers, eventTriggers); | ||
+ | }; | ||
+ | |||
+ | // Replace all triggers with async wrapper to queue events until init | ||
+ | api.async = function() { | ||
+ | for (var key in eventTriggers) { | ||
+ | var func = eventTriggers[key]; | ||
+ | if (!eventTriggers.hasOwnProperty(key)) continue; | ||
+ | |||
+ | // Replace trigger method with async wrapper | ||
+ | api.triggers[key] = function(i, el) { | ||
+ | eventQueue.push([func, el]); | ||
+ | }; | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | // Default triggers to async queue | ||
+ | api.async(); | ||
+ | |||
+ | module.exports = api; | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 3 */ | ||
+ | /***/ function(module, exports) { | ||
+ | |||
+ | /*! | ||
+ | * tram.js v0.8.1-global | ||
+ | * Cross-browser CSS3 transitions in JavaScript | ||
+ | * https://github.com/bkwld/tram | ||
+ | * MIT License | ||
+ | */ | ||
+ | window.tram=function(a){function b(a,b){var c=new L.Bare;return c.init(a,b)}function c(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function d(a){var b=parseInt(a.slice(1),16),c=b>>16&255,d=b>>8&255,e=255&b;return[c,d,e]}function e(a,b,c){return"#"+(1<<24|a<<16|b<<8|c).toString(16).slice(1)}function f(){}function g(a,b){_("Type warning: Expected: ["+a+"] Got: ["+typeof b+"] "+b)}function h(a,b,c){_("Units do not match ["+a+"]: "+b+", "+c)}function i(a,b,c){if(void 0!==b&&(c=b),void 0===a)return c;var d=c;return Z.test(a)||!$.test(a)?d=parseInt(a,10):$.test(a)&&(d=1e3*parseFloat(a)),0>d&&(d=0),d===d?d:c}function j(a){for(var b=-1,c=a?a.length:0,d=[];++b<c;){var e=a[b];e&&d.push(e)}return d}var k=function(a,b,c){function d(a){return"object"==typeof a}function e(a){return"function"==typeof a}function f(){}function g(h,i){function j(){var a=new k;return e(a.init)&&a.init.apply(a,arguments),a}function k(){}i===c&&(i=h,h=Object),j.Bare=k;var l,m=f[a]=h[a],n=k[a]=j[a]=new f;return n.constructor=j,j.mixin=function(b){return k[a]=j[a]=g(j,b)[a],j},j.open=function(a){if(l={},e(a)?l=a.call(j,n,m,j,h):d(a)&&(l=a),d(l))for(var c in l)b.call(l,c)&&(n[c]=l[c]);return e(n.init)||(n.init=h),j},j.open(i)}return g}("prototype",{}.hasOwnProperty),l={ease:["ease",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(-2.75*f*e+11*e*e+-15.5*f+8*e+.25*a)}],"ease-in":["ease-in",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(-1*f*e+3*e*e+-3*f+2*e)}],"ease-out":["ease-out",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(.3*f*e+-1.6*e*e+2.2*f+-1.8*e+1.9*a)}],"ease-in-out":["ease-in-out",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(2*f*e+-5*e*e+2*f+2*e)}],linear:["linear",function(a,b,c,d){return c*a/d+b}],"ease-in-quad":["cubic-bezier(0.550, 0.085, 0.680, 0.530)",function(a,b,c,d){return c*(a/=d)*a+b}],"ease-out-quad":["cubic-bezier(0.250, 0.460, 0.450, 0.940)",function(a,b,c,d){return-c*(a/=d)*(a-2)+b}],"ease-in-out-quad":["cubic-bezier(0.455, 0.030, 0.515, 0.955)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}],"ease-in-cubic":["cubic-bezier(0.550, 0.055, 0.675, 0.190)",function(a,b,c,d){return c*(a/=d)*a*a+b}],"ease-out-cubic":["cubic-bezier(0.215, 0.610, 0.355, 1)",function(a,b,c,d){return c*((a=a/d-1)*a*a+1)+b}],"ease-in-out-cubic":["cubic-bezier(0.645, 0.045, 0.355, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a+b:c/2*((a-=2)*a*a+2)+b}],"ease-in-quart":["cubic-bezier(0.895, 0.030, 0.685, 0.220)",function(a,b,c,d){return c*(a/=d)*a*a*a+b}],"ease-out-quart":["cubic-bezier(0.165, 0.840, 0.440, 1)",function(a,b,c,d){return-c*((a=a/d-1)*a*a*a-1)+b}],"ease-in-out-quart":["cubic-bezier(0.770, 0, 0.175, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a+b:-c/2*((a-=2)*a*a*a-2)+b}],"ease-in-quint":["cubic-bezier(0.755, 0.050, 0.855, 0.060)",function(a,b,c,d){return c*(a/=d)*a*a*a*a+b}],"ease-out-quint":["cubic-bezier(0.230, 1, 0.320, 1)",function(a,b,c,d){return c*((a=a/d-1)*a*a*a*a+1)+b}],"ease-in-out-quint":["cubic-bezier(0.860, 0, 0.070, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a*a+b:c/2*((a-=2)*a*a*a*a+2)+b}],"ease-in-sine":["cubic-bezier(0.470, 0, 0.745, 0.715)",function(a,b,c,d){return-c*Math.cos(a/d*(Math.PI/2))+c+b}],"ease-out-sine":["cubic-bezier(0.390, 0.575, 0.565, 1)",function(a,b,c,d){return c*Math.sin(a/d*(Math.PI/2))+b}],"ease-in-out-sine":["cubic-bezier(0.445, 0.050, 0.550, 0.950)",function(a,b,c,d){return-c/2*(Math.cos(Math.PI*a/d)-1)+b}],"ease-in-expo":["cubic-bezier(0.950, 0.050, 0.795, 0.035)",function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b}],"ease-out-expo":["cubic-bezier(0.190, 1, 0.220, 1)",function(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}],"ease-in-out-expo":["cubic-bezier(1, 0, 0, 1)",function(a,b,c,d){return 0===a?b:a===d?b+c:(a/=d/2)<1?c/2*Math.pow(2,10*(a-1))+b:c/2*(-Math.pow(2,-10*--a)+2)+b}],"ease-in-circ":["cubic-bezier(0.600, 0.040, 0.980, 0.335)",function(a,b,c,d){return-c*(Math.sqrt(1-(a/=d)*a)-1)+b}],"ease-out-circ":["cubic-bezier(0.075, 0.820, 0.165, 1)",function(a,b,c,d){return c*Math.sqrt(1-(a=a/d-1)*a)+b}],"ease-in-out-circ":["cubic-bezier(0.785, 0.135, 0.150, 0.860)",function(a,b,c,d){return(a/=d/2)<1?-c/2*(Math.sqrt(1-a*a)-1)+b:c/2*(Math.sqrt(1-(a-=2)*a)+1)+b}],"ease-in-back":["cubic-bezier(0.600, -0.280, 0.735, 0.045)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*(a/=d)*a*((e+1)*a-e)+b}],"ease-out-back":["cubic-bezier(0.175, 0.885, 0.320, 1.275)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*((a=a/d-1)*a*((e+1)*a+e)+1)+b}],"ease-in-out-back":["cubic-bezier(0.680, -0.550, 0.265, 1.550)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),(a/=d/2)<1?c/2*a*a*(((e*=1.525)+1)*a-e)+b:c/2*((a-=2)*a*(((e*=1.525)+1)*a+e)+2)+b}]},m={"ease-in-back":"cubic-bezier(0.600, 0, 0.735, 0.045)","ease-out-back":"cubic-bezier(0.175, 0.885, 0.320, 1)","ease-in-out-back":"cubic-bezier(0.680, 0, 0.265, 1)"},n=document,o=window,p="bkwld-tram",q=/[\-\.0-9]/g,r=/[A-Z]/,s="number",t=/^(rgb|#)/,u=/(em|cm|mm|in|pt|pc|px)$/,v=/(em|cm|mm|in|pt|pc|px|%)$/,w=/(deg|rad|turn)$/,x="unitless",y=/(all|none) 0s ease 0s/,z=/^(width|height)$/,A=" ",B=n.createElement("a"),C=["Webkit","Moz","O","ms"],D=["-webkit-","-moz-","-o-","-ms-"],E=function(a){if(a in B.style)return{dom:a,css:a};var b,c,d="",e=a.split("-");for(b=0;b<e.length;b++)d+=e[b].charAt(0).toUpperCase()+e[b].slice(1);for(b=0;b<C.length;b++)if(c=C[b]+d,c in B.style)return{dom:c,css:D[b]+a}},F=b.support={bind:Function.prototype.bind,transform:E("transform"),transition:E("transition"),backface:E("backface-visibility"),timing:E("transition-timing-function")};if(F.transition){var G=F.timing.dom;if(B.style[G]=l["ease-in-back"][0],!B.style[G])for(var H in m)l[H][0]=m[H]}var I=b.frame=function(){var a=o.requestAnimationFrame||o.webkitRequestAnimationFrame||o.mozRequestAnimationFrame||o.oRequestAnimationFrame||o.msRequestAnimationFrame;return a&&F.bind?a.bind(o):function(a){o.setTimeout(a,16)}}(),J=b.now=function(){var a=o.performance,b=a&&(a.now||a.webkitNow||a.msNow||a.mozNow);return b&&F.bind?b.bind(a):Date.now||function(){return+new Date}}(),K=k(function(b){function d(a,b){var c=j((""+a).split(A)),d=c[0];b=b||{};var e=X[d];if(!e)return _("Unsupported property: "+d);if(!b.weak||!this.props[d]){var f=e[0],g=this.props[d];return g||(g=this.props[d]=new f.Bare),g.init(this.$el,c,e,b),g}}function e(a,b,c){if(a){var e=typeof a;if(b||(this.timer&&this.timer.destroy(),this.queue=[],this.active=!1),"number"==e&&b)return this.timer=new R({duration:a,context:this,complete:h}),void(this.active=!0);if("string"==e&&b){switch(a){case"hide":n.call(this);break;case"stop":k.call(this);break;case"redraw":o.call(this);break;default:d.call(this,a,c&&c[1])}return h.call(this)}if("function"==e)return void a.call(this,this);if("object"==e){var f=0;t.call(this,a,function(a,b){a.span>f&&(f=a.span),a.stop(),a.animate(b)},function(a){"wait"in a&&(f=i(a.wait,0))}),s.call(this),f>0&&(this.timer=new R({duration:f,context:this}),this.active=!0,b&&(this.timer.complete=h));var g=this,j=!1,l={};I(function(){t.call(g,a,function(a){a.active&&(j=!0,l[a.name]=a.nextStyle)}),j&&g.$el.css(l)})}}}function f(a){a=i(a,0),this.active?this.queue.push({options:a}):(this.timer=new R({duration:a,context:this,complete:h}),this.active=!0)}function g(a){return this.active?(this.queue.push({options:a,args:arguments}),void(this.timer.complete=h)):_("No active transition timer. Use start() or wait() before then().")}function h(){if(this.timer&&this.timer.destroy(),this.active=!1,this.queue.length){var a=this.queue.shift();e.call(this,a.options,!0,a.args)}}function k(a){this.timer&&this.timer.destroy(),this.queue=[],this.active=!1;var b;"string"==typeof a?(b={},b[a]=1):b="object"==typeof a&&null!=a?a:this.props,t.call(this,b,u),s.call(this)}function l(a){k.call(this,a),t.call(this,a,v,w)}function m(a){"string"!=typeof a&&(a="block"),this.el.style.display=a}function n(){k.call(this),this.el.style.display="none"}function o(){this.el.offsetHeight}function q(){k.call(this),a.removeData(this.el,p),this.$el=this.el=null}function s(){var a,b,c=[];this.upstream&&c.push(this.upstream);for(a in this.props)b=this.props[a],b.active&&c.push(b.string);c=c.join(","),this.style!==c&&(this.style=c,this.el.style[F.transition.dom]=c)}function t(a,b,e){var f,g,h,i,j=b!==u,k={};for(f in a)h=a[f],f in Y?(k.transform||(k.transform={}),k.transform[f]=h):(r.test(f)&&(f=c(f)),f in X?k[f]=h:(i||(i={}),i[f]=h));for(f in k){if(h=k[f],g=this.props[f],!g){if(!j)continue;g=d.call(this,f)}b.call(this,g,h)}e&&i&&e.call(this,i)}function u(a){a.stop()}function v(a,b){a.set(b)}function w(a){this.$el.css(a)}function x(a,c){b[a]=function(){return this.children?z.call(this,c,arguments):(this.el&&c.apply(this,arguments),this)}}function z(a,b){var c,d=this.children.length;for(c=0;d>c;c++)a.apply(this.children[c],b);return this}b.init=function(b){if(this.$el=a(b),this.el=this.$el[0],this.props={},this.queue=[],this.style="",this.active=!1,T.keepInherited&&!T.fallback){var c=V(this.el,"transition");c&&!y.test(c)&&(this.upstream=c)}F.backface&&T.hideBackface&&U(this.el,F.backface.css,"hidden")},x("add",d),x("start",e),x("wait",f),x("then",g),x("next",h),x("stop",k),x("set",l),x("show",m),x("hide",n),x("redraw",o),x("destroy",q)}),L=k(K,function(b){function c(b,c){var d=a.data(b,p)||a.data(b,p,new K.Bare);return d.el||d.init(b),c?d.start(c):d}b.init=function(b,d){var e=a(b);if(!e.length)return this;if(1===e.length)return c(e[0],d);var f=[];return e.each(function(a,b){f.push(c(b,d))}),this.children=f,this}}),M=k(function(a){function b(){var a=this.get();this.update("auto");var b=this.get();return this.update(a),b}function c(a,b,c){return void 0!==b&&(c=b),a in l?a:c}function d(a){var b=/rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(a);return(b?e(b[1],b[2],b[3]):a).replace(/#(\w)(\w)(\w)$/,"#$1$1$2$2$3$3")}var f={duration:500,ease:"ease",delay:0};a.init=function(a,b,d,e){this.$el=a,this.el=a[0];var g=b[0];d[2]&&(g=d[2]),W[g]&&(g=W[g]),this.name=g,this.type=d[1],this.duration=i(b[1],this.duration,f.duration),this.ease=c(b[2],this.ease,f.ease),this.delay=i(b[3],this.delay,f.delay),this.span=this.duration+this.delay,this.active=!1,this.nextStyle=null,this.auto=z.test(this.name),this.unit=e.unit||this.unit||T.defaultUnit,this.angle=e.angle||this.angle||T.defaultAngle,T.fallback||e.fallback?this.animate=this.fallback:(this.animate=this.transition,this.string=this.name+A+this.duration+"ms"+("ease"!=this.ease?A+l[this.ease][0]:"")+(this.delay?A+this.delay+"ms":""))},a.set=function(a){a=this.convert(a,this.type),this.update(a),this.redraw()},a.transition=function(a){this.active=!0,a=this.convert(a,this.type),this.auto&&("auto"==this.el.style[this.name]&&(this.update(this.get()),this.redraw()),"auto"==a&&(a=b.call(this))),this.nextStyle=a},a.fallback=function(a){var c=this.el.style[this.name]||this.convert(this.get(),this.type);a=this.convert(a,this.type),this.auto&&("auto"==c&&(c=this.convert(this.get(),this.type)),"auto"==a&&(a=b.call(this))),this.tween=new Q({from:c,to:a,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},a.get=function(){return V(this.el,this.name)},a.update=function(a){U(this.el,this.name,a)},a.stop=function(){(this.active||this.nextStyle)&&(this.active=!1,this.nextStyle=null,U(this.el,this.name,this.get()));var a=this.tween;a&&a.context&&a.destroy()},a.convert=function(a,b){if("auto"==a&&this.auto)return a;var c,e="number"==typeof a,f="string"==typeof a;switch(b){case s:if(e)return a;if(f&&""===a.replace(q,""))return+a;c="number(unitless)";break;case t:if(f){if(""===a&&this.original)return this.original;if(b.test(a))return"#"==a.charAt(0)&&7==a.length?a:d(a)}c="hex or rgb string";break;case u:if(e)return a+this.unit;if(f&&b.test(a))return a;c="number(px) or string(unit)";break;case v:if(e)return a+this.unit;if(f&&b.test(a))return a;c="number(px) or string(unit or %)";break;case w:if(e)return a+this.angle;if(f&&b.test(a))return a;c="number(deg) or string(angle)";break;case x:if(e)return a;if(f&&v.test(a))return a;c="number(unitless) or string(unit or %)"}return g(c,a),a},a.redraw=function(){this.el.offsetHeight}}),N=k(M,function(a,b){a.init=function(){b.init.apply(this,arguments),this.original||(this.original=this.convert(this.get(),t))}}),O=k(M,function(a,b){a.init=function(){b.init.apply(this,arguments),this.animate=this.fallback},a.get=function(){return this.$el[this.name]()},a.update=function(a){this.$el[this.name](a)}}),P=k(M,function(a,b){function c(a,b){var c,d,e,f,g;for(c in a)f=Y[c],e=f[0],d=f[1]||c,g=this.convert(a[c],e),b.call(this,d,g,e)}a.init=function(){b.init.apply(this,arguments),this.current||(this.current={},Y.perspective&&T.perspective&&(this.current.perspective=T.perspective,U(this.el,this.name,this.style(this.current)),this.redraw()))},a.set=function(a){c.call(this,a,function(a,b){this.current[a]=b}),U(this.el,this.name,this.style(this.current)),this.redraw()},a.transition=function(a){var b=this.values(a);this.tween=new S({current:this.current,values:b,duration:this.duration,delay:this.delay,ease:this.ease});var c,d={};for(c in this.current)d[c]=c in b?b[c]:this.current[c];this.active=!0,this.nextStyle=this.style(d)},a.fallback=function(a){var b=this.values(a);this.tween=new S({current:this.current,values:b,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},a.update=function(){U(this.el,this.name,this.style(this.current))},a.style=function(a){var b,c="";for(b in a)c+=b+"("+a[b]+") ";return c},a.values=function(a){var b,d={};return c.call(this,a,function(a,c,e){d[a]=c,void 0===this.current[a]&&(b=0,~a.indexOf("scale")&&(b=1),this.current[a]=this.convert(b,e))}),d}}),Q=k(function(b){function c(a){1===n.push(a)&&I(g)}function g(){var a,b,c,d=n.length;if(d)for(I(g),b=J(),a=d;a--;)c=n[a],c&&c.render(b)}function i(b){var c,d=a.inArray(b,n);d>=0&&(c=n.slice(d+1),n.length=d,c.length&&(n=n.concat(c)))}function j(a){return Math.round(a*o)/o}function k(a,b,c){return e(a[0]+c*(b[0]-a[0]),a[1]+c*(b[1]-a[1]),a[2]+c*(b[2]-a[2]))}var m={ease:l.ease[1],from:0,to:1};b.init=function(a){this.duration=a.duration||0,this.delay=a.delay||0;var b=a.ease||m.ease;l[b]&&(b=l[b][1]),"function"!=typeof b&&(b=m.ease),this.ease=b,this.update=a.update||f,this.complete=a.complete||f,this.context=a.context||this,this.name=a.name;var c=a.from,d=a.to;void 0===c&&(c=m.from),void 0===d&&(d=m.to),this.unit=a.unit||"","number"==typeof c&&"number"==typeof d?(this.begin=c,this.change=d-c):this.format(d,c),this.value=this.begin+this.unit,this.start=J(),a.autoplay!==!1&&this.play()},b.play=function(){this.active||(this.start||(this.start=J()),this.active=!0,c(this))},b.stop=function(){this.active&&(this.active=!1,i(this))},b.render=function(a){var b,c=a-this.start;if(this.delay){if(c<=this.delay)return;c-=this.delay}if(c<this.duration){var d=this.ease(c,0,1,this.duration);return b=this.startRGB?k(this.startRGB,this.endRGB,d):j(this.begin+d*this.change),this.value=b+this.unit,void this.update.call(this.context,this.value)}b=this.endHex||this.begin+this.change,this.value=b+this.unit,this.update.call(this.context,this.value),this.complete.call(this.context),this.destroy()},b.format=function(a,b){if(b+="",a+="","#"==a.charAt(0))return this.startRGB=d(b),this.endRGB=d(a),this.endHex=a,this.begin=0,void(this.change=1);if(!this.unit){var c=b.replace(q,""),e=a.replace(q,"");c!==e&&h("tween",b,a),this.unit=c}b=parseFloat(b),a=parseFloat(a),this.begin=this.value=b,this.change=a-b},b.destroy=function(){this.stop(),this.context=null,this.ease=this.update=this.complete=f};var n=[],o=1e3}),R=k(Q,function(a){a.init=function(a){this.duration=a.duration||0,this.complete=a.complete||f,this.context=a.context,this.play()},a.render=function(a){var b=a-this.start;b<this.duration||(this.complete.call(this.context),this.destroy())}}),S=k(Q,function(a,b){a.init=function(a){this.context=a.context,this.update=a.update,this.tweens=[],this.current=a.current;var b,c;for(b in a.values)c=a.values[b],this.current[b]!==c&&this.tweens.push(new Q({name:b,from:this.current[b],to:c,duration:a.duration,delay:a.delay,ease:a.ease,autoplay:!1}));this.play()},a.render=function(a){var b,c,d=this.tweens.length,e=!1;for(b=d;b--;)c=this.tweens[b],c.context&&(c.render(a),this.current[c.name]=c.value,e=!0);return e?void(this.update&&this.update.call(this.context)):this.destroy()},a.destroy=function(){if(b.destroy.call(this),this.tweens){var a,c=this.tweens.length;for(a=c;a--;)this.tweens[a].destroy();this.tweens=null,this.current=null}}}),T=b.config={defaultUnit:"px",defaultAngle:"deg",keepInherited:!1,hideBackface:!1,perspective:"",fallback:!F.transition,agentTests:[]};b.fallback=function(a){if(!F.transition)return T.fallback=!0;T.agentTests.push("("+a+")");var b=new RegExp(T.agentTests.join("|"),"i");T.fallback=b.test(navigator.userAgent)},b.fallback("6.0.[2-5] Safari"),b.tween=function(a){return new Q(a)},b.delay=function(a,b,c){return new R({complete:b,duration:a,context:c})},a.fn.tram=function(a){return b.call(null,this,a)};var U=a.style,V=a.css,W={transform:F.transform&&F.transform.css},X={color:[N,t],background:[N,t,"background-color"],"outline-color":[N,t],"border-color":[N,t],"border-top-color":[N,t],"border-right-color":[N,t],"border-bottom-color":[N,t],"border-left-color":[N,t],"border-width":[M,u],"border-top-width":[M,u],"border-right-width":[M,u],"border-bottom-width":[M,u],"border-left-width":[M,u],"border-spacing":[M,u],"letter-spacing":[M,u],margin:[M,u],"margin-top":[M,u],"margin-right":[M,u],"margin-bottom":[M,u],"margin-left":[M,u],padding:[M,u],"padding-top":[M,u],"padding-right":[M,u],"padding-bottom":[M,u],"padding-left":[M,u],"outline-width":[M,u],opacity:[M,s],top:[M,v],right:[M,v],bottom:[M,v],left:[M,v],"font-size":[M,v],"text-indent":[M,v],"word-spacing":[M,v],width:[M,v],"min-width":[M,v],"max-width":[M,v],height:[M,v],"min-height":[M,v],"max-height":[M,v],"line-height":[M,x],"scroll-top":[O,s,"scrollTop"],"scroll-left":[O,s,"scrollLeft"]},Y={};F.transform&&(X.transform=[P],Y={x:[v,"translateX"],y:[v,"translateY"],rotate:[w],rotateX:[w],rotateY:[w],scale:[s],scaleX:[s],scaleY:[s],skew:[w],skewX:[w],skewY:[w]}),F.transform&&F.backface&&(Y.z=[v,"translateZ"],Y.rotateZ=[w],Y.scaleZ=[s],Y.perspective=[u]);var Z=/ms/,$=/s|\./,_=function(){var a="warn",b=window.console;return b&&b[a]?function(c){b[a](c)}:f}();return a.tram=b}(window.jQuery); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 4 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Brand pages on the subdomain | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('brand', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var $html = $('html'); | ||
+ | var $body = $('body'); | ||
+ | var location = window.location; | ||
+ | var inApp = Webflow.env(); | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = function() { | ||
+ | var doBranding = $html.attr('data-wf-status'); | ||
+ | |||
+ | if (doBranding) { | ||
+ | var $branding = $('<div></div>'); | ||
+ | var $link = $('<a></a>'); | ||
+ | $link.attr('href', 'http://webflow.com?utm_campaign=brandjs'); | ||
+ | |||
+ | $branding.css({ | ||
+ | position: 'fixed', | ||
+ | bottom: 0, | ||
+ | right: 0, | ||
+ | borderTop: '5px solid #2b3239', | ||
+ | borderLeft: '5px solid #2b3239', | ||
+ | borderTopLeftRadius: '5px', | ||
+ | backgroundColor: '#2b3239', | ||
+ | padding: '5px 5px 5px 10px', | ||
+ | fontFamily: 'Arial', | ||
+ | fontSize: '10px', | ||
+ | textTransform: 'uppercase', | ||
+ | opacity: '0', | ||
+ | transition: 'opacity 0.50s ease-in-out' | ||
+ | }); | ||
+ | |||
+ | $link.css({ | ||
+ | color: '#AAADB0', | ||
+ | textDecoration: 'none' | ||
+ | }); | ||
+ | |||
+ | var $webflowLogo = $('<img>'); | ||
+ | $webflowLogo.attr('src', 'https://daks2k3a4ib2z.cloudfront.net/54153e6a3d25f2755b1f14ed/5445a4b1944ecdaa4df86d3e_subdomain-brand.svg'); | ||
+ | $webflowLogo.css({ | ||
+ | opacity: 0.9, | ||
+ | width: '55px', | ||
+ | verticalAlign: 'middle', | ||
+ | paddingLeft: '4px', | ||
+ | paddingBottom: '3px' | ||
+ | }); | ||
+ | |||
+ | $branding.text('Built with'); | ||
+ | $branding.append($webflowLogo); | ||
+ | $link.append($branding); | ||
+ | |||
+ | $body.append($link); | ||
+ | |||
+ | if (/PhantomJS/.test(window.navigator.userAgent)) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | $branding.css({ | ||
+ | opacity: '1.0' | ||
+ | }); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 5 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Dropdown component | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | var IXEvents = __webpack_require__(2); | ||
+ | |||
+ | Webflow.define('dropdown', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var tram = $.tram; | ||
+ | var $doc = $(document); | ||
+ | var $dropdowns; | ||
+ | var designer; | ||
+ | var inApp = Webflow.env(); | ||
+ | var namespace = '.w-dropdown'; | ||
+ | var stateOpen = 'w--open'; | ||
+ | var closeEvent = 'w-close' + namespace; | ||
+ | var ix = IXEvents.triggers; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = api.design = api.preview = init; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | designer = inApp && Webflow.env('design'); | ||
+ | |||
+ | // Find all instances on the page | ||
+ | $dropdowns = $doc.find(namespace); | ||
+ | $dropdowns.each(build); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | var $el = $(el); | ||
+ | |||
+ | // Store state in data | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} }); | ||
+ | data.list = $el.children('.w-dropdown-list'); | ||
+ | data.toggle = $el.children('.w-dropdown-toggle'); | ||
+ | data.links = data.list.children('.w-dropdown-link'); | ||
+ | data.outside = outside(data); | ||
+ | data.complete = complete(data); | ||
+ | |||
+ | // Remove old events | ||
+ | $el.off(namespace); | ||
+ | data.toggle.off(namespace); | ||
+ | |||
+ | // Set config from data attributes | ||
+ | configure(data); | ||
+ | |||
+ | if (data.nav) data.nav.off(namespace); | ||
+ | data.nav = $el.closest('.w-nav'); | ||
+ | data.nav.on(closeEvent, handler(data)); | ||
+ | |||
+ | // Add events based on mode | ||
+ | if (designer) { | ||
+ | $el.on('setting' + namespace, handler(data)); | ||
+ | } else { | ||
+ | data.toggle.on('tap' + namespace, toggle(data)); | ||
+ | $el.on(closeEvent, handler(data)); | ||
+ | // Close in preview mode | ||
+ | inApp && close(data); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function configure(data) { | ||
+ | data.config = { | ||
+ | hover: +data.el.attr('data-hover'), | ||
+ | delay: +data.el.attr('data-delay') || 0 | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function handler(data) { | ||
+ | return function(evt, options) { | ||
+ | options = options || {}; | ||
+ | |||
+ | if (evt.type === 'w-close') { | ||
+ | return close(data); | ||
+ | } | ||
+ | |||
+ | if (evt.type === 'setting') { | ||
+ | configure(data); | ||
+ | options.open === true && open(data, true); | ||
+ | options.open === false && close(data, true); | ||
+ | return; | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function toggle(data) { | ||
+ | return _.debounce(function(evt) { | ||
+ | data.open ? close(data) : open(data); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function open(data, immediate) { | ||
+ | if (data.open) return; | ||
+ | closeOthers(data); | ||
+ | data.open = true; | ||
+ | data.list.addClass(stateOpen); | ||
+ | data.toggle.addClass(stateOpen); | ||
+ | ix.intro(0, data.el[0]); | ||
+ | Webflow.redraw.up(); | ||
+ | |||
+ | // Listen for tap outside events | ||
+ | if (!designer) $doc.on('tap' + namespace, data.outside); | ||
+ | |||
+ | // Clear previous delay | ||
+ | window.clearTimeout(data.delayId); | ||
+ | } | ||
+ | |||
+ | function close(data, immediate) { | ||
+ | if (!data.open) return; | ||
+ | data.open = false; | ||
+ | var config = data.config; | ||
+ | ix.outro(0, data.el[0]); | ||
+ | |||
+ | // Stop listening for tap outside events | ||
+ | $doc.off('tap' + namespace, data.outside); | ||
+ | |||
+ | // Clear previous delay | ||
+ | window.clearTimeout(data.delayId); | ||
+ | |||
+ | // Skip delay during immediate | ||
+ | if (!config.delay || immediate) return data.complete(); | ||
+ | |||
+ | // Optionally wait for delay before close | ||
+ | data.delayId = window.setTimeout(data.complete, config.delay); | ||
+ | } | ||
+ | |||
+ | function closeOthers(data) { | ||
+ | var self = data.el[0]; | ||
+ | $dropdowns.each(function(i, other) { | ||
+ | var $other = $(other); | ||
+ | if ($other.is(self) || $other.has(self).length) return; | ||
+ | $other.triggerHandler(closeEvent); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function outside(data) { | ||
+ | // Unbind previous tap handler if it exists | ||
+ | if (data.outside) $doc.off('tap' + namespace, data.outside); | ||
+ | |||
+ | // Close menu when tapped outside | ||
+ | return _.debounce(function(evt) { | ||
+ | if (!data.open) return; | ||
+ | var $target = $(evt.target); | ||
+ | if ($target.closest('.w-dropdown-toggle').length) return; | ||
+ | if (!data.el.is($target.closest(namespace))) { | ||
+ | close(data); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function complete(data) { | ||
+ | return function() { | ||
+ | data.list.removeClass(stateOpen); | ||
+ | data.toggle.removeClass(stateOpen); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 6 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Editor loader | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('edit', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var $win = $(window); | ||
+ | var noop = function() {}; | ||
+ | var location = document.location; | ||
+ | var hashchange = 'hashchange'; | ||
+ | var loaded; | ||
+ | |||
+ | // Only allow editor to load outside test env | ||
+ | var loadEditor = Webflow.env('test') ? noop : load; | ||
+ | |||
+ | // Check localStorage for editor data | ||
+ | if (localStorage && localStorage.getItem && localStorage.getItem('WebflowEditor')) { | ||
+ | loadEditor(); | ||
+ | |||
+ | } else if (location.search) { | ||
+ | // Check url query for `edit` parameter or an invalid query ending in `?edit` | ||
+ | if (/[?&](edit)(?:[=&]|$)/.test(location.search) || /\?edit$/.test(location.search)) { | ||
+ | loadEditor(); | ||
+ | } | ||
+ | |||
+ | } else { | ||
+ | // Check hash fragment to support `#hash?edit` | ||
+ | $win.on(hashchange, checkHash).triggerHandler(hashchange); | ||
+ | } | ||
+ | |||
+ | function checkHash() { | ||
+ | if (loaded) return; | ||
+ | // Load editor when hash contains `?edit` | ||
+ | if (/\?edit/.test(location.hash)) loadEditor(); | ||
+ | } | ||
+ | |||
+ | function load() { | ||
+ | loaded = true; | ||
+ | // Predefine global immediately to benefit Webflow.env | ||
+ | window.WebflowEditor = true; | ||
+ | $win.off(hashchange, checkHash); | ||
+ | $.ajax({ | ||
+ | url: cleanSlashes(("https://webflow.com") + '/api/editor/view'), | ||
+ | xhrFields: { withCredentials: true }, | ||
+ | dataType: 'json', | ||
+ | crossDomain: true, | ||
+ | success: success | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function success(data) { | ||
+ | if (!data) { | ||
+ | console.error('Could not load editor data'); | ||
+ | return; | ||
+ | } | ||
+ | getScript(prefix(data.scriptPath), function () { | ||
+ | window.WebflowEditor(data); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function getScript(url, done) { | ||
+ | $.ajax({ type: 'GET', url: url, dataType: 'script', cache: true }).then(done, error); | ||
+ | } | ||
+ | |||
+ | function error(jqXHR, textStatus, errorThrown) { | ||
+ | console.error('Could not load editor script: ' + textStatus); | ||
+ | throw errorThrown; | ||
+ | } | ||
+ | |||
+ | function prefix(url) { | ||
+ | return (url.indexOf('//') >= 0) ? url : cleanSlashes(("https://webflow.com") + url); | ||
+ | } | ||
+ | |||
+ | function cleanSlashes(url) { | ||
+ | return url.replace(/([^:])\/\//g, '$1/'); | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 7 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | /** | ||
+ | * Webflow: Forms | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('forms', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | |||
+ | // Cross-Domain AJAX for IE8 | ||
+ | __webpack_require__(19); | ||
+ | |||
+ | var $doc = $(document); | ||
+ | var $forms; | ||
+ | var loc = window.location; | ||
+ | var retro = window.XDomainRequest && !window.atob; | ||
+ | var namespace = '.w-form'; | ||
+ | var siteId; | ||
+ | var emailField = /e(\-)?mail/i; | ||
+ | var emailValue = /^\S+@\S+$/; | ||
+ | var alert = window.alert; | ||
+ | var listening; | ||
+ | |||
+ | // MailChimp domains: list-manage.com + mirrors | ||
+ | var chimpRegex = /list-manage[1-9]?.com/i; | ||
+ | |||
+ | var disconnected = _.debounce(function() { | ||
+ | alert('Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.'); | ||
+ | }, 100); | ||
+ | |||
+ | api.ready = function() { | ||
+ | // Init forms | ||
+ | init(); | ||
+ | |||
+ | // Wire document events once | ||
+ | if (!listening) addListeners(); | ||
+ | }; | ||
+ | |||
+ | api.preview = api.design = function() { | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | function init() { | ||
+ | siteId = $('html').attr('data-wf-site'); | ||
+ | |||
+ | $forms = $(namespace + ' form'); | ||
+ | if (!$forms.length) return; | ||
+ | $forms.each(build); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | // Store form state using namespace | ||
+ | var $el = $(el); | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) data = $.data(el, namespace, { form: $el }); // data.form | ||
+ | |||
+ | reset(data); | ||
+ | var wrap = $el.closest('div.w-form'); | ||
+ | data.done = wrap.find('> .w-form-done'); | ||
+ | data.fail = wrap.find('> .w-form-fail'); | ||
+ | |||
+ | var action = data.action = $el.attr('action'); | ||
+ | data.handler = null; | ||
+ | data.redirect = $el.attr('data-redirect'); | ||
+ | |||
+ | // MailChimp form | ||
+ | if (chimpRegex.test(action)) { data.handler = submitMailChimp; return; } | ||
+ | |||
+ | // Custom form action | ||
+ | if (action) return; | ||
+ | |||
+ | // Webflow form | ||
+ | if (siteId) { data.handler = submitWebflow; return; } | ||
+ | |||
+ | // Alert for disconnected Webflow forms | ||
+ | disconnected(); | ||
+ | } | ||
+ | |||
+ | function addListeners() { | ||
+ | listening = true; | ||
+ | |||
+ | // Handle form submission for Webflow forms | ||
+ | $doc.on('submit', namespace + ' form', function(evt) { | ||
+ | var data = $.data(this, namespace); | ||
+ | if (data.handler) { | ||
+ | data.evt = evt; | ||
+ | data.handler(data); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | // Reset data common to all submit handlers | ||
+ | function reset(data) { | ||
+ | var btn = data.btn = data.form.find(':input[type="submit"]'); | ||
+ | data.wait = data.btn.attr('data-wait') || null; | ||
+ | data.success = false; | ||
+ | btn.prop('disabled', false); | ||
+ | data.label && btn.val(data.label); | ||
+ | } | ||
+ | |||
+ | // Disable submit button | ||
+ | function disableBtn(data) { | ||
+ | var btn = data.btn; | ||
+ | var wait = data.wait; | ||
+ | btn.prop('disabled', true); | ||
+ | // Show wait text and store previous label | ||
+ | if (wait) { | ||
+ | data.label = btn.val(); | ||
+ | btn.val(wait); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Find form fields, validate, and set value pairs | ||
+ | function findFields(form, result) { | ||
+ | var status = null; | ||
+ | result = result || {}; | ||
+ | |||
+ | // The ":input" selector is a jQuery shortcut to select all inputs, selects, textareas | ||
+ | form.find(':input:not([type="submit"])').each(function(i, el) { | ||
+ | var field = $(el); | ||
+ | var type = field.attr('type'); | ||
+ | var name = field.attr('data-name') || field.attr('name') || ('Field ' + (i + 1)); | ||
+ | var value = field.val(); | ||
+ | |||
+ | if (type === 'checkbox') { | ||
+ | value = field.is(':checked'); | ||
+ | } if (type === 'radio') { | ||
+ | // Radio group value already processed | ||
+ | if (result[name] === null || typeof result[name] === 'string') { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | value = form.find('input[name="' + field.attr('name') + '"]:checked').val() || null; | ||
+ | } | ||
+ | |||
+ | if (typeof value === 'string') value = $.trim(value); | ||
+ | result[name] = value; | ||
+ | status = status || getStatus(field, name, value); | ||
+ | }); | ||
+ | |||
+ | return status; | ||
+ | } | ||
+ | |||
+ | function getStatus(field, name, value) { | ||
+ | var status = null; | ||
+ | if (!field.attr('required')) return null; | ||
+ | if (!value) status = 'Please fill out the required field: ' + name; | ||
+ | else if (emailField.test(name) || emailField.test(field.attr('type'))) { | ||
+ | if (!emailValue.test(value)) status = 'Please enter a valid email address for: ' + name; | ||
+ | } | ||
+ | return status; | ||
+ | } | ||
+ | |||
+ | // Submit form to Webflow | ||
+ | function submitWebflow(data) { | ||
+ | reset(data); | ||
+ | |||
+ | var form = data.form; | ||
+ | var payload = { | ||
+ | name: form.attr('data-name') || form.attr('name') || 'Untitled Form', | ||
+ | source: loc.href, | ||
+ | test: Webflow.env(), | ||
+ | fields: {} | ||
+ | }; | ||
+ | |||
+ | preventDefault(data); | ||
+ | |||
+ | // Find & populate all fields | ||
+ | var status = findFields(form, payload.fields); | ||
+ | if (status) return alert(status); | ||
+ | |||
+ | // Disable submit button | ||
+ | disableBtn(data); | ||
+ | |||
+ | // Read site ID | ||
+ | // NOTE: If this site is exported, the HTML tag must retain the data-wf-site attribute for forms to work | ||
+ | if (!siteId) { afterSubmit(data); return; } | ||
+ | var url = ("https://webflow.com") + '/api/v1/form/' + siteId; | ||
+ | |||
+ | // Work around same-protocol IE XDR limitation - without this IE9 and below forms won't submit | ||
+ | if (retro && url.indexOf(("https://webflow.com")) >= 0) { | ||
+ | url = url.replace(("https://webflow.com"), ("http://formdata.webflow.com")); | ||
+ | } | ||
+ | |||
+ | $.ajax({ | ||
+ | url: url, | ||
+ | type: 'POST', | ||
+ | data: payload, | ||
+ | dataType: 'json', | ||
+ | crossDomain: true | ||
+ | }).done(function() { | ||
+ | data.success = true; | ||
+ | afterSubmit(data); | ||
+ | }).fail(function(response, textStatus, jqXHR) { | ||
+ | afterSubmit(data); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | // Submit form to MailChimp | ||
+ | function submitMailChimp(data) { | ||
+ | reset(data); | ||
+ | |||
+ | var form = data.form; | ||
+ | var payload = {}; | ||
+ | |||
+ | // Skip Ajax submission if http/s mismatch, fallback to POST instead | ||
+ | if (/^https/.test(loc.href) && !/^https/.test(data.action)) { | ||
+ | form.attr('method', 'post'); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | preventDefault(data); | ||
+ | |||
+ | // Find & populate all fields | ||
+ | var status = findFields(form, payload); | ||
+ | if (status) return alert(status); | ||
+ | |||
+ | // Disable submit button | ||
+ | disableBtn(data); | ||
+ | |||
+ | // Use special format for MailChimp params | ||
+ | var fullName; | ||
+ | _.each(payload, function(value, key) { | ||
+ | if (emailField.test(key)) payload.EMAIL = value; | ||
+ | if (/^((full[ _-]?)?name)$/i.test(key)) fullName = value; | ||
+ | if (/^(first[ _-]?name)$/i.test(key)) payload.FNAME = value; | ||
+ | if (/^(last[ _-]?name)$/i.test(key)) payload.LNAME = value; | ||
+ | }); | ||
+ | |||
+ | if (fullName && !payload.FNAME) { | ||
+ | fullName = fullName.split(' '); | ||
+ | payload.FNAME = fullName[0]; | ||
+ | payload.LNAME = payload.LNAME || fullName[1]; | ||
+ | } | ||
+ | |||
+ | // Use the (undocumented) MailChimp jsonp api | ||
+ | var url = data.action.replace('/post?', '/post-json?') + '&c=?'; | ||
+ | // Add special param to prevent bot signups | ||
+ | var userId = url.indexOf('u=') + 2; | ||
+ | userId = url.substring(userId, url.indexOf('&', userId)); | ||
+ | var listId = url.indexOf('id=') + 3; | ||
+ | listId = url.substring(listId, url.indexOf('&', listId)); | ||
+ | payload['b_' + userId + '_' + listId] = ''; | ||
+ | |||
+ | $.ajax({ | ||
+ | url: url, | ||
+ | data: payload, | ||
+ | dataType: 'jsonp' | ||
+ | }).done(function(resp) { | ||
+ | data.success = (resp.result === 'success' || /already/.test(resp.msg)); | ||
+ | if (!data.success) console.info('MailChimp error: ' + resp.msg); | ||
+ | afterSubmit(data); | ||
+ | }).fail(function(response, textStatus, jqXHR) { | ||
+ | afterSubmit(data); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | // Common callback which runs after all Ajax submissions | ||
+ | function afterSubmit(data) { | ||
+ | var form = data.form; | ||
+ | var wrap = form.closest('div.w-form'); | ||
+ | var redirect = data.redirect; | ||
+ | var success = data.success; | ||
+ | |||
+ | // Redirect to a success url if defined | ||
+ | if (success && redirect) { | ||
+ | Webflow.location(redirect); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Show or hide status divs | ||
+ | data.done.toggle(success); | ||
+ | data.fail.toggle(!success); | ||
+ | |||
+ | // Hide form on success | ||
+ | form.toggle(!success); | ||
+ | |||
+ | // Reset data and enable submit button | ||
+ | reset(data); | ||
+ | } | ||
+ | |||
+ | function preventDefault(data) { | ||
+ | data.evt && data.evt.preventDefault(); | ||
+ | data.evt = null; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 8 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Google+ widget | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('gplus', module.exports = function($, _) { | ||
+ | var $doc = $(document); | ||
+ | var api = {}; | ||
+ | var loaded; | ||
+ | |||
+ | api.ready = function() { | ||
+ | // Load Google+ API on the front-end | ||
+ | if (!Webflow.env() && !loaded) init(); | ||
+ | }; | ||
+ | |||
+ | function init() { | ||
+ | $doc.find('.w-widget-gplus').length && load(); | ||
+ | } | ||
+ | |||
+ | function load() { | ||
+ | loaded = true; | ||
+ | $.getScript('https://apis.google.com/js/plusone.js'); | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 9 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Interactions | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | var IXEvents = __webpack_require__(2); | ||
+ | |||
+ | Webflow.define('ix', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var designer; | ||
+ | var $win = $(window); | ||
+ | var namespace = '.w-ix'; | ||
+ | var tram = $.tram; | ||
+ | var env = Webflow.env; | ||
+ | var inApp = env(); | ||
+ | var emptyFix = env.chrome && env.chrome < 35; | ||
+ | var transNone = 'none 0s ease 0s'; | ||
+ | var fallbackProps = /width|height/; | ||
+ | var $subs = $(); | ||
+ | var config = {}; | ||
+ | var anchors = []; | ||
+ | var loads = []; | ||
+ | var readys = []; | ||
+ | var destroyed; | ||
+ | var readyDelay = 1; | ||
+ | |||
+ | // Component types and proxy selectors | ||
+ | var components = { | ||
+ | tabs: '.w-tab-link, .w-tab-pane', | ||
+ | dropdown: '.w-dropdown', | ||
+ | slider: '.w-slide', | ||
+ | navbar: '.w-nav' | ||
+ | }; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.init = function(list) { | ||
+ | setTimeout(function() { configure(list); }, 1); | ||
+ | }; | ||
+ | |||
+ | api.preview = function() { | ||
+ | designer = false; | ||
+ | readyDelay = 100; | ||
+ | setTimeout(function() { configure(window.__wf_ix); }, 1); | ||
+ | }; | ||
+ | |||
+ | api.design = function() { | ||
+ | designer = true; | ||
+ | api.destroy(); | ||
+ | }; | ||
+ | |||
+ | api.destroy = function() { | ||
+ | destroyed = true; | ||
+ | $subs.each(teardown); | ||
+ | Webflow.scroll.off(scroll); | ||
+ | IXEvents.async(); | ||
+ | anchors = []; | ||
+ | loads = []; | ||
+ | readys = []; | ||
+ | }; | ||
+ | |||
+ | api.ready = function() { | ||
+ | // Ready should only be used after destroy, as a way to re-init | ||
+ | if (config && destroyed) { | ||
+ | destroyed = false; | ||
+ | init(); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | api.run = run; | ||
+ | api.style = inApp ? styleApp : stylePub; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function configure(list) { | ||
+ | if (!list) return; | ||
+ | |||
+ | // Map all interactions by slug | ||
+ | config = {}; | ||
+ | _.each(list, function(item) { | ||
+ | config[item.slug] = item.value; | ||
+ | }); | ||
+ | |||
+ | // Init ix after config | ||
+ | init(); | ||
+ | } | ||
+ | |||
+ | function init() { | ||
+ | // Build each element's interaction keying from data attribute | ||
+ | var els = $('[data-ix]'); | ||
+ | if (!els.length) return; | ||
+ | els.each(teardown); | ||
+ | els.each(build); | ||
+ | |||
+ | // Listen for scroll events if any anchors exist | ||
+ | if (anchors.length) { | ||
+ | Webflow.scroll.on(scroll); | ||
+ | setTimeout(scroll, 1); | ||
+ | } | ||
+ | |||
+ | // Handle loads or readys if they exist | ||
+ | if (loads.length) Webflow.load(runLoads); | ||
+ | if (readys.length) setTimeout(runReadys, readyDelay); | ||
+ | |||
+ | // Trigger queued events, must happen after init | ||
+ | IXEvents.init(); | ||
+ | |||
+ | // Trigger a redraw to ensure all IX intros play | ||
+ | Webflow.redraw.up(); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | var $el = $(el); | ||
+ | var id = $el.attr('data-ix'); | ||
+ | var ix = config[id]; | ||
+ | if (!ix) return; | ||
+ | var triggers = ix.triggers; | ||
+ | if (!triggers) return; | ||
+ | |||
+ | // Set styles immediately to provide tram with starting transform values | ||
+ | api.style($el, ix.style); | ||
+ | |||
+ | _.each(triggers, function(trigger) { | ||
+ | var state = {}; | ||
+ | var type = trigger.type; | ||
+ | var stepsB = trigger.stepsB && trigger.stepsB.length; | ||
+ | |||
+ | function runA() { run(trigger, $el, { group: 'A' }); } | ||
+ | function runB() { run(trigger, $el, { group: 'B' }); } | ||
+ | |||
+ | if (type === 'load') { | ||
+ | (trigger.preload && !inApp) ? loads.push(runA) : readys.push(runA); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (type === 'click') { | ||
+ | $el.on('click' + namespace, function(evt) { | ||
+ | // Avoid late clicks on touch devices | ||
+ | if (!Webflow.validClick(evt.currentTarget)) return; | ||
+ | |||
+ | // Prevent default on empty hash urls | ||
+ | if ($el.attr('href') === '#') evt.preventDefault(); | ||
+ | |||
+ | run(trigger, $el, { group: state.clicked ? 'B' : 'A' }); | ||
+ | if (stepsB) state.clicked = !state.clicked; | ||
+ | }); | ||
+ | $subs = $subs.add($el); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (type === 'hover') { | ||
+ | $el.on('mouseenter' + namespace, runA); | ||
+ | $el.on('mouseleave' + namespace, runB); | ||
+ | $subs = $subs.add($el); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (type === 'scroll') { | ||
+ | anchors.push({ | ||
+ | el: $el, trigger: trigger, state: { active: false }, | ||
+ | offsetTop: convert(trigger.offsetTop), | ||
+ | offsetBot: convert(trigger.offsetBot) | ||
+ | }); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Check for a proxy component selector | ||
+ | // type == [tabs, dropdown, slider, navbar] | ||
+ | var proxy = components[type]; | ||
+ | if (proxy) { | ||
+ | var $proxy = $el.closest(proxy); | ||
+ | $proxy.on(IXEvents.types.INTRO, runA).on(IXEvents.types.OUTRO, runB); | ||
+ | $subs = $subs.add($proxy); | ||
+ | return; | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function convert(offset) { | ||
+ | if (!offset) return 0; | ||
+ | offset = offset + ''; | ||
+ | var result = parseInt(offset, 10); | ||
+ | if (result !== result) return 0; | ||
+ | if (offset.indexOf('%') > 0) { | ||
+ | result = result / 100; | ||
+ | if (result >= 1) result = 0.999; | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | function teardown(i, el) { | ||
+ | $(el).off(namespace); | ||
+ | } | ||
+ | |||
+ | function scroll() { | ||
+ | var viewTop = $win.scrollTop(); | ||
+ | var viewHeight = $win.height(); | ||
+ | |||
+ | // Check each anchor for a valid scroll trigger | ||
+ | var count = anchors.length; | ||
+ | for (var i = 0; i < count; i++) { | ||
+ | var anchor = anchors[i]; | ||
+ | var $el = anchor.el; | ||
+ | var trigger = anchor.trigger; | ||
+ | var stepsB = trigger.stepsB && trigger.stepsB.length; | ||
+ | var state = anchor.state; | ||
+ | var top = $el.offset().top; | ||
+ | var height = $el.outerHeight(); | ||
+ | var offsetTop = anchor.offsetTop; | ||
+ | var offsetBot = anchor.offsetBot; | ||
+ | if (offsetTop < 1 && offsetTop > 0) offsetTop *= viewHeight; | ||
+ | if (offsetBot < 1 && offsetBot > 0) offsetBot *= viewHeight; | ||
+ | var active = (top + height - offsetTop >= viewTop && top + offsetBot <= viewTop + viewHeight); | ||
+ | if (active === state.active) continue; | ||
+ | if (active === false && !stepsB) continue; | ||
+ | state.active = active; | ||
+ | run(trigger, $el, { group: active ? 'A' : 'B' }); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function runLoads() { | ||
+ | var count = loads.length; | ||
+ | for (var i = 0; i < count; i++) { | ||
+ | loads[i](); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function runReadys() { | ||
+ | var count = readys.length; | ||
+ | for (var i = 0; i < count; i++) { | ||
+ | readys[i](); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function run(trigger, $el, opts, replay) { | ||
+ | opts = opts || {}; | ||
+ | var done = opts.done; | ||
+ | |||
+ | // Do not run in designer unless forced | ||
+ | if (designer && !opts.force) return; | ||
+ | |||
+ | // Operate on a set of grouped steps | ||
+ | var group = opts.group || 'A'; | ||
+ | var loop = trigger['loop' + group]; | ||
+ | var steps = trigger['steps' + group]; | ||
+ | if (!steps || !steps.length) return; | ||
+ | if (steps.length < 2) loop = false; | ||
+ | |||
+ | // One-time init before any loops | ||
+ | if (!replay) { | ||
+ | |||
+ | // Find selector within element descendants, siblings, or query whole document | ||
+ | var selector = trigger.selector; | ||
+ | if (selector) { | ||
+ | $el = ( | ||
+ | trigger.descend ? $el.find(selector) : | ||
+ | trigger.siblings ? $el.siblings(selector) : | ||
+ | $(selector) | ||
+ | ); | ||
+ | if (inApp) $el.attr('data-ix-affect', 1); | ||
+ | } | ||
+ | |||
+ | // Apply empty fix for certain Chrome versions | ||
+ | if (emptyFix) $el.addClass('w-ix-emptyfix'); | ||
+ | } | ||
+ | |||
+ | var _tram = tram($el); | ||
+ | |||
+ | // Add steps | ||
+ | var meta = {}; | ||
+ | for (var i = 0; i < steps.length; i++) { | ||
+ | addStep(_tram, steps[i], meta); | ||
+ | } | ||
+ | |||
+ | function fin() { | ||
+ | // Run trigger again if looped | ||
+ | if (loop) return run(trigger, $el, opts, true); | ||
+ | |||
+ | // Reset any 'auto' values | ||
+ | if (meta.width === 'auto') _tram.set({ width: 'auto' }); | ||
+ | if (meta.height === 'auto') _tram.set({ height: 'auto' }); | ||
+ | |||
+ | // Run callback | ||
+ | done && done(); | ||
+ | } | ||
+ | |||
+ | // Add final step to queue if tram has started | ||
+ | meta.start ? _tram.then(fin) : fin(); | ||
+ | } | ||
+ | |||
+ | function addStep(_tram, step, meta) { | ||
+ | var addMethod = 'add'; | ||
+ | var startMethod = 'start'; | ||
+ | |||
+ | // Once the transition has started, we will always use then() to add to the queue. | ||
+ | if (meta.start) addMethod = startMethod = 'then'; | ||
+ | |||
+ | // Parse transitions string on the current step | ||
+ | var transitions = step.transition; | ||
+ | if (transitions) { | ||
+ | transitions = transitions.split(','); | ||
+ | for (var i = 0; i < transitions.length; i++) { | ||
+ | var transition = transitions[i]; | ||
+ | var options = fallbackProps.test(transition) ? { fallback: true } : null; | ||
+ | _tram[addMethod](transition, options); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Build a clean object to pass to the tram method | ||
+ | var clean = tramify(step) || {}; | ||
+ | |||
+ | // Store last width and height values | ||
+ | if (clean.width != null) meta.width = clean.width; | ||
+ | if (clean.height != null) meta.height = clean.height; | ||
+ | |||
+ | // When transitions are not present, set values immediately and continue queue. | ||
+ | if (transitions == null) { | ||
+ | |||
+ | // If we have started, wrap set() in then() and reset queue | ||
+ | if (meta.start) { | ||
+ | _tram.then(function() { | ||
+ | var queue = this.queue; | ||
+ | this.set(clean); | ||
+ | if (clean.display) { | ||
+ | _tram.redraw(); | ||
+ | Webflow.redraw.up(); | ||
+ | } | ||
+ | this.queue = queue; | ||
+ | this.next(); | ||
+ | }); | ||
+ | } else { | ||
+ | _tram.set(clean); | ||
+ | |||
+ | // Always redraw after setting display | ||
+ | if (clean.display) { | ||
+ | _tram.redraw(); | ||
+ | Webflow.redraw.up(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Use the wait() method to kick off queue in absence of transitions. | ||
+ | var wait = clean.wait; | ||
+ | if (wait != null) { | ||
+ | _tram.wait(wait); | ||
+ | meta.start = true; | ||
+ | } | ||
+ | |||
+ | // Otherwise, when transitions are present | ||
+ | } else { | ||
+ | |||
+ | // If display is present, handle it separately | ||
+ | if (clean.display) { | ||
+ | var display = clean.display; | ||
+ | delete clean.display; | ||
+ | |||
+ | // If we've already started, we need to wrap it in a then() | ||
+ | if (meta.start) { | ||
+ | _tram.then(function() { | ||
+ | var queue = this.queue; | ||
+ | this.set({ display: display }).redraw(); | ||
+ | Webflow.redraw.up(); | ||
+ | this.queue = queue; | ||
+ | this.next(); | ||
+ | }); | ||
+ | } else { | ||
+ | _tram.set({ display: display }).redraw(); | ||
+ | Webflow.redraw.up(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Otherwise, start a transition using the current start method. | ||
+ | _tram[startMethod](clean); | ||
+ | meta.start = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // (In app) Set styles immediately and manage upstream transition | ||
+ | function styleApp(el, data) { | ||
+ | var _tram = tram(el); | ||
+ | |||
+ | // Get computed transition value | ||
+ | el.css('transition', ''); | ||
+ | var computed = el.css('transition'); | ||
+ | |||
+ | // If computed is set to none, clear upstream | ||
+ | if (computed === transNone) computed = _tram.upstream = null; | ||
+ | |||
+ | // Set upstream transition to none temporarily | ||
+ | _tram.upstream = transNone; | ||
+ | |||
+ | // Set values immediately | ||
+ | _tram.set(tramify(data)); | ||
+ | |||
+ | // Only restore upstream in preview mode | ||
+ | _tram.upstream = computed; | ||
+ | } | ||
+ | |||
+ | // (Published) Set styles immediately on specified jquery element | ||
+ | function stylePub(el, data) { | ||
+ | tram(el).set(tramify(data)); | ||
+ | } | ||
+ | |||
+ | // Build a clean object for tram | ||
+ | function tramify(obj) { | ||
+ | var result = {}; | ||
+ | var found = false; | ||
+ | for (var x in obj) { | ||
+ | if (x === 'transition') continue; | ||
+ | result[x] = obj[x]; | ||
+ | found = true; | ||
+ | } | ||
+ | // If empty, return null for tram.set/stop compliance | ||
+ | return found ? result : null; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 10 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | /*eslint | ||
+ | no-use-before-define: 0, | ||
+ | no-shadow: 0 | ||
+ | */ | ||
+ | |||
+ | /** | ||
+ | * Webflow: Lightbox component | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | function createLightbox(window, document, $) { | ||
+ | var tram = $.tram; | ||
+ | var isArray = Array.isArray; | ||
+ | var namespace = 'w-lightbox'; | ||
+ | var prefix = namespace + '-'; | ||
+ | var prefixRegex = /(^|\s+)/g; | ||
+ | |||
+ | // Array of objects describing items to be displayed. | ||
+ | var items = []; | ||
+ | |||
+ | // Index of the currently displayed item. | ||
+ | var currentIndex; | ||
+ | |||
+ | // Object holding references to jQuery wrapped nodes. | ||
+ | var $refs; | ||
+ | |||
+ | // Instance of Spinner | ||
+ | var spinner; | ||
+ | |||
+ | function lightbox(thing, index) { | ||
+ | items = isArray(thing) ? thing : [thing]; | ||
+ | |||
+ | if (!$refs) { | ||
+ | lightbox.build(); | ||
+ | } | ||
+ | |||
+ | if (items.length > 1) { | ||
+ | $refs.items = $refs.empty; | ||
+ | |||
+ | items.forEach(function (item) { | ||
+ | var $thumbnail = dom('thumbnail'); | ||
+ | var $item = dom('item').append($thumbnail); | ||
+ | |||
+ | $refs.items = $refs.items.add($item); | ||
+ | |||
+ | loadImage(item.thumbnailUrl || item.url, function ($image) { | ||
+ | if ($image.prop('width') > $image.prop('height')) { | ||
+ | addClass($image, 'wide'); | ||
+ | } else { | ||
+ | addClass($image, 'tall'); | ||
+ | } | ||
+ | $thumbnail.append(addClass($image, 'thumbnail-image')); | ||
+ | }); | ||
+ | }); | ||
+ | |||
+ | $refs.strip.empty().append($refs.items); | ||
+ | addClass($refs.content, 'group'); | ||
+ | } | ||
+ | |||
+ | tram( | ||
+ | // Focus the lightbox to receive keyboard events. | ||
+ | removeClass($refs.lightbox, 'hide').focus() | ||
+ | ) | ||
+ | .add('opacity .3s') | ||
+ | .start({opacity: 1}); | ||
+ | |||
+ | // Prevent document from scrolling while lightbox is active. | ||
+ | addClass($refs.html, 'noscroll'); | ||
+ | |||
+ | return lightbox.show(index || 0); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Creates the DOM structure required by the lightbox. | ||
+ | */ | ||
+ | lightbox.build = function () { | ||
+ | // In case `build` is called more than once. | ||
+ | lightbox.destroy(); | ||
+ | |||
+ | $refs = { | ||
+ | html: $(document.documentElement), | ||
+ | // Empty jQuery object can be used to build new ones using `.add`. | ||
+ | empty: $() | ||
+ | }; | ||
+ | |||
+ | $refs.arrowLeft = dom('control left inactive'); | ||
+ | $refs.arrowRight = dom('control right inactive'); | ||
+ | $refs.close = dom('control close'); | ||
+ | |||
+ | $refs.spinner = dom('spinner'); | ||
+ | $refs.strip = dom('strip'); | ||
+ | |||
+ | spinner = new Spinner($refs.spinner, prefixed('hide')); | ||
+ | |||
+ | $refs.content = dom('content') | ||
+ | .append($refs.spinner, $refs.arrowLeft, $refs.arrowRight, $refs.close); | ||
+ | |||
+ | $refs.container = dom('container') | ||
+ | .append($refs.content, $refs.strip); | ||
+ | |||
+ | $refs.lightbox = dom('backdrop hide') | ||
+ | .append($refs.container); | ||
+ | |||
+ | // We are delegating events for performance reasons and also | ||
+ | // to not have to reattach handlers when images change. | ||
+ | $refs.strip.on('tap', selector('item'), itemTapHandler); | ||
+ | $refs.content | ||
+ | .on('swipe', swipeHandler) | ||
+ | .on('tap', selector('left'), handlerPrev) | ||
+ | .on('tap', selector('right'), handlerNext) | ||
+ | .on('tap', selector('close'), handlerHide) | ||
+ | .on('tap', selector('image, caption'), handlerNext); | ||
+ | $refs.container | ||
+ | .on('tap', selector('view, strip'), handlerHide) | ||
+ | // Prevent images from being dragged around. | ||
+ | .on('dragstart', selector('img'), preventDefault); | ||
+ | $refs.lightbox | ||
+ | .on('keydown', keyHandler) | ||
+ | // IE loses focus to inner nodes without letting us know. | ||
+ | .on('focusin', focusThis); | ||
+ | |||
+ | // The `tabindex` attribute is needed to enable non-input elements | ||
+ | // to receive keyboard events. | ||
+ | $('body').append($refs.lightbox.prop('tabIndex', 0)); | ||
+ | |||
+ | return lightbox; | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Dispose of DOM nodes created by the lightbox. | ||
+ | */ | ||
+ | lightbox.destroy = function () { | ||
+ | if (!$refs) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Event handlers are also removed. | ||
+ | removeClass($refs.html, 'noscroll'); | ||
+ | $refs.lightbox.remove(); | ||
+ | $refs = undefined; | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Show a specific item. | ||
+ | */ | ||
+ | lightbox.show = function (index) { | ||
+ | // Bail if we are already showing this item. | ||
+ | if (index === currentIndex) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var item = items[index]; | ||
+ | if (!item) { return lightbox.hide(); } | ||
+ | |||
+ | var previousIndex = currentIndex; | ||
+ | currentIndex = index; | ||
+ | spinner.show(); | ||
+ | |||
+ | // For videos, load an empty SVG with the video dimensions to preserve | ||
+ | // the video’s aspect ratio while being responsive. | ||
+ | var url = item.html && svgDataUri(item.width, item.height) || item.url; | ||
+ | loadImage(url, function ($image) { | ||
+ | // Make sure this is the last item requested to be shown since | ||
+ | // images can finish loading in a different order than they were | ||
+ | // requested in. | ||
+ | if (index !== currentIndex) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var $figure = dom('figure', 'figure').append(addClass($image, 'image')); | ||
+ | var $frame = dom('frame').append($figure); | ||
+ | var $newView = dom('view').append($frame); | ||
+ | var $html, isIframe; | ||
+ | |||
+ | if (item.html) { | ||
+ | $html = $(item.html); | ||
+ | isIframe = $html.is('iframe'); | ||
+ | |||
+ | if (isIframe) { | ||
+ | $html.on('load', transitionToNewView); | ||
+ | } | ||
+ | |||
+ | $figure.append(addClass($html, 'embed')); | ||
+ | } | ||
+ | |||
+ | if (item.caption) { | ||
+ | $figure.append(dom('caption', 'figcaption').text(item.caption)); | ||
+ | } | ||
+ | |||
+ | $refs.spinner.before($newView); | ||
+ | |||
+ | if (!isIframe) { | ||
+ | transitionToNewView(); | ||
+ | } | ||
+ | |||
+ | function transitionToNewView() { | ||
+ | spinner.hide(); | ||
+ | |||
+ | if (index !== currentIndex) { | ||
+ | $newView.remove(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | toggleClass($refs.arrowLeft, 'inactive', index <= 0); | ||
+ | toggleClass($refs.arrowRight, 'inactive', index >= items.length - 1); | ||
+ | |||
+ | if ($refs.view) { | ||
+ | tram($refs.view) | ||
+ | .add('opacity .3s') | ||
+ | .start({opacity: 0}) | ||
+ | .then(remover($refs.view)); | ||
+ | |||
+ | tram($newView) | ||
+ | .add('opacity .3s') | ||
+ | .add('transform .3s') | ||
+ | .set({x: index > previousIndex ? '80px' : '-80px'}) | ||
+ | .start({opacity: 1, x: 0}); | ||
+ | } else { | ||
+ | $newView.css('opacity', 1); | ||
+ | } | ||
+ | |||
+ | $refs.view = $newView; | ||
+ | |||
+ | if ($refs.items) { | ||
+ | // Mark proper thumbnail as active | ||
+ | addClass(removeClass($refs.items, 'active').eq(index), 'active'); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | return lightbox; | ||
+ | }; | ||
+ | |||
+ | /** | ||
+ | * Hides the lightbox. | ||
+ | */ | ||
+ | lightbox.hide = function () { | ||
+ | tram($refs.lightbox) | ||
+ | .add('opacity .3s') | ||
+ | .start({opacity: 0}) | ||
+ | .then(hideLightbox); | ||
+ | |||
+ | return lightbox; | ||
+ | }; | ||
+ | |||
+ | lightbox.prev = function () { | ||
+ | if (currentIndex > 0) { | ||
+ | lightbox.show(currentIndex - 1); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | lightbox.next = function () { | ||
+ | if (currentIndex < items.length - 1) { | ||
+ | lightbox.show(currentIndex + 1); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | function createHandler(action) { | ||
+ | return function (event) { | ||
+ | // We only care about events triggered directly on the bound selectors. | ||
+ | if (this !== event.target) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | event.stopPropagation(); | ||
+ | event.preventDefault(); | ||
+ | |||
+ | action(); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | var handlerPrev = createHandler(lightbox.prev); | ||
+ | var handlerNext = createHandler(lightbox.next); | ||
+ | var handlerHide = createHandler(lightbox.hide); | ||
+ | |||
+ | var itemTapHandler = function(event) { | ||
+ | var index = $(this).index(); | ||
+ | |||
+ | event.preventDefault(); | ||
+ | lightbox.show(index); | ||
+ | }; | ||
+ | |||
+ | var swipeHandler = function (event, data) { | ||
+ | // Prevent scrolling. | ||
+ | event.preventDefault(); | ||
+ | |||
+ | if (data.direction === 'left') { | ||
+ | lightbox.next(); | ||
+ | } else if (data.direction === 'right') { | ||
+ | lightbox.prev(); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | var focusThis = function () { | ||
+ | this.focus(); | ||
+ | }; | ||
+ | |||
+ | function preventDefault(event) { | ||
+ | event.preventDefault(); | ||
+ | } | ||
+ | |||
+ | function keyHandler(event) { | ||
+ | var keyCode = event.keyCode; | ||
+ | |||
+ | // [esc] | ||
+ | if (keyCode === 27) { | ||
+ | lightbox.hide(); | ||
+ | } | ||
+ | |||
+ | // [◀] | ||
+ | else if (keyCode === 37) { | ||
+ | lightbox.prev(); | ||
+ | } | ||
+ | |||
+ | // [▶] | ||
+ | else if (keyCode === 39) { | ||
+ | lightbox.next(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function hideLightbox() { | ||
+ | // If the lightbox hasn't been destroyed already | ||
+ | if ($refs) { | ||
+ | removeClass($refs.html, 'noscroll'); | ||
+ | addClass($refs.lightbox, 'hide'); | ||
+ | $refs.strip.empty(); | ||
+ | $refs.view && $refs.view.remove(); | ||
+ | |||
+ | // Reset some stuff | ||
+ | removeClass($refs.content, 'group'); | ||
+ | addClass($refs.arrowLeft, 'inactive'); | ||
+ | addClass($refs.arrowRight, 'inactive'); | ||
+ | |||
+ | currentIndex = $refs.view = undefined; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function loadImage(url, callback) { | ||
+ | var $image = dom('img', 'img'); | ||
+ | |||
+ | $image.one('load', function () { | ||
+ | callback($image); | ||
+ | }); | ||
+ | |||
+ | // Start loading image. | ||
+ | $image.attr('src', url); | ||
+ | |||
+ | return $image; | ||
+ | } | ||
+ | |||
+ | function remover($element) { | ||
+ | return function () { | ||
+ | $element.remove(); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Spinner | ||
+ | */ | ||
+ | function Spinner($spinner, className, delay) { | ||
+ | this.$element = $spinner; | ||
+ | this.className = className; | ||
+ | this.delay = delay || 200; | ||
+ | this.hide(); | ||
+ | } | ||
+ | |||
+ | Spinner.prototype.show = function () { | ||
+ | var spinner = this; | ||
+ | |||
+ | // Bail if we are already showing the spinner. | ||
+ | if (spinner.timeoutId) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | spinner.timeoutId = setTimeout(function () { | ||
+ | spinner.$element.removeClass(spinner.className); | ||
+ | delete spinner.timeoutId; | ||
+ | }, spinner.delay); | ||
+ | }; | ||
+ | |||
+ | Spinner.prototype.hide = function () { | ||
+ | var spinner = this; | ||
+ | if (spinner.timeoutId) { | ||
+ | clearTimeout(spinner.timeoutId); | ||
+ | delete spinner.timeoutId; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | spinner.$element.addClass(spinner.className); | ||
+ | }; | ||
+ | |||
+ | function prefixed(string, isSelector) { | ||
+ | return string.replace(prefixRegex, (isSelector ? ' .' : ' ') + prefix); | ||
+ | } | ||
+ | |||
+ | function selector(string) { | ||
+ | return prefixed(string, true); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * jQuery.addClass with auto-prefixing | ||
+ | * @param {jQuery} Element to add class to | ||
+ | * @param {string} Class name that will be prefixed and added to element | ||
+ | * @return {jQuery} | ||
+ | */ | ||
+ | function addClass($element, className) { | ||
+ | return $element.addClass(prefixed(className)); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * jQuery.removeClass with auto-prefixing | ||
+ | * @param {jQuery} Element to remove class from | ||
+ | * @param {string} Class name that will be prefixed and removed from element | ||
+ | * @return {jQuery} | ||
+ | */ | ||
+ | function removeClass($element, className) { | ||
+ | return $element.removeClass(prefixed(className)); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * jQuery.toggleClass with auto-prefixing | ||
+ | * @param {jQuery} Element where class will be toggled | ||
+ | * @param {string} Class name that will be prefixed and toggled | ||
+ | * @param {boolean} Optional boolean that determines if class will be added or removed | ||
+ | * @return {jQuery} | ||
+ | */ | ||
+ | function toggleClass($element, className, shouldAdd) { | ||
+ | return $element.toggleClass(prefixed(className), shouldAdd); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Create a new DOM element wrapped in a jQuery object, | ||
+ | * decorated with our custom methods. | ||
+ | * @param {string} className | ||
+ | * @param {string} [tag] | ||
+ | * @return {jQuery} | ||
+ | */ | ||
+ | function dom(className, tag) { | ||
+ | return addClass($(document.createElement(tag || 'div')), className); | ||
+ | } | ||
+ | |||
+ | function isObject(value) { | ||
+ | return typeof value === 'object' && value != null && !isArray(value); | ||
+ | } | ||
+ | |||
+ | function svgDataUri(width, height) { | ||
+ | var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '"/>'; | ||
+ | return 'data:image/svg+xml;charset=utf-8,' + encodeURI(svg); | ||
+ | } | ||
+ | |||
+ | // Compute some dimensions manually for iOS, because of buggy support for VH. | ||
+ | // Also, Android built-in browser does not support viewport units. | ||
+ | (function () { | ||
+ | var ua = window.navigator.userAgent; | ||
+ | var iOS = /(iPhone|iPod|iPad).+AppleWebKit/i.test(ua); | ||
+ | var android = ua.indexOf('Android ') > -1 && ua.indexOf('Chrome') === -1; | ||
+ | |||
+ | if (!iOS && !android) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var styleNode = document.createElement('style'); | ||
+ | document.head.appendChild(styleNode); | ||
+ | window.addEventListener('orientationchange', refresh, true); | ||
+ | |||
+ | function refresh() { | ||
+ | var vh = window.innerHeight; | ||
+ | var vw = window.innerWidth; | ||
+ | var content = | ||
+ | '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' + | ||
+ | 'height:' + vh + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-view {' + | ||
+ | 'width:' + vw + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' + | ||
+ | 'height:' + (0.86 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-image {' + | ||
+ | 'max-width:' + vw + 'px;' + | ||
+ | 'max-height:' + vh + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-group .w-lightbox-image {' + | ||
+ | 'max-height:' + (0.86 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-strip {' + | ||
+ | 'padding: 0 ' + (0.01 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-item {' + | ||
+ | 'width:' + (0.1 * vh) + 'px;' + | ||
+ | 'padding:' + (0.02 * vh) + 'px ' + (0.01 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-thumbnail {' + | ||
+ | 'height:' + (0.1 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '@media (min-width: 768px) {' + | ||
+ | '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' + | ||
+ | 'height:' + (0.96 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-content {' + | ||
+ | 'margin-top:' + (0.02 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' + | ||
+ | 'height:' + (0.84 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-image {' + | ||
+ | 'max-width:' + (0.96 * vw) + 'px;' + | ||
+ | 'max-height:' + (0.96 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '.w-lightbox-group .w-lightbox-image {' + | ||
+ | 'max-width:' + (0.823 * vw) + 'px;' + | ||
+ | 'max-height:' + (0.84 * vh) + 'px' + | ||
+ | '}' + | ||
+ | '}'; | ||
+ | |||
+ | styleNode.textContent = content; | ||
+ | } | ||
+ | |||
+ | refresh(); | ||
+ | })(); | ||
+ | |||
+ | return lightbox; | ||
+ | } | ||
+ | |||
+ | Webflow.define('lightbox', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var lightbox = createLightbox(window, document, $); | ||
+ | var $doc = $(document); | ||
+ | var $body; | ||
+ | var $lightboxes; | ||
+ | var designer; | ||
+ | var inApp = Webflow.env(); | ||
+ | var namespace = '.w-lightbox'; | ||
+ | var groups; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = api.design = api.preview = init; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | designer = inApp && Webflow.env('design'); | ||
+ | $body = $(document.body); | ||
+ | |||
+ | // Reset Lightbox | ||
+ | lightbox.destroy(); | ||
+ | |||
+ | // Reset groups | ||
+ | groups = {}; | ||
+ | |||
+ | // Find all instances on the page | ||
+ | $lightboxes = $doc.find(namespace); | ||
+ | |||
+ | // Instantiate all lighboxes | ||
+ | $lightboxes.webflowLightBox(); | ||
+ | } | ||
+ | |||
+ | jQuery.fn.extend({ | ||
+ | webflowLightBox: function() { | ||
+ | var $el = this; | ||
+ | $.each($el, function(i, el) { | ||
+ | // Store state in data | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) { | ||
+ | data = $.data(el, namespace, { | ||
+ | el: $(el), | ||
+ | mode: 'images', | ||
+ | images: [], | ||
+ | embed: '' | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | // Remove old events | ||
+ | data.el.off(namespace); | ||
+ | |||
+ | // Set config from json script tag | ||
+ | configure(data); | ||
+ | |||
+ | // Add events based on mode | ||
+ | if (designer) { | ||
+ | data.el.on('setting' + namespace, configure.bind(null, data)); | ||
+ | } else { | ||
+ | data.el | ||
+ | .on('tap' + namespace, tapHandler(data)) | ||
+ | // Prevent page scrolling to top when clicking on lightbox triggers. | ||
+ | .on('click' + namespace, function (e) { e.preventDefault(); }); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function configure(data) { | ||
+ | var json = data.el.children('.w-json').html(); | ||
+ | var groupName, groupItems; | ||
+ | |||
+ | if (!json) { | ||
+ | data.items = []; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | try { | ||
+ | json = JSON.parse(json); | ||
+ | } catch(e) { | ||
+ | console.error('Malformed lightbox JSON configuration.', e); | ||
+ | } | ||
+ | |||
+ | supportOldLightboxJson(json); | ||
+ | |||
+ | groupName = json.group; | ||
+ | |||
+ | if (groupName) { | ||
+ | groupItems = groups[groupName]; | ||
+ | if (!groupItems) { | ||
+ | groupItems = groups[groupName] = []; | ||
+ | } | ||
+ | |||
+ | data.items = groupItems; | ||
+ | |||
+ | if (json.items.length) { | ||
+ | data.index = groupItems.length; | ||
+ | groupItems.push.apply(groupItems, json.items); | ||
+ | } | ||
+ | } else { | ||
+ | data.items = json.items; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function tapHandler(data) { | ||
+ | return function () { | ||
+ | data.items.length && lightbox(data.items, data.index || 0); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function supportOldLightboxJson(data) { | ||
+ | if (data.images) { | ||
+ | data.images.forEach(function (item) { | ||
+ | item.type = 'image'; | ||
+ | }); | ||
+ | data.items = data.images; | ||
+ | } | ||
+ | |||
+ | if (data.embed) { | ||
+ | data.embed.type = 'video'; | ||
+ | data.items = [data.embed]; | ||
+ | } | ||
+ | |||
+ | if (data.groupId) { | ||
+ | data.group = data.groupId; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 11 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Auto-select links to current page or section | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('links', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var $win = $(window); | ||
+ | var designer; | ||
+ | var inApp = Webflow.env(); | ||
+ | var location = window.location; | ||
+ | var tempLink = document.createElement('a'); | ||
+ | var linkCurrent = 'w--current'; | ||
+ | var validHash = /^#[a-zA-Z][\w:.-]*$/; | ||
+ | var indexPage = /index\.(html|php)$/; | ||
+ | var dirList = /\/$/; | ||
+ | var anchors; | ||
+ | var slug; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = api.design = api.preview = init; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | designer = inApp && Webflow.env('design'); | ||
+ | slug = Webflow.env('slug') || location.pathname || ''; | ||
+ | |||
+ | // Reset scroll listener, init anchors | ||
+ | Webflow.scroll.off(scroll); | ||
+ | anchors = []; | ||
+ | |||
+ | // Test all links for a selectable href | ||
+ | var links = document.links; | ||
+ | for (var i = 0; i < links.length; ++i) { | ||
+ | select(links[i]); | ||
+ | } | ||
+ | |||
+ | // Listen for scroll if any anchors exist | ||
+ | if (anchors.length) { | ||
+ | Webflow.scroll.on(scroll); | ||
+ | scroll(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function select(link) { | ||
+ | var href = (designer && link.getAttribute('href-disabled')) || link.getAttribute('href'); | ||
+ | tempLink.href = href; | ||
+ | |||
+ | // Ignore any hrefs with a colon to safely avoid all uri schemes | ||
+ | if (href.indexOf(':') >= 0) return; | ||
+ | |||
+ | var $link = $(link); | ||
+ | |||
+ | // Check for valid hash links w/ sections and use scroll anchor | ||
+ | if (href.indexOf('#') === 0 && validHash.test(href)) { | ||
+ | var $section = $(href); | ||
+ | $section.length && anchors.push({ link: $link, sec: $section, active: false }); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Ignore empty # links | ||
+ | if (href === '#') return; | ||
+ | |||
+ | // Determine whether the link should be selected | ||
+ | var match = (tempLink.href === location.href) || (href === slug) || (indexPage.test(href) && dirList.test(slug)); | ||
+ | setClass($link, linkCurrent, match); | ||
+ | } | ||
+ | |||
+ | function scroll() { | ||
+ | var viewTop = $win.scrollTop(); | ||
+ | var viewHeight = $win.height(); | ||
+ | |||
+ | // Check each anchor for a section in view | ||
+ | _.each(anchors, function(anchor) { | ||
+ | var $link = anchor.link; | ||
+ | var $section = anchor.sec; | ||
+ | var top = $section.offset().top; | ||
+ | var height = $section.outerHeight(); | ||
+ | var offset = viewHeight * 0.5; | ||
+ | var active = ($section.is(':visible') && | ||
+ | top + height - offset >= viewTop && | ||
+ | top + offset <= viewTop + viewHeight); | ||
+ | if (anchor.active === active) return; | ||
+ | anchor.active = active; | ||
+ | setClass($link, linkCurrent, active); | ||
+ | if (designer) $link[0].__wf_current = active; | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function setClass($elem, className, add) { | ||
+ | var exists = $elem.hasClass(className); | ||
+ | if (add && exists) return; | ||
+ | if (!add && !exists) return; | ||
+ | add ? $elem.addClass(className) : $elem.removeClass(className); | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 12 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Maps widget | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('maps', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var $doc = $(document); | ||
+ | var google = null; | ||
+ | var $maps; | ||
+ | var namespace = '.w-widget-map'; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = function() { | ||
+ | // Init Maps on the front-end | ||
+ | if (!Webflow.env()) initMaps(); | ||
+ | }; | ||
+ | |||
+ | api.preview = function() { | ||
+ | // Update active map nodes | ||
+ | $maps = $doc.find(namespace); | ||
+ | // Listen for resize events | ||
+ | Webflow.resize.off(triggerRedraw); | ||
+ | if ($maps.length) { | ||
+ | Webflow.resize.on(triggerRedraw); | ||
+ | triggerRedraw(); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | api.design = function(evt) { | ||
+ | // Update active map nodes | ||
+ | $maps = $doc.find(namespace); | ||
+ | // Stop listening for resize events | ||
+ | Webflow.resize.off(triggerRedraw); | ||
+ | // Redraw to account for page changes | ||
+ | $maps.length && _.defer(triggerRedraw); | ||
+ | }; | ||
+ | |||
+ | api.destroy = removeListeners; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | // Trigger redraw in designer or preview mode | ||
+ | function triggerRedraw() { | ||
+ | if ($maps.length && Webflow.app) { | ||
+ | $maps.each(Webflow.app.redrawElement); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function initMaps() { | ||
+ | $maps = $doc.find(namespace); | ||
+ | if (!$maps.length) return; | ||
+ | |||
+ | if (google === null) { | ||
+ | $.getScript('https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=_wf_maps_loaded'); | ||
+ | window._wf_maps_loaded = mapsLoaded; | ||
+ | } else { | ||
+ | mapsLoaded(); | ||
+ | } | ||
+ | |||
+ | function mapsLoaded() { | ||
+ | window._wf_maps_loaded = function() {}; | ||
+ | google = window.google; | ||
+ | $maps.each(renderMap); | ||
+ | removeListeners(); | ||
+ | addListeners(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function removeListeners() { | ||
+ | Webflow.resize.off(resizeMaps); | ||
+ | Webflow.redraw.off(resizeMaps); | ||
+ | } | ||
+ | |||
+ | function addListeners() { | ||
+ | Webflow.resize.on(resizeMaps); | ||
+ | Webflow.redraw.on(resizeMaps); | ||
+ | } | ||
+ | |||
+ | // Render map onto each element | ||
+ | function renderMap(i, el) { | ||
+ | var data = $(el).data(); | ||
+ | getState(el, data); | ||
+ | } | ||
+ | |||
+ | function resizeMaps() { | ||
+ | $maps.each(resizeMap); | ||
+ | } | ||
+ | |||
+ | // Resize map when window changes | ||
+ | function resizeMap(i, el) { | ||
+ | var state = getState(el); | ||
+ | google.maps.event.trigger(state.map, 'resize'); | ||
+ | state.setMapPosition(); | ||
+ | } | ||
+ | |||
+ | // Store state on element data | ||
+ | var store = 'w-widget-map'; | ||
+ | function getState(el, data) { | ||
+ | |||
+ | var state = $.data(el, store); | ||
+ | if (state) return state; | ||
+ | |||
+ | var $el = $(el); | ||
+ | state = $.data(el, store, { | ||
+ | // Default options | ||
+ | latLng: '51.511214,-0.119824', | ||
+ | tooltip: '', | ||
+ | style: 'roadmap', | ||
+ | zoom: 12, | ||
+ | |||
+ | // Marker | ||
+ | marker: new google.maps.Marker({ | ||
+ | draggable: false | ||
+ | }), | ||
+ | |||
+ | // Tooltip infowindow | ||
+ | infowindow: new google.maps.InfoWindow({ | ||
+ | disableAutoPan: true | ||
+ | }) | ||
+ | }); | ||
+ | |||
+ | // LatLng center point | ||
+ | var latLng = data.widgetLatlng || state.latLng; | ||
+ | state.latLng = latLng; | ||
+ | var coords = latLng.split(','); | ||
+ | var latLngObj = new google.maps.LatLng(coords[0], coords[1]); | ||
+ | state.latLngObj = latLngObj; | ||
+ | |||
+ | // Disable touch events | ||
+ | var mapDraggable = (Webflow.env.touch && data.disableTouch) ? false : true; | ||
+ | |||
+ | // Map instance | ||
+ | state.map = new google.maps.Map(el, { | ||
+ | center: state.latLngObj, | ||
+ | zoom: state.zoom, | ||
+ | maxZoom: 18, | ||
+ | mapTypeControl: false, | ||
+ | panControl: false, | ||
+ | streetViewControl: false, | ||
+ | scrollwheel: !data.disableScroll, | ||
+ | draggable: mapDraggable, | ||
+ | zoomControl: true, | ||
+ | zoomControlOptions: { | ||
+ | style: google.maps.ZoomControlStyle.SMALL | ||
+ | }, | ||
+ | mapTypeId: state.style | ||
+ | }); | ||
+ | state.marker.setMap(state.map); | ||
+ | |||
+ | // Set map position and offset | ||
+ | state.setMapPosition = function() { | ||
+ | state.map.setCenter(state.latLngObj); | ||
+ | var offsetX = 0; | ||
+ | var offsetY = 0; | ||
+ | var padding = $el.css(['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft']); | ||
+ | offsetX -= parseInt(padding.paddingLeft, 10); | ||
+ | offsetX += parseInt(padding.paddingRight, 10); | ||
+ | offsetY -= parseInt(padding.paddingTop, 10); | ||
+ | offsetY += parseInt(padding.paddingBottom, 10); | ||
+ | if (offsetX || offsetY) { | ||
+ | state.map.panBy(offsetX, offsetY); | ||
+ | } | ||
+ | $el.css('position', ''); // Remove injected position | ||
+ | }; | ||
+ | |||
+ | // Fix position after first tiles have loaded | ||
+ | google.maps.event.addListener(state.map, 'tilesloaded', function() { | ||
+ | google.maps.event.clearListeners(state.map, 'tilesloaded'); | ||
+ | state.setMapPosition(); | ||
+ | }); | ||
+ | |||
+ | // Set initial position | ||
+ | state.setMapPosition(); | ||
+ | state.marker.setPosition(state.latLngObj); | ||
+ | state.infowindow.setPosition(state.latLngObj); | ||
+ | |||
+ | // Draw tooltip | ||
+ | var tooltip = data.widgetTooltip; | ||
+ | if (tooltip) { | ||
+ | state.tooltip = tooltip; | ||
+ | state.infowindow.setContent(tooltip); | ||
+ | if (!state.infowindowOpen) { | ||
+ | state.infowindow.open(state.map, state.marker); | ||
+ | state.infowindowOpen = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Map style - options.style | ||
+ | var style = data.widgetStyle; | ||
+ | if (style) { | ||
+ | state.map.setMapTypeId(style); | ||
+ | } | ||
+ | |||
+ | // Zoom - options.zoom | ||
+ | var zoom = data.widgetZoom; | ||
+ | if (zoom != null) { | ||
+ | state.zoom = zoom; | ||
+ | state.map.setZoom(+zoom); | ||
+ | } | ||
+ | |||
+ | // Click marker to open in google maps | ||
+ | google.maps.event.addListener(state.marker, 'click', function() { | ||
+ | window.open('https://maps.google.com/?z=' + state.zoom + '&daddr=' + state.latLng); | ||
+ | }); | ||
+ | |||
+ | return state; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 13 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Navbar component | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | var IXEvents = __webpack_require__(2); | ||
+ | |||
+ | Webflow.define('navbar', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var tram = $.tram; | ||
+ | var $win = $(window); | ||
+ | var $doc = $(document); | ||
+ | var $body; | ||
+ | var $navbars; | ||
+ | var designer; | ||
+ | var inApp = Webflow.env(); | ||
+ | var overlay = '<div class="w-nav-overlay" data-wf-ignore />'; | ||
+ | var namespace = '.w-nav'; | ||
+ | var buttonOpen = 'w--open'; | ||
+ | var menuOpen = 'w--nav-menu-open'; | ||
+ | var linkOpen = 'w--nav-link-open'; | ||
+ | var ix = IXEvents.triggers; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = api.design = api.preview = init; | ||
+ | api.destroy = removeListeners; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | designer = inApp && Webflow.env('design'); | ||
+ | $body = $(document.body); | ||
+ | |||
+ | // Find all instances on the page | ||
+ | $navbars = $doc.find(namespace); | ||
+ | if (!$navbars.length) return; | ||
+ | $navbars.each(build); | ||
+ | |||
+ | // Wire events | ||
+ | removeListeners(); | ||
+ | addListeners(); | ||
+ | } | ||
+ | |||
+ | function removeListeners() { | ||
+ | Webflow.resize.off(resizeAll); | ||
+ | } | ||
+ | |||
+ | function addListeners() { | ||
+ | Webflow.resize.on(resizeAll); | ||
+ | } | ||
+ | |||
+ | function resizeAll() { | ||
+ | $navbars.each(resize); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | var $el = $(el); | ||
+ | |||
+ | // Store state in data | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} }); | ||
+ | data.menu = $el.find('.w-nav-menu'); | ||
+ | data.links = data.menu.find('.w-nav-link'); | ||
+ | data.dropdowns = data.menu.find('.w-dropdown'); | ||
+ | data.button = $el.find('.w-nav-button'); | ||
+ | data.container = $el.find('.w-container'); | ||
+ | data.outside = outside(data); | ||
+ | |||
+ | // Remove old events | ||
+ | data.el.off(namespace); | ||
+ | data.button.off(namespace); | ||
+ | data.menu.off(namespace); | ||
+ | |||
+ | // Set config from data attributes | ||
+ | configure(data); | ||
+ | |||
+ | // Add events based on mode | ||
+ | if (designer) { | ||
+ | removeOverlay(data); | ||
+ | data.el.on('setting' + namespace, handler(data)); | ||
+ | } else { | ||
+ | addOverlay(data); | ||
+ | data.button.on('tap' + namespace, toggle(data)); | ||
+ | data.menu.on('click' + namespace, 'a', navigate(data)); | ||
+ | } | ||
+ | |||
+ | // Trigger initial resize | ||
+ | resize(i, el); | ||
+ | } | ||
+ | |||
+ | function removeOverlay(data) { | ||
+ | if (!data.overlay) return; | ||
+ | close(data, true); | ||
+ | data.overlay.remove(); | ||
+ | data.overlay = null; | ||
+ | } | ||
+ | |||
+ | function addOverlay(data) { | ||
+ | if (data.overlay) return; | ||
+ | data.overlay = $(overlay).appendTo(data.el); | ||
+ | data.parent = data.menu.parent(); | ||
+ | close(data, true); | ||
+ | } | ||
+ | |||
+ | function configure(data) { | ||
+ | var config = {}; | ||
+ | var old = data.config || {}; | ||
+ | |||
+ | // Set config options from data attributes | ||
+ | var animation = config.animation = data.el.attr('data-animation') || 'default'; | ||
+ | config.animOver = /^over/.test(animation); | ||
+ | config.animDirect = /left$/.test(animation) ? -1 : 1; | ||
+ | |||
+ | // Re-open menu if the animation type changed | ||
+ | if (old.animation !== animation) { | ||
+ | data.open && _.defer(reopen, data); | ||
+ | } | ||
+ | |||
+ | config.easing = data.el.attr('data-easing') || 'ease'; | ||
+ | config.easing2 = data.el.attr('data-easing2') || 'ease'; | ||
+ | |||
+ | var duration = data.el.attr('data-duration'); | ||
+ | config.duration = duration != null ? +duration : 400; | ||
+ | |||
+ | config.docHeight = data.el.attr('data-doc-height'); | ||
+ | |||
+ | // Store config in data | ||
+ | data.config = config; | ||
+ | } | ||
+ | |||
+ | function handler(data) { | ||
+ | return function(evt, options) { | ||
+ | options = options || {}; | ||
+ | var winWidth = $win.width(); | ||
+ | configure(data); | ||
+ | options.open === true && open(data, true); | ||
+ | options.open === false && close(data, true); | ||
+ | // Reopen if media query changed after setting | ||
+ | data.open && _.defer(function() { | ||
+ | if (winWidth !== $win.width()) reopen(data); | ||
+ | }); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function reopen(data) { | ||
+ | if (!data.open) return; | ||
+ | close(data, true); | ||
+ | open(data, true); | ||
+ | } | ||
+ | |||
+ | function toggle(data) { | ||
+ | // Debounce toggle to wait for accurate open state | ||
+ | return _.debounce(function(evt) { | ||
+ | data.open ? close(data) : open(data); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function navigate(data) { | ||
+ | return function(evt) { | ||
+ | var link = $(this); | ||
+ | var href = link.attr('href'); | ||
+ | |||
+ | // Avoid late clicks on touch devices | ||
+ | if (!Webflow.validClick(evt.currentTarget)) { | ||
+ | evt.preventDefault(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Close when navigating to an in-page anchor | ||
+ | if (href && href.indexOf('#') === 0 && data.open) { | ||
+ | close(data); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function outside(data) { | ||
+ | // Unbind previous tap handler if it exists | ||
+ | if (data.outside) $doc.off('tap' + namespace, data.outside); | ||
+ | |||
+ | // Close menu when tapped outside, debounced to wait for state | ||
+ | return _.debounce(function(evt) { | ||
+ | if (!data.open) return; | ||
+ | var menu = $(evt.target).closest('.w-nav-menu'); | ||
+ | if (!data.menu.is(menu)) { | ||
+ | close(data); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function resize(i, el) { | ||
+ | var data = $.data(el, namespace); | ||
+ | // Check for collapsed state based on button display | ||
+ | var collapsed = data.collapsed = data.button.css('display') !== 'none'; | ||
+ | // Close menu if button is no longer visible (and not in designer) | ||
+ | if (data.open && !collapsed && !designer) close(data, true); | ||
+ | // Set max-width of links + dropdowns to match container | ||
+ | if (data.container.length) { | ||
+ | var updateEachMax = updateMax(data); | ||
+ | data.links.each(updateEachMax); | ||
+ | data.dropdowns.each(updateEachMax); | ||
+ | } | ||
+ | // If currently open, update height to match body | ||
+ | if (data.open) { | ||
+ | setOverlayHeight(data); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | var maxWidth = 'max-width'; | ||
+ | function updateMax(data) { | ||
+ | // Set max-width of each element to match container | ||
+ | var containMax = data.container.css(maxWidth); | ||
+ | if (containMax === 'none') containMax = ''; | ||
+ | return function(i, link) { | ||
+ | link = $(link); | ||
+ | link.css(maxWidth, ''); | ||
+ | // Don't set the max-width if an upstream value exists | ||
+ | if (link.css(maxWidth) === 'none') link.css(maxWidth, containMax); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function open(data, immediate) { | ||
+ | if (data.open) return; | ||
+ | data.open = true; | ||
+ | data.menu.addClass(menuOpen); | ||
+ | data.links.addClass(linkOpen); | ||
+ | data.button.addClass(buttonOpen); | ||
+ | var config = data.config; | ||
+ | var animation = config.animation; | ||
+ | if (animation === 'none' || !tram.support.transform) immediate = true; | ||
+ | var bodyHeight = setOverlayHeight(data); | ||
+ | var menuHeight = data.menu.outerHeight(true); | ||
+ | var menuWidth = data.menu.outerWidth(true); | ||
+ | var navHeight = data.el.height(); | ||
+ | var navbarEl = data.el[0]; | ||
+ | resize(0, navbarEl); | ||
+ | ix.intro(0, navbarEl); | ||
+ | Webflow.redraw.up(); | ||
+ | |||
+ | // Listen for tap outside events | ||
+ | if (!designer) $doc.on('tap' + namespace, data.outside); | ||
+ | |||
+ | // No transition for immediate | ||
+ | if (immediate) return; | ||
+ | |||
+ | var transConfig = 'transform ' + config.duration + 'ms ' + config.easing; | ||
+ | |||
+ | // Add menu to overlay | ||
+ | if (data.overlay) { | ||
+ | data.overlay.show().append(data.menu); | ||
+ | } | ||
+ | |||
+ | // Over left/right | ||
+ | if (config.animOver) { | ||
+ | tram(data.menu) | ||
+ | .add(transConfig) | ||
+ | .set({ x: config.animDirect * menuWidth, height: bodyHeight }).start({ x: 0 }); | ||
+ | data.overlay && data.overlay.width(menuWidth); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Drop Down | ||
+ | var offsetY = navHeight + menuHeight; | ||
+ | tram(data.menu) | ||
+ | .add(transConfig) | ||
+ | .set({ y: -offsetY }).start({ y: 0 }); | ||
+ | } | ||
+ | |||
+ | function setOverlayHeight(data) { | ||
+ | var config = data.config; | ||
+ | var bodyHeight = config.docHeight ? $doc.height() : $body.height(); | ||
+ | if (config.animOver) { | ||
+ | data.menu.height(bodyHeight); | ||
+ | } else if (data.el.css('position') !== 'fixed') { | ||
+ | bodyHeight -= data.el.height(); | ||
+ | } | ||
+ | data.overlay && data.overlay.height(bodyHeight); | ||
+ | return bodyHeight; | ||
+ | } | ||
+ | |||
+ | function close(data, immediate) { | ||
+ | if (!data.open) return; | ||
+ | data.open = false; | ||
+ | data.button.removeClass(buttonOpen); | ||
+ | var config = data.config; | ||
+ | if (config.animation === 'none' || !tram.support.transform) immediate = true; | ||
+ | var animation = config.animation; | ||
+ | ix.outro(0, data.el[0]); | ||
+ | |||
+ | // Stop listening for tap outside events | ||
+ | $doc.off('tap' + namespace, data.outside); | ||
+ | |||
+ | if (immediate) { | ||
+ | tram(data.menu).stop(); | ||
+ | complete(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var transConfig = 'transform ' + config.duration + 'ms ' + config.easing2; | ||
+ | var menuHeight = data.menu.outerHeight(true); | ||
+ | var menuWidth = data.menu.outerWidth(true); | ||
+ | var navHeight = data.el.height(); | ||
+ | |||
+ | // Over left/right | ||
+ | if (config.animOver) { | ||
+ | tram(data.menu) | ||
+ | .add(transConfig) | ||
+ | .start({ x: menuWidth * config.animDirect }).then(complete); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Drop Down | ||
+ | var offsetY = navHeight + menuHeight; | ||
+ | tram(data.menu) | ||
+ | .add(transConfig) | ||
+ | .start({ y: -offsetY }).then(complete); | ||
+ | |||
+ | function complete() { | ||
+ | data.menu.height(''); | ||
+ | tram(data.menu).set({ x: 0, y: 0 }); | ||
+ | data.menu.removeClass(menuOpen); | ||
+ | data.links.removeClass(linkOpen); | ||
+ | if (data.overlay && data.overlay.children().length) { | ||
+ | // Move menu back to parent | ||
+ | data.menu.appendTo(data.parent); | ||
+ | data.overlay.attr('style', '').hide(); | ||
+ | } | ||
+ | |||
+ | // Trigger event so other components can hook in (dropdown) | ||
+ | data.el.triggerHandler('w-close'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 14 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Smooth scroll | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('scroll', module.exports = function($, _) { | ||
+ | var $doc = $(document); | ||
+ | var win = window; | ||
+ | var loc = win.location; | ||
+ | var history = inIframe() ? null : win.history; | ||
+ | var validHash = /^[a-zA-Z][\w:.-]*$/; | ||
+ | |||
+ | function inIframe() { | ||
+ | try { | ||
+ | return !!win.frameElement; | ||
+ | } catch (e) { | ||
+ | return true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function ready() { | ||
+ | // If hash is already present on page load, scroll to it right away | ||
+ | if (loc.hash) { | ||
+ | findEl(loc.hash.substring(1)); | ||
+ | } | ||
+ | |||
+ | // When clicking on a link, check if it links to another part of the page | ||
+ | $doc.on('click', 'a', function(e) { | ||
+ | if (Webflow.env('design')) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Ignore links being used by jQuery mobile | ||
+ | if (window.$.mobile && $(e.currentTarget).hasClass('ui-link')) return; | ||
+ | |||
+ | // Ignore empty # links | ||
+ | if (this.getAttribute('href') === '#') { | ||
+ | e.preventDefault(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var hash = this.hash ? this.hash.substring(1) : null; | ||
+ | if (hash) { | ||
+ | findEl(hash, e); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function findEl(hash, e) { | ||
+ | if (!validHash.test(hash)) return; | ||
+ | |||
+ | var el = $('#' + hash); | ||
+ | if (!el.length) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (e) { | ||
+ | e.preventDefault(); | ||
+ | e.stopPropagation(); | ||
+ | } | ||
+ | |||
+ | // Push new history state | ||
+ | if (loc.hash !== hash && history && history.pushState) { | ||
+ | var oldHash = history.state && history.state.hash; | ||
+ | if (oldHash !== hash) { | ||
+ | history.pushState({ hash: hash }, '', '#' + hash); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // If a fixed header exists, offset for the height | ||
+ | var rootTag = Webflow.env('editor') ? '.w-editor-body' : 'body'; | ||
+ | var header = $('header, ' + rootTag + ' > .header, ' + rootTag + ' > .w-nav:not([data-no-scroll])'); | ||
+ | var offset = header.css('position') === 'fixed' ? header.outerHeight() : 0; | ||
+ | |||
+ | win.setTimeout(function() { | ||
+ | scroll(el, offset); | ||
+ | }, e ? 0 : 300); | ||
+ | } | ||
+ | |||
+ | function scroll(el, offset){ | ||
+ | var start = $(win).scrollTop(); | ||
+ | var end = el.offset().top - offset; | ||
+ | |||
+ | // If specified, scroll so that the element ends up in the middle of the viewport | ||
+ | if (el.data('scroll') === 'mid') { | ||
+ | var available = $(win).height() - offset; | ||
+ | var elHeight = el.outerHeight(); | ||
+ | if (elHeight < available) { | ||
+ | end -= Math.round((available - elHeight) / 2); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | var mult = 1; | ||
+ | |||
+ | // Check for custom time multiplier on the body and the element | ||
+ | $('body').add(el).each(function(i) { | ||
+ | var time = parseFloat($(this).attr('data-scroll-time'), 10); | ||
+ | if (!isNaN(time) && (time === 0 || time > 0)) { | ||
+ | mult = time; | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | // Shim for IE8 and below | ||
+ | if (!Date.now) { | ||
+ | Date.now = function() { return new Date().getTime(); }; | ||
+ | } | ||
+ | |||
+ | var clock = Date.now(); | ||
+ | var animate = win.requestAnimationFrame || win.mozRequestAnimationFrame || win.webkitRequestAnimationFrame || function(fn) { win.setTimeout(fn, 15); }; | ||
+ | var duration = (472.143 * Math.log(Math.abs(start - end) +125) - 2000) * mult; | ||
+ | |||
+ | var step = function() { | ||
+ | var elapsed = Date.now() - clock; | ||
+ | win.scroll(0, getY(start, end, elapsed, duration)); | ||
+ | |||
+ | if (elapsed <= duration) { | ||
+ | animate(step); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | step(); | ||
+ | } | ||
+ | |||
+ | function getY(start, end, elapsed, duration) { | ||
+ | if (elapsed > duration) { | ||
+ | return end; | ||
+ | } | ||
+ | |||
+ | return start + (end - start) * ease(elapsed / duration); | ||
+ | } | ||
+ | |||
+ | function ease(t) { | ||
+ | return t<0.5 ? 4 * t * t * t : (t-1) * (2 * t-2) * (2 * t-2)+1; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return { ready: ready }; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 15 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Slider component | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | var IXEvents = __webpack_require__(2); | ||
+ | |||
+ | Webflow.define('slider', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var tram = $.tram; | ||
+ | var $doc = $(document); | ||
+ | var $sliders; | ||
+ | var designer; | ||
+ | var inApp = Webflow.env(); | ||
+ | var namespace = '.w-slider'; | ||
+ | var dot = '<div class="w-slider-dot" data-wf-ignore />'; | ||
+ | var ix = IXEvents.triggers; | ||
+ | var fallback; | ||
+ | var inRedraw; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = function() { | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | api.design = function() { | ||
+ | designer = true; | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | api.preview = function() { | ||
+ | designer = false; | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | api.redraw = function() { | ||
+ | inRedraw = true; | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | api.destroy = removeListeners; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | // Find all sliders on the page | ||
+ | $sliders = $doc.find(namespace); | ||
+ | if (!$sliders.length) return; | ||
+ | $sliders.filter(':visible').each(build); | ||
+ | inRedraw = null; | ||
+ | if (fallback) return; | ||
+ | |||
+ | removeListeners(); | ||
+ | addListeners(); | ||
+ | } | ||
+ | |||
+ | function removeListeners() { | ||
+ | Webflow.resize.off(renderAll); | ||
+ | Webflow.redraw.off(api.redraw); | ||
+ | } | ||
+ | |||
+ | function addListeners() { | ||
+ | Webflow.resize.on(renderAll); | ||
+ | Webflow.redraw.on(api.redraw); | ||
+ | } | ||
+ | |||
+ | function renderAll() { | ||
+ | $sliders.filter(':visible').each(render); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | var $el = $(el); | ||
+ | |||
+ | // Store slider state in data | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) { | ||
+ | data = $.data(el, namespace, { | ||
+ | index: 0, | ||
+ | depth: 1, | ||
+ | el: $el, | ||
+ | config: {} | ||
+ | }); | ||
+ | } | ||
+ | data.mask = $el.children('.w-slider-mask'); | ||
+ | data.left = $el.children('.w-slider-arrow-left'); | ||
+ | data.right = $el.children('.w-slider-arrow-right'); | ||
+ | data.nav = $el.children('.w-slider-nav'); | ||
+ | data.slides = data.mask.children('.w-slide'); | ||
+ | data.slides.each(ix.reset); | ||
+ | if (inRedraw) data.maskWidth = 0; | ||
+ | |||
+ | // Disable in old browsers | ||
+ | if (!tram.support.transform) { | ||
+ | data.left.hide(); | ||
+ | data.right.hide(); | ||
+ | data.nav.hide(); | ||
+ | fallback = true; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Remove old events | ||
+ | data.el.off(namespace); | ||
+ | data.left.off(namespace); | ||
+ | data.right.off(namespace); | ||
+ | data.nav.off(namespace); | ||
+ | |||
+ | // Set config from data attributes | ||
+ | configure(data); | ||
+ | |||
+ | // Add events based on mode | ||
+ | if (designer) { | ||
+ | data.el.on('setting' + namespace, handler(data)); | ||
+ | stopTimer(data); | ||
+ | data.hasTimer = false; | ||
+ | } else { | ||
+ | data.el.on('swipe' + namespace, handler(data)); | ||
+ | data.left.on('tap' + namespace, previousFunction(data)); | ||
+ | data.right.on('tap' + namespace, next(data)); | ||
+ | |||
+ | // Start timer if autoplay is true, only once | ||
+ | if (data.config.autoplay && !data.hasTimer) { | ||
+ | data.hasTimer = true; | ||
+ | data.timerCount = 1; | ||
+ | startTimer(data); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Listen to nav events | ||
+ | data.nav.on('tap' + namespace, '> div', handler(data)); | ||
+ | |||
+ | // Remove gaps from formatted html (for inline-blocks) | ||
+ | if (!inApp) { | ||
+ | data.mask.contents().filter(function() { | ||
+ | return this.nodeType === 3; | ||
+ | }).remove(); | ||
+ | } | ||
+ | |||
+ | // Run first render | ||
+ | render(i, el); | ||
+ | } | ||
+ | |||
+ | function configure(data) { | ||
+ | var config = {}; | ||
+ | |||
+ | config.crossOver = 0; | ||
+ | |||
+ | // Set config options from data attributes | ||
+ | config.animation = data.el.attr('data-animation') || 'slide'; | ||
+ | if (config.animation === 'outin') { | ||
+ | config.animation = 'cross'; | ||
+ | config.crossOver = 0.5; | ||
+ | } | ||
+ | config.easing = data.el.attr('data-easing') || 'ease'; | ||
+ | |||
+ | var duration = data.el.attr('data-duration'); | ||
+ | config.duration = duration != null ? +duration : 500; | ||
+ | |||
+ | if (+data.el.attr('data-infinite')) config.infinite = true; | ||
+ | if (+data.el.attr('data-disable-swipe')) config.disableSwipe = true; | ||
+ | |||
+ | if (+data.el.attr('data-hide-arrows')) { | ||
+ | config.hideArrows = true; | ||
+ | } else if (data.config.hideArrows) { | ||
+ | data.left.show(); | ||
+ | data.right.show(); | ||
+ | } | ||
+ | |||
+ | if (+data.el.attr('data-autoplay')) { | ||
+ | config.autoplay = true; | ||
+ | config.delay = +data.el.attr('data-delay') || 2000; | ||
+ | config.timerMax = +data.el.attr('data-autoplay-limit'); | ||
+ | // Disable timer on first touch or mouse down | ||
+ | var touchEvents = 'mousedown' + namespace + ' touchstart' + namespace; | ||
+ | if (!designer) { | ||
+ | data.el.off(touchEvents).one(touchEvents, function() { | ||
+ | stopTimer(data); | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Use edge buffer to help calculate page count | ||
+ | var arrowWidth = data.right.width(); | ||
+ | config.edge = arrowWidth ? arrowWidth + 40 : 100; | ||
+ | |||
+ | // Store config in data | ||
+ | data.config = config; | ||
+ | } | ||
+ | |||
+ | function previousFunction(data) { | ||
+ | return function(evt) { | ||
+ | change(data, { index: data.index - 1, vector: -1 }); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function next(data) { | ||
+ | return function(evt) { | ||
+ | change(data, { index: data.index + 1, vector: 1 }); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function select(data, value) { | ||
+ | // Select page based on slide element index | ||
+ | var found = null; | ||
+ | if (value === data.slides.length) { | ||
+ | init(); layout(data); // Rebuild and find new slides | ||
+ | } | ||
+ | _.each(data.anchors, function(anchor, index) { | ||
+ | $(anchor.els).each(function(i, el) { | ||
+ | if ($(el).index() === value) found = index; | ||
+ | }); | ||
+ | }); | ||
+ | if (found != null) change(data, { index: found, immediate: true }); | ||
+ | } | ||
+ | |||
+ | function startTimer(data) { | ||
+ | stopTimer(data); | ||
+ | var config = data.config; | ||
+ | var timerMax = config.timerMax; | ||
+ | if (timerMax && data.timerCount++ > timerMax) return; | ||
+ | data.timerId = window.setTimeout(function() { | ||
+ | if (data.timerId == null || designer) return; | ||
+ | next(data)(); | ||
+ | startTimer(data); | ||
+ | }, config.delay); | ||
+ | } | ||
+ | |||
+ | function stopTimer(data) { | ||
+ | window.clearTimeout(data.timerId); | ||
+ | data.timerId = null; | ||
+ | } | ||
+ | |||
+ | function handler(data) { | ||
+ | return function(evt, options) { | ||
+ | options = options || {}; | ||
+ | var config = data.config; | ||
+ | |||
+ | // Designer settings | ||
+ | if (designer && evt.type === 'setting') { | ||
+ | if (options.select === 'prev') return previousFunction(data)(); | ||
+ | if (options.select === 'next') return next(data)(); | ||
+ | configure(data); | ||
+ | layout(data); | ||
+ | if (options.select == null) return; | ||
+ | select(data, options.select); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Swipe event | ||
+ | if (evt.type === 'swipe') { | ||
+ | if (config.disableSwipe) return; | ||
+ | if (Webflow.env('editor')) return; | ||
+ | if (options.direction === 'left') return next(data)(); | ||
+ | if (options.direction === 'right') return previousFunction(data)(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Page buttons | ||
+ | if (data.nav.has(evt.target).length) { | ||
+ | change(data, { index: $(evt.target).index() }); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function change(data, options) { | ||
+ | options = options || {}; | ||
+ | var config = data.config; | ||
+ | var anchors = data.anchors; | ||
+ | |||
+ | // Set new index | ||
+ | data.previous = data.index; | ||
+ | var index = options.index; | ||
+ | var shift = {}; | ||
+ | if (index < 0) { | ||
+ | index = anchors.length - 1; | ||
+ | if (config.infinite) { | ||
+ | // Shift first slide to the end | ||
+ | shift.x = -data.endX; | ||
+ | shift.from = 0; | ||
+ | shift.to = anchors[0].width; | ||
+ | } | ||
+ | } else if (index >= anchors.length) { | ||
+ | index = 0; | ||
+ | if (config.infinite) { | ||
+ | // Shift last slide to the start | ||
+ | shift.x = anchors[anchors.length - 1].width; | ||
+ | shift.from = -anchors[anchors.length - 1].x; | ||
+ | shift.to = shift.from - shift.x; | ||
+ | } | ||
+ | } | ||
+ | data.index = index; | ||
+ | |||
+ | // Select page nav | ||
+ | var active = data.nav.children().eq(data.index).addClass('w-active'); | ||
+ | data.nav.children().not(active).removeClass('w-active'); | ||
+ | |||
+ | // Hide arrows | ||
+ | if (config.hideArrows) { | ||
+ | data.index === anchors.length - 1 ? data.right.hide() : data.right.show(); | ||
+ | data.index === 0 ? data.left.hide() : data.left.show(); | ||
+ | } | ||
+ | |||
+ | // Get page offset from anchors | ||
+ | var lastOffsetX = data.offsetX || 0; | ||
+ | var offsetX = data.offsetX = -anchors[data.index].x; | ||
+ | var resetConfig = { x: offsetX, opacity: 1, visibility: '' }; | ||
+ | |||
+ | // Transition slides | ||
+ | var targets = $(anchors[data.index].els); | ||
+ | var prevTargs = $(anchors[data.previous] && anchors[data.previous].els); | ||
+ | var others = data.slides.not(targets); | ||
+ | var animation = config.animation; | ||
+ | var easing = config.easing; | ||
+ | var duration = Math.round(config.duration); | ||
+ | var vector = options.vector || (data.index > data.previous ? 1 : -1); | ||
+ | var fadeRule = 'opacity ' + duration + 'ms ' + easing; | ||
+ | var slideRule = 'transform ' + duration + 'ms ' + easing; | ||
+ | |||
+ | // Trigger IX events | ||
+ | if (!designer) { | ||
+ | targets.each(ix.intro); | ||
+ | others.each(ix.outro); | ||
+ | } | ||
+ | |||
+ | // Set immediately after layout changes (but not during redraw) | ||
+ | if (options.immediate && !inRedraw) { | ||
+ | tram(targets).set(resetConfig); | ||
+ | resetOthers(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Exit early if index is unchanged | ||
+ | if (data.index === data.previous) return; | ||
+ | |||
+ | // Cross Fade / Out-In | ||
+ | if (animation === 'cross') { | ||
+ | var reduced = Math.round(duration - duration * config.crossOver); | ||
+ | var wait = Math.round(duration - reduced); | ||
+ | fadeRule = 'opacity ' + reduced + 'ms ' + easing; | ||
+ | tram(prevTargs) | ||
+ | .set({ visibility: '' }) | ||
+ | .add(fadeRule) | ||
+ | .start({ opacity: 0 }); | ||
+ | tram(targets) | ||
+ | .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ }) | ||
+ | .add(fadeRule) | ||
+ | .wait(wait) | ||
+ | .then({ opacity: 1 }) | ||
+ | .then(resetOthers); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Fade Over | ||
+ | if (animation === 'fade') { | ||
+ | tram(prevTargs) | ||
+ | .set({ visibility: '' }) | ||
+ | .stop(); | ||
+ | tram(targets) | ||
+ | .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ }) | ||
+ | .add(fadeRule) | ||
+ | .start({ opacity: 1 }) | ||
+ | .then(resetOthers); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Slide Over | ||
+ | if (animation === 'over') { | ||
+ | resetConfig = { x: data.endX }; | ||
+ | tram(prevTargs) | ||
+ | .set({ visibility: '' }) | ||
+ | .stop(); | ||
+ | tram(targets) | ||
+ | .set({ visibility: '', zIndex: data.depth++, x: offsetX + anchors[data.index].width * vector }) | ||
+ | .add(slideRule) | ||
+ | .start({ x: offsetX }) | ||
+ | .then(resetOthers); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Slide - infinite scroll | ||
+ | if (config.infinite && shift.x) { | ||
+ | tram(data.slides.not(prevTargs)) | ||
+ | .set({ visibility: '', x: shift.x }) | ||
+ | .add(slideRule) | ||
+ | .start({ x: offsetX }); | ||
+ | tram(prevTargs) | ||
+ | .set({ visibility: '', x: shift.from }) | ||
+ | .add(slideRule) | ||
+ | .start({ x: shift.to }); | ||
+ | data.shifted = prevTargs; | ||
+ | |||
+ | } else { | ||
+ | if (config.infinite && data.shifted) { | ||
+ | tram(data.shifted).set({ visibility: '', x: lastOffsetX }); | ||
+ | data.shifted = null; | ||
+ | } | ||
+ | |||
+ | // Slide - basic scroll | ||
+ | tram(data.slides) | ||
+ | .set({ visibility: '' }) | ||
+ | .add(slideRule) | ||
+ | .start({ x: offsetX }); | ||
+ | } | ||
+ | |||
+ | // Helper to move others out of view | ||
+ | function resetOthers() { | ||
+ | targets = $(anchors[data.index].els); | ||
+ | others = data.slides.not(targets); | ||
+ | if (animation !== 'slide') resetConfig.visibility = 'hidden'; | ||
+ | tram(others).set(resetConfig); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function render(i, el) { | ||
+ | var data = $.data(el, namespace); | ||
+ | if (maskChanged(data)) return layout(data); | ||
+ | if (designer && slidesChanged(data)) layout(data); | ||
+ | } | ||
+ | |||
+ | function layout(data) { | ||
+ | // Determine page count from width of slides | ||
+ | var pages = 1; | ||
+ | var offset = 0; | ||
+ | var anchor = 0; | ||
+ | var width = 0; | ||
+ | var maskWidth = data.maskWidth; | ||
+ | var threshold = maskWidth - data.config.edge; | ||
+ | if (threshold < 0) threshold = 0; | ||
+ | data.anchors = [{ els: [], x: 0, width: 0 }]; | ||
+ | data.slides.each(function(i, el) { | ||
+ | if (anchor - offset > threshold) { | ||
+ | pages++; | ||
+ | offset += maskWidth; | ||
+ | // Store page anchor for transition | ||
+ | data.anchors[pages - 1] = { els: [], x: anchor, width: 0 }; | ||
+ | } | ||
+ | // Set next anchor using current width + margin | ||
+ | width = $(el).outerWidth(true); | ||
+ | anchor += width; | ||
+ | data.anchors[pages - 1].width += width; | ||
+ | data.anchors[pages - 1].els.push(el); | ||
+ | }); | ||
+ | data.endX = anchor; | ||
+ | |||
+ | // Build dots if nav exists and needs updating | ||
+ | if (designer) data.pages = null; | ||
+ | if (data.nav.length && data.pages !== pages){ | ||
+ | data.pages = pages; | ||
+ | buildNav(data); | ||
+ | } | ||
+ | |||
+ | // Make sure index is still within range and call change handler | ||
+ | var index = data.index; | ||
+ | if (index >= pages) index = pages - 1; | ||
+ | change(data, { immediate: true, index: index }); | ||
+ | } | ||
+ | |||
+ | function buildNav(data) { | ||
+ | var dots = []; | ||
+ | var $dot; | ||
+ | var spacing = data.el.attr('data-nav-spacing'); | ||
+ | if (spacing) spacing = parseFloat(spacing) + 'px'; | ||
+ | for (var i = 0; i < data.pages; i++) { | ||
+ | $dot = $(dot); | ||
+ | if (data.nav.hasClass('w-num')) $dot.text(i + 1); | ||
+ | if (spacing != null) { | ||
+ | $dot.css({ | ||
+ | 'margin-left': spacing, | ||
+ | 'margin-right': spacing | ||
+ | }); | ||
+ | } | ||
+ | dots.push($dot); | ||
+ | } | ||
+ | data.nav.empty().append(dots); | ||
+ | } | ||
+ | |||
+ | function maskChanged(data) { | ||
+ | var maskWidth = data.mask.width(); | ||
+ | if (data.maskWidth !== maskWidth) { | ||
+ | data.maskWidth = maskWidth; | ||
+ | return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | function slidesChanged(data) { | ||
+ | var slidesWidth = 0; | ||
+ | data.slides.each(function(i, el) { | ||
+ | slidesWidth += $(el).outerWidth(true); | ||
+ | }); | ||
+ | if (data.slidesWidth !== slidesWidth) { | ||
+ | data.slidesWidth = slidesWidth; | ||
+ | return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 16 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Tabs component | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | var IXEvents = __webpack_require__(2); | ||
+ | |||
+ | Webflow.define('tabs', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var tram = $.tram; | ||
+ | var $win = $(window); | ||
+ | var $doc = $(document); | ||
+ | var $tabs; | ||
+ | var design; | ||
+ | var env = Webflow.env; | ||
+ | var safari = env.safari; | ||
+ | var inApp = env(); | ||
+ | var tabAttr = 'data-w-tab'; | ||
+ | var namespace = '.w-tabs'; | ||
+ | var linkCurrent = 'w--current'; | ||
+ | var tabActive = 'w--tab-active'; | ||
+ | var ix = IXEvents.triggers; | ||
+ | var inRedraw; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Module methods | ||
+ | |||
+ | api.ready = api.design = api.preview = init; | ||
+ | |||
+ | api.redraw = function() { | ||
+ | inRedraw = true; | ||
+ | init(); | ||
+ | }; | ||
+ | |||
+ | api.destroy = function() { | ||
+ | $tabs = $doc.find(namespace); | ||
+ | if (!$tabs.length) return; | ||
+ | $tabs.each(resetIX); | ||
+ | removeListeners(); | ||
+ | }; | ||
+ | |||
+ | // ----------------------------------- | ||
+ | // Private methods | ||
+ | |||
+ | function init() { | ||
+ | design = inApp && Webflow.env('design'); | ||
+ | |||
+ | // Find all instances on the page | ||
+ | $tabs = $doc.find(namespace); | ||
+ | if (!$tabs.length) return; | ||
+ | $tabs.each(build); | ||
+ | Webflow.env('preview') && $tabs.each(resetIX); | ||
+ | inRedraw = null; | ||
+ | |||
+ | removeListeners(); | ||
+ | addListeners(); | ||
+ | } | ||
+ | |||
+ | function removeListeners() { | ||
+ | Webflow.redraw.off(api.redraw); | ||
+ | } | ||
+ | |||
+ | function addListeners() { | ||
+ | Webflow.redraw.on(api.redraw); | ||
+ | } | ||
+ | |||
+ | function resetIX(i, el) { | ||
+ | var $el = $(el); | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) return; | ||
+ | data.links && data.links.each(ix.reset); | ||
+ | data.panes && data.panes.each(ix.reset); | ||
+ | } | ||
+ | |||
+ | function build(i, el) { | ||
+ | var $el = $(el); | ||
+ | |||
+ | // Store state in data | ||
+ | var data = $.data(el, namespace); | ||
+ | if (!data) data = $.data(el, namespace, { el: $el, config: {} }); | ||
+ | data.current = null; | ||
+ | data.menu = $el.children('.w-tab-menu'); | ||
+ | data.links = data.menu.children('.w-tab-link'); | ||
+ | data.content = $el.children('.w-tab-content'); | ||
+ | data.panes = data.content.children('.w-tab-pane'); | ||
+ | |||
+ | // Remove old events | ||
+ | data.el.off(namespace); | ||
+ | data.links.off(namespace); | ||
+ | |||
+ | // Set config from data attributes | ||
+ | configure(data); | ||
+ | |||
+ | // Wire up events when not in design mode | ||
+ | if (!design) { | ||
+ | data.links.on('click' + namespace, linkSelect(data)); | ||
+ | |||
+ | // Trigger first intro event from current tab | ||
+ | var $link = data.links.filter('.' + linkCurrent); | ||
+ | var tab = $link.attr(tabAttr); | ||
+ | tab && changeTab(data, { tab: tab, immediate: true }); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function configure(data) { | ||
+ | var config = {}; | ||
+ | var old = data.config || {}; | ||
+ | |||
+ | // Set config options from data attributes | ||
+ | config.easing = data.el.attr('data-easing') || 'ease'; | ||
+ | |||
+ | var intro = +data.el.attr('data-duration-in'); | ||
+ | intro = config.intro = intro === intro ? intro : 0; | ||
+ | |||
+ | var outro = +data.el.attr('data-duration-out'); | ||
+ | outro = config.outro = outro === outro ? outro : 0; | ||
+ | |||
+ | config.immediate = !intro && !outro; | ||
+ | |||
+ | // Store config in data | ||
+ | data.config = config; | ||
+ | } | ||
+ | |||
+ | function linkSelect(data) { | ||
+ | return function(evt) { | ||
+ | var tab = evt.currentTarget.getAttribute(tabAttr); | ||
+ | tab && changeTab(data, { tab: tab }); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | function changeTab(data, options) { | ||
+ | options = options || {}; | ||
+ | |||
+ | var config = data.config; | ||
+ | var easing = config.easing; | ||
+ | var tab = options.tab; | ||
+ | |||
+ | // Don't select the same tab twice | ||
+ | if (tab === data.current) return; | ||
+ | data.current = tab; | ||
+ | |||
+ | // Select the current link | ||
+ | data.links.each(function(i, el) { | ||
+ | var $el = $(el); | ||
+ | if (el.getAttribute(tabAttr) === tab) $el.addClass(linkCurrent).each(ix.intro); | ||
+ | else if ($el.hasClass(linkCurrent)) $el.removeClass(linkCurrent).each(ix.outro); | ||
+ | }); | ||
+ | |||
+ | // Find the new tab panes and keep track of previous | ||
+ | var targets = []; | ||
+ | var previous = []; | ||
+ | data.panes.each(function(i, el) { | ||
+ | var $el = $(el); | ||
+ | if (el.getAttribute(tabAttr) === tab) { | ||
+ | targets.push(el); | ||
+ | } else if ($el.hasClass(tabActive)) { | ||
+ | previous.push(el); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | var $targets = $(targets); | ||
+ | var $previous = $(previous); | ||
+ | |||
+ | // Switch tabs immediately and bypass transitions | ||
+ | if (options.immediate || config.immediate) { | ||
+ | $targets.addClass(tabActive).each(ix.intro); | ||
+ | $previous.removeClass(tabActive); | ||
+ | // Redraw to benefit components in the hidden tab pane | ||
+ | // But only if not currently in the middle of a redraw | ||
+ | if (!inRedraw) Webflow.redraw.up(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Fade out the currently active tab before intro | ||
+ | if ($previous.length && config.outro) { | ||
+ | $previous.each(ix.outro); | ||
+ | tram($previous) | ||
+ | .add('opacity ' + config.outro + 'ms ' + easing, { fallback: safari }) | ||
+ | .start({ opacity: 0 }) | ||
+ | .then(intro); | ||
+ | } else { | ||
+ | // Skip the outro and play intro | ||
+ | intro(); | ||
+ | } | ||
+ | |||
+ | // Fade in the new target | ||
+ | function intro() { | ||
+ | // Clear previous active class + inline style | ||
+ | $previous.removeClass(tabActive).removeAttr('style'); | ||
+ | |||
+ | // Add active class to new target | ||
+ | $targets.addClass(tabActive).each(ix.intro); | ||
+ | Webflow.redraw.up(); | ||
+ | |||
+ | // Set opacity immediately if intro is zero | ||
+ | if (!config.intro) return tram($targets).set({ opacity: 1 }); | ||
+ | |||
+ | // Otherwise fade in opacity | ||
+ | tram($targets) | ||
+ | .set({ opacity: 0 }) | ||
+ | .redraw() | ||
+ | .add('opacity ' + config.intro + 'ms ' + easing, { fallback: safari }) | ||
+ | .start({ opacity: 1 }); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 17 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /** | ||
+ | * Webflow: Touch events | ||
+ | */ | ||
+ | |||
+ | var Webflow = __webpack_require__(1); | ||
+ | |||
+ | Webflow.define('touch', module.exports = function($, _) { | ||
+ | var api = {}; | ||
+ | var fallback = !document.addEventListener; | ||
+ | var getSelection = window.getSelection; | ||
+ | |||
+ | // Fallback to click events in old IE | ||
+ | if (fallback) { | ||
+ | $.event.special.tap = { bindType: 'click', delegateType: 'click' }; | ||
+ | } | ||
+ | |||
+ | api.init = function(el) { | ||
+ | if (fallback) return null; | ||
+ | el = typeof el === 'string' ? $(el).get(0) : el; | ||
+ | return el ? new Touch(el) : null; | ||
+ | }; | ||
+ | |||
+ | function Touch(el) { | ||
+ | var active = false; | ||
+ | var dirty = false; | ||
+ | var useTouch = false; | ||
+ | var thresholdX = Math.min(Math.round(window.innerWidth * 0.04), 40); | ||
+ | var startX, startY, lastX; | ||
+ | |||
+ | el.addEventListener('touchstart', start, false); | ||
+ | el.addEventListener('touchmove', move, false); | ||
+ | el.addEventListener('touchend', end, false); | ||
+ | el.addEventListener('touchcancel', cancel, false); | ||
+ | el.addEventListener('mousedown', start, false); | ||
+ | el.addEventListener('mousemove', move, false); | ||
+ | el.addEventListener('mouseup', end, false); | ||
+ | el.addEventListener('mouseout', cancel, false); | ||
+ | |||
+ | function start(evt) { | ||
+ | // We don’t handle multi-touch events yet. | ||
+ | var touches = evt.touches; | ||
+ | if (touches && touches.length > 1) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | active = true; | ||
+ | dirty = false; | ||
+ | |||
+ | if (touches) { | ||
+ | useTouch = true; | ||
+ | startX = touches[0].clientX; | ||
+ | startY = touches[0].clientY; | ||
+ | } else { | ||
+ | startX = evt.clientX; | ||
+ | startY = evt.clientY; | ||
+ | } | ||
+ | |||
+ | lastX = startX; | ||
+ | } | ||
+ | |||
+ | function move(evt) { | ||
+ | if (!active) return; | ||
+ | |||
+ | if (useTouch && evt.type === 'mousemove') { | ||
+ | evt.preventDefault(); | ||
+ | evt.stopPropagation(); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | var touches = evt.touches; | ||
+ | var x = touches ? touches[0].clientX : evt.clientX; | ||
+ | var y = touches ? touches[0].clientY : evt.clientY; | ||
+ | |||
+ | var velocityX = x - lastX; | ||
+ | lastX = x; | ||
+ | |||
+ | // Allow swipes while pointer is down, but prevent them during text selection | ||
+ | if (Math.abs(velocityX) > thresholdX && getSelection && getSelection() + '' === '') { | ||
+ | triggerEvent('swipe', evt, { direction: velocityX > 0 ? 'right' : 'left' }); | ||
+ | cancel(); | ||
+ | } | ||
+ | |||
+ | // If pointer moves more than 10px flag to cancel tap | ||
+ | if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) { | ||
+ | dirty = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function end(evt) { | ||
+ | if (!active) return; | ||
+ | active = false; | ||
+ | |||
+ | if (useTouch && evt.type === 'mouseup') { | ||
+ | evt.preventDefault(); | ||
+ | evt.stopPropagation(); | ||
+ | useTouch = false; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (!dirty) triggerEvent('tap', evt); | ||
+ | } | ||
+ | |||
+ | function cancel(evt) { | ||
+ | active = false; | ||
+ | } | ||
+ | |||
+ | function destroy() { | ||
+ | el.removeEventListener('touchstart', start, false); | ||
+ | el.removeEventListener('touchmove', move, false); | ||
+ | el.removeEventListener('touchend', end, false); | ||
+ | el.removeEventListener('touchcancel', cancel, false); | ||
+ | el.removeEventListener('mousedown', start, false); | ||
+ | el.removeEventListener('mousemove', move, false); | ||
+ | el.removeEventListener('mouseup', end, false); | ||
+ | el.removeEventListener('mouseout', cancel, false); | ||
+ | el = null; | ||
+ | } | ||
+ | |||
+ | // Public instance methods | ||
+ | this.destroy = destroy; | ||
+ | } | ||
+ | |||
+ | // Wrap native event to supoprt preventdefault + stopPropagation | ||
+ | function triggerEvent(type, evt, data) { | ||
+ | var newEvent = $.Event(type, { originalEvent: evt }); | ||
+ | $(evt.target).trigger(newEvent, data); | ||
+ | } | ||
+ | |||
+ | // Listen for touch events on all nodes by default. | ||
+ | api.instance = api.init(document); | ||
+ | |||
+ | // Export module | ||
+ | return api; | ||
+ | }); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 18 */ | ||
+ | /***/ function(module, exports, __webpack_require__) { | ||
+ | |||
+ | 'use strict'; | ||
+ | |||
+ | /*jshint -W054 */ | ||
+ | |||
+ | // Include tram for frame-throttling | ||
+ | var $ = window.$; | ||
+ | var tram = __webpack_require__(3) && $.tram; | ||
+ | |||
+ | /*! | ||
+ | * Webflow._ (aka) Underscore.js 1.6.0 (custom build) | ||
+ | * _.each | ||
+ | * _.map | ||
+ | * _.find | ||
+ | * _.filter | ||
+ | * _.any | ||
+ | * _.contains | ||
+ | * _.delay | ||
+ | * _.defer | ||
+ | * _.throttle (webflow) | ||
+ | * _.debounce | ||
+ | * _.keys | ||
+ | * _.has | ||
+ | * _.now | ||
+ | * | ||
+ | * http://underscorejs.org | ||
+ | * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
+ | * Underscore may be freely distributed under the MIT license. | ||
+ | * @license MIT | ||
+ | */ | ||
+ | module.exports = (function() { | ||
+ | var _ = {}; | ||
+ | |||
+ | // Current version. | ||
+ | _.VERSION = '1.6.0-Webflow'; | ||
+ | |||
+ | // Establish the object that gets returned to break out of a loop iteration. | ||
+ | var breaker = {}; | ||
+ | |||
+ | // Save bytes in the minified (but not gzipped) version: | ||
+ | var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; | ||
+ | |||
+ | // Create quick reference variables for speed access to core prototypes. | ||
+ | var | ||
+ | push = ArrayProto.push, | ||
+ | slice = ArrayProto.slice, | ||
+ | concat = ArrayProto.concat, | ||
+ | toString = ObjProto.toString, | ||
+ | hasOwnProperty = ObjProto.hasOwnProperty; | ||
+ | |||
+ | // All **ECMAScript 5** native function implementations that we hope to use | ||
+ | // are declared here. | ||
+ | var | ||
+ | nativeForEach = ArrayProto.forEach, | ||
+ | nativeMap = ArrayProto.map, | ||
+ | nativeReduce = ArrayProto.reduce, | ||
+ | nativeReduceRight = ArrayProto.reduceRight, | ||
+ | nativeFilter = ArrayProto.filter, | ||
+ | nativeEvery = ArrayProto.every, | ||
+ | nativeSome = ArrayProto.some, | ||
+ | nativeIndexOf = ArrayProto.indexOf, | ||
+ | nativeLastIndexOf = ArrayProto.lastIndexOf, | ||
+ | nativeIsArray = Array.isArray, | ||
+ | nativeKeys = Object.keys, | ||
+ | nativeBind = FuncProto.bind; | ||
+ | |||
+ | // Collection Functions | ||
+ | // -------------------- | ||
+ | |||
+ | // The cornerstone, an `each` implementation, aka `forEach`. | ||
+ | // Handles objects with the built-in `forEach`, arrays, and raw objects. | ||
+ | // Delegates to **ECMAScript 5**'s native `forEach` if available. | ||
+ | var each = _.each = _.forEach = function(obj, iterator, context) { | ||
+ | /* jshint shadow:true */ | ||
+ | if (obj == null) return obj; | ||
+ | if (nativeForEach && obj.forEach === nativeForEach) { | ||
+ | obj.forEach(iterator, context); | ||
+ | } else if (obj.length === +obj.length) { | ||
+ | for (var i = 0, length = obj.length; i < length; i++) { | ||
+ | if (iterator.call(context, obj[i], i, obj) === breaker) return; | ||
+ | } | ||
+ | } else { | ||
+ | var keys = _.keys(obj); | ||
+ | for (var i = 0, length = keys.length; i < length; i++) { | ||
+ | if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; | ||
+ | } | ||
+ | } | ||
+ | return obj; | ||
+ | }; | ||
+ | |||
+ | // Return the results of applying the iterator to each element. | ||
+ | // Delegates to **ECMAScript 5**'s native `map` if available. | ||
+ | _.map = _.collect = function(obj, iterator, context) { | ||
+ | var results = []; | ||
+ | if (obj == null) return results; | ||
+ | if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); | ||
+ | each(obj, function(value, index, list) { | ||
+ | results.push(iterator.call(context, value, index, list)); | ||
+ | }); | ||
+ | return results; | ||
+ | }; | ||
+ | |||
+ | // Return the first value which passes a truth test. Aliased as `detect`. | ||
+ | _.find = _.detect = function(obj, predicate, context) { | ||
+ | var result; | ||
+ | any(obj, function(value, index, list) { | ||
+ | if (predicate.call(context, value, index, list)) { | ||
+ | result = value; | ||
+ | return true; | ||
+ | } | ||
+ | }); | ||
+ | return result; | ||
+ | }; | ||
+ | |||
+ | // Return all the elements that pass a truth test. | ||
+ | // Delegates to **ECMAScript 5**'s native `filter` if available. | ||
+ | // Aliased as `select`. | ||
+ | _.filter = _.select = function(obj, predicate, context) { | ||
+ | var results = []; | ||
+ | if (obj == null) return results; | ||
+ | if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); | ||
+ | each(obj, function(value, index, list) { | ||
+ | if (predicate.call(context, value, index, list)) results.push(value); | ||
+ | }); | ||
+ | return results; | ||
+ | }; | ||
+ | |||
+ | // Determine if at least one element in the object matches a truth test. | ||
+ | // Delegates to **ECMAScript 5**'s native `some` if available. | ||
+ | // Aliased as `any`. | ||
+ | var any = _.some = _.any = function(obj, predicate, context) { | ||
+ | predicate || (predicate = _.identity); | ||
+ | var result = false; | ||
+ | if (obj == null) return result; | ||
+ | if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); | ||
+ | each(obj, function(value, index, list) { | ||
+ | if (result || (result = predicate.call(context, value, index, list))) return breaker; | ||
+ | }); | ||
+ | return !!result; | ||
+ | }; | ||
+ | |||
+ | // Determine if the array or object contains a given value (using `===`). | ||
+ | // Aliased as `include`. | ||
+ | _.contains = _.include = function(obj, target) { | ||
+ | if (obj == null) return false; | ||
+ | if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; | ||
+ | return any(obj, function(value) { | ||
+ | return value === target; | ||
+ | }); | ||
+ | }; | ||
+ | |||
+ | // Function (ahem) Functions | ||
+ | // -------------------- | ||
+ | |||
+ | // Delays a function for the given number of milliseconds, and then calls | ||
+ | // it with the arguments supplied. | ||
+ | _.delay = function(func, wait) { | ||
+ | var args = slice.call(arguments, 2); | ||
+ | return setTimeout(function(){ return func.apply(null, args); }, wait); | ||
+ | }; | ||
+ | |||
+ | // Defers a function, scheduling it to run after the current call stack has | ||
+ | // cleared. | ||
+ | _.defer = function(func) { | ||
+ | return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); | ||
+ | }; | ||
+ | |||
+ | // Returns a function, that, when invoked, will only be triggered once every | ||
+ | // browser animation frame - using tram's requestAnimationFrame polyfill. | ||
+ | _.throttle = function(func) { | ||
+ | var wait, args, context; | ||
+ | return function() { | ||
+ | if (wait) return; | ||
+ | wait = true; | ||
+ | args = arguments; | ||
+ | context = this; | ||
+ | tram.frame(function() { | ||
+ | wait = false; | ||
+ | func.apply(context, args); | ||
+ | }); | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | // Returns a function, that, as long as it continues to be invoked, will not | ||
+ | // be triggered. The function will be called after it stops being called for | ||
+ | // N milliseconds. If `immediate` is passed, trigger the function on the | ||
+ | // leading edge, instead of the trailing. | ||
+ | _.debounce = function(func, wait, immediate) { | ||
+ | var timeout, args, context, timestamp, result; | ||
+ | |||
+ | var later = function() { | ||
+ | var last = _.now() - timestamp; | ||
+ | if (last < wait) { | ||
+ | timeout = setTimeout(later, wait - last); | ||
+ | } else { | ||
+ | timeout = null; | ||
+ | if (!immediate) { | ||
+ | result = func.apply(context, args); | ||
+ | context = args = null; | ||
+ | } | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | return function() { | ||
+ | context = this; | ||
+ | args = arguments; | ||
+ | timestamp = _.now(); | ||
+ | var callNow = immediate && !timeout; | ||
+ | if (!timeout) { | ||
+ | timeout = setTimeout(later, wait); | ||
+ | } | ||
+ | if (callNow) { | ||
+ | result = func.apply(context, args); | ||
+ | context = args = null; | ||
+ | } | ||
+ | |||
+ | return result; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | // Object Functions | ||
+ | // ---------------- | ||
+ | |||
+ | // Fill in a given object with default properties. | ||
+ | _.defaults = function(obj) { | ||
+ | if (!_.isObject(obj)) return obj; | ||
+ | for (var i = 1, length = arguments.length; i < length; i++) { | ||
+ | var source = arguments[i]; | ||
+ | for (var prop in source) { | ||
+ | if (obj[prop] === void 0) obj[prop] = source[prop]; | ||
+ | } | ||
+ | } | ||
+ | return obj; | ||
+ | }; | ||
+ | |||
+ | // Retrieve the names of an object's properties. | ||
+ | // Delegates to **ECMAScript 5**'s native `Object.keys` | ||
+ | _.keys = function(obj) { | ||
+ | if (!_.isObject(obj)) return []; | ||
+ | if (nativeKeys) return nativeKeys(obj); | ||
+ | var keys = []; | ||
+ | for (var key in obj) if (_.has(obj, key)) keys.push(key); | ||
+ | return keys; | ||
+ | }; | ||
+ | |||
+ | // Shortcut function for checking if an object has a given property directly | ||
+ | // on itself (in other words, not on a prototype). | ||
+ | _.has = function(obj, key) { | ||
+ | return hasOwnProperty.call(obj, key); | ||
+ | }; | ||
+ | |||
+ | // Is a given variable an object? | ||
+ | _.isObject = function(obj) { | ||
+ | return obj === Object(obj); | ||
+ | }; | ||
+ | |||
+ | // Utility Functions | ||
+ | // ----------------- | ||
+ | |||
+ | // A (possibly faster) way to get the current timestamp as an integer. | ||
+ | _.now = Date.now || function() { return new Date().getTime(); }; | ||
+ | |||
+ | // By default, Underscore uses ERB-style template delimiters, change the | ||
+ | // following template settings to use alternative delimiters. | ||
+ | _.templateSettings = { | ||
+ | evaluate : /<%([\s\S]+?)%>/g, | ||
+ | interpolate : /<%=([\s\S]+?)%>/g, | ||
+ | escape : /<%-([\s\S]+?)%>/g | ||
+ | }; | ||
+ | |||
+ | // When customizing `templateSettings`, if you don't want to define an | ||
+ | // interpolation, evaluation or escaping regex, we need one that is | ||
+ | // guaranteed not to match. | ||
+ | var noMatch = /(.)^/; | ||
+ | |||
+ | // Certain characters need to be escaped so that they can be put into a | ||
+ | // string literal. | ||
+ | var escapes = { | ||
+ | "'": "'", | ||
+ | '\\': '\\', | ||
+ | '\r': 'r', | ||
+ | '\n': 'n', | ||
+ | '\u2028': 'u2028', | ||
+ | '\u2029': 'u2029' | ||
+ | }; | ||
+ | |||
+ | var escaper = /\\|'|\r|\n|\u2028|\u2029/g; | ||
+ | |||
+ | var escapeChar = function(match) { | ||
+ | return '\\' + escapes[match]; | ||
+ | }; | ||
+ | |||
+ | // JavaScript micro-templating, similar to John Resig's implementation. | ||
+ | // Underscore templating handles arbitrary delimiters, preserves whitespace, | ||
+ | // and correctly escapes quotes within interpolated code. | ||
+ | // NB: `oldSettings` only exists for backwards compatibility. | ||
+ | _.template = function(text, settings, oldSettings) { | ||
+ | if (!settings && oldSettings) settings = oldSettings; | ||
+ | settings = _.defaults({}, settings, _.templateSettings); | ||
+ | |||
+ | // Combine delimiters into one regular expression via alternation. | ||
+ | var matcher = RegExp([ | ||
+ | (settings.escape || noMatch).source, | ||
+ | (settings.interpolate || noMatch).source, | ||
+ | (settings.evaluate || noMatch).source | ||
+ | ].join('|') + '|$', 'g'); | ||
+ | |||
+ | // Compile the template source, escaping string literals appropriately. | ||
+ | var index = 0; | ||
+ | var source = "__p+='"; | ||
+ | text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { | ||
+ | source += text.slice(index, offset).replace(escaper, escapeChar); | ||
+ | index = offset + match.length; | ||
+ | |||
+ | if (escape) { | ||
+ | source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; | ||
+ | } else if (interpolate) { | ||
+ | source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; | ||
+ | } else if (evaluate) { | ||
+ | source += "';\n" + evaluate + "\n__p+='"; | ||
+ | } | ||
+ | |||
+ | // Adobe VMs need the match returned to produce the correct offest. | ||
+ | return match; | ||
+ | }); | ||
+ | source += "';\n"; | ||
+ | |||
+ | // If a variable is not specified, place data values in local scope. | ||
+ | if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; | ||
+ | |||
+ | source = "var __t,__p='',__j=Array.prototype.join," + | ||
+ | "print=function(){__p+=__j.call(arguments,'');};\n" + | ||
+ | source + 'return __p;\n'; | ||
+ | |||
+ | try { | ||
+ | var render = new Function(settings.variable || 'obj', '_', source); | ||
+ | } catch (e) { | ||
+ | e.source = source; | ||
+ | throw e; | ||
+ | } | ||
+ | |||
+ | var template = function(data) { | ||
+ | return render.call(this, data, _); | ||
+ | }; | ||
+ | |||
+ | // Provide the compiled source as a convenience for precompilation. | ||
+ | var argument = settings.variable || 'obj'; | ||
+ | template.source = 'function(' + argument + '){\n' + source + '}'; | ||
+ | |||
+ | return template; | ||
+ | }; | ||
+ | |||
+ | // Export underscore | ||
+ | return _; | ||
+ | }()); | ||
+ | |||
+ | |||
+ | /***/ }, | ||
+ | /* 19 */ | ||
+ | /***/ function(module, exports) { | ||
+ | |||
+ | /*! | ||
+ | * jQuery-ajaxTransport-XDomainRequest - v1.0.3 | ||
+ | * 2014-12-16 WEBFLOW - Removed UMD wrapper | ||
+ | * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest | ||
+ | * Copyright (c) 2014 Jason Moon (@JSONMOON) | ||
+ | * @license MIT (/blob/master/LICENSE.txt) | ||
+ | */ | ||
+ | module.exports=function($){if($.support.cors||!$.ajaxTransport||!window.XDomainRequest){return}var httpRegEx=/^https?:\/\//i;var getOrPostRegEx=/^get|post$/i;var sameSchemeRegEx=new RegExp("^"+location.protocol,"i");$.ajaxTransport("* text html xml json",function(options,userOptions,jqXHR){if(!options.crossDomain||!options.async||!getOrPostRegEx.test(options.type)||!httpRegEx.test(options.url)||!sameSchemeRegEx.test(options.url)){return}var xdr=null;return{send:function(headers,complete){var postData="";var userType=(userOptions.dataType||"").toLowerCase();xdr=new XDomainRequest;if(/^\d+$/.test(userOptions.timeout)){xdr.timeout=userOptions.timeout}xdr.ontimeout=function(){complete(500,"timeout")};xdr.onload=function(){var allResponseHeaders="Content-Length: "+xdr.responseText.length+"\r\nContent-Type: "+xdr.contentType;var status={code:200,message:"success"};var responses={text:xdr.responseText};try{if(userType==="html"||/text\/html/i.test(xdr.contentType)){responses.html=xdr.responseText}else if(userType==="json"||userType!=="text"&&/\/json/i.test(xdr.contentType)){try{responses.json=$.parseJSON(xdr.responseText)}catch(e){status.code=500;status.message="parseerror"}}else if(userType==="xml"||userType!=="text"&&/\/xml/i.test(xdr.contentType)){var doc=new ActiveXObject("Microsoft.XMLDOM");doc.async=false;try{doc.loadXML(xdr.responseText)}catch(e){doc=undefined}if(!doc||!doc.documentElement||doc.getElementsByTagName("parsererror").length){status.code=500;status.message="parseerror";throw"Invalid XML: "+xdr.responseText}responses.xml=doc}}catch(parseMessage){throw parseMessage}finally{complete(status.code,status.message,responses,allResponseHeaders)}};xdr.onprogress=function(){};xdr.onerror=function(){complete(500,"error",{text:xdr.responseText})};if(userOptions.data){postData=$.type(userOptions.data)==="string"?userOptions.data:$.param(userOptions.data)}xdr.open(options.type,options.url);xdr.send(postData)},abort:function(){if(xdr){xdr.abort()}}}})}(window.jQuery); | ||
+ | |||
+ | /***/ } | ||
+ | /******/ ]);/** | ||
+ | * ---------------------------------------------------------------------- | ||
+ | * Webflow: Interactions: Init | ||
+ | */ | ||
+ | Webflow.require('ix').init([ | ||
+ | {"slug":"hero-title","name":"Hero title","value":{"style":{"opacity":0},"triggers":[{"type":"load","stepsA":[{"wait":100},{"opacity":1,"transition":"opacity 500ms ease 0ms"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-title-2","name":"Hero title 2","value":{"style":{"opacity":0,"x":"-20px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":300},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-title-3","name":"Hero title 3","value":{"style":{"opacity":0,"x":"-20px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":500},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-title-4","name":"Hero title 4","value":{"style":{"opacity":0,"x":"-20px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":700},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-title-5","name":"Hero title 5","value":{"style":{"opacity":0,"x":"-20px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":900},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-title-6","name":"Hero title 6","value":{"style":{"opacity":0,"x":"0px","y":"20px"},"triggers":[{"type":"load","stepsA":[{"wait":1100},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-button","name":"Hero button","value":{"style":{"opacity":0,"x":"0px","y":"20px"},"triggers":[{"type":"load","stepsA":[{"wait":1500},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-button-2","name":"Hero button 2","value":{"style":{"opacity":0,"x":"0px","y":"20px"},"triggers":[{"type":"load","stepsA":[{"wait":1800},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-image","name":"Hero image","value":{"style":{"opacity":0,"x":"50px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":1700},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-image-2","name":"Hero image 2","value":{"style":{"opacity":0,"x":"50px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":1900},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"hero-image-3","name":"Hero image 3","value":{"style":{"opacity":0,"x":"50px","y":"0px"},"triggers":[{"type":"load","stepsA":[{"wait":2200},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"model-title-slide","name":"Model title slide","value":{"style":{"opacity":0,"x":"20px","y":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":200},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"20px","y":"0px"}]}]}}, | ||
+ | {"slug":"model-title-slide-2","name":"Model title slide 2","value":{"style":{"opacity":0,"x":"20px","y":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"20px","y":"0px"}]}]}}, | ||
+ | {"slug":"testimonial-image","name":"Testimonial image","value":{"style":{"opacity":0.4},"triggers":[]}}, | ||
+ | {"slug":"show-testimonial-image","name":"Show testimonial image","value":{"style":{},"triggers":[{"type":"hover","selector":".testimonial-image","descend":true,"stepsA":[{"opacity":1,"transition":"opacity 500ms ease 0ms"}],"stepsB":[{"opacity":0.4,"transition":"opacity 500ms ease 0ms"}]}]}}, | ||
+ | {"slug":"page-title","name":"Page title","value":{"style":{"opacity":0,"x":"0px","y":"-20px"},"triggers":[{"type":"load","stepsA":[{"wait":300},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"page-title-2","name":"Page title 2","value":{"style":{"opacity":0,"x":"0px","y":"20px"},"triggers":[{"type":"load","stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-in-on-load","name":"Fade in on Load","value":{"style":{"opacity":0,"x":"0px","y":"30px"},"triggers":[{"type":"load","stepsA":[{"wait":200},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-in-on-load-2","name":"Fade in on Load 2","value":{"style":{"opacity":0,"x":"0px","y":"30px"},"triggers":[{"type":"load","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-in-on-load-3","name":"Fade in on Load 3","value":{"style":{"opacity":0,"x":"0px","y":"30px"},"triggers":[{"type":"load","stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-in-on-load-4","name":"Fade in on Load 4","value":{"style":{"opacity":0,"x":"0px","y":"30px"},"triggers":[{"type":"load","stepsA":[{"wait":800},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-in-on-load-5","name":"Fade in on Load 5","value":{"style":{"opacity":0,"x":"0px","y":"30px"},"triggers":[{"type":"load","stepsA":[{"wait":1000},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-on-scroll","name":"Fade on scroll","value":{"style":{"opacity":0.02,"x":"-50px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"fade-on-scroll-right","name":"Fade on scroll (right)","value":{"style":{"opacity":0.02,"x":"30px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"stats-fade-in","name":"Stats fade in","value":{"style":{"opacity":0,"x":"-50px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"wait":200},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"stats-fade-in-2","name":"Stats fade in 2","value":{"style":{"opacity":0,"x":"-50px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"stats-fade-in-3","name":"Stats fade in 3","value":{"style":{"opacity":0,"x":"50px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"stats-fade-in-4","name":"Stats fade in 4","value":{"style":{"opacity":0,"x":"50px","y":"0px"},"triggers":[{"type":"scroll","offsetBot":"20%","stepsA":[{"wait":600},{"opacity":1,"transition":"transform 700ms ease 0ms, opacity 700ms ease 0ms","x":"0px","y":"0px"}],"stepsB":[]}]}}, | ||
+ | {"slug":"process-bar-fill-70","name":"Process bar fill (70%)","value":{"style":{"width":"0%"},"triggers":[{"type":"load","stepsA":[{"wait":300},{"width":"70%","transition":"width 700ms ease 0ms"}],"stepsB":[]}]}}, | ||
+ | {"slug":"process-bar-fill-50","name":"Process bar fill (50%)","value":{"style":{"width":"0%"},"triggers":[{"type":"load","stepsA":[{"wait":300},{"width":"50%","transition":"width 700ms ease 0ms"}],"stepsB":[]}]}}, | ||
+ | {"slug":"process-bar-fill-30","name":"Process bar fill (30%)","value":{"style":{"width":"0%"},"triggers":[{"type":"load","stepsA":[{"wait":300},{"width":"30%","transition":"width 700ms ease 0ms"}],"stepsB":[]}]}} | ||
+ | ]); | ||
+ | |||
+ | |||
+ | |||
+ | </script> | ||
</body> | </body> | ||
</html> | </html> |
Revision as of 21:28, 16 September 2015
Alergln project
The aim of our project is to create a personal kit, one that identifies gluten in food, reliably and in reasonable time. This kit will allow easing the celiac patient’s life and reducing their expenses to a great extent.
The "Alergln" Kit is based on a fascinating innovative technology in the diagnostic world, just as the kit to identify pregnancy brought with it a series of scientific technology; equally, this kit brings innovation and a breakthrough in a way of thinking and designing the kit. In the future, we believe that the idea can be implemented and utilized as well in areas to identify other substances, not necessarily food materials.
The "Alergln Project" was created after the realization that the number of people diagnosed in having gluten sensitivity (celiac disease) increases from year to year. The number of diagnosed celiac patient’s increases annually worldwide mostly due to awareness of this phenomenon. This awareness eases and enables many people real quality of life without the horrendous stomach pains. Celiac disease patients are not treated with drugs because the drug is not available; these patients simply avoid eating gluten. Therefore, they must verify whether the food they intend eating has gluten or not. The scales to check are often complicated and not necessarily accurate.
The "Alergln" kit will serve the above population, prevent them from concern for the presence of gluten in food and can eat with peace of mind and without worrying about their lives.
The success of the project will allow patients to eat foods that "may contain gluten," but there is no gluten, the difference in prices is very high and hence the kit cancels the presence of gluten in regular foods and allows the patient to eat without any concern, and at a lower cost.
Team DANZI-KESH-8
Team DANZI-KESH-8 is a biotechnology class from Danziger High School, the high school is situated in the northernmost part of Israel. The school is located in a small town Kiryat Shmona.
We, 23 students aged 16 and majoring in biotechnology, may be young but full of ambition and motivation for success and learning different fields of science. The entire school staff is recruited together with us to prepare for competition - the English teacher, science teacher, math teacher, and of course the school administration.
Watch our journey album