1/*! 2 * Webflow: Front-end site library 3 * @license MIT 4 * Inline scripts may access the api using an async handler: 5 * var Webflow = Webflow || []; 6 * Webflow.push(readyFunction); 7 */ 8/******/ (function(modules) { // webpackBootstrap 9/******/ // The module cache 10/******/ var installedModules = {}; 11 12/******/ // The require function 13/******/ function __webpack_require__(moduleId) { 14 15/******/ // Check if module is in cache 16/******/ if(installedModules[moduleId]) 17/******/ return installedModules[moduleId].exports; 18 19/******/ // Create a new module (and put it into the cache) 20/******/ var module = installedModules[moduleId] = { 21/******/ exports: {}, 22/******/ id: moduleId, 23/******/ loaded: false 24/******/ }; 25 26/******/ // Execute the module function 27/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 28 29/******/ // Flag the module as loaded 30/******/ module.loaded = true; 31 32/******/ // Return the exports of the module 33/******/ return module.exports; 34/******/ } 35 36 37/******/ // expose the modules object (__webpack_modules__) 38/******/ __webpack_require__.m = modules; 39 40/******/ // expose the module cache 41/******/ __webpack_require__.c = installedModules; 42 43/******/ // __webpack_public_path__ 44/******/ __webpack_require__.p = "/"; 45 46/******/ // Load entry module and return exports 47/******/ return __webpack_require__(0); 48/******/ }) 49/************************************************************************/ 50/******/ ([ 51/* 0 */ 52/***/ function(module, exports, __webpack_require__) { 53 54 __webpack_require__(5); 55 __webpack_require__(6); 56 __webpack_require__(7); 57 __webpack_require__(8); 58 __webpack_require__(9); 59 __webpack_require__(10); 60 __webpack_require__(11); 61 __webpack_require__(12); 62 __webpack_require__(1); 63 __webpack_require__(13); 64 __webpack_require__(14); 65 __webpack_require__(15); 66 __webpack_require__(16); 67 __webpack_require__(17); 68 __webpack_require__(18); 69 __webpack_require__(19); 70 module.exports = __webpack_require__(20); 71 72 73/***/ }, 74/* 1 */ 75/***/ function(module, exports, __webpack_require__) { 76 77 /* WEBPACK VAR INJECTION */(function(process) {'use strict'; 78 79 /** 80 * Webflow: Core site library 81 */ 82 83 var Webflow = {}; 84 var modules = {}; 85 var primary = []; 86 var secondary = window.Webflow || []; 87 var $ = window.jQuery; 88 var $win = $(window); 89 var $doc = $(document); 90 var isFunction = $.isFunction; 91 var _ = Webflow._ = __webpack_require__(21); 92 var tram = __webpack_require__(3) && $.tram; 93 var domready = false; 94 var destroyed = false; 95 var Modernizr = window.Modernizr; 96 tram.config.hideBackface = false; 97 tram.config.keepInherited = true; 98 99 /** 100 * Webflow.define - Define a named module 101 * @param {string} name 102 * @param {function} factory 103 * @param {object} options 104 * @return {object} 105 */ 106 Webflow.define = function(name, factory, options) { 107 if (modules[name]) unbindModule(modules[name]); 108 var instance = modules[name] = factory($, _, options) || {}; 109 bindModule(instance); 110 return instance; 111 }; 112 113 /** 114 * Webflow.require - Require a named module 115 * @param {string} name 116 * @return {object} 117 */ 118 Webflow.require = function(name) { 119 return modules[name]; 120 }; 121 122 function bindModule(module) { 123 // If running in Webflow app, subscribe to design/preview events 124 if (Webflow.env()) { 125 isFunction(module.design) && $win.on('__wf_design', module.design); 126 isFunction(module.preview) && $win.on('__wf_preview', module.preview); 127 } 128 // Subscribe to front-end destroy event 129 isFunction(module.destroy) && $win.on('__wf_destroy', module.destroy); 130 // Look for ready method on module 131 if (module.ready && isFunction(module.ready)) { 132 addReady(module); 133 } 134 } 135 136 function addReady(module) { 137 // If domready has already happened, run ready method 138 if (domready) { 139 module.ready(); 140 return; 141 } 142 // Otherwise add ready method to the primary queue (only once) 143 if (_.contains(primary, module.ready)) return; 144 primary.push(module.ready); 145 } 146 147 function unbindModule(module) { 148 // Unsubscribe module from window events 149 isFunction(module.design) && $win.off('__wf_design', module.design); 150 isFunction(module.preview) && $win.off('__wf_preview', module.preview); 151 isFunction(module.destroy) && $win.off('__wf_destroy', module.destroy); 152 // Remove ready method from primary queue 153 if (module.ready && isFunction(module.ready)) { 154 removeReady(module); 155 } 156 } 157 158 function removeReady(module) { 159 primary = _.filter(primary, function(readyFn) { 160 return readyFn !== module.ready; 161 }); 162 } 163 164 /** 165 * Webflow.push - Add a ready handler into secondary queue 166 * @param {function} ready Callback to invoke on domready 167 */ 168 Webflow.push = function(ready) { 169 // If domready has already happened, invoke handler 170 if (domready) { 171 isFunction(ready) && ready(); 172 return; 173 } 174 // Otherwise push into secondary queue 175 secondary.push(ready); 176 }; 177 178 /** 179 * Webflow.env - Get the state of the Webflow app 180 * @param {string} mode [optional] 181 * @return {boolean} 182 */ 183 Webflow.env = function(mode) { 184 var designFlag = window.__wf_design; 185 var inApp = typeof designFlag !== 'undefined'; 186 if (!mode) return inApp; 187 if (mode === 'design') return inApp && designFlag; 188 if (mode === 'preview') return inApp && !designFlag; 189 if (mode === 'slug') return inApp && window.__wf_slug; 190 if (mode === 'editor') return window.WebflowEditor; 191 if (mode === 'test') return process.env.NODE_ENV === 'test' || window.__wf_test; 192 if (mode === 'frame') return window !== window.top; 193 }; 194 195 // Feature detects + browser sniffs � _� 196 var userAgent = navigator.userAgent.toLowerCase(); 197 var appVersion = navigator.appVersion.toLowerCase(); 198 var touch = Webflow.env.touch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch; 199 var chrome = Webflow.env.chrome = /chrome/.test(userAgent) && /Google/.test(navigator.vendor) && parseInt(appVersion.match(/chrome\/(\d+)\./)[1], 10); 200 var ios = Webflow.env.ios = Modernizr && Modernizr.ios; 201 Webflow.env.safari = /safari/.test(userAgent) && !chrome && !ios; 202 203 // Maintain current touch target to prevent late clicks on touch devices 204 var touchTarget; 205 // Listen for both events to support touch/mouse hybrid devices 206 touch && $doc.on('touchstart mousedown', function(evt) { 207 touchTarget = evt.target; 208 }); 209 210 /** 211 * Webflow.validClick - validate click target against current touch target 212 * @param {HTMLElement} clickTarget Element being clicked 213 * @return {Boolean} True if click target is valid (always true on non-touch) 214 */ 215 Webflow.validClick = touch ? function(clickTarget) { 216 return clickTarget === touchTarget || $.contains(clickTarget, touchTarget); 217 } : function() { return true; }; 218 219 /** 220 * Webflow.resize, Webflow.scroll - throttled event proxies 221 */ 222 var resizeEvents = 'resize.webflow orientationchange.webflow load.webflow';
223 var scrollEvents = 'scroll.webflow ' + resizeEvents; 224 Webflow.resize = eventProxy($win, resizeEvents); 225 Webflow.scroll = eventProxy($win, scrollEvents); 226 Webflow.redraw = eventProxy(); 227 228 // Create a proxy instance for throttled events 229 function eventProxy(target, types) { 230 231 // Set up throttled method (using custom frame-based _.throttle) 232 var handlers = []; 233 var proxy = {}; 234 proxy.up = _.throttle(function(evt) { 235 _.each(handlers, function(h) { h(evt); }); 236 }); 237 238 // Bind events to target 239 if (target && types) target.on(types, proxy.up); 240 241 /** 242 * Add an event handler 243 * @param {function} handler 244 */ 245 proxy.on = function(handler) { 246 if (typeof handler !== 'function') return; 247 if (_.contains(handlers, handler)) return; 248 handlers.push(handler); 249 }; 250 251 /** 252 * Remove an event handler 253 * @param {function} handler 254 */ 255 proxy.off = function(handler) { 256 // If no arguments supplied, clear all handlers 257 if (!arguments.length) { 258 handlers = []; 259 return; 260 } 261 // Otherwise, remove handler from the list 262 handlers = _.filter(handlers, function(h) { 263 return h !== handler; 264 }); 265 }; 266 267 return proxy; 268 } 269 270 // Webflow.location - Wrap window.location in api 271 Webflow.location = function(url) { 272 window.location = url; 273 }; 274 275 // Webflow.app - Designer-specific methods 276 Webflow.app = Webflow.env() ? {} : null; 277 if (Webflow.app) { 278 279 // Trigger redraw for specific elements 280 var redraw = new Event('__wf_redraw'); 281 Webflow.app.redrawElement = function(i, el) { el.dispatchEvent(redraw); }; 282 283 // Webflow.location - Re-route location change to trigger an event 284 Webflow.location = function(url) { 285 window.dispatchEvent(new CustomEvent('__wf_location', { detail: url })); 286 }; 287 } 288 289 // Webflow.ready - Call primary and secondary handlers 290 Webflow.ready = function() { 291 domready = true; 292 293 // Restore modules after destroy 294 if (destroyed) { 295 restoreModules(); 296 297 // Otherwise run primary ready methods 298 } else { 299 _.each(primary, callReady); 300 } 301 302 // Run secondary ready methods 303 _.each(secondary, callReady); 304 305 // Trigger resize 306 Webflow.resize.up(); 307 }; 308 309 function callReady(readyFn) { 310 isFunction(readyFn) && readyFn(); 311 } 312 313 function restoreModules() { 314 destroyed = false; 315 _.each(modules, bindModule); 316 } 317 318 /** 319 * Webflow.load - Add a window load handler that will run even if load event has already happened 320 * @param {function} handler 321 */ 322 var deferLoad; 323 Webflow.load = function(handler) { 324 deferLoad.then(handler); 325 }; 326 327 function bindLoad() { 328 // Reject any previous deferred (to support destroy) 329 if (deferLoad) { 330 deferLoad.reject(); 331 $win.off('load', deferLoad.resolve); 332 } 333 // Create deferred and bind window load event 334 deferLoad = new $.Deferred(); 335 $win.on('load', deferLoad.resolve); 336 } 337 338 // Webflow.destroy - Trigger a destroy event for all modules 339 Webflow.destroy = function(options) { 340 options = options || {}; 341 destroyed = true; 342 $win.triggerHandler('__wf_destroy'); 343 344 // Allow domready reset for tests 345 if (options.domready != null) { 346 domready = options.domready; 347 } 348 349 // Unbind modules 350 _.each(modules, unbindModule); 351 352 // Clear any proxy event handlers 353 Webflow.resize.off(); 354 Webflow.scroll.off(); 355 Webflow.redraw.off(); 356 357 // Clear any queued ready methods 358 primary = []; 359 secondary = []; 360 361 // If load event has not yet fired, replace the deferred 362 if (deferLoad.state() === 'pending') bindLoad(); 363 }; 364 365 // Listen for domready 366 $(Webflow.ready); 367 368 // Listen for window.onload and resolve deferred 369 bindLoad(); 370 371 // Export commonjs module 372 module.exports = window.Webflow = Webflow; 373 374 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4))) 375 376/***/ }, 377/* 2 */ 378/***/ function(module, exports) { 379 380 'use strict'; 381 382 /** 383 * Webflow: IX Event triggers for other modules 384 */ 385 386 var $ = window.jQuery; 387 var api = {}; 388 var eventQueue = []; 389 var namespace = '.w-ix'; 390 391 var eventTriggers = { 392 reset: function(i, el) { 393 el.__wf_intro = null; 394 }, 395 intro: function(i, el) { 396 if (el.__wf_intro) return; 397 el.__wf_intro = true; 398 $(el).triggerHandler(api.types.INTRO); 399 }, 400 outro: function(i, el) { 401 if (!el.__wf_intro) return; 402 el.__wf_intro = null; 403 $(el).triggerHandler(api.types.OUTRO); 404 } 405 }; 406 407 api.triggers = {}; 408 409 api.types = { 410 INTRO: 'w-ix-intro' + namespace, 411 OUTRO: 'w-ix-outro' + namespace 412 }; 413 414 // Trigger any events in queue + restore trigger methods 415 api.init = function() { 416 var count = eventQueue.length; 417 for (var i = 0; i < count; i++) { 418 var memo = eventQueue[i]; 419 memo[0](0, memo[1]); 420 } 421 eventQueue = []; 422 $.extend(api.triggers, eventTriggers); 423 }; 424 425 // Replace all triggers with async wrapper to queue events until init 426 api.async = function() { 427 for (var key in eventTriggers) { 428 var func = eventTriggers[key]; 429 if (!eventTriggers.hasOwnProperty(key)) continue; 430 431 // Replace trigger method with async wrapper 432 api.triggers[key] = function(i, el) { 433 eventQueue.push([func, el]); 434 }; 435 } 436 }; 437 438 // Default triggers to async queue 439 api.async(); 440 441 module.exports = api; 442 443 444/***/ }, 445/* 3 */
446/***/ function(module, exports) { 447 448 /*! 449 * tram.js v0.8.1-global 450 * Cross-browser CSS3 transitions in JavaScript 451 * https://github.com/bkwld/tram 452 * MIT License 453 */ 454 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={}
454,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
454(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;
454if(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:[]};
454b.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); 455 456 457/***/ }, 458/* 4 */ 459/***/ function(module, exports) { 460 461 // shim for using process in browser 462 var process = module.exports = {}; 463 464 // cached from whatever global is present so that test runners that stub it 465 // don't break things. But we need to wrap it in a try catch in case it is 466 // wrapped in strict mode code which doesn't define any globals. It's inside a 467 // function because try/catches deoptimize in certain engines. 468 469 var cachedSetTimeout; 470 var cachedClearTimeout; 471 472 (function () { 473 try { 474 cachedSetTimeout = setTimeout; 475 } catch (e) { 476 cachedSetTimeout = function () { 477 throw new Error('setTimeout is not defined'); 478 } 479 } 480 try { 481 cachedClearTimeout = clearTimeout; 482 } catch (e) { 483 cachedClearTimeout = function () { 484 throw new Error('clearTimeout is not defined'); 485 } 486 } 487 } ()) 488 function runTimeout(fun) { 489 if (cachedSetTimeout === setTimeout) { 490 //normal enviroments in sane situations 491 return setTimeout(fun, 0); 492 } 493 try { 494 // when when somebody has screwed with setTimeout but no I.E. maddness 495 return cachedSetTimeout(fun, 0); 496 } catch(e){ 497 try { 498 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 499 return cachedSetTimeout.call(null, fun, 0); 500 } catch(e){ 501 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error 502 return cachedSetTimeout.call(this, fun, 0); 503 } 504 } 505 506 507 } 508 function runClearTimeout(marker) { 509 if (cachedClearTimeout === clearTimeout) { 510 //normal enviroments in sane situations 511 return clearTimeout(marker); 512 } 513 try { 514 // when when somebody has screwed with setTimeout but no I.E. maddness 515 return cachedClearTimeout(marker); 516 } catch (e){ 517 try { 518 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 519 return cachedClearTimeout.call(null, marker); 520 } catch (e){ 521 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. 522 // Some versions of I.E. have different rules for clearTimeout vs setTimeout 523 return cachedClearTimeout.call(this, marker); 524 } 525 } 526 527 528 529 } 530 var queue = []; 531 var draining = false;
532 var currentQueue; 533 var queueIndex = -1; 534 535 function cleanUpNextTick() { 536 if (!draining || !currentQueue) { 537 return; 538 } 539 draining = false; 540 if (currentQueue.length) { 541 queue = currentQueue.concat(queue); 542 } else { 543 queueIndex = -1; 544 } 545 if (queue.length) { 546 drainQueue(); 547 } 548 } 549 550 function drainQueue() { 551 if (draining) { 552 return; 553 } 554 var timeout = runTimeout(cleanUpNextTick); 555 draining = true; 556 557 var len = queue.length; 558 while(len) { 559 currentQueue = queue; 560 queue = []; 561 while (++queueIndex < len) { 562 if (currentQueue) { 563 currentQueue[queueIndex].run(); 564 } 565 } 566 queueIndex = -1; 567 len = queue.length; 568 } 569 currentQueue = null; 570 draining = false; 571 runClearTimeout(timeout); 572 } 573 574 process.nextTick = function (fun) { 575 var args = new Array(arguments.length - 1); 576 if (arguments.length > 1) { 577 for (var i = 1; i < arguments.length; i++) { 578 args[i - 1] = arguments[i]; 579 } 580 } 581 queue.push(new Item(fun, args)); 582 if (queue.length === 1 && !draining) { 583 runTimeout(drainQueue); 584 } 585 }; 586 587 // v8 likes predictible objects 588 function Item(fun, array) { 589 this.fun = fun; 590 this.array = array; 591 } 592 Item.prototype.run = function () { 593 this.fun.apply(null, this.array); 594 }; 595 process.title = 'browser'; 596 process.browser = true; 597 process.env = {}; 598 process.argv = []; 599 process.version = ''; // empty string to avoid regexp issues 600 process.versions = {}; 601 602 function noop() {} 603 604 process.on = noop; 605 process.addListener = noop; 606 process.once = noop; 607 process.off = noop; 608 process.removeListener = noop; 609 process.removeAllListeners = noop; 610 process.emit = noop; 611 612 process.binding = function (name) { 613 throw new Error('process.binding is not supported'); 614 }; 615 616 process.cwd = function () { return '/' }; 617 process.chdir = function (dir) { 618 throw new Error('process.chdir is not supported'); 619 }; 620 process.umask = function() { return 0; }; 621 622 623/***/ }, 624/* 5 */ 625/***/ function(module, exports, __webpack_require__) { 626 627 'use strict'; 628 629 /** 630 * Webflow: Background Video component 631 */ 632 633 var Webflow = __webpack_require__(1); 634 635 Webflow.define('backgroundVideo', module.exports = function ($, _) { 636 var namespace = '.w-background-video'; 637 var doc = $(document); 638 639 function ready () { 640 var backgroundVideoNodes = $(document).find('.w-background-video'); 641 if (backgroundVideoNodes.length === 0) { 642 return; 643 } 644 645 backgroundVideoNodes.each(function (_, node) { 646 $(node).prepend(createVideoNode(node)); 647 }); 648 } 649 650 function createVideoNode (nativeNode) { 651 var nodeData = nativeNode.dataset; 652 653 if (!nodeData.videoUrls) { 654 return $('<video />'); 655 } 656 657 // Prevent loading the videos on mobile browsers as its likely that they 658 // are on low-bandwidth connections. 659 if (Webflow.isMobile()) { 660 return $('<video />').css('background-image', 'url(' + nodeData.posterUrl + ')'); 661 } 662 663 var videoURLs = nodeData.videoUrls.split(','); 664 var sourceNodes = videoURLs.map(function (url) { 665 return $('<source />').attr({ 666 src: url, 667 'data-wf-ignore': '', 668 }); 669 }); 670 671 var videoNode = $('<video />').attr({ 672 autoplay: nodeData.autoplay, 673 loop: nodeData.loop, 674 }) 675 .css('background-image', 'url(' + nodeData.posterUrl + ')'); 676 677 videoNode.append(sourceNodes); 678 679 return videoNode; 680 } 681 682 return { ready: ready }; 683 }); 684 685 686/***/ }, 687/* 6 */ 688/***/ function(module, exports, __webpack_require__) { 689 690 'use strict'; 691 692 /** 693 * Webflow: Brand pages on the subdomain 694 */ 695 696 var Webflow = __webpack_require__(1); 697 698 Webflow.define('brand', module.exports = function($, _) { 699 var api = {}; 700 var $html = $('html'); 701 var $body = $('body'); 702 var location = window.location; 703 var inApp = Webflow.env(); 704 705 // ----------------------------------- 706 // Module methods 707 708 api.ready = function() { 709 var doBranding = $html.attr('data-wf-status'); 710 var publishedDomain = $html.attr('data-wf-domain') || ''; 711 712 if (/\.webflow\.io$/i.test(publishedDomain) && location.hostname !== publishedDomain) { 713 doBranding = true; 714 } 715 716 if (doBranding) { 717 var $branding = $('<div></div>'); 718 var $link = $('<a></a>'); 719 $link.attr('href', 'http://webflow.com?utm_campaign=brandjs'); 720 721 $branding.css({ 722 position: 'fixed', 723 bottom: 0, 724 right: 0, 725 zIndex: 2147483647, 726 borderTopLeftRadius: '5px', 727 backgroundColor: '#2b3239', 728 padding: '8px 12px 5px 15px', 729 fontFamily: 'Arial', 730 fontSize: '10px', 731 textTransform: 'uppercase', 732 opacity: '0', 733 transition: 'opacity 0.50s ease-in-out' 734 }); 735 736 $link.css({ 737 color: '#AAADB0', 738 textDecoration: 'none' 739 }); 740 741 var $webflowLogo = $('<img>'); 742 $webflowLogo.attr('src', 'https://daks2k3a4ib2z.cloudfront.net/54153e6a3d25f2755b1f14ed/5445a4b1944ecdaa4df86d3e_subdomain-brand.svg'); 743 $webflowLogo.css({ 744 opacity: 0.9, 745 width: '57px', 746 verticalAlign: 'middle', 747 paddingLeft: '4px', 748 paddingBottom: '3px' 749 }); 750 751 $branding.text('Built with'); 752 $branding.append($webflowLogo); 753 $link.append($branding); 754 755 $body.append($link); 756 757 if (/PhantomJS/.test(window.navigator.userAgent)) { 758 return; 759 } 760 761 $branding.css({ 762 opacity: '1.0' 763 }); 764 } 765 }; 766 767 // Export module 768 return api; 769 }); 770 771 772/***/ }, 773/* 7 */ 774/***/ function(module, exports, __webpack_require__) { 775 776 'use strict'; 777 778 /** 779 * Webflow: Dropdown component 780 */ 781 782 var Webflow = __webpack_require__(1); 783 var IXEvents = __webpack_require__(2); 784 785 Webflow.define('dropdown', module.exports = function($, _) { 786 var api = {}; 787 var $doc = $(document); 788 var $dropdowns; 789 var designer; 790 var inApp = Webflow.env(); 791 var touch = Webflow.env.touch; 792 var namespace = '.w-dropdown'; 793 var stateOpen = 'w--open'; 794 var closeEvent = 'w-close' + namespace; 795 var ix = IXEvents.triggers; 796 797 // ----------------------------------- 798 // Module methods 799 800 api.ready = api.design = api.preview = init; 801 802 // ----------------------------------- 803 // Private methods 804
805 function init() { 806 designer = inApp && Webflow.env('design'); 807 808 // Find all instances on the page 809 $dropdowns = $doc.find(namespace); 810 $dropdowns.each(build); 811 } 812 813 function build(i, el) { 814 var $el = $(el); 815 816 // Store state in data 817 var data = $.data(el, namespace); 818 if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} }); 819 data.list = $el.children('.w-dropdown-list'); 820 data.toggle = $el.children('.w-dropdown-toggle'); 821 data.links = data.list.children('.w-dropdown-link'); 822 data.outside = outside(data); 823 data.complete = complete(data); 824 data.leave = leave(data); 825 826 // Remove old events 827 $el.off(namespace); 828 data.toggle.off(namespace); 829 830 // Set config from data attributes 831 configure(data); 832 833 if (data.nav) data.nav.off(namespace); 834 data.nav = $el.closest('.w-nav'); 835 data.nav.on(closeEvent, handler(data)); 836 837 // Add events based on mode 838 if (designer) { 839 $el.on('setting' + namespace, handler(data)); 840 } else { 841 data.toggle.on('tap' + namespace, toggle(data)); 842 if (data.config.hover) { 843 data.toggle.on('mouseenter' + namespace, enter(data)); 844 } 845 $el.on(closeEvent, handler(data)); 846 // Close in preview mode 847 inApp && close(data); 848 } 849 } 850 851 function configure(data) { 852 data.config = { 853 hover: Boolean(data.el.attr('data-hover')) && !touch, 854 delay: Number(data.el.attr('data-delay')) || 0 855 }; 856 } 857 858 function handler(data) { 859 return function(evt, options) { 860 options = options || {}; 861 862 if (evt.type === 'w-close') { 863 return close(data); 864 } 865 866 if (evt.type === 'setting') { 867 configure(data); 868 options.open === true && open(data, true); 869 options.open === false && close(data, true); 870 return; 871 } 872 }; 873 } 874 875 function toggle(data) { 876 return _.debounce(function() { 877 data.open ? close(data) : open(data); 878 }); 879 } 880 881 function open(data) { 882 if (data.open) return; 883 closeOthers(data); 884 data.open = true; 885 data.list.addClass(stateOpen); 886 data.toggle.addClass(stateOpen); 887 ix.intro(0, data.el[0]); 888 Webflow.redraw.up(); 889 890 // Listen for tap outside events 891 if (!designer) $doc.on('tap' + namespace, data.outside); 892 if (data.hovering) data.el.on('mouseleave' + namespace, data.leave); 893 894 // Clear previous delay 895 window.clearTimeout(data.delayId); 896 } 897 898 function close(data, immediate) { 899 if (!data.open) return; 900 901 // Do not close hover-based menus if currently hovering 902 if (data.config.hover && data.hovering) return; 903 904 data.open = false; 905 var config = data.config; 906 ix.outro(0, data.el[0]); 907 908 // Stop listening for tap outside events 909 $doc.off('tap' + namespace, data.outside); 910 data.el.off('mouseleave' + namespace, data.leave); 911 912 // Clear previous delay 913 window.clearTimeout(data.delayId); 914 915 // Skip delay during immediate 916 if (!config.delay || immediate) return data.complete(); 917 918 // Optionally wait for delay before close 919 data.delayId = window.setTimeout(data.complete, config.delay); 920 } 921 922 function closeOthers(data) { 923 var self = data.el[0]; 924 $dropdowns.each(function(i, other) { 925 var $other = $(other); 926 if ($other.is(self) || $other.has(self).length) return; 927 $other.triggerHandler(closeEvent); 928 }); 929 } 930 931 function outside(data) { 932 // Unbind previous tap handler if it exists 933 if (data.outside) $doc.off('tap' + namespace, data.outside); 934 935 // Close menu when tapped outside 936 return _.debounce(function(evt) { 937 if (!data.open) return; 938 var $target = $(evt.target); 939 if ($target.closest('.w-dropdown-toggle').length) return; 940 if (!data.el.is($target.closest(namespace))) { 941 close(data); 942 } 943 }); 944 } 945 946 function complete(data) { 947 return function() { 948 data.list.removeClass(stateOpen); 949 data.toggle.removeClass(stateOpen); 950 }; 951 } 952 953 function enter(data) { 954 return function() { 955 data.hovering = true; 956 open(data); 957 }; 958 } 959 960 function leave(data) { 961 return function() { 962 data.hovering = false;
963 close(data); 964 }; 965 } 966 967 // Export module 968 return api; 969 }); 970 971 972/***/ }, 973/* 8 */ 974/***/ function(module, exports, __webpack_require__) { 975 976 'use strict'; 977 978 /** 979 * Webflow: Editor loader 980 */ 981 982 var Webflow = __webpack_require__(1); 983 984 Webflow.define('edit', module.exports = function($, _, options) { 985 options = options || {}; 986 987 // Exit early in test env or when inside an iframe 988 if (Webflow.env('test') || Webflow.env('frame')) { 989 // Allow test fixtures to continue 990 if (!options.fixture) { 991 return {exit: 1}; 992 } 993 } 994 995 var api = {}; 996 var $win = $(window); 997 var $html = $(document.documentElement); 998 var location = document.location; 999 var hashchange = 'hashchange'; 1000 var loaded; 1001 var loadEditor = options.load || load; 1002 var hasLocalStorage = false; 1003 1004 try { 1005 // Check localStorage for editor data 1006 hasLocalStorage = localStorage && localStorage.getItem && localStorage.getItem('WebflowEditor'); 1007 } catch (e) { 1008 // SecurityError: browser storage has been disabled 1009 } 1010 1011 if (hasLocalStorage) { 1012 loadEditor(); 1013 1014 } else if (location.search) { 1015 // Check url query for `edit` parameter or any url ending in `?edit` 1016 if (/[?&](edit)(?:[=&?]|$)/.test(location.search) || /\?edit$/.test(location.href)) { 1017 loadEditor(); 1018 } 1019 1020 } else { 1021 // Check hash fragment to support `#hash?edit` 1022 $win.on(hashchange, checkHash).triggerHandler(hashchange); 1023 } 1024 1025 function checkHash() { 1026 if (loaded) return; 1027 // Load editor when hash contains `?edit` 1028 if (/\?edit/.test(location.hash)) loadEditor(); 1029 } 1030 1031 function load() { 1032 loaded = true; 1033 // Predefine global immediately to benefit Webflow.env 1034 window.WebflowEditor = true; 1035 $win.off(hashchange, checkHash); 1036 $.ajax({ 1037 url: cleanSlashes(("https://editor-api.webflow.com") + '/api/editor/view'), 1038 data: { siteId: $html.attr('data-wf-site') }, 1039 xhrFields: { withCredentials: true }, 1040 dataType: 'json', 1041 crossDomain: true, 1042 success: success 1043 }); 1044 } 1045 1046 function success(data) { 1047 if (!data) { 1048 console.error('Could not load editor data'); 1049 return; 1050 } 1051 getScript(prefix(data.scriptPath), function () { 1052 window.WebflowEditor(data); 1053 }); 1054 } 1055 1056 function getScript(url, done) { 1057 $.ajax({ type: 'GET', url: url, dataType: 'script', cache: true }).then(done, error); 1058 } 1059 1060 function error(jqXHR, textStatus, errorThrown) { 1061 console.error('Could not load editor script: ' + textStatus); 1062 throw errorThrown; 1063 } 1064 1065 function prefix(url) { 1066 return (url.indexOf('//') >= 0) ? url : cleanSlashes(("https://editor-api.webflow.com") + url); 1067 } 1068 1069 function cleanSlashes(url) { 1070 return url.replace(/([^:])\/\//g, '$1/'); 1071 } 1072 1073 // Export module 1074 return api; 1075 }); 1076 1077 1078/***/ }, 1079/* 9 */ 1080/***/ function(module, exports) { 1081 1082 /** 1083 * Returns a Boolean representing whether or not the client is a mobile browser. 1084 * 1085 * NOTE: Many thanks to detectmobilebrowsers.com for this user agent detection 1086 * regex, without which the mobile internet probably wouldn't exist. 1087 */ 1088 Webflow.isMobile = function () { 1089 var userAgent = navigator.userAgent || navigator.vendor || window.opera; 1090 return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i 1091 .test(userAgent) || 1092 /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
1092sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i 1093 .test(userAgent.substr(0, 4)); 1094 } 1095 1096 1097/***/ }, 1098/* 10 */ 1099/***/ function(module, exports, __webpack_require__) { 1100 1101 /** 1102 * Webflow: Forms 1103 */ 1104 1105 var Webflow = __webpack_require__(1); 1106 1107 Webflow.define('forms', module.exports = function($, _) { 1108 var api = {}; 1109 1110 // Cross-Domain AJAX for IE8 1111 __webpack_require__(22); 1112 1113 var $doc = $(document); 1114 var $forms; 1115 var loc = window.location; 1116 var retro = window.XDomainRequest && !window.atob; 1117 var namespace = '.w-form'; 1118 var siteId; 1119 var emailField = /e(\-)?mail/i; 1120 var emailValue = /^\S+@\S+$/; 1121 var alert = window.alert; 1122 var listening; 1123 1124 // MailChimp domains: list-manage.com + mirrors 1125 var chimpRegex = /list-manage[1-9]?.com/i; 1126 1127 var disconnected = _.debounce(function() { 1128 alert('Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.'); 1129 }, 100); 1130 1131 api.ready = function() { 1132 // Init forms 1133 init(); 1134 1135 // Wire document events once 1136 if (!listening) addListeners(); 1137 }; 1138 1139 api.preview = api.design = function() { 1140 init(); 1141 }; 1142 1143 function init() { 1144 siteId = $('html').attr('data-wf-site'); 1145 1146 $forms = $(namespace + ' form'); 1147 if (!$forms.length) return; 1148 $forms.each(build); 1149 } 1150 1151 function build(i, el) { 1152 // Store form state using namespace 1153 var $el = $(el); 1154 var data = $.data(el, namespace); 1155 if (!data) data = $.data(el, namespace, { form: $el }); // data.form 1156 1157 reset(data); 1158 var wrap = $el.closest('div.w-form'); 1159 data.done = wrap.find('> .w-form-done'); 1160 data.fail = wrap.find('> .w-form-fail'); 1161 1162 var action = data.action = $el.attr('action'); 1163 data.handler = null; 1164 data.redirect = $el.attr('data-redirect'); 1165 1166 // MailChimp form 1167 if (chimpRegex.test(action)) { data.handler = submitMailChimp; return; } 1168 1169 // Custom form action 1170 if (action) return; 1171 1172 // Webflow form 1173 if (siteId) { data.handler = submitWebflow; return; } 1174 1175 // Alert for disconnected Webflow forms 1176 disconnected(); 1177 } 1178 1179 function addListeners() { 1180 listening = true; 1181 1182 // Handle form submission for Webflow forms 1183 $doc.on('submit', namespace + ' form', function(evt) { 1184 var data = $.data(this, namespace); 1185 if (data.handler) { 1186 data.evt = evt; 1187 data.handler(data); 1188 } 1189 }); 1190 } 1191 1192 // Reset data common to all submit handlers 1193 function reset(data) { 1194 var btn = data.btn = data.form.find(':input[type="submit"]'); 1195 data.wait = data.btn.attr('data-wait') || null; 1196 data.success = false; 1197 btn.prop('disabled', false); 1198 data.label && btn.val(data.label); 1199 } 1200 1201 // Disable submit button 1202 function disableBtn(data) { 1203 var btn = data.btn; 1204 var wait = data.wait; 1205 btn.prop('disabled', true); 1206 // Show wait text and store previous label 1207 if (wait) { 1208 data.label = btn.val(); 1209 btn.val(wait); 1210 } 1211 } 1212 1213 // Find form fields, validate, and set value pairs 1214 function findFields(form, result) { 1215 var status = null; 1216 result = result || {}; 1217 1218 // The ":input" selector is a jQuery shortcut to select all inputs, selects, textareas 1219 form.find(':input:not([type="submit"])').each(function(i, el) { 1220 var field = $(el); 1221 var type = field.attr('type'); 1222 var name = field.attr('data-name') || field.attr('name') || ('Field ' + (i + 1)); 1223 var value = field.val(); 1224 1225 if (type === 'checkbox') { 1226 value = field.is(':checked'); 1227 } if (type === 'radio') { 1228 // Radio group value already processed 1229 if (result[name] === null || typeof result[name] === 'string') { 1230 return; 1231 } 1232 1233 value = form.find('input[name="' + field.attr('name') + '"]:checked').val() || null; 1234 } 1235 1236 if (typeof value === 'string') value = $.trim(value); 1237 result[name] = value; 1238 status = status || getStatus(field, type, name, value); 1239 }); 1240 1241 return status; 1242 } 1243 1244 function getStatus(field, type, name, value) { 1245 var status = null; 1246 1247 if (type === 'password') { 1248 status = 'Passwords cannot be submitted.'; 1249 } else if (field.attr('required')) { 1250 if (!value) { 1251 status = 'Please fill out the required field: ' + name; 1252 } else if (emailField.test(name) || emailField.test(field.attr('type'))) { 1253 if (!emailValue.test(value)) status = 'Please enter a valid email address for: ' + name; 1254 } 1255 } 1256 1257 return status; 1258 } 1259 1260 // Submit form to Webflow 1261 function submitWebflow(data) { 1262 reset(data); 1263 1264 var form = data.form; 1265 var payload = { 1266 name: form.attr('data-name') || form.attr('name') || 'Untitled Form', 1267 source: loc.href, 1268 test: Webflow.env(), 1269 fields: {}, 1270 dolphin: /pass[\s-_]?(word|code)|secret|login|credentials/i.test(form.html()) 1271 }; 1272 1273 preventDefault(data); 1274 1275 // Find & populate all fields 1276 var status = findFields(form, payload.fields); 1277 if (status) return alert(status); 1278 1279 // Disable submit button 1280 disableBtn(data); 1281 1282 // Read site ID 1283 // NOTE: If this site is exported, the HTML tag must retain the data-wf-site attribute for forms to work 1284 if (!siteId) { afterSubmit(data); return; } 1285 var url = ("https://webflow.com") + '/api/v1/form/' + siteId; 1286 1287 // Work around same-protocol IE XDR limitation - without this IE9 and below forms won't submit 1288 if (retro && url.indexOf(("https://webflow.com")) >= 0) { 1289 url = url.replace(("https://webflow.com"), ("http://formdata.webflow.com")); 1290 } 1291 1292 $.ajax({ 1293 url: url, 1294 type: 'POST', 1295 data: payload, 1296 dataType: 'json', 1297 crossDomain: true 1298 }).done(function() { 1299 data.success = true; 1300 afterSubmit(data); 1301 }).fail(function(response, textStatus, jqXHR) { 1302 afterSubmit(data); 1303 }); 1304 } 1305 1306 // Submit form to MailChimp 1307 function submitMailChimp(data) { 1308 reset(data); 1309 1310 var form = data.form; 1311 var payload = {}; 1312 1313 // Skip Ajax submission if http/s mismatch, fallback to POST instead 1314 if (/^https/.test(loc.href) && !/^https/.test(data.action)) { 1315 form.attr('method', 'post'); 1316 return; 1317 } 1318 1319 preventDefault(data); 1320 1321 // Find & populate all fields 1322 var status = findFields(form, payload); 1323 if (status) return alert(status); 1324 1325 // Disable submit button 1326 disableBtn(data); 1327 1328 // Use special format for MailChimp params 1329 var fullName; 1330 _.each(payload, function(value, key) { 1331 if (emailField.test(key)) payload.EMAIL = value; 1332 if (/^((full[ _-]?)?name)$/i.test(key)) fullName = value; 1333 if (/^(first[ _-]?name)$/i.test(key)) payload.FNAME = value; 1334 if (/^(last[ _-]?name)$/i.test(key)) payload.LNAME = value; 1335 }); 1336 1337 if (fullName && !payload.FNAME) { 1338 fullName = fullName.split(' '); 1339 payload.FNAME = fullName[0]; 1340 payload.LNAME = payload.LNAME || fullName[1]; 1341 } 1342 1343 // Use the (undocumented) MailChimp jsonp api 1344 var url = data.action.replace('/post?', '/post-json?') + '&c=?'; 1345 // Add special param to prevent bot signups 1346 var userId = url.indexOf('u=') + 2; 1347 userId = url.substring(userId, url.indexOf('&', userId)); 1348 var listId = url.indexOf('id=') + 3; 1349 listId = url.substring(listId, url.indexOf('&', listId)); 1350 payload['b_' + userId + '_' + listId] = ''; 1351 1352 $.ajax({ 1353 url: url, 1354 data: payload, 1355 dataType: 'jsonp' 1356 }).done(function(resp) { 1357 data.success = (resp.result === 'success' || /already/.test(resp.msg)); 1358 if (!data.success) console.info('MailChimp error: ' + resp.msg); 1359 afterSubmit(data); 1360 }).fail(function(response, textStatus, jqXHR) { 1361 afterSubmit(data); 1362 }); 1363 } 1364 1365 // Common callback which runs after all Ajax submissions 1366 function afterSubmit(data) { 1367 var form = data.form; 1368 var wrap = form.closest('div.w-form'); 1369 var redirect = data.redirect; 1370 var success = data.success; 1371 1372 // Redirect to a success url if defined 1373 if (success && redirect) { 1374 Webflow.location(redirect); 1375 return; 1376 } 1377 1378 // Show or hide status divs 1379 data.done.toggle(success); 1380 data.fail.toggle(!success); 1381 1382 // Hide form on success 1383 form.toggle(!success); 1384 1385 // Reset data and enable submit button 1386 reset(data); 1387 } 1388 1389 function preventDefault(data) { 1390 data.evt && data.evt.preventDefault(); 1391 data.evt = null; 1392 } 1393 1394 // Export module 1395 return api; 1396 }); 1397 1398 1399/***/ }, 1400/* 11 */ 1401/***/ function(module, exports, __webpack_require__) { 1402 1403 'use strict'; 1404 1405 /** 1406 * Webflow: Google+ widget 1407 */ 1408 1409 var Webflow = __webpack_require__(1); 1410 1411 Webflow.define('gplus', module.exports = function($, _) { 1412 var $doc = $(document); 1413 var api = {}; 1414 var loaded; 1415 1416 api.ready = function() { 1417 // Load Google+ API on the front-end 1418 if (!Webflow.env() && !loaded) init(); 1419 }; 1420
1421 function init() { 1422 $doc.find('.w-widget-gplus').length && load(); 1423 } 1424 1425 function load() { 1426 loaded = true; 1427 $.getScript('https://apis.google.com/js/plusone.js'); 1428 } 1429 1430 // Export module 1431 return api; 1432 }); 1433 1434 1435/***/ }, 1436/* 12 */ 1437/***/ function(module, exports, __webpack_require__) { 1438 1439 'use strict'; 1440 /*eslint no-self-compare:0 */ 1441 1442 /** 1443 * Webflow: Interactions 1444 */ 1445 1446 var Webflow = __webpack_require__(1); 1447 var IXEvents = __webpack_require__(2); 1448 1449 Webflow.define('ix', module.exports = function($, _) { 1450 var api = {}; 1451 var designer; 1452 var $win = $(window); 1453 var namespace = '.w-ix'; 1454 var tram = $.tram; 1455 var env = Webflow.env; 1456 var inApp = env(); 1457 var emptyFix = env.chrome && env.chrome < 35; 1458 var transNone = 'none 0s ease 0s'; 1459 var $subs = $(); 1460 var config = {}; 1461 var anchors = []; 1462 var loads = []; 1463 var readys = []; 1464 var destroyed; 1465 var readyDelay = 1; 1466 1467 // Component types and proxy selectors 1468 var components = { 1469 tabs: '.w-tab-link, .w-tab-pane', 1470 dropdown: '.w-dropdown', 1471 slider: '.w-slide', 1472 navbar: '.w-nav' 1473 }; 1474 1475 // ----------------------------------- 1476 // Module methods 1477 1478 api.init = function(list) { 1479 setTimeout(function() { configure(list); }, 1); 1480 }; 1481 1482 api.preview = function() { 1483 designer = false;
1484 readyDelay = 100; 1485 setTimeout(function() { configure(window.__wf_ix); }, 1); 1486 }; 1487 1488 api.design = function() { 1489 designer = true; 1490 api.destroy(); 1491 }; 1492 1493 api.destroy = function() { 1494 destroyed = true; 1495 $subs.each(teardown); 1496 Webflow.scroll.off(scroll); 1497 IXEvents.async(); 1498 anchors = []; 1499 loads = []; 1500 readys = []; 1501 }; 1502 1503 api.ready = function() { 1504 // Ready should only be used after destroy, as a way to re-init 1505 if (config && destroyed) { 1506 destroyed = false; 1507 init(); 1508 } 1509 }; 1510 1511 api.run = run; 1512 api.style = inApp ? styleApp : stylePub; 1513 1514 // ----------------------------------- 1515 // Private methods 1516 1517 function configure(list) { 1518 if (!list) return; 1519 1520 // Map all interactions by slug 1521 config = {}; 1522 _.each(list, function(item) { 1523 config[item.slug] = item.value; 1524 }); 1525 1526 // Init ix after config 1527 init(); 1528 } 1529 1530 function init() { 1531 // Build each element's interaction keying from data attribute 1532 var els = $('[data-ix]'); 1533 if (!els.length) return; 1534 els.each(teardown); 1535 els.each(build); 1536 1537 // Listen for scroll events if any anchors exist 1538 if (anchors.length) { 1539 Webflow.scroll.on(scroll); 1540 setTimeout(scroll, 1); 1541 } 1542 1543 // Handle loads or readys if they exist 1544 if (loads.length) Webflow.load(runLoads); 1545 if (readys.length) setTimeout(runReadys, readyDelay); 1546 1547 // Trigger queued events, must happen after init 1548 IXEvents.init(); 1549 1550 // Trigger a redraw to ensure all IX intros play 1551 Webflow.redraw.up(); 1552 } 1553 1554 function build(i, el) { 1555 var $el = $(el); 1556 var id = $el.attr('data-ix'); 1557 var ix = config[id]; 1558 if (!ix) return; 1559 var triggers = ix.triggers; 1560 if (!triggers) return; 1561 1562 // Set styles immediately to provide tram with starting transform values 1563 api.style($el, ix.style); 1564 1565 _.each(triggers, function(trigger) { 1566 var state = {}; 1567 var type = trigger.type; 1568 var stepsB = trigger.stepsB && trigger.stepsB.length; 1569 1570 function runA() { run(trigger, $el, { group: 'A' }); } 1571 function runB() { run(trigger, $el, { group: 'B' }); } 1572 1573 if (type === 'load') { 1574 (trigger.preload && !inApp) ? loads.push(runA) : readys.push(runA); 1575 return; 1576 } 1577 1578 if (type === 'click') { 1579 $el.on('click' + namespace, function(evt) { 1580 // Avoid late clicks on touch devices 1581 if (!Webflow.validClick(evt.currentTarget)) return; 1582 1583 // Prevent default on empty hash urls 1584 if ($el.attr('href') === '#') evt.preventDefault(); 1585 1586 run(trigger, $el, { group: state.clicked ? 'B' : 'A' }); 1587 if (stepsB) state.clicked = !state.clicked; 1588 }); 1589 $subs = $subs.add($el); 1590 return; 1591 } 1592 1593 if (type === 'hover') { 1594 $el.on('mouseenter' + namespace, runA); 1595 $el.on('mouseleave' + namespace, runB); 1596 $subs = $subs.add($el); 1597 return; 1598 } 1599 1600 if (type === 'scroll') { 1601 anchors.push({ 1602 el: $el, trigger: trigger, state: { active: false }, 1603 offsetTop: convert(trigger.offsetTop), 1604 offsetBot: convert(trigger.offsetBot) 1605 }); 1606 return; 1607 } 1608 1609 // Check for a proxy component selector 1610 // type == [tabs, dropdown, slider, navbar] 1611 var proxy = components[type]; 1612 if (proxy) { 1613 var $proxy = $el.closest(proxy); 1614 $proxy.on(IXEvents.types.INTRO, runA).on(IXEvents.types.OUTRO, runB); 1615 $subs = $subs.add($proxy); 1616 return; 1617 } 1618 }); 1619 } 1620 1621 function convert(offset) { 1622 if (!offset) return 0; 1623 offset = String(offset); 1624 var result = parseInt(offset, 10); 1625 if (result !== result) return 0; 1626 if (offset.indexOf('%') > 0) { 1627 result /= 100; 1628 if (result >= 1) result = 0.999; 1629 } 1630 return result; 1631 } 1632 1633 function teardown(i, el) { 1634 $(el).off(namespace); 1635 } 1636 1637 function scroll() { 1638 var viewTop = $win.scrollTop(); 1639 var viewHeight = $win.height(); 1640 1641 // Check each anchor for a valid scroll trigger 1642 var count = anchors.length; 1643 for (var i = 0; i < count; i++) { 1644 var anchor = anchors[i]; 1645 var $el = anchor.el; 1646 var trigger = anchor.trigger; 1647 var stepsB = trigger.stepsB && trigger.stepsB.length; 1648 var state = anchor.state; 1649 var top = $el.offset().top; 1650 var height = $el.outerHeight(); 1651 var offsetTop = anchor.offsetTop; 1652 var offsetBot = anchor.offsetBot; 1653 if (offsetTop < 1 && offsetTop > 0) offsetTop *= viewHeight; 1654 if (offsetBot < 1 && offsetBot > 0) offsetBot *= viewHeight; 1655 var active = (top + height - offsetTop >= viewTop && top + offsetBot <= viewTop + viewHeight); 1656 if (active === state.active) continue; 1657 if (active === false && !stepsB) continue; 1658 state.active = active; 1659 run(trigger, $el, { group: active ? 'A' : 'B' }); 1660 } 1661 } 1662 1663 function runLoads() { 1664 var count = loads.length; 1665 for (var i = 0; i < count; i++) { 1666 loads[i](); 1667 } 1668 } 1669 1670 function runReadys() { 1671 var count = readys.length; 1672 for (var i = 0; i < count; i++) { 1673 readys[i](); 1674 } 1675 } 1676 1677 function run(trigger, $el, opts, replay) { 1678 opts = opts || {}; 1679 var done = opts.done; 1680
1681 // Do not run in designer unless forced 1682 if (designer && !opts.force) return; 1683 1684 // Operate on a set of grouped steps 1685 var group = opts.group || 'A'; 1686 var loop = trigger['loop' + group]; 1687 var steps = trigger['steps' + group]; 1688 if (!steps || !steps.length) return; 1689 if (steps.length < 2) loop = false; 1690 1691 // One-time init before any loops 1692 if (!replay) { 1693 1694 // Find selector within element descendants, siblings, or query whole document 1695 var selector = trigger.selector; 1696 if (selector) { 1697 if (trigger.descend) { 1698 $el = $el.find(selector); 1699 } else if (trigger.siblings) { 1700 $el = $el.siblings(selector); 1701 } else { 1702 $el = $(selector); 1703 } 1704 if (inApp) $el.attr('data-ix-affect', 1); 1705 } 1706 1707 // Apply empty fix for certain Chrome versions 1708 if (emptyFix) $el.addClass('w-ix-emptyfix'); 1709 1710 // Set preserve3d for triggers with transforms 1711 if (trigger.preserve3d) $el.css('transform-style', 'preserve-3d'); 1712 } 1713 1714 var _tram = tram($el); 1715 1716 // Add steps 1717 var meta = {}; 1718 for (var i = 0; i < steps.length; i++) { 1719 addStep(_tram, steps[i], meta); 1720 } 1721 1722 function fin() { 1723 // Run trigger again if looped 1724 if (loop) return run(trigger, $el, opts, true); 1725 1726 // Reset any 'auto' values 1727 if (meta.width === 'auto') _tram.set({ width: 'auto' }); 1728 if (meta.height === 'auto') _tram.set({ height: 'auto' }); 1729 1730 // Run callback 1731 done && done(); 1732 } 1733 1734 // Add final step to queue if tram has started 1735 meta.start ? _tram.then(fin) : fin(); 1736 } 1737 1738 function addStep(_tram, step, meta) { 1739 var addMethod = 'add'; 1740 var startMethod = 'start'; 1741 1742 // Once the transition has started, we will always use then() to add to the queue. 1743 if (meta.start) addMethod = startMethod = 'then'; 1744 1745 // Parse transitions string on the current step 1746 var transitions = step.transition; 1747 if (transitions) { 1748 transitions = transitions.split(','); 1749 for (var i = 0; i < transitions.length; i++) { 1750 var transition = transitions[i]; 1751 _tram[addMethod](transition); 1752 } 1753 } 1754 1755 // Build a clean object to pass to the tram method 1756 var clean = tramify(step) || {}; 1757 1758 // Store last width and height values 1759 if (clean.width != null) meta.width = clean.width; 1760 if (clean.height != null) meta.height = clean.height; 1761 1762 // When transitions are not present, set values immediately and continue queue. 1763 if (transitions == null) { 1764 1765 // If we have started, wrap set() in then() and reset queue 1766 if (meta.start) { 1767 _tram.then(function() { 1768 var queue = this.queue; 1769 this.set(clean); 1770 if (clean.display) { 1771 _tram.redraw(); 1772 Webflow.redraw.up(); 1773 } 1774 this.queue = queue; 1775 this.next(); 1776 }); 1777 } else { 1778 _tram.set(clean); 1779 1780 // Always redraw after setting display 1781 if (clean.display) { 1782 _tram.redraw(); 1783 Webflow.redraw.up(); 1784 } 1785 } 1786 1787 // Use the wait() method to kick off queue in absence of transitions. 1788 var wait = clean.wait; 1789 if (wait != null) { 1790 _tram.wait(wait); 1791 meta.start = true; 1792 } 1793 1794 // Otherwise, when transitions are present 1795 } else { 1796 1797 // If display is present, handle it separately 1798 if (clean.display) { 1799 var display = clean.display; 1800 delete clean.display; 1801 1802 // If we've already started, we need to wrap it in a then() 1803 if (meta.start) { 1804 _tram.then(function() { 1805 var queue = this.queue; 1806 this.set({ display: display }).redraw(); 1807 Webflow.redraw.up(); 1808 this.queue = queue; 1809 this.next(); 1810 }); 1811 } else { 1812 _tram.set({ display: display }).redraw(); 1813 Webflow.redraw.up(); 1814 } 1815 } 1816 1817 // Otherwise, start a transition using the current start method. 1818 _tram[startMethod](clean); 1819 meta.start = true; 1820 } 1821 } 1822 1823 // (In app) Set styles immediately and manage upstream transition
1824 function styleApp(el, data) { 1825 var _tram = tram(el); 1826 1827 // Get computed transition value 1828 el.css('transition', ''); 1829 var computed = el.css('transition'); 1830 1831 // If computed is set to none, clear upstream 1832 if (computed === transNone) computed = _tram.upstream = null; 1833 1834 // Set upstream transition to none temporarily 1835 _tram.upstream = transNone; 1836 1837 // Set values immediately 1838 _tram.set(tramify(data)); 1839 1840 // Only restore upstream in preview mode 1841 _tram.upstream = computed; 1842 } 1843 1844 // (Published) Set styles immediately on specified jquery element 1845 function stylePub(el, data) { 1846 tram(el).set(tramify(data)); 1847 } 1848 1849 // Build a clean object for tram 1850 function tramify(obj) { 1851 var result = {}; 1852 var found = false; 1853 for (var x in obj) { 1854 if (x === 'transition') continue; 1855 result[x] = obj[x]; 1856 found = true; 1857 } 1858 // If empty, return null for tram.set/stop compliance 1859 return found ? result : null; 1860 } 1861 1862 // Export module 1863 return api; 1864 }); 1865 1866 1867/***/ }, 1868/* 13 */ 1869/***/ function(module, exports, __webpack_require__) { 1870 1871 'use strict'; 1872 /*eslint 1873 no-use-before-define: 0, 1874 no-shadow: 0 1875 */ 1876 1877 /** 1878 * Webflow: Lightbox component 1879 */ 1880 1881 var Webflow = __webpack_require__(1); 1882 1883 function createLightbox(window, document, $) { 1884 var tram = $.tram; 1885 var isArray = Array.isArray; 1886 var namespace = 'w-lightbox'; 1887 var prefix = namespace + '-'; 1888 var prefixRegex = /(^|\s+)/g; 1889 1890 // Array of objects describing items to be displayed. 1891 var items = []; 1892 1893 // Index of the currently displayed item. 1894 var currentIndex; 1895 1896 // Object holding references to jQuery wrapped nodes. 1897 var $refs; 1898 1899 // Instance of Spinner 1900 var spinner; 1901 1902 function lightbox(thing, index) { 1903 items = isArray(thing) ? thing : [thing]; 1904 1905 if (!$refs) { 1906 lightbox.build(); 1907 } 1908 1909 if (items.length > 1) { 1910 $refs.items = $refs.empty; 1911 1912 items.forEach(function (item) { 1913 var $thumbnail = dom('thumbnail'); 1914 var $item = dom('item').append($thumbnail); 1915 1916 $refs.items = $refs.items.add($item); 1917 1918 loadImage(item.thumbnailUrl || item.url, function ($image) { 1919 if ($image.prop('width') > $image.prop('height')) { 1920 addClass($image, 'wide'); 1921 } else { 1922 addClass($image, 'tall'); 1923 } 1924 $thumbnail.append(addClass($image, 'thumbnail-image')); 1925 }); 1926 }); 1927 1928 $refs.strip.empty().append($refs.items); 1929 addClass($refs.content, 'group'); 1930 } 1931 1932 tram( 1933 // Focus the lightbox to receive keyboard events. 1934 removeClass($refs.lightbox, 'hide').focus() 1935 ) 1936 .add('opacity .3s') 1937 .start({opacity: 1}); 1938 1939 // Prevent document from scrolling while lightbox is active. 1940 addClass($refs.html, 'noscroll'); 1941 1942 return lightbox.show(index || 0); 1943 } 1944 1945 /** 1946 * Creates the DOM structure required by the lightbox. 1947 */ 1948 lightbox.build = function () { 1949 // In case `build` is called more than once. 1950 lightbox.destroy(); 1951 1952 $refs = { 1953 html: $(document.documentElement), 1954 // Empty jQuery object can be used to build new ones using `.add`. 1955 empty: $() 1956 }; 1957 1958 $refs.arrowLeft = dom('control left inactive'); 1959 $refs.arrowRight = dom('control right inactive'); 1960 $refs.close = dom('control close'); 1961 1962 $refs.spinner = dom('spinner'); 1963 $refs.strip = dom('strip'); 1964 1965 spinner = new Spinner($refs.spinner, prefixed('hide')); 1966 1967 $refs.content = dom('content') 1968 .append($refs.spinner, $refs.arrowLeft, $refs.arrowRight, $refs.close); 1969 1970 $refs.container = dom('container') 1971 .append($refs.content, $refs.strip); 1972 1973 $refs.lightbox = dom('backdrop hide') 1974 .append($refs.container); 1975 1976 // We are delegating events for performance reasons and also 1977 // to not have to reattach handlers when images change. 1978 $refs.strip.on('tap', selector('item'), itemTapHandler); 1979 $refs.content 1980 .on('swipe', swipeHandler) 1981 .on('tap', selector('left'), handlerPrev) 1982 .on('tap', selector('right'), handlerNext) 1983 .on('tap', selector('close'), handlerHide) 1984 .on('tap', selector('image, caption'), handlerNext); 1985 $refs.container 1986 .on('tap', selector('view, strip'), handlerHide) 1987 // Prevent images from being dragged around. 1988 .on('dragstart', selector('img'), preventDefault); 1989 $refs.lightbox 1990 .on('keydown', keyHandler) 1991 // IE loses focus to inner nodes without letting us know. 1992 .on('focusin', focusThis); 1993 1994 // The `tabindex` attribute is needed to enable non-input elements 1995 // to receive keyboard events. 1996 $('body').append($refs.lightbox.prop('tabIndex', 0)); 1997 1998 return lightbox; 1999 }; 2000 2001 /**
2002 * Dispose of DOM nodes created by the lightbox. 2003 */ 2004 lightbox.destroy = function () { 2005 if (!$refs) { 2006 return; 2007 } 2008 2009 // Event handlers are also removed. 2010 removeClass($refs.html, 'noscroll'); 2011 $refs.lightbox.remove(); 2012 $refs = undefined; 2013 }; 2014 2015 /** 2016 * Show a specific item. 2017 */ 2018 lightbox.show = function (index) { 2019 // Bail if we are already showing this item. 2020 if (index === currentIndex) { 2021 return; 2022 } 2023 2024 var item = items[index]; 2025 if (!item) { return lightbox.hide(); } 2026 2027 var previousIndex = currentIndex; 2028 currentIndex = index; 2029 spinner.show(); 2030 2031 // For videos, load an empty SVG with the video dimensions to preserve 2032 // the videoâs aspect ratio while being responsive. 2033 var url = item.html && svgDataUri(item.width, item.height) || item.url; 2034 loadImage(url, function ($image) { 2035 // Make sure this is the last item requested to be shown since 2036 // images can finish loading in a different order than they were 2037 // requested in. 2038 if (index !== currentIndex) { 2039 return; 2040 } 2041 2042 var $figure = dom('figure', 'figure').append(addClass($image, 'image')); 2043 var $frame = dom('frame').append($figure); 2044 var $newView = dom('view').append($frame); 2045 var $html, isIframe; 2046 2047 if (item.html) { 2048 $html = $(item.html); 2049 isIframe = $html.is('iframe'); 2050 2051 if (isIframe) { 2052 $html.on('load', transitionToNewView); 2053 } 2054 2055 $figure.append(addClass($html, 'embed')); 2056 } 2057 2058 if (item.caption) { 2059 $figure.append(dom('caption', 'figcaption').text(item.caption)); 2060 } 2061 2062 $refs.spinner.before($newView); 2063 2064 if (!isIframe) { 2065 transitionToNewView(); 2066 } 2067 2068 function transitionToNewView() { 2069 spinner.hide(); 2070 2071 if (index !== currentIndex) { 2072 $newView.remove(); 2073 return; 2074 } 2075 2076 2077 toggleClass($refs.arrowLeft, 'inactive', index <= 0); 2078 toggleClass($refs.arrowRight, 'inactive', index >= items.length - 1); 2079 2080 if ($refs.view) { 2081 tram($refs.view) 2082 .add('opacity .3s') 2083 .start({opacity: 0}) 2084 .then(remover($refs.view)); 2085 2086 tram($newView) 2087 .add('opacity .3s') 2088 .add('transform .3s') 2089 .set({x: index > previousIndex ? '80px' : '-80px'}) 2090 .start({opacity: 1, x: 0}); 2091 } else { 2092 $newView.css('opacity', 1); 2093 } 2094 2095 $refs.view = $newView; 2096 2097 if ($refs.items) { 2098 // Mark proper thumbnail as active 2099 addClass(removeClass($refs.items, 'active').eq(index), 'active'); 2100 } 2101 } 2102 }); 2103 2104 return lightbox; 2105 }; 2106 2107 /** 2108 * Hides the lightbox. 2109 */ 2110 lightbox.hide = function () { 2111 tram($refs.lightbox) 2112 .add('opacity .3s') 2113 .start({opacity: 0}) 2114 .then(hideLightbox); 2115 2116 return lightbox; 2117 }; 2118 2119 lightbox.prev = function () { 2120 if (currentIndex > 0) { 2121 lightbox.show(currentIndex - 1); 2122 } 2123 }; 2124 2125 lightbox.next = function () { 2126 if (currentIndex < items.length - 1) { 2127 lightbox.show(currentIndex + 1); 2128 } 2129 }; 2130 2131 function createHandler(action) { 2132 return function (event) { 2133 // We only care about events triggered directly on the bound selectors. 2134 if (this !== event.target) { 2135 return; 2136 } 2137 2138 event.stopPropagation(); 2139 event.preventDefault(); 2140 2141 action(); 2142 }; 2143 } 2144 2145 var handlerPrev = createHandler(lightbox.prev); 2146 var handlerNext = createHandler(lightbox.next); 2147 var handlerHide = createHandler(lightbox.hide); 2148 2149 var itemTapHandler = function(event) { 2150 var index = $(this).index(); 2151 2152 event.preventDefault(); 2153 lightbox.show(index); 2154 }; 2155 2156 var swipeHandler = function (event, data) { 2157 // Prevent scrolling. 2158 event.preventDefault(); 2159 2160 if (data.direction === 'left') { 2161 lightbox.next(); 2162 } else if (data.direction === 'right') { 2163 lightbox.prev(); 2164 } 2165 }; 2166 2167 var focusThis = function () { 2168 this.focus(); 2169 }; 2170 2171 function preventDefault(event) { 2172 event.preventDefault(); 2173 } 2174 2175 function keyHandler(event) { 2176 var keyCode = event.keyCode; 2177 2178 // [esc] 2179 if (keyCode === 27) { 2180 lightbox.hide(); 2181 } 2182 2183 // [â] 2184 else if (keyCode === 37) { 2185 lightbox.prev(); 2186 } 2187 2188 // [â¶] 2189 else if (keyCode === 39) { 2190 lightbox.next(); 2191 } 2192 } 2193 2194 function hideLightbox() { 2195 // If the lightbox hasn't been destroyed already 2196 if ($refs) { 2197 removeClass($refs.html, 'noscroll'); 2198 addClass($refs.lightbox, 'hide'); 2199 $refs.strip.empty(); 2200 $refs.view && $refs.view.remove(); 2201 2202 // Reset some stuff 2203 removeClass($refs.content, 'group'); 2204 addClass($refs.arrowLeft, 'inactive'); 2205 addClass($refs.arrowRight, 'inactive'); 2206 2207 currentIndex = $refs.view = undefined; 2208 } 2209 } 2210 2211 function loadImage(url, callback) { 2212 var $image = dom('img', 'img'); 2213 2214 $image.one('load', function () { 2215 callback($image); 2216 }); 2217 2218 // Start loading image. 2219 $image.attr('src', url); 2220 2221 return $image; 2222 } 2223 2224 function remover($element) { 2225 return function () { 2226 $element.remove(); 2227 }; 2228 } 2229 2230 /** 2231 * Spinner 2232 */ 2233 function Spinner($spinner, className, delay) { 2234 this.$element = $spinner; 2235 this.className = className; 2236 this.delay = delay || 200; 2237 this.hide(); 2238 } 2239 2240 Spinner.prototype.show = function () { 2241 var spinner = this; 2242 2243 // Bail if we are already showing the spinner. 2244 if (spinner.timeoutId) { 2245 return; 2246 } 2247 2248 spinner.timeoutId = setTimeout(function () { 2249 spinner.$element.removeClass(spinner.className); 2250 delete spinner.timeoutId; 2251 }, spinner.delay); 2252 }; 2253 2254 Spinner.prototype.hide = function () { 2255 var spinner = this; 2256 if (spinner.timeoutId) { 2257 clearTimeout(spinner.timeoutId); 2258 delete spinner.timeoutId; 2259 return; 2260 } 2261 2262 spinner.$element.addClass(spinner.className); 2263 }; 2264 2265 function prefixed(string, isSelector) { 2266 return string.replace(prefixRegex, (isSelector ? ' .' : ' ') + prefix); 2267 } 2268 2269 function selector(string) { 2270 return prefixed(string, true); 2271 } 2272 2273 /** 2274 * jQuery.addClass with auto-prefixing 2275 * @param {jQuery} Element to add class to 2276 * @param {string}
2276 Class name that will be prefixed and added to element 2277 * @return {jQuery} 2278 */ 2279 function addClass($element, className) { 2280 return $element.addClass(prefixed(className)); 2281 } 2282 2283 /** 2284 * jQuery.removeClass with auto-prefixing 2285 * @param {jQuery} Element to remove class from 2286 * @param {string} Class name that will be prefixed and removed from element 2287 * @return {jQuery} 2288 */ 2289 function removeClass($element, className) { 2290 return $element.removeClass(prefixed(className)); 2291 } 2292 2293 /** 2294 * jQuery.toggleClass with auto-prefixing 2295 * @param {jQuery} Element where class will be toggled 2296 * @param {string} Class name that will be prefixed and toggled 2297 * @param {boolean} Optional boolean that determines if class will be added or removed 2298 * @return {jQuery} 2299 */ 2300 function toggleClass($element, className, shouldAdd) { 2301 return $element.toggleClass(prefixed(className), shouldAdd); 2302 } 2303 2304 /** 2305 * Create a new DOM element wrapped in a jQuery object, 2306 * decorated with our custom methods. 2307 * @param {string} className 2308 * @param {string} [tag] 2309 * @return {jQuery} 2310 */ 2311 function dom(className, tag) { 2312 return addClass($(document.createElement(tag || 'div')), className); 2313 } 2314 2315 function isObject(value) { 2316 return typeof value === 'object' && value != null && !isArray(value); 2317 } 2318 2319 function svgDataUri(width, height) { 2320 var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '"/>'; 2321 return 'data:image/svg+xml;charset=utf-8,' + encodeURI(svg); 2322 } 2323 2324 // Compute some dimensions manually for iOS < 8, because of buggy support for VH. 2325 // Also, Android built-in browser does not support viewport units. 2326 (function () { 2327 var ua = window.navigator.userAgent; 2328 var iOSRegex = /(iPhone|iPad|iPod);[^OS]*OS (\d)/; 2329 var iOSMatches = ua.match(iOSRegex); 2330 var android = ua.indexOf('Android ') > -1 && ua.indexOf('Chrome') === -1; 2331 2332 if (!android && (!iOSMatches || iOSMatches[2] > 7)) { 2333 return; 2334 } 2335 2336 var styleNode = document.createElement('style'); 2337 document.head.appendChild(styleNode); 2338 window.addEventListener('orientationchange', refresh, true); 2339 2340 function refresh() { 2341 var vh = window.innerHeight; 2342 var vw = window.innerWidth; 2343 var content = 2344 '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' + 2345 'height:' + vh + 'px' + 2346 '}' + 2347 '.w-lightbox-view {' + 2348 'width:' + vw + 'px' + 2349 '}' + 2350 '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' + 2351 'height:' + (0.86 * vh) + 'px' + 2352 '}' + 2353 '.w-lightbox-image {' + 2354 'max-width:' + vw + 'px;' + 2355 'max-height:' + vh + 'px' + 2356 '}' + 2357 '.w-lightbox-group .w-lightbox-image {' + 2358 'max-height:' + (0.86 * vh) + 'px' + 2359 '}' + 2360 '.w-lightbox-strip {' + 2361 'padding: 0 ' + (0.01 * vh) + 'px' + 2362 '}' + 2363 '.w-lightbox-item {' + 2364 'width:' + (0.1 * vh) + 'px;' + 2365 'padding:' + (0.02 * vh) + 'px ' + (0.01 * vh) + 'px' + 2366 '}' + 2367 '.w-lightbox-thumbnail {' + 2368 'height:' + (0.1 * vh) + 'px' + 2369 '}' + 2370 '@media (min-width: 768px) {' + 2371 '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' + 2372 'height:' + (0.96 * vh) + 'px' + 2373 '}' + 2374 '.w-lightbox-content {' + 2375 'margin-top:' + (0.02 * vh) + 'px' + 2376 '}' + 2377 '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' + 2378 'height:' + (0.84 * vh) + 'px' + 2379 '}' + 2380 '.w-lightbox-image {' + 2381 'max-width:' + (0.96 * vw) + 'px;' + 2382 'max-height:' + (0.96 * vh) + 'px' + 2383 '}' + 2384 '.w-lightbox-group .w-lightbox-image {' + 2385 'max-width:' + (0.823 * vw) + 'px;' + 2386 'max-height:' + (0.84 * vh) + 'px' + 2387 '}' + 2388 '}'; 2389 2390 styleNode.textContent = content; 2391 } 2392 2393 refresh(); 2394 })(); 2395 2396 return lightbox; 2397 } 2398 2399 Webflow.define('lightbox', module.exports = function($, _) { 2400 var api = {}; 2401 var lightbox = createLightbox(window, document, $); 2402 var $doc = $(document); 2403 var $body; 2404 var $lightboxes; 2405 var designer; 2406 var inApp = Webflow.env(); 2407 var namespace = '.w-lightbox'; 2408 var groups; 2409 2410 // ----------------------------------- 2411 // Module methods 2412 2413 api.ready = api.design = api.preview = init; 2414 2415 // ----------------------------------- 2416 // Private methods 2417
2418 function init() { 2419 designer = inApp && Webflow.env('design'); 2420 $body = $(document.body); 2421 2422 // Reset Lightbox 2423 lightbox.destroy(); 2424 2425 // Reset groups 2426 groups = {}; 2427 2428 // Find all instances on the page 2429 $lightboxes = $doc.find(namespace); 2430 2431 // Instantiate all lighboxes 2432 $lightboxes.webflowLightBox(); 2433 } 2434 2435 jQuery.fn.extend({ 2436 webflowLightBox: function() { 2437 var $el = this; 2438 $.each($el, function(i, el) { 2439 // Store state in data 2440 var data = $.data(el, namespace); 2441 if (!data) { 2442 data = $.data(el, namespace, { 2443 el: $(el), 2444 mode: 'images', 2445 images: [], 2446 embed: '' 2447 }); 2448 } 2449 2450 // Remove old events 2451 data.el.off(namespace); 2452 2453 // Set config from json script tag 2454 configure(data); 2455 2456 // Add events based on mode 2457 if (designer) { 2458 data.el.on('setting' + namespace, configure.bind(null, data)); 2459 } else { 2460 data.el 2461 .on('tap' + namespace, tapHandler(data)) 2462 // Prevent page scrolling to top when clicking on lightbox triggers. 2463 .on('click' + namespace, function (e) { e.preventDefault(); }); 2464 } 2465 }); 2466 } 2467 }); 2468 2469 function configure(data) { 2470 var json = data.el.children('.w-json').html(); 2471 var groupName, groupItems; 2472 2473 if (!json) { 2474 data.items = []; 2475 return; 2476 } 2477 2478 try { 2479 json = JSON.parse(json); 2480 } catch(e) { 2481 console.error('Malformed lightbox JSON configuration.', e); 2482 } 2483 2484 supportOldLightboxJson(json); 2485 2486 groupName = json.group; 2487 2488 if (groupName) { 2489 groupItems = groups[groupName]; 2490 if (!groupItems) { 2491 groupItems = groups[groupName] = []; 2492 } 2493 2494 data.items = groupItems; 2495 2496 if (json.items.length) { 2497 data.index = groupItems.length; 2498 groupItems.push.apply(groupItems, json.items); 2499 } 2500 } else { 2501 data.items = json.items; 2502 } 2503 } 2504 2505 function tapHandler(data) { 2506 return function () { 2507 data.items.length && lightbox(data.items, data.index || 0); 2508 }; 2509 } 2510 2511 function supportOldLightboxJson(data) { 2512 if (data.images) { 2513 data.images.forEach(function (item) { 2514 item.type = 'image'; 2515 }); 2516 data.items = data.images; 2517 } 2518 2519 if (data.embed) { 2520 data.embed.type = 'video'; 2521 data.items = [data.embed]; 2522 } 2523 2524 if (data.groupId) { 2525 data.group = data.groupId; 2526 } 2527 } 2528 2529 // Export module 2530 return api; 2531 }); 2532 2533 2534/***/ }, 2535/* 14 */ 2536/***/ function(module, exports, __webpack_require__) { 2537 2538 'use strict'; 2539 2540 /** 2541 * Webflow: Auto-select links to current page or section 2542 */ 2543 2544 var Webflow = __webpack_require__(1); 2545 2546 Webflow.define('links', module.exports = function($, _) { 2547 var api = {}; 2548 var $win = $(window); 2549 var designer; 2550 var inApp = Webflow.env(); 2551 var location = window.location; 2552 var tempLink = document.createElement('a'); 2553 var linkCurrent = 'w--current'; 2554 var validHash = /^#[a-zA-Z][\w:.-]*$/; 2555 var indexPage = /index\.(html|php)$/; 2556 var dirList = /\/$/; 2557 var anchors; 2558 var slug; 2559 2560 // ----------------------------------- 2561 // Module methods 2562 2563 api.ready = api.design = api.preview = init; 2564 2565 // ----------------------------------- 2566 // Private methods 2567 2568 function init() { 2569 designer = inApp && Webflow.env('design'); 2570 slug = Webflow.env('slug') || location.pathname || ''; 2571 2572 // Reset scroll listener, init anchors 2573 Webflow.scroll.off(scroll); 2574 anchors = []; 2575 2576 // Test all links for a selectable href 2577 var links = document.links; 2578 for (var i = 0; i < links.length; ++i) { 2579 select(links[i]); 2580 } 2581 2582 // Listen for scroll if any anchors exist 2583 if (anchors.length) { 2584 Webflow.scroll.on(scroll); 2585 scroll(); 2586 } 2587 } 2588 2589 function select(link) { 2590 var href = (designer && link.getAttribute('href-disabled')) || link.getAttribute('href'); 2591 tempLink.href = href; 2592 2593 // Ignore any hrefs with a colon to safely avoid all uri schemes 2594 if (href.indexOf(':') >= 0) return; 2595 2596 var $link = $(link); 2597 2598 // Check for valid hash links w/ sections and use scroll anchor 2599 if (href.indexOf('#') === 0 && validHash.test(href)) { 2600 var $section = $(href); 2601 $section.length && anchors.push({ link: $link, sec: $section, active: false }); 2602 return; 2603 } 2604 2605 // Ignore empty # links 2606 if (href === '#') return; 2607 2608 // Determine whether the link should be selected 2609 var match = (tempLink.href === location.href) || (href === slug) || (indexPage.test(href) && dirList.test(slug)); 2610 setClass($link, linkCurrent, match); 2611 } 2612 2613 function scroll() { 2614 var viewTop = $win.scrollTop(); 2615 var viewHeight = $win.height(); 2616 2617 // Check each anchor for a section in view 2618 _.each(anchors, function(anchor) { 2619 var $link = anchor.link; 2620 var $section = anchor.sec; 2621 var top = $section.offset().top; 2622 var height = $section.outerHeight(); 2623 var offset = viewHeight * 0.5; 2624 var active = ($section.is(':visible') && 2625 top + height - offset >= viewTop && 2626 top + offset <= viewTop + viewHeight); 2627 if (anchor.active === active) return; 2628 anchor.active = active; 2629 setClass($link, linkCurrent, active); 2630 if (designer) $link[0].__wf_current = active; 2631 }); 2632 } 2633 2634 function setClass($elem, className, add) { 2635 var exists = $elem.hasClass(className); 2636 if (add && exists) return; 2637 if (!add && !exists) return; 2638 add ? $elem.addClass(className) : $elem.removeClass(className); 2639 } 2640 2641 // Export module 2642 return api; 2643 }); 2644 2645 2646/***/ }, 2647/* 15 */ 2648/***/ function(module, exports, __webpack_require__) { 2649 2650 'use strict'; 2651 2652 /** 2653 * Webflow: Maps widget 2654 */ 2655 2656 var Webflow = __webpack_require__(1); 2657 2658 Webflow.define('maps', module.exports = function($, _) { 2659 var api = {}; 2660 var $doc = $(document); 2661 var google = null; 2662 var $maps; 2663 var namespace = '.w-widget-map'; 2664 var apiKey = 'AIzaSyBks0W0NawnPju70JQS5XXPOTTrguDQjWE'; 2665 2666 // ----------------------------------- 2667 // Module methods 2668 2669 api.ready = function() { 2670 // Init Maps on the front-end 2671 if (!Webflow.env()) initMaps(); 2672 }; 2673 2674 api.preview = function() { 2675 // Update active map nodes 2676 $maps = $doc.find(namespace); 2677 // Listen for resize events 2678 Webflow.resize.off(triggerRedraw); 2679 if ($maps.length) { 2680 Webflow.resize.on(triggerRedraw); 2681 triggerRedraw(); 2682 } 2683 }; 2684 2685 api.design = function(evt) { 2686 // Update active map nodes 2687 $maps = $doc.find(namespace); 2688 // Stop listening for resize events 2689 Webflow.resize.off(triggerRedraw); 2690 // Redraw to account for page changes 2691 $maps.length && _.defer(triggerRedraw); 2692 }; 2693 2694 api.destroy = removeListeners; 2695 2696 // ----------------------------------- 2697 // Private methods 2698 2699 // Trigger redraw in designer or preview mode 2700 function triggerRedraw() { 2701 if ($maps.length && Webflow.app) { 2702 $maps.each(Webflow.app.redrawElement); 2703 } 2704 } 2705 2706 function initMaps() { 2707 $maps = $doc.find(namespace); 2708 if (!$maps.length) return; 2709 2710 if (google === null) {
2711 $.getScript('https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=_wf_maps_loaded&key=' + apiKey); 2712 window._wf_maps_loaded = mapsLoaded; 2713 } else { 2714 mapsLoaded(); 2715 } 2716 2717 function mapsLoaded() { 2718 window._wf_maps_loaded = function() {}; 2719 google = window.google; 2720 $maps.each(renderMap); 2721 removeListeners(); 2722 addListeners(); 2723 } 2724 } 2725 2726 function removeListeners() { 2727 Webflow.resize.off(resizeMaps); 2728 Webflow.redraw.off(resizeMaps); 2729 } 2730 2731 function addListeners() { 2732 Webflow.resize.on(resizeMaps); 2733 Webflow.redraw.on(resizeMaps); 2734 } 2735 2736 // Render map onto each element 2737 function renderMap(i, el) { 2738 var data = $(el).data(); 2739 getState(el, data); 2740 } 2741 2742 function resizeMaps() { 2743 $maps.each(resizeMap); 2744 } 2745 2746 // Resize map when window changes 2747 function resizeMap(i, el) { 2748 var state = getState(el); 2749 google.maps.event.trigger(state.map, 'resize'); 2750 state.setMapPosition(); 2751 } 2752 2753 // Store state on element data 2754 var store = 'w-widget-map'; 2755 function getState(el, data) { 2756 2757 var state = $.data(el, store); 2758 if (state) return state; 2759 2760 var $el = $(el); 2761 state = $.data(el, store, { 2762 // Default options 2763 latLng: '51.511214,-0.119824', 2764 tooltip: '', 2765 style: 'roadmap', 2766 zoom: 12, 2767 2768 // Marker 2769 marker: new google.maps.Marker({ 2770 draggable: false 2771 }), 2772 2773 // Tooltip infowindow 2774 infowindow: new google.maps.InfoWindow({ 2775 disableAutoPan: true 2776 }) 2777 }); 2778 2779 // LatLng center point 2780 var latLng = data.widgetLatlng || state.latLng; 2781 state.latLng = latLng; 2782 var coords = latLng.split(','); 2783 var latLngObj = new google.maps.LatLng(coords[0], coords[1]); 2784 state.latLngObj = latLngObj; 2785 2786 // Disable touch events 2787 var mapDraggable = (Webflow.env.touch && data.disableTouch) ? false : true; 2788 2789 // Map instance 2790 state.map = new google.maps.Map(el, { 2791 center: state.latLngObj, 2792 zoom: state.zoom, 2793 maxZoom: 18, 2794 mapTypeControl: false, 2795 panControl: false, 2796 streetViewControl: false, 2797 scrollwheel: !data.disableScroll, 2798 draggable: mapDraggable, 2799 zoomControl: true, 2800 zoomControlOptions: { 2801 style: google.maps.ZoomControlStyle.SMALL 2802 }, 2803 mapTypeId: state.style 2804 }); 2805 state.marker.setMap(state.map); 2806 2807 // Set map position and offset 2808 state.setMapPosition = function() { 2809 state.map.setCenter(state.latLngObj); 2810 var offsetX = 0; 2811 var offsetY = 0; 2812 var padding = $el.css(['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft']); 2813 offsetX -= parseInt(padding.paddingLeft, 10); 2814 offsetX += parseInt(padding.paddingRight, 10); 2815 offsetY -= parseInt(padding.paddingTop, 10); 2816 offsetY += parseInt(padding.paddingBottom, 10); 2817 if (offsetX || offsetY) { 2818 state.map.panBy(offsetX, offsetY); 2819 } 2820 $el.css('position', ''); // Remove injected position 2821 }; 2822 2823 // Fix position after first tiles have loaded 2824 google.maps.event.addListener(state.map, 'tilesloaded', function() { 2825 google.maps.event.clearListeners(state.map, 'tilesloaded'); 2826 state.setMapPosition(); 2827 }); 2828 2829 // Set initial position 2830 state.setMapPosition(); 2831 state.marker.setPosition(state.latLngObj); 2832 state.infowindow.setPosition(state.latLngObj); 2833 2834 // Draw tooltip 2835 var tooltip = data.widgetTooltip; 2836 if (tooltip) { 2837 state.tooltip = tooltip; 2838 state.infowindow.setContent(tooltip); 2839 if (!state.infowindowOpen) { 2840 state.infowindow.open(state.map, state.marker); 2841 state.infowindowOpen = true; 2842 } 2843 } 2844 2845 // Map style - options.style 2846 var style = data.widgetStyle; 2847 if (style) { 2848 state.map.setMapTypeId(style); 2849 } 2850 2851 // Zoom - options.zoom 2852 var zoom = data.widgetZoom; 2853 if (zoom != null) { 2854 state.zoom = zoom; 2855 state.map.setZoom(+zoom); 2856 } 2857 2858 // Click marker to open in google maps 2859 google.maps.event.addListener(state.marker, 'click', function() { 2860 window.open('https://maps.google.com/?z=' + state.zoom + '&daddr=' + state.latLng); 2861 }); 2862 2863 return state; 2864 } 2865 2866 // Export module 2867 return api; 2868 }); 2869 2870 2871/***/ }, 2872/* 16 */ 2873/***/ function(module, exports, __webpack_require__) { 2874 2875 'use strict'; 2876 2877 /** 2878 * Webflow: Navbar component 2879 */ 2880 2881 var Webflow = __webpack_require__(1); 2882 var IXEvents = __webpack_require__(2); 2883 2884 Webflow.define('navbar', module.exports = function($, _) { 2885 var api = {}; 2886 var tram = $.tram; 2887 var $win = $(window); 2888 var $doc = $(document); 2889 var $body;
2890 var $navbars; 2891 var designer; 2892 var inApp = Webflow.env(); 2893 var overlay = '<div class="w-nav-overlay" data-wf-ignore />'; 2894 var namespace = '.w-nav'; 2895 var buttonOpen = 'w--open'; 2896 var menuOpen = 'w--nav-menu-open'; 2897 var linkOpen = 'w--nav-link-open'; 2898 var ix = IXEvents.triggers; 2899 var menuSibling = $(); 2900 2901 // ----------------------------------- 2902 // Module methods 2903 2904 api.ready = api.design = api.preview = init; 2905 2906 api.destroy = function() { 2907 menuSibling = $(); 2908 removeListeners(); 2909 if ($navbars && $navbars.length) { 2910 $navbars.each(teardown); 2911 } 2912 }; 2913 2914 // ----------------------------------- 2915 // Private methods 2916 2917 function init() { 2918 designer = inApp && Webflow.env('design'); 2919 $body = $(document.body); 2920 2921 // Find all instances on the page 2922 $navbars = $doc.find(namespace); 2923 if (!$navbars.length) return; 2924 $navbars.each(build); 2925 2926 // Wire events 2927 removeListeners(); 2928 addListeners(); 2929 } 2930 2931 function removeListeners() { 2932 Webflow.resize.off(resizeAll); 2933 } 2934 2935 function addListeners() { 2936 Webflow.resize.on(resizeAll); 2937 } 2938 2939 function resizeAll() { 2940 $navbars.each(resize); 2941 } 2942 2943 function build(i, el) { 2944 var $el = $(el); 2945 2946 // Store state in data 2947 var data = $.data(el, namespace); 2948 if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} }); 2949 data.menu = $el.find('.w-nav-menu'); 2950 data.links = data.menu.find('.w-nav-link'); 2951 data.dropdowns = data.menu.find('.w-dropdown'); 2952 data.button = $el.find('.w-nav-button'); 2953 data.container = $el.find('.w-container'); 2954 data.outside = outside(data); 2955 2956 // Remove old events 2957 data.el.off(namespace); 2958 data.button.off(namespace); 2959 data.menu.off(namespace); 2960 2961 // Set config from data attributes 2962 configure(data); 2963 2964 // Add events based on mode 2965 if (designer) { 2966 removeOverlay(data); 2967 data.el.on('setting' + namespace, handler(data)); 2968 } else { 2969 addOverlay(data); 2970 data.button.on('tap' + namespace, toggle(data)); 2971 data.menu.on('click' + namespace, 'a', navigate(data)); 2972 } 2973 2974 // Trigger initial resize 2975 resize(i, el); 2976 } 2977 2978 function teardown(i, el) { 2979 var data = $.data(el, namespace); 2980 if (data) { 2981 removeOverlay(data); 2982 $.removeData(el, namespace); 2983 } 2984 } 2985 2986 function removeOverlay(data) { 2987 if (!data.overlay) return; 2988 close(data, true); 2989 data.overlay.remove(); 2990 data.overlay = null; 2991 } 2992 2993 function addOverlay(data) { 2994 if (data.overlay) return; 2995 data.overlay = $(overlay).appendTo(data.el); 2996 data.parent = data.menu.parent(); 2997 close(data, true); 2998 } 2999 3000 function configure(data) { 3001 var config = {}; 3002 var old = data.config || {}; 3003 3004 // Set config options from data attributes 3005 var animation = config.animation = data.el.attr('data-animation') || 'default'; 3006 config.animOver = /^over/.test(animation); 3007 config.animDirect = /left$/.test(animation) ? -1 : 1; 3008 3009 // Re-open menu if the animation type changed 3010 if (old.animation !== animation) { 3011 data.open && _.defer(reopen, data); 3012 } 3013 3014 config.easing = data.el.attr('data-easing') || 'ease'; 3015 config.easing2 = data.el.attr('data-easing2') || 'ease'; 3016 3017 var duration = data.el.attr('data-duration'); 3018 config.duration = duration != null ? Number(duration) : 400; 3019 3020 config.docHeight = data.el.attr('data-doc-height'); 3021 3022 // Store config in data 3023 data.config = config; 3024 } 3025 3026 function handler(data) { 3027 return function(evt, options) { 3028 options = options || {}; 3029 var winWidth = $win.width(); 3030 configure(data); 3031 options.open === true && open(data, true); 3032 options.open === false && close(data, true); 3033 // Reopen if media query changed after setting 3034 data.open && _.defer(function() { 3035 if (winWidth !== $win.width()) reopen(data); 3036 }); 3037 }; 3038 } 3039 3040 function reopen(data) { 3041 if (!data.open) return; 3042 close(data, true); 3043 open(data, true); 3044 } 3045 3046 function toggle(data) { 3047 // Debounce toggle to wait for accurate open state 3048 return _.debounce(function() { 3049 data.open ? close(data) : open(data); 3050 }); 3051 } 3052 3053 function navigate(data) { 3054 return function(evt) { 3055 var link = $(this); 3056 var href = link.attr('href'); 3057 3058 // Avoid late clicks on touch devices 3059 if (!Webflow.validClick(evt.currentTarget)) { 3060 evt.preventDefault(); 3061 return; 3062 } 3063 3064 // Close when navigating to an in-page anchor 3065 if (href && href.indexOf('#') === 0 && data.open) { 3066 close(data); 3067 } 3068 }; 3069 } 3070 3071 function outside(data) { 3072 // Unbind previous tap handler if it exists 3073 if (data.outside) $doc.off('tap' + namespace, data.outside); 3074 3075 // Close menu when tapped outside, debounced to wait for state 3076 return _.debounce(function(evt) { 3077 if (!data.open) return; 3078 var menu = $(evt.target).closest('.w-nav-menu'); 3079 if (!data.menu.is(menu)) { 3080 close(data); 3081 } 3082 }); 3083 } 3084 3085 function resize(i, el) { 3086 var data = $.data(el, namespace);
3087 // Check for collapsed state based on button display 3088 var collapsed = data.collapsed = data.button.css('display') !== 'none'; 3089 // Close menu if button is no longer visible (and not in designer) 3090 if (data.open && !collapsed && !designer) close(data, true); 3091 // Set max-width of links + dropdowns to match container 3092 if (data.container.length) { 3093 var updateEachMax = updateMax(data); 3094 data.links.each(updateEachMax); 3095 data.dropdowns.each(updateEachMax); 3096 } 3097 // If currently open, update height to match body 3098 if (data.open) { 3099 setOverlayHeight(data); 3100 } 3101 } 3102 3103 var maxWidth = 'max-width'; 3104 function updateMax(data) { 3105 // Set max-width of each element to match container 3106 var containMax = data.container.css(maxWidth); 3107 if (containMax === 'none') containMax = ''; 3108 return function(i, link) { 3109 link = $(link); 3110 link.css(maxWidth, ''); 3111 // Don't set the max-width if an upstream value exists 3112 if (link.css(maxWidth) === 'none') link.css(maxWidth, containMax); 3113 }; 3114 } 3115 3116 function open(data, immediate) { 3117 if (data.open) return; 3118 data.open = true; 3119 data.menu.addClass(menuOpen); 3120 data.links.addClass(linkOpen); 3121 data.button.addClass(buttonOpen); 3122 var config = data.config; 3123 var animation = config.animation; 3124 if (animation === 'none' || !tram.support.transform) immediate = true; 3125 var bodyHeight = setOverlayHeight(data); 3126 var menuHeight = data.menu.outerHeight(true); 3127 var menuWidth = data.menu.outerWidth(true); 3128 var navHeight = data.el.height(); 3129 var navbarEl = data.el[0]; 3130 resize(0, navbarEl); 3131 ix.intro(0, navbarEl); 3132 Webflow.redraw.up(); 3133 3134 // Listen for tap outside events 3135 if (!designer) $doc.on('tap' + namespace, data.outside); 3136 3137 // No transition for immediate 3138 if (immediate) return; 3139 3140 var transConfig = 'transform ' + config.duration + 'ms ' + config.easing; 3141 3142 // Add menu to overlay 3143 if (data.overlay) { 3144 menuSibling = data.menu.prev(); 3145 data.overlay.show().append(data.menu); 3146 } 3147 3148 // Over left/right 3149 if (config.animOver) { 3150 tram(data.menu) 3151 .add(transConfig) 3152 .set({ x: config.animDirect * menuWidth, height: bodyHeight }).start({ x: 0 }); 3153 data.overlay && data.overlay.width(menuWidth); 3154 return; 3155 } 3156 3157 // Drop Down 3158 var offsetY = navHeight + menuHeight; 3159 tram(data.menu) 3160 .add(transConfig) 3161 .set({ y: -offsetY }).start({ y: 0 }); 3162 } 3163 3164 function setOverlayHeight(data) { 3165 var config = data.config; 3166 var bodyHeight = config.docHeight ? $doc.height() : $body.height(); 3167 if (config.animOver) { 3168 data.menu.height(bodyHeight); 3169 } else if (data.el.css('position') !== 'fixed') { 3170 bodyHeight -= data.el.height(); 3171 } 3172 data.overlay && data.overlay.height(bodyHeight); 3173 return bodyHeight; 3174 } 3175 3176 function close(data, immediate) { 3177 if (!data.open) return; 3178 data.open = false; 3179 data.button.removeClass(buttonOpen); 3180 var config = data.config; 3181 if (config.animation === 'none' || !tram.support.transform || config.duration <= 0) immediate = true; 3182 ix.outro(0, data.el[0]); 3183 3184 // Stop listening for tap outside events 3185 $doc.off('tap' + namespace, data.outside); 3186 3187 if (immediate) { 3188 tram(data.menu).stop(); 3189 complete(); 3190 return; 3191 } 3192 3193 var transConfig = 'transform ' + config.duration + 'ms ' + config.easing2; 3194 var menuHeight = data.menu.outerHeight(true); 3195 var menuWidth = data.menu.outerWidth(true); 3196 var navHeight = data.el.height(); 3197 3198 // Over left/right 3199 if (config.animOver) { 3200 tram(data.menu) 3201 .add(transConfig) 3202 .start({ x: menuWidth * config.animDirect }).then(complete); 3203 return; 3204 } 3205 3206 // Drop Down 3207 var offsetY = navHeight + menuHeight; 3208 tram(data.menu) 3209 .add(transConfig) 3210 .start({ y: -offsetY }).then(complete); 3211 3212 function complete() { 3213 data.menu.height(''); 3214 tram(data.menu).set({ x: 0, y: 0 }); 3215 data.menu.removeClass(menuOpen); 3216 data.links.removeClass(linkOpen); 3217 if (data.overlay && data.overlay.children().length) { 3218 // Move menu back to parent at the original location 3219 menuSibling.length ? data.menu.insertAfter(menuSibling) : data.menu.prependTo(data.parent); 3220 data.overlay.attr('style', '').hide(); 3221 } 3222 3223 // Trigger event so other components can hook in (dropdown) 3224 data.el.triggerHandler('w-close'); 3225 } 3226 } 3227 3228 // Export module 3229 return api; 3230 }); 3231 3232 3233/***/ }, 3234/* 17 */ 3235/***/ function(module, exports, __webpack_require__) { 3236 3237 'use strict'; 3238 3239 /** 3240 * Webflow: Smooth scroll 3241 */ 3242 3243 var Webflow = __webpack_require__(1); 3244 3245 Webflow.define('scroll', module.exports = function($, _) { 3246 var $doc = $(document); 3247 var win = window; 3248 var loc = win.location; 3249 var history = inIframe() ? null : win.history;
3250 var validHash = /^[a-zA-Z0-9][\w:.-]*$/; 3251 3252 function inIframe() { 3253 try { 3254 return !!win.frameElement; 3255 } catch (e) { 3256 return true; 3257 } 3258 } 3259 3260 function ready() { 3261 // If hash is already present on page load, scroll to it right away 3262 if (loc.hash) { 3263 findEl(loc.hash.substring(1)); 3264 } 3265 3266 // The current page url without the hash part. 3267 var locHref = loc.href.split('#')[0]; 3268 3269 // When clicking on a link, check if it links to another part of the page 3270 $doc.on('click', 'a', function(e) { 3271 3272 if (Webflow.env('design')) { 3273 return; 3274 3275 } 3276 3277 // Ignore links being used by jQuery mobile 3278 if (window.$.mobile && $(e.currentTarget).hasClass('ui-link')) return; 3279 3280 // Ignore empty # links #liton_tab error 3281 if (this.getAttribute('href') === '#') { 3282 e.preventDefault(); 3283 return; 3284 } 3285 //Ignore error #liton_tab_3_1 -- Main Page (Essam 6-6-2022) 3286 if (this.getAttribute('href') === '#liton_tab_3_1' ||this.getAttribute('href') === '#liton_tab_3_2'||this.getAttribute('href') === '#liton_tab_3_3'||this.getAttribute('href') === '#liton_tab_3_4')||this.getAttribute('href') === '#liton_tab_4_2') { 3287 e.preventDefault(); 3288 return; 3289 } 3290 3291 // The href property always contains the full url so we can compare 3292 // with the documentâs location to only target links on this page. 3293 var parts = this.href.split('#'); 3294 var hash = parts[0] === locHref ? parts[1] : null; 3295 if (hash) { 3296 findEl(hash, e); 3297 } 3298 }); 3299 } 3300 3301 function findEl(hash, e) { 3302 if (!validHash.test(hash)) return; 3303 3304 var el = $('#' + hash); 3305 if (!el.length) { 3306 return; 3307 } 3308 3309 if (e) { 3310 e.preventDefault(); 3311 e.stopPropagation(); 3312 } 3313 3314 // Push new history state 3315 if ( 3316 loc.hash !== hash && 3317 history && history.pushState && 3318 // Navigation breaks Chrome when the protocol is `file:`. 3319 !(Webflow.env.chrome && loc.protocol === 'file:') 3320 ) { 3321 var oldHash = history.state && history.state.hash; 3322 if (oldHash !== hash) { 3323 history.pushState({ hash: hash }, '', '#' + hash); 3324 } 3325 } 3326 3327 // If a fixed header exists, offset for the height 3328 var rootTag = Webflow.env('editor') ? '.w-editor-body' : 'body'; 3329 var header = $('header, ' + rootTag + ' > .header, ' + rootTag + ' > .w-nav:not([data-no-scroll])'); 3330 var offset = header.css('position') === 'fixed' ? header.outerHeight() : 0; 3331 3332 win.setTimeout(function() { 3333 scroll(el, offset); 3334 }, e ? 0 : 300); 3335 } 3336 3337 function scroll(el, offset){ 3338 var start = $(win).scrollTop(); 3339 var end = el.offset().top - offset; 3340 3341 // If specified, scroll so that the element ends up in the middle of the viewport 3342 if (el.data('scroll') === 'mid') { 3343 var available = $(win).height() - offset; 3344 var elHeight = el.outerHeight(); 3345 if (elHeight < available) { 3346 end -= Math.round((available - elHeight) / 2); 3347 } 3348 } 3349 3350 var mult = 1; 3351 3352 // Check for custom time multiplier on the body and the element 3353 $('body').add(el).each(function(i) { 3354 var time = parseFloat($(this).attr('data-scroll-time'), 10); 3355 if (!isNaN(time) && (time === 0 || time > 0)) { 3356 mult = time; 3357 } 3358 }); 3359 3360 // Shim for IE8 and below 3361 if (!Date.now) { 3362 Date.now = function() { return new Date().getTime(); }; 3363 } 3364 3365 var clock = Date.now(); 3366 var animate = win.requestAnimationFrame || win.mozRequestAnimationFrame || win.webkitRequestAnimationFrame || function(fn) { win.setTimeout(fn, 15); }; 3367 var duration = (472.143 * Math.log(Math.abs(start - end) +125) - 2000) * mult; 3368 3369 var step = function() { 3370 var elapsed = Date.now() - clock; 3371 win.scroll(0, getY(start, end, elapsed, duration)); 3372 3373 if (elapsed <= duration) { 3374 animate(step); 3375 } 3376 }; 3377 3378 step(); 3379 } 3380 3381 function getY(start, end, elapsed, duration) { 3382 if (elapsed > duration) { 3383 return end; 3384 } 3385 3386 return start + (end - start) * ease(elapsed / duration); 3387 } 3388 3389 function ease(t) { 3390 return t<0.5 ? 4 * t * t * t : (t-1) * (2 * t-2) * (2 * t-2)+1; 3391 } 3392 3393 // Export module 3394 return { ready: ready }; 3395 }); 3396 3397 3398/***/ }, 3399/* 18 */ 3400/***/ function(module, exports, __webpack_require__) { 3401 3402 'use strict'; 3403 3404 /** 3405 * Webflow: Slider component 3406 */ 3407 3408 var Webflow = __webpack_require__(1); 3409 var IXEvents = __webpack_require__(2); 3410 3411 Webflow.define('slider', module.exports = function($, _) { 3412 var api = {}; 3413 var tram = $.tram; 3414 var $doc = $(document); 3415 var $sliders; 3416 var designer; 3417 var inApp = Webflow.env(); 3418 var namespace = '.w-slider'; 3419 var dot = '<div class="w-slider-dot" data-wf-ignore />'; 3420 var ix = IXEvents.triggers; 3421 var fallback; 3422 var inRedraw; 3423 3424 // ----------------------------------- 3425 // Module methods 3426 3427 api.ready = function() { 3428 init(); 3429 }; 3430 3431 api.design = function() { 3432 designer = true; 3433 init(); 3434 }; 3435 3436 api.preview = function() { 3437 designer = false;
3438 init(); 3439 }; 3440 3441 api.redraw = function() { 3442 inRedraw = true; 3443 init(); 3444 }; 3445 3446 api.destroy = removeListeners; 3447 3448 // ----------------------------------- 3449 // Private methods 3450 3451 function init() { 3452 // Find all sliders on the page 3453 $sliders = $doc.find(namespace); 3454 if (!$sliders.length) return; 3455 $sliders.filter(':visible').each(build); 3456 inRedraw = null; 3457 if (fallback) return; 3458 3459 removeListeners(); 3460 addListeners(); 3461 } 3462 3463 function removeListeners() { 3464 Webflow.resize.off(renderAll); 3465 Webflow.redraw.off(api.redraw); 3466 } 3467 3468 function addListeners() { 3469 Webflow.resize.on(renderAll); 3470 Webflow.redraw.on(api.redraw); 3471 } 3472 3473 function renderAll() { 3474 $sliders.filter(':visible').each(render); 3475 } 3476 3477 function build(i, el) { 3478 var $el = $(el); 3479 3480 // Store slider state in data 3481 var data = $.data(el, namespace); 3482 if (!data) { 3483 data = $.data(el, namespace, { 3484 index: 0, 3485 depth: 1, 3486 el: $el, 3487 config: {} 3488 }); 3489 } 3490 data.mask = $el.children('.w-slider-mask'); 3491 data.left = $el.children('.w-slider-arrow-left'); 3492 data.right = $el.children('.w-slider-arrow-right'); 3493 data.nav = $el.children('.w-slider-nav'); 3494 data.slides = data.mask.children('.w-slide'); 3495 data.slides.each(ix.reset); 3496 if (inRedraw) data.maskWidth = 0; 3497 3498 // Disable in old browsers 3499 if (!tram.support.transform) { 3500 data.left.hide(); 3501 data.right.hide(); 3502 data.nav.hide(); 3503 fallback = true; 3504 return; 3505 } 3506 3507 // Remove old events 3508 data.el.off(namespace); 3509 data.left.off(namespace); 3510 data.right.off(namespace); 3511 data.nav.off(namespace); 3512 3513 // Set config from data attributes 3514 configure(data); 3515 3516 // Add events based on mode 3517 if (designer) { 3518 data.el.on('setting' + namespace, handler(data)); 3519 stopTimer(data); 3520 data.hasTimer = false; 3521 } else { 3522 data.el.on('swipe' + namespace, handler(data)); 3523 data.left.on('tap' + namespace, previousFunction(data)); 3524 data.right.on('tap' + namespace, next(data)); 3525 3526 // Start timer if autoplay is true, only once 3527 if (data.config.autoplay && !data.hasTimer) { 3528 data.hasTimer = true; 3529 data.timerCount = 1; 3530 startTimer(data); 3531 } 3532 } 3533 3534 // Listen to nav events 3535 data.nav.on('tap' + namespace, '> div', handler(data)); 3536 3537 // Remove gaps from formatted html (for inline-blocks) 3538 if (!inApp) { 3539 data.mask.contents().filter(function() { 3540 return this.nodeType === 3; 3541 }).remove(); 3542 } 3543 3544 // Run first render 3545 render(i, el); 3546 } 3547 3548 function configure(data) { 3549 var config = {}; 3550 3551 config.crossOver = 0; 3552 3553 // Set config options from data attributes 3554 config.animation = data.el.attr('data-animation') || 'slide'; 3555 if (config.animation === 'outin') { 3556 config.animation = 'cross'; 3557 config.crossOver = 0.5; 3558 } 3559 config.easing = data.el.attr('data-easing') || 'ease'; 3560 3561 var duration = data.el.attr('data-duration'); 3562 config.duration = duration != null ? +duration : 500; 3563 3564 if (+data.el.attr('data-infinite')) config.infinite = true; 3565 if (+data.el.attr('data-disable-swipe')) config.disableSwipe = true; 3566 3567 if (+data.el.attr('data-hide-arrows')) { 3568 config.hideArrows = true; 3569 } else if (data.config.hideArrows) { 3570 data.left.show(); 3571 data.right.show(); 3572 } 3573 3574 if (+data.el.attr('data-autoplay')) { 3575 config.autoplay = true; 3576 config.delay = +data.el.attr('data-delay') || 2000; 3577 config.timerMax = +data.el.attr('data-autoplay-limit'); 3578 // Disable timer on first touch or mouse down 3579 var touchEvents = 'mousedown' + namespace + ' touchstart' + namespace; 3580 if (!designer) { 3581 data.el.off(touchEvents).one(touchEvents, function() { 3582 stopTimer(data); 3583 }); 3584 } 3585 } 3586 3587 // Use edge buffer to help calculate page count 3588 var arrowWidth = data.right.width(); 3589 config.edge = arrowWidth ? arrowWidth + 40 : 100; 3590 3591 // Store config in data 3592 data.config = config; 3593 } 3594 3595 function previousFunction(data) { 3596 return function(evt) { 3597 change(data, { index: data.index - 1, vector: -1 }); 3598 }; 3599 } 3600 3601 function next(data) { 3602 return function(evt) { 3603 change(data, { index: data.index + 1, vector: 1 }); 3604 }; 3605 } 3606 3607 function select(data, value) { 3608 // Select page based on slide element index 3609 var found = null; 3610 if (value === data.slides.length) { 3611 init(); layout(data); // Rebuild and find new slides 3612 } 3613 _.each(data.anchors, function(anchor, index) { 3614 $(anchor.els).each(function(i, el) { 3615 if ($(el).index() === value) found = index; 3616 }); 3617 }); 3618 if (found != null) change(data, { index: found, immediate: true }); 3619 } 3620 3621 function startTimer(data) { 3622 stopTimer(data); 3623 var config = data.config; 3624 var timerMax = config.timerMax; 3625 if (timerMax && data.timerCount++ > timerMax) return; 3626 data.timerId = window.setTimeout(function() { 3627 if (data.timerId == null || designer) return; 3628 next(data)(); 3629 startTimer(data); 3630 }, config.delay); 3631 } 3632 3633 function stopTimer(data) { 3634 window.clearTimeout(data.timerId); 3635 data.timerId = null; 3636 } 3637 3638 function handler(data) { 3639 return function(evt, options) { 3640 options = options || {}; 3641 var config = data.config; 3642 3643 // Designer settings 3644 if (designer && evt.type === 'setting') { 3645 if (options.select === 'prev') return previousFunction(data)(); 3646 if (options.select === 'next') return next(data)(); 3647 configure(data); 3648 layout(data); 3649 if (options.select == null) return; 3650 select(data, options.select); 3651 return; 3652 } 3653 3654 // Swipe event 3655 if (evt.type === 'swipe') { 3656 if (config.disableSwipe) return; 3657 if (Webflow.env('editor')) return; 3658 if (options.direction === 'left') return next(data)(); 3659 if (options.direction === 'right') return previousFunction(data)(); 3660 return; 3661 } 3662 3663 // Page buttons 3664 if (data.nav.has(evt.target).length) { 3665 change(data, { index: $(evt.target).index() }); 3666 } 3667 }; 3668 } 3669 3670 function change(data, options) { 3671 options = options || {}; 3672 var config = data.config; 3673 var anchors = data.anchors; 3674 3675 // Set new index 3676 data.previous = data.index; 3677 var index = options.index; 3678 var shift = {}; 3679 if (index < 0) { 3680 index = anchors.length - 1; 3681 if (config.infinite) { 3682 // Shift first slide to the end 3683 shift.x = -data.endX; 3684 shift.from = 0; 3685 shift.to = anchors[0].width; 3686 } 3687 } else if (index >= anchors.length) { 3688 index = 0; 3689 if (config.infinite) { 3690 // Shift last slide to the start
3691 shift.x = anchors[anchors.length - 1].width; 3692 shift.from = -anchors[anchors.length - 1].x; 3693 shift.to = shift.from - shift.x; 3694 } 3695 } 3696 data.index = index; 3697 3698 // Select page nav 3699 var active = data.nav.children().eq(data.index).addClass('w-active'); 3700 data.nav.children().not(active).removeClass('w-active'); 3701 3702 // Hide arrows 3703 if (config.hideArrows) { 3704 data.index === anchors.length - 1 ? data.right.hide() : data.right.show(); 3705 data.index === 0 ? data.left.hide() : data.left.show(); 3706 } 3707 3708 // Get page offset from anchors 3709 var lastOffsetX = data.offsetX || 0; 3710 var offsetX = data.offsetX = -anchors[data.index].x; 3711 var resetConfig = { x: offsetX, opacity: 1, visibility: '' }; 3712 3713 // Transition slides 3714 var targets = $(anchors[data.index].els); 3715 var prevTargs = $(anchors[data.previous] && anchors[data.previous].els); 3716 var others = data.slides.not(targets); 3717 var animation = config.animation; 3718 var easing = config.easing; 3719 var duration = Math.round(config.duration); 3720 var vector = options.vector || (data.index > data.previous ? 1 : -1); 3721 var fadeRule = 'opacity ' + duration + 'ms ' + easing; 3722 var slideRule = 'transform ' + duration + 'ms ' + easing; 3723 3724 // Trigger IX events 3725 if (!designer) { 3726 targets.each(ix.intro); 3727 others.each(ix.outro); 3728 } 3729 3730 // Set immediately after layout changes (but not during redraw) 3731 if (options.immediate && !inRedraw) { 3732 tram(targets).set(resetConfig); 3733 resetOthers(); 3734 return; 3735 } 3736 3737 // Exit early if index is unchanged 3738 if (data.index === data.previous) return; 3739 3740 // Cross Fade / Out-In 3741 if (animation === 'cross') { 3742 var reduced = Math.round(duration - duration * config.crossOver); 3743 var wait = Math.round(duration - reduced); 3744 fadeRule = 'opacity ' + reduced + 'ms ' + easing; 3745 tram(prevTargs) 3746 .set({ visibility: '' }) 3747 .add(fadeRule) 3748 .start({ opacity: 0 }); 3749 tram(targets) 3750 .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ }) 3751 .add(fadeRule) 3752 .wait(wait) 3753 .then({ opacity: 1 }) 3754 .then(resetOthers); 3755 return; 3756 } 3757 3758 // Fade Over 3759 if (animation === 'fade') { 3760 tram(prevTargs) 3761 .set({ visibility: '' }) 3762 .stop(); 3763 tram(targets) 3764 .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ }) 3765 .add(fadeRule) 3766 .start({ opacity: 1 }) 3767 .then(resetOthers); 3768 return; 3769 } 3770 3771 // Slide Over 3772 if (animation === 'over') { 3773 resetConfig = { x: data.endX }; 3774 tram(prevTargs) 3775 .set({ visibility: '' }) 3776 .stop(); 3777 tram(targets) 3778 .set({ visibility: '', zIndex: data.depth++, x: offsetX + anchors[data.index].width * vector }) 3779 .add(slideRule) 3780 .start({ x: offsetX }) 3781 .then(resetOthers); 3782 return; 3783 } 3784 3785 // Slide - infinite scroll 3786 if (config.infinite && shift.x) { 3787 tram(data.slides.not(prevTargs)) 3788 .set({ visibility: '', x: shift.x }) 3789 .add(slideRule) 3790 .start({ x: offsetX }); 3791 tram(prevTargs) 3792 .set({ visibility: '', x: shift.from }) 3793 .add(slideRule) 3794 .start({ x: shift.to }); 3795 data.shifted = prevTargs; 3796 3797 } else { 3798 if (config.infinite && data.shifted) { 3799 tram(data.shifted).set({ visibility: '', x: lastOffsetX }); 3800 data.shifted = null; 3801 } 3802 3803 // Slide - basic scroll 3804 tram(data.slides) 3805 .set({ visibility: '' }) 3806 .add(slideRule) 3807 .start({ x: offsetX }); 3808 } 3809 3810 // Helper to move others out of view 3811 function resetOthers() { 3812 targets = $(anchors[data.index].els); 3813 others = data.slides.not(targets); 3814 if (animation !== 'slide') resetConfig.visibility = 'hidden'; 3815 tram(others).set(resetConfig); 3816 } 3817 } 3818 3819 function render(i, el) { 3820 var data = $.data(el, namespace); 3821 if (maskChanged(data)) return layout(data); 3822 if (designer && slidesChanged(data)) layout(data); 3823 } 3824 3825 function layout(data) { 3826 // Determine page count from width of slides 3827 var pages = 1; 3828 var offset = 0; 3829 var anchor = 0; 3830 var width = 0; 3831 var maskWidth = data.maskWidth; 3832 var threshold = maskWidth - data.config.edge; 3833 if (threshold < 0) threshold = 0; 3834 data.anchors = [{ els: [], x: 0, width: 0 }]; 3835 data.slides.each(function(i, el) { 3836 if (anchor - offset > threshold) { 3837 pages++; 3838 offset += maskWidth; 3839 // Store page anchor for transition 3840 data.anchors[pages - 1] = { els: [], x: anchor, width: 0 }; 3841 } 3842 // Set next anchor using current width + margin 3843 width = $(el).outerWidth(true); 3844 anchor += width; 3845 data.anchors[pages - 1].width += width; 3846 data.anchors[pages - 1].els.push(el); 3847 }); 3848 data.endX = anchor; 3849 3850 // Build dots if nav exists and needs updating 3851 if (designer) data.pages = null; 3852 if (data.nav.length && data.pages !== pages){ 3853 data.pages = pages; 3854 buildNav(data); 3855 } 3856 3857 // Make sure index is still within range and call change handler 3858 var index = data.index; 3859 if (index >= pages) index = pages - 1; 3860 change(data, { immediate: true, index: index }); 3861 } 3862 3863 function buildNav(data) { 3864 var dots = []; 3865 var $dot; 3866 var spacing = data.el.attr('data-nav-spacing'); 3867 if (spacing) spacing = parseFloat(spacing) + 'px'; 3868 for (var i = 0; i < data.pages; i++) { 3869 $dot = $(dot); 3870 if (data.nav.hasClass('w-num')) $dot.text(i + 1); 3871 if (spacing != null) { 3872 $dot.css({ 3873 'margin-left': spacing, 3874 'margin-right': spacing 3875 }); 3876 } 3877 dots.push($dot); 3878 } 3879 data.nav.empty().append(dots); 3880 } 3881 3882 function maskChanged(data) { 3883 var maskWidth = data.mask.width(); 3884 if (data.maskWidth !== maskWidth) { 3885 data.maskWidth = maskWidth; 3886 return true; 3887 } 3888 return false;
3889 } 3890 3891 function slidesChanged(data) { 3892 var slidesWidth = 0; 3893 data.slides.each(function(i, el) { 3894 slidesWidth += $(el).outerWidth(true); 3895 }); 3896 if (data.slidesWidth !== slidesWidth) { 3897 data.slidesWidth = slidesWidth; 3898 return true; 3899 } 3900 return false; 3901 } 3902 3903 // Export module 3904 return api; 3905 }); 3906 3907 3908/***/ }, 3909/* 19 */ 3910/***/ function(module, exports, __webpack_require__) { 3911 3912 'use strict'; 3913 3914 /** 3915 * Webflow: Tabs component 3916 */ 3917 3918 var Webflow = __webpack_require__(1); 3919 var IXEvents = __webpack_require__(2); 3920 3921 Webflow.define('tabs', module.exports = function($, _) { 3922 var api = {}; 3923 var tram = $.tram; 3924 var $win = $(window); 3925 var $doc = $(document); 3926 var $tabs; 3927 var design; 3928 var env = Webflow.env; 3929 var safari = env.safari; 3930 var inApp = env(); 3931 var tabAttr = 'data-w-tab'; 3932 var namespace = '.w-tabs'; 3933 var linkCurrent = 'w--current'; 3934 var tabActive = 'w--tab-active'; 3935 var ix = IXEvents.triggers; 3936 var inRedraw; 3937 3938 // ----------------------------------- 3939 // Module methods 3940 3941 api.ready = api.design = api.preview = init; 3942 3943 api.redraw = function() { 3944 inRedraw = true; 3945 init(); 3946 }; 3947 3948 api.destroy = function() { 3949 $tabs = $doc.find(namespace); 3950 if (!$tabs.length) return; 3951 $tabs.each(resetIX); 3952 removeListeners(); 3953 }; 3954 3955 // ----------------------------------- 3956 // Private methods 3957 3958 function init() { 3959 design = inApp && Webflow.env('design'); 3960 3961 // Find all instances on the page 3962 $tabs = $doc.find(namespace); 3963 if (!$tabs.length) return; 3964 $tabs.each(build); 3965 Webflow.env('preview') && $tabs.each(resetIX); 3966 inRedraw = null; 3967 3968 removeListeners(); 3969 addListeners(); 3970 } 3971 3972 function removeListeners() { 3973 Webflow.redraw.off(api.redraw); 3974 } 3975 3976 function addListeners() { 3977 Webflow.redraw.on(api.redraw); 3978 } 3979 3980 function resetIX(i, el) { 3981 var $el = $(el); 3982 var data = $.data(el, namespace); 3983 if (!data) return; 3984 data.links && data.links.each(ix.reset); 3985 data.panes && data.panes.each(ix.reset); 3986 } 3987 3988 function build(i, el) { 3989 var $el = $(el); 3990 3991 // Store state in data 3992 var data = $.data(el, namespace); 3993 if (!data) data = $.data(el, namespace, { el: $el, config: {} }); 3994 data.current = null; 3995 data.menu = $el.children('.w-tab-menu'); 3996 data.links = data.menu.children('.w-tab-link'); 3997 data.content = $el.children('.w-tab-content'); 3998 data.panes = data.content.children('.w-tab-pane'); 3999 4000 // Remove old events 4001 data.el.off(namespace); 4002 data.links.off(namespace); 4003 4004 // Set config from data attributes 4005 configure(data); 4006 4007 // Wire up events when not in design mode 4008 if (!design) { 4009 data.links.on('click' + namespace, linkSelect(data)); 4010 4011 // Trigger first intro event from current tab 4012 var $link = data.links.filter('.' + linkCurrent); 4013 var tab = $link.attr(tabAttr); 4014 tab && changeTab(data, { tab: tab, immediate: true }); 4015 } 4016 } 4017 4018 function configure(data) { 4019 var config = {}; 4020 var old = data.config || {}; 4021 4022 // Set config options from data attributes 4023 config.easing = data.el.attr('data-easing') || 'ease'; 4024 4025 var intro = +data.el.attr('data-duration-in'); 4026 intro = config.intro = intro === intro ? intro : 0; 4027 4028 var outro = +data.el.attr('data-duration-out'); 4029 outro = config.outro = outro === outro ? outro : 0; 4030 4031 config.immediate = !intro && !outro; 4032 4033 // Store config in data 4034 data.config = config; 4035 } 4036 4037 function linkSelect(data) { 4038 return function(evt) { 4039 var tab = evt.currentTarget.getAttribute(tabAttr); 4040 tab && changeTab(data, { tab: tab }); 4041 }; 4042 } 4043 4044 function changeTab(data, options) { 4045 options = options || {}; 4046 4047 var config = data.config; 4048 var easing = config.easing; 4049 var tab = options.tab; 4050 4051 // Don't select the same tab twice 4052 if (tab === data.current) return; 4053 data.current = tab; 4054 4055 // Select the current link 4056 data.links.each(function(i, el) { 4057 var $el = $(el); 4058 if (el.getAttribute(tabAttr) === tab) $el.addClass(linkCurrent).each(ix.intro); 4059 else if ($el.hasClass(linkCurrent)) $el.removeClass(linkCurrent).each(ix.outro); 4060 }); 4061 4062 // Find the new tab panes and keep track of previous 4063 var targets = []; 4064 var previous = []; 4065 data.panes.each(function(i, el) { 4066 var $el = $(el); 4067 if (el.getAttribute(tabAttr) === tab) { 4068 targets.push(el); 4069 } else if ($el.hasClass(tabActive)) { 4070 previous.push(el); 4071 } 4072 }); 4073 4074 var $targets = $(targets); 4075 var $previous = $(previous); 4076 4077 // Switch tabs immediately and bypass transitions 4078 if (options.immediate || config.immediate) { 4079 $targets.addClass(tabActive).each(ix.intro); 4080 $previous.removeClass(tabActive); 4081 // Redraw to benefit components in the hidden tab pane 4082 // But only if not currently in the middle of a redraw 4083 if (!inRedraw) Webflow.redraw.up(); 4084 return; 4085 } 4086 4087 // Fade out the currently active tab before intro 4088 if ($previous.length && config.outro) { 4089 $previous.each(ix.outro); 4090 tram($previous) 4091 .add('opacity ' + config.outro + 'ms ' + easing, { fallback: safari }) 4092 .start({ opacity: 0 }) 4093 .then(intro); 4094 } else { 4095 // Skip the outro and play intro 4096 intro(); 4097 } 4098 4099 // Fade in the new target 4100 function intro() { 4101 // Clear previous active class + styles touched by tram
4102 // We cannot remove the whole inline style because it could be dynamically bound 4103 $previous.removeClass(tabActive).css({ 4104 opacity: '', 4105 transition: '', 4106 transform: '', 4107 width: '', 4108 height: '' 4109 }); 4110 4111 // Add active class to new target 4112 $targets.addClass(tabActive).each(ix.intro); 4113 Webflow.redraw.up(); 4114 4115 // Set opacity immediately if intro is zero 4116 if (!config.intro) return tram($targets).set({ opacity: 1 }); 4117 4118 // Otherwise fade in opacity 4119 tram($targets) 4120 .set({ opacity: 0 }) 4121 .redraw() 4122 .add('opacity ' + config.intro + 'ms ' + easing, { fallback: safari }) 4123 .start({ opacity: 1 }); 4124 } 4125 } 4126 4127 // Export module 4128 return api; 4129 }); 4130 4131 4132/***/ }, 4133/* 20 */ 4134/***/ function(module, exports, __webpack_require__) { 4135 4136 'use strict'; 4137 4138 /** 4139 * Webflow: Touch events 4140 */ 4141 4142 var Webflow = __webpack_require__(1); 4143 4144 Webflow.define('touch', module.exports = function($, _) { 4145 var api = {}; 4146 var fallback = !document.addEventListener; 4147 var getSelection = window.getSelection; 4148 4149 // Fallback to click events in old IE 4150 if (fallback) { 4151 $.event.special.tap = { bindType: 'click', delegateType: 'click' }; 4152 } 4153 4154 api.init = function(el) { 4155 if (fallback) return null; 4156 el = typeof el === 'string' ? $(el).get(0) : el; 4157 return el ? new Touch(el) : null; 4158 }; 4159 4160 function Touch(el) { 4161 var active = false; 4162 var dirty = false; 4163 var useTouch = false; 4164 var thresholdX = Math.min(Math.round(window.innerWidth * 0.04), 40); 4165 var startX, startY, lastX; 4166 4167 el.addEventListener('touchstart', start, false); 4168 el.addEventListener('touchmove', move, false); 4169 el.addEventListener('touchend', end, false); 4170 el.addEventListener('touchcancel', cancel, false); 4171 el.addEventListener('mousedown', start, false); 4172 el.addEventListener('mousemove', move, false); 4173 el.addEventListener('mouseup', end, false); 4174 el.addEventListener('mouseout', cancel, false); 4175 4176 function start(evt) { 4177 // We donât handle multi-touch events yet. 4178 var touches = evt.touches; 4179 if (touches && touches.length > 1) { 4180 return; 4181 } 4182 4183 active = true; 4184 dirty = false; 4185 4186 if (touches) { 4187 useTouch = true; 4188 startX = touches[0].clientX; 4189 startY = touches[0].clientY; 4190 } else { 4191 startX = evt.clientX; 4192 startY = evt.clientY; 4193 } 4194 4195 lastX = startX; 4196 } 4197 4198 function move(evt) { 4199 if (!active) return; 4200 4201 if (useTouch && evt.type === 'mousemove') { 4202 evt.preventDefault(); 4203 evt.stopPropagation(); 4204 return; 4205 } 4206 4207 var touches = evt.touches; 4208 var x = touches ? touches[0].clientX : evt.clientX; 4209 var y = touches ? touches[0].clientY : evt.clientY; 4210 4211 var velocityX = x - lastX; 4212 lastX = x; 4213 4214 // Allow swipes while pointer is down, but prevent them during text selection 4215 if (Math.abs(velocityX) > thresholdX && getSelection && getSelection() + '' === '') { 4216 triggerEvent('swipe', evt, { direction: velocityX > 0 ? 'right' : 'left' }); 4217 cancel(); 4218 } 4219 4220 // If pointer moves more than 10px flag to cancel tap 4221 if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) { 4222 dirty = true; 4223 } 4224 } 4225 4226 function end(evt) { 4227 if (!active) return; 4228 active = false; 4229 4230 if (useTouch && evt.type === 'mouseup') { 4231 evt.preventDefault(); 4232 evt.stopPropagation(); 4233 useTouch = false; 4234 return; 4235 } 4236 4237 if (!dirty) triggerEvent('tap', evt); 4238 } 4239 4240 function cancel(evt) { 4241 active = false; 4242 } 4243 4244 function destroy() { 4245 el.removeEventListener('touchstart', start, false); 4246 el.removeEventListener('touchmove', move, false); 4247 el.removeEventListener('touchend', end, false); 4248 el.removeEventListener('touchcancel', cancel, false); 4249 el.removeEventListener('mousedown', start, false); 4250 el.removeEventListener('mousemove', move, false); 4251 el.removeEventListener('mouseup', end, false);
4252 el.removeEventListener('mouseout', cancel, false); 4253 el = null; 4254 } 4255 4256 // Public instance methods 4257 this.destroy = destroy; 4258 } 4259 4260 // Wrap native event to supoprt preventdefault + stopPropagation 4261 function triggerEvent(type, evt, data) { 4262 var newEvent = $.Event(type, { originalEvent: evt }); 4263 $(evt.target).trigger(newEvent, data); 4264 } 4265 4266 // Listen for touch events on all nodes by default. 4267 api.instance = api.init(document); 4268 4269 // Export module 4270 return api; 4271 }); 4272 4273 4274/***/ }, 4275/* 21 */ 4276/***/ function(module, exports, __webpack_require__) { 4277 4278 'use strict'; 4279 4280 /*jshint -W054 */ 4281 4282 // Include tram for frame-throttling 4283 var $ = window.$; 4284 var tram = __webpack_require__(3) && $.tram; 4285 4286 /*! 4287 * Webflow._ (aka) Underscore.js 1.6.0 (custom build) 4288 * _.each 4289 * _.map 4290 * _.find 4291 * _.filter 4292 * _.any 4293 * _.contains 4294 * _.delay 4295 * _.defer 4296 * _.throttle (webflow) 4297 * _.debounce 4298 * _.keys 4299 * _.has 4300 * _.now 4301 * 4302 * http://underscorejs.org 4303 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4304 * Underscore may be freely distributed under the MIT license. 4305 * @license MIT 4306 */ 4307 module.exports = (function() { 4308 var _ = {}; 4309 4310 // Current version. 4311 _.VERSION = '1.6.0-Webflow'; 4312 4313 // Establish the object that gets returned to break out of a loop iteration. 4314 var breaker = {}; 4315 4316 // Save bytes in the minified (but not gzipped) version: 4317 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; 4318 4319 // Create quick reference variables for speed access to core prototypes. 4320 var 4321 push = ArrayProto.push, 4322 slice = ArrayProto.slice, 4323 concat = ArrayProto.concat, 4324 toString = ObjProto.toString, 4325 hasOwnProperty = ObjProto.hasOwnProperty; 4326 4327 // All **ECMAScript 5** native function implementations that we hope to use 4328 // are declared here. 4329 var 4330 nativeForEach = ArrayProto.forEach, 4331 nativeMap = ArrayProto.map, 4332 nativeReduce = ArrayProto.reduce, 4333 nativeReduceRight = ArrayProto.reduceRight, 4334 nativeFilter = ArrayProto.filter, 4335 nativeEvery = ArrayProto.every, 4336 nativeSome = ArrayProto.some, 4337 nativeIndexOf = ArrayProto.indexOf, 4338 nativeLastIndexOf = ArrayProto.lastIndexOf, 4339 nativeIsArray = Array.isArray, 4340 nativeKeys = Object.keys, 4341 nativeBind = FuncProto.bind; 4342 4343 // Collection Functions 4344 // -------------------- 4345 4346 // The cornerstone, an `each` implementation, aka `forEach`. 4347 // Handles objects with the built-in `forEach`, arrays, and raw objects. 4348 // Delegates to **ECMAScript 5**'s native `forEach` if available. 4349 var each = _.each = _.forEach = function(obj, iterator, context) { 4350 /* jshint shadow:true */ 4351 if (obj == null) return obj; 4352 if (nativeForEach && obj.forEach === nativeForEach) { 4353 obj.forEach(iterator, context); 4354 } else if (obj.length === +obj.length) { 4355 for (var i = 0, length = obj.length; i < length; i++) { 4356 if (iterator.call(context, obj[i], i, obj) === breaker) return; 4357 } 4358 } else { 4359 var keys = _.keys(obj); 4360 for (var i = 0, length = keys.length; i < length; i++) { 4361 if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; 4362 } 4363 } 4364 return obj; 4365 }; 4366 4367 // Return the results of applying the iterator to each element. 4368 // Delegates to **ECMAScript 5**'s native `map` if available. 4369 _.map = _.collect = function(obj, iterator, context) { 4370 var results = []; 4371 if (obj == null) return results; 4372 if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 4373 each(obj, function(value, index, list) { 4374 results.push(iterator.call(context, value, index, list)); 4375 }); 4376 return results; 4377 }; 4378 4379 // Return the first value which passes a truth test. Aliased as `detect`. 4380 _.find = _.detect = function(obj, predicate, context) { 4381 var result; 4382 any(obj, function(value, index, list) { 4383 if (predicate.call(context, value, index, list)) { 4384 result = value; 4385 return true; 4386 } 4387 }); 4388 return result; 4389 }; 4390 4391 // Return all the elements that pass a truth test. 4392 // Delegates to **ECMAScript 5**'s native `filter` if available. 4393 // Aliased as `select`. 4394 _.filter = _.select = function(obj, predicate, context) { 4395 var results = []; 4396 if (obj == null) return results; 4397 if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); 4398 each(obj, function(value, index, list) { 4399 if (predicate.call(context, value, index, list)) results.push(value); 4400 }); 4401 return results; 4402 }; 4403 4404 // Determine if at least one element in the object matches a truth test. 4405 // Delegates to **ECMAScript 5**'s native `some` if available. 4406 // Aliased as `any`. 4407 var any = _.some = _.any = function(obj, predicate, context) { 4408 predicate || (predicate = _.identity); 4409 var result = false;
4410 if (obj == null) return result; 4411 if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); 4412 each(obj, function(value, index, list) { 4413 if (result || (result = predicate.call(context, value, index, list))) return breaker; 4414 }); 4415 return !!result; 4416 }; 4417 4418 // Determine if the array or object contains a given value (using `===`). 4419 // Aliased as `include`. 4420 _.contains = _.include = function(obj, target) { 4421 if (obj == null) return false; 4422 if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; 4423 return any(obj, function(value) { 4424 return value === target; 4425 }); 4426 }; 4427 4428 // Function (ahem) Functions 4429 // -------------------- 4430 4431 // Delays a function for the given number of milliseconds, and then calls 4432 // it with the arguments supplied. 4433 _.delay = function(func, wait) { 4434 var args = slice.call(arguments, 2); 4435 return setTimeout(function(){ return func.apply(null, args); }, wait); 4436 }; 4437 4438 // Defers a function, scheduling it to run after the current call stack has 4439 // cleared. 4440 _.defer = function(func) { 4441 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); 4442 }; 4443 4444 // Returns a function, that, when invoked, will only be triggered once every 4445 // browser animation frame - using tram's requestAnimationFrame polyfill. 4446 _.throttle = function(func) { 4447 var wait, args, context; 4448 return function() { 4449 if (wait) return; 4450 wait = true; 4451 args = arguments; 4452 context = this; 4453 tram.frame(function() { 4454 wait = false; 4455 func.apply(context, args); 4456 }); 4457 }; 4458 }; 4459 4460 // Returns a function, that, as long as it continues to be invoked, will not 4461 // be triggered. The function will be called after it stops being called for 4462 // N milliseconds. If `immediate` is passed, trigger the function on the 4463 // leading edge, instead of the trailing. 4464 _.debounce = function(func, wait, immediate) { 4465 var timeout, args, context, timestamp, result; 4466 4467 var later = function() { 4468 var last = _.now() - timestamp; 4469 if (last < wait) { 4470 timeout = setTimeout(later, wait - last); 4471 } else { 4472 timeout = null; 4473 if (!immediate) { 4474 result = func.apply(context, args); 4475 context = args = null; 4476 } 4477 } 4478 }; 4479 4480 return function() { 4481 context = this; 4482 args = arguments; 4483 timestamp = _.now(); 4484 var callNow = immediate && !timeout; 4485 if (!timeout) { 4486 timeout = setTimeout(later, wait); 4487 } 4488 if (callNow) { 4489 result = func.apply(context, args); 4490 context = args = null; 4491 } 4492 4493 return result; 4494 }; 4495 }; 4496 4497 // Object Functions 4498 // ---------------- 4499 4500 // Fill in a given object with default properties. 4501 _.defaults = function(obj) { 4502 if (!_.isObject(obj)) return obj; 4503 for (var i = 1, length = arguments.length; i < length; i++) { 4504 var source = arguments[i]; 4505 for (var prop in source) { 4506 if (obj[prop] === void 0) obj[prop] = source[prop]; 4507 } 4508 } 4509 return obj; 4510 }; 4511 4512 // Retrieve the names of an object's properties. 4513 // Delegates to **ECMAScript 5**'s native `Object.keys` 4514 _.keys = function(obj) { 4515 if (!_.isObject(obj)) return []; 4516 if (nativeKeys) return nativeKeys(obj); 4517 var keys = []; 4518 for (var key in obj) if (_.has(obj, key)) keys.push(key); 4519 return keys; 4520 }; 4521 4522 // Shortcut function for checking if an object has a given property directly 4523 // on itself (in other words, not on a prototype). 4524 _.has = function(obj, key) { 4525 return hasOwnProperty.call(obj, key); 4526 }; 4527 4528 // Is a given variable an object? 4529 _.isObject = function(obj) { 4530 return obj === Object(obj); 4531 }; 4532 4533 // Utility Functions 4534 // ----------------- 4535 4536 // A (possibly faster) way to get the current timestamp as an integer. 4537 _.now = Date.now || function() { return new Date().getTime(); }; 4538 4539 // By default, Underscore uses ERB-style template delimiters, change the 4540 // following template settings to use alternative delimiters. 4541 _.templateSettings = { 4542 evaluate : /<%([\s\S]+?)%>/g, 4543 interpolate : /<%=([\s\S]+?)%>/g, 4544 escape : /<%-([\s\S]+?)%>/g 4545 }; 4546 4547 // When customizing `templateSettings`, if you don't want to define an 4548 // interpolation, evaluation or escaping regex, we need one that is 4549 // guaranteed not to match. 4550 var noMatch = /(.)^/; 4551 4552 // Certain characters need to be escaped so that they can be put into a 4553 // string literal. 4554 var escapes = { 4555 "'": "'", 4556 '\\': '\\', 4557 '\r': 'r', 4558 '\n': 'n', 4559 '\u2028': 'u2028', 4560 '\u2029': 'u2029' 4561 }; 4562 4563 var escaper = /\\|'|\r|\n|\u2028|\u2029/g; 4564 4565 var escapeChar = function(match) { 4566 return '\\' + escapes[match]; 4567 }; 4568 4569 // JavaScript micro-templating, similar to John Resig's implementation. 4570 // Underscore templating handles arbitrary delimiters, preserves whitespace, 4571 // and correctly escapes quotes within interpolated code. 4572 // NB: `oldSettings` only exists for backwards compatibility. 4573 _.template = function(text, settings, oldSettings) { 4574 if (!settings && oldSettings) settings = oldSettings; 4575 settings = _.defaults({}, settings, _.templateSettings); 4576 4577 // Combine delimiters into one regular expression via alternation. 4578 var matcher = RegExp([
4579 (settings.escape || noMatch).source, 4580 (settings.interpolate || noMatch).source, 4581 (settings.evaluate || noMatch).source 4582 ].join('|') + '|$', 'g'); 4583 4584 // Compile the template source, escaping string literals appropriately. 4585 var index = 0; 4586 var source = "__p+='"; 4587 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { 4588 source += text.slice(index, offset).replace(escaper, escapeChar); 4589 index = offset + match.length; 4590 4591 if (escape) { 4592 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; 4593 } else if (interpolate) { 4594 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; 4595 } else if (evaluate) { 4596 source += "';\n" + evaluate + "\n__p+='"; 4597 } 4598 4599 // Adobe VMs need the match returned to produce the correct offest. 4600 return match; 4601 }); 4602 source += "';\n"; 4603 4604 // If a variable is not specified, place data values in local scope. 4605 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; 4606 4607 source = "var __t,__p='',__j=Array.prototype.join," + 4608 "print=function(){__p+=__j.call(arguments,'');};\n" + 4609 source + 'return __p;\n'; 4610 4611 try { 4612 var render = new Function(settings.variable || 'obj', '_', source); 4613 } catch (e) { 4614 e.source = source; 4615 throw e; 4616 } 4617 4618 var template = function(data) { 4619 return render.call(this, data, _); 4620 }; 4621 4622 // Provide the compiled source as a convenience for precompilation. 4623 var argument = settings.variable || 'obj'; 4624 template.source = 'function(' + argument + '){\n' + source + '}'; 4625 4626 return template; 4627 }; 4628 4629 // Export underscore 4630 return _; 4631 }()); 4632 4633 4634/***/ }, 4635/* 22 */ 4636/***/ function(module, exports) { 4637 4638 /*! 4639 * jQuery-ajaxTransport-XDomainRequest - v1.0.3 4640 * 2014-12-16 WEBFLOW - Removed UMD wrapper 4641 * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest 4642 * Copyright (c) 2014 Jason Moon (@JSONMOON) 4643 * @license MIT (/blob/master/LICENSE.txt) 4644 */ 4645 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); 4646 4647/***/ } 4648/******/ ]);/** 4649 * ---------------------------------------------------------------------- 4650 * Webflow: Interactions: Init 4651 */ 4652Webflow.require('ix').init([ 4653 {"slug":"hide-speaker-overlay","name":"Hide speaker overlay","value":{"style":{"display":"none","opacity":0},"triggers":[]}}, 4654 {"slug":"hide-speaker-element","name":"Hide speaker element","value":{"style":{"opacity":0,"x":"0px","y":"20px","z":"0px"},"triggers":[]}}, 4655 {"slug":"show-speaker-overlay","name":"Show speaker overlay","value":{"style":{},"triggers":[{"type":"hover","selector":".speaker-overlay","descend":true,"stepsA":[{"display":"block","opacity":1,"transition":"opacity 400ms ease 0ms"}],"stepsB":[{"opacity":0,"transition":"opacity 200ms ease 0ms"}
4655,{"display":"none"}]},{"type":"hover","selector":".speaker-name","descend":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 400ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".section-divider","descend":true,"stepsA":[{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".speaker-title","descend":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".paragraph","descend":true,"stepsA":[{"wait":300},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".speaker-social-icons-wrapper","descend":true,"stepsA":[{"wait":500},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]}]}}, 4656 {"slug":"show-program-info","name":"Show program info","value":{"style":{},"triggers":[{"type":"click","selector":".program-hidden-info","siblings":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"opacity 300ms ease 0ms, height 300ms ease 0ms"}],"stepsB":[{"opacity":0,"height":"0px","transition":"opacity 200ms ease 0ms, height 200ms ease 0ms"},{"display":"none"}]}]}}, 4657 {"slug":"hide-program-info","name":"Hide program info","value":{"style":{"display":"none","opacity":0,"height":"0px"},"triggers":[]}}, 4658 {"slug":"page-header-fade-in","name":"Page header fade in","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4659 {"slug":"page-header-fade-in-2","name":"Page header fade in 2","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":400},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4660 {"slug":"page-header-fade-in-3","name":"Page header fade in 3","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4661 {"slug":"fade-in-on-scroll","name":"Fade in on scroll","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":500},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4662 {"slug":"fade-in-on-scroll-2","name":"Fade in on scroll 2","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":700},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4663 {"slug":"fade-in-on-scroll-divider","name":"Fade in on scroll (divider)","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":700},{"opacity":0.2,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4664 {"slug":"fade-in-on-scroll-3","name":"Fade in on scroll 3","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":900},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4665 {"slug":"fade-in-on-scroll-4","name":"Fade in on scroll 4","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":1100},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 4666 {"slug":"slider-title","name":"Slider title","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}}, 4667 {"slug":"slider-title-2","name":"Slider title 2","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}}, 4668 {"slug":"slider-title-3","name":"Slider title 3","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":800},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}} 4669]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.