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/******/ i: moduleId, 22/******/ l: false, 23/******/ exports: {} 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.l = 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/******/ // define getter function for harmony exports 44/******/ __webpack_require__.d = function(exports, name, getter) { 45/******/ if(!__webpack_require__.o(exports, name)) { 46/******/ Object.defineProperty(exports, name, { 47/******/ configurable: false, 48/******/ enumerable: true, 49/******/ get: getter 50/******/ }); 51/******/ } 52/******/ }; 53/******/ 54/******/ // getDefaultExport function for compatibility with non-harmony modules 55/******/ __webpack_require__.n = function(module) { 56/******/ var getter = module && module.__esModule ? 57/******/ function getDefault() { return module['default']; } : 58/******/ function getModuleExports() { return module; }; 59/******/ __webpack_require__.d(getter, 'a', getter); 60/******/ return getter; 61/******/ }; 62/******/ 63/******/ // Object.prototype.hasOwnProperty.call 64/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 65/******/ 66/******/ // __webpack_public_path__ 67/******/ __webpack_require__.p = ""; 68/******/ 69/******/ // Load entry module and return exports 70/******/ return __webpack_require__(__webpack_require__.s = 4); 71/******/ }) 72/************************************************************************/ 73/******/ ([ 74/* 0 */ 75/***/ (function(module, exports, __webpack_require__) { 76 77/** 78 * Webflow: Core site library 79 */ 80 81var Webflow = {}; 82var modules = {}; 83var primary = []; 84var secondary = window.Webflow || []; 85var $ = window.jQuery; 86var $win = $(window); 87var $doc = $(document); 88var isFunction = $.isFunction; 89var _ = Webflow._ = __webpack_require__(6); 90var tram = __webpack_require__(1) && $.tram; 91var domready = false; 92var destroyed = false; 93tram.config.hideBackface = false; 94tram.config.keepInherited = true; 95 96/** 97 * Webflow.define - Define a named module 98 * @param {string} name 99 * @param {function} factory 100 * @param {object} options 101 * @return {object} 102 */ 103Webflow.define = function (name, factory, options) { 104 if (modules[name]) unbindModule(modules[name]); 105 var instance = modules[name] = factory($, _, options) || {}; 106 bindModule(instance); 107 return instance; 108}; 109 110/** 111 * Webflow.require - Require a named module 112 * @param {string} name 113 * @return {object} 114 */ 115Webflow.require = function (name) { 116 return modules[name]; 117}; 118 119function bindModule(module) { 120 // If running in Webflow app, subscribe to design/preview events 121 if (Webflow.env()) { 122 isFunction(module.design) && $win.on('__wf_design', module.design); 123 isFunction(module.preview) && $win.on('__wf_preview', module.preview); 124 } 125 // Subscribe to front-end destroy event 126 isFunction(module.destroy) && $win.on('__wf_destroy', module.destroy); 127 // Look for ready method on module 128 if (module.ready && isFunction(module.ready)) { 129 addReady(module); 130 } 131} 132 133function addReady(module) { 134 // If domready has already happened, run ready method 135 if (domready) { 136 module.ready(); 137 return; 138 } 139 // Otherwise add ready method to the primary queue (only once) 140 if (_.contains(primary, module.ready)) return; 141 primary.push(module.ready); 142} 143 144function unbindModule(module) { 145 // Unsubscribe module from window events 146 isFunction(module.design) && $win.off('__wf_design', module.design); 147 isFunction(module.preview) && $win.off('__wf_preview', module.preview); 148 isFunction(module.destroy) && $win.off('__wf_destroy', module.destroy); 149 // Remove ready method from primary queue 150 if (module.ready && isFunction(module.ready)) { 151 removeReady(module); 152 } 153} 154 155function removeReady(module) { 156 primary = _.filter(primary, function (readyFn) { 157 return readyFn !== module.ready; 158 }); 159} 160 161/** 162 * Webflow.push - Add a ready handler into secondary queue 163 * @param {function} ready Callback to invoke on domready 164 */ 165Webflow.push = function (ready) { 166 // If domready has already happened, invoke handler 167 if (domready) { 168 isFunction(ready) && ready(); 169 return; 170 } 171 // Otherwise push into secondary queue 172 secondary.push(ready); 173}; 174 175/** 176 * Webflow.env - Get the state of the Webflow app 177 * @param {string} mode [optional] 178 * @return {boolean} 179 */ 180Webflow.env = function (mode) { 181 var designFlag = window.__wf_design; 182 var inApp = typeof designFlag !== 'undefined'; 183 if (!mode) return inApp; 184 if (mode === 'design') return inApp && designFlag; 185 if (mode === 'preview') return inApp && !designFlag; 186 if (mode === 'slug') return inApp && window.__wf_slug; 187 if (mode === 'editor') return window.WebflowEditor; 188 if (mode === 'test') return false || window.__wf_test; 189 if (mode === 'frame') return window !== window.top; 190}; 191 192// Feature detects + browser sniffs ಠ_ಠ193var userAgent = navigator.userAgent.toLowerCase(); 194var touch = Webflow.env.touch = 'ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch; 195var chrome = Webflow.env.chrome = /chrome/.test(userAgent) && /Google/.test(navigator.vendor) && parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10); 196var ios = Webflow.env.ios = /(ipod|iphone|ipad)/.test(userAgent); 197Webflow.env.safari = /safari/.test(userAgent) && !chrome && !ios; 198 199// Maintain current touch target to prevent late clicks on touch devices 200var touchTarget; 201// Listen for both events to support touch/mouse hybrid devices 202touch && $doc.on('touchstart mousedown', function (evt) { 203 touchTarget = evt.target; 204}); 205 206/** 207 * Webflow.validClick - validate click target against current touch target 208 * @param {HTMLElement} clickTarget Element being clicked 209 * @return {Boolean} True if click target is valid (always true on non-touch) 210 */ 211Webflow.validClick = touch ? function (clickTarget) { 212 return clickTarget === touchTarget || $.contains(clickTarget, touchTarget); 213} : function () { 214 return true; 215}; 216 217/** 218 * Webflow.resize, Webflow.scroll - throttled event proxies 219 */ 220var resizeEvents = 'resize.webflow orientationchange.webflow load.webflow';
221var scrollEvents = 'scroll.webflow ' + resizeEvents; 222Webflow.resize = eventProxy($win, resizeEvents); 223Webflow.scroll = eventProxy($win, scrollEvents); 224Webflow.redraw = eventProxy(); 225 226// Create a proxy instance for throttled events 227function eventProxy(target, types) { 228 229 // Set up throttled method (using custom frame-based _.throttle) 230 var handlers = []; 231 var proxy = {}; 232 proxy.up = _.throttle(function (evt) { 233 _.each(handlers, function (h) { 234 h(evt); 235 }); 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 271Webflow.location = function (url) { 272 window.location = url; 273}; 274 275if (Webflow.env()) { 276 // Ignore redirects inside a Webflow design/edit environment 277 Webflow.location = function () {}; 278} 279 280// Webflow.ready - Call primary and secondary handlers 281Webflow.ready = function () { 282 domready = true; 283 284 // Restore modules after destroy 285 if (destroyed) { 286 restoreModules(); 287 288 // Otherwise run primary ready methods 289 } else { 290 _.each(primary, callReady); 291 } 292 293 // Run secondary ready methods 294 _.each(secondary, callReady); 295 296 // Trigger resize 297 Webflow.resize.up(); 298}; 299 300function callReady(readyFn) { 301 isFunction(readyFn) && readyFn(); 302} 303 304function restoreModules() { 305 destroyed = false; 306 _.each(modules, bindModule); 307} 308 309/** 310 * Webflow.load - Add a window load handler that will run even if load event has already happened 311 * @param {function} handler 312 */ 313var deferLoad; 314Webflow.load = function (handler) { 315 deferLoad.then(handler); 316}; 317 318function bindLoad() { 319 // Reject any previous deferred (to support destroy) 320 if (deferLoad) { 321 deferLoad.reject(); 322 $win.off('load', deferLoad.resolve); 323 } 324 // Create deferred and bind window load event 325 deferLoad = new $.Deferred(); 326 $win.on('load', deferLoad.resolve); 327} 328 329// Webflow.destroy - Trigger a destroy event for all modules 330Webflow.destroy = function (options) { 331 options = options || {}; 332 destroyed = true; 333 $win.triggerHandler('__wf_destroy'); 334 335 // Allow domready reset for tests 336 if (options.domready != null) { 337 domready = options.domready; 338 } 339 340 // Unbind modules 341 _.each(modules, unbindModule); 342 343 // Clear any proxy event handlers 344 Webflow.resize.off(); 345 Webflow.scroll.off(); 346 Webflow.redraw.off(); 347 348 // Clear any queued ready methods 349 primary = []; 350 secondary = []; 351 352 // If load event has not yet fired, replace the deferred 353 if (deferLoad.state() === 'pending') bindLoad(); 354}; 355 356// Listen for domready 357$(Webflow.ready); 358 359// Listen for window.onload and resolve deferred 360bindLoad(); 361 362// Export commonjs module 363module.exports = window.Webflow = Webflow; 364 365/***/ }), 366/* 1 */ 367/***/ (function(module, exports) { 368 369var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 370 371/*! 372 * tram.js v0.8.2-global 373 * Cross-browser CSS3 transitions in JavaScript 374 * https://github.com/bkwld/tram 375 * MIT License 376 */ 377window.tram = function (a) { 378 function b(a, b) { 379 var c = new M.Bare();return c.init(a, b); 380 }function c(a) { 381 return a.replace(/[A-Z]/g, function (a) { 382 return "-" + a.toLowerCase(); 383 }); 384 }function d(a) { 385 var b = parseInt(a.slice(1), 16), 386 c = b >> 16 & 255, 387 d = b >> 8 & 255, 388 e = 255 & b;return [c, d, e]; 389 }function e(a, b, c) { 390 return "#" + (1 << 24 | a << 16 | b << 8 | c).toString(16).slice(1); 391 }function f() {}function g(a, b) { 392 j("Type warning: Expected: [" + a + "] Got: [" + (typeof b === "undefined" ? "undefined" : _typeof(b)) + "] " + b); 393 }function h(a, b, c) { 394 j("Units do not match [" + a + "]: " + b + ", " + c); 395 }function i(a, b, c) { 396 if (void 0 !== b && (c = b), void 0 === a) return c;var d = c;return $.test(a) || !_.test(a) ? d = parseInt(a, 10) : _.test(a) && (d = 1e3 * parseFloat(a)), 0 > d && (d = 0), d === d ? d : c; 397 }function j(a) { 398 U.debug && window && window.console.warn(a); 399 }function k(a) { 400 for (var b = -1, c = a ? a.length : 0, d = []; ++b < c;) { 401 var e = a[b];e && d.push(e); 402 }return d; 403 }var l = function (a, b, c) { 404 function d(a) { 405 return "object" == (typeof a === "undefined" ? "undefined" : _typeof(a)); 406 }function e(a) { 407 return "function" == typeof a; 408 }function f() {}function g(h, i) { 409 function j() { 410 var a = new k();return e(a.init) && a.init.apply(a, arguments), a; 411 }function k() {}i === c && (i = h, h = Object), j.Bare = k;var l, 412 m = f[a] = h[a], 413 n = k[a] = j[a] = new f();return n.constructor = j, j.mixin = function (b) { 414 return k[a] = j[a] = g(j, b)[a], j; 415 }, j.open = function (a) { 416 if (l = {}, e(a) ? l = a.call(j, n, m, j, h) : d(a) && (l = a), d(l)) for (var c in l) { 417 b.call(l, c) && (n[c] = l[c]); 418 }return e(n.init) || (n.init = h), j; 419 }, j.open(i); 420 }return g; 421 }("prototype", {}.hasOwnProperty), 422 m = { ease: ["ease", function (a, b, c, d) { 423 var e = (a /= d) * a, 424 f = e * a;return b + c * (-2.75 * f * e + 11 * e * e + -15.5 * f + 8 * e + .25 * a); 425 }], "ease-in": ["ease-in", function (a, b, c, d) { 426 var e = (a /= d) * a, 427 f = e * a;return b + c * (-1 * f * e + 3 * e * e + -3 * f + 2 * e); 428 }], "ease-out": ["ease-out", function (a, b, c, d) { 429 var e = (a /= d) * a, 430 f = e * a;return b + c * (.3 * f * e + -1.6 * e * e + 2.2 * f + -1.8 * e + 1.9 * a); 431 }], "ease-in-out": ["ease-in-out", function (a, b, c, d) { 432 var e = (a /= d) * a, 433 f = e * a;return b + c * (2 * f * e + -5 * e * e + 2 * f + 2 * e); 434 }], linear: ["linear", function (a, b, c, d) { 435 return c * a / d + b; 436 }], "ease-in-quad": ["cubic-bezier(0.550, 0.085, 0.680, 0.530)", function (a, b, c, d) { 437 return c * (a /= d) * a + b; 438 }], "ease-out-quad": ["cubic-bezier(0.250, 0.460, 0.450, 0.940)", function (a, b, c, d) { 439 return -c * (a /= d) * (a - 2) + b; 440 }], "ease-in-out-quad": ["cubic-bezier(0.455, 0.030, 0.515, 0.955)", function (a, b, c, d) { 441 return (a /= d / 2) < 1 ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b; 442 }], "ease-in-cubic": ["cubic-bezier(0.550, 0.055, 0.675, 0.190)", function (a, b, c, d) { 443 return c * (a /= d) * a * a + b; 444 }], "ease-out-cubic": ["cubic-bezier(0.215, 0.610, 0.355, 1)", function (a, b, c, d) { 445 return c * ((a = a / d - 1) * a * a + 1) + b; 446 }], "ease-in-out-cubic": ["cubic-bezier(0.645, 0.045, 0.355, 1)", function (a, b, c, d) { 447 return (a /= d / 2) < 1 ? c / 2 * a * a * a + b : c / 2 * ((a -= 2) * a * a + 2) + b; 448 }], "ease-in-quart": ["cubic-bezier(0.895, 0.030, 0.685, 0.220)", function (a, b, c, d) { 449 return c * (a /= d) * a * a * a + b; 450 }], "ease-out-quart": ["cubic-bezier(0.165, 0.840, 0.440, 1)", function (a, b, c, d) { 451 return -c * ((a = a / d - 1) * a * a * a - 1) + b; 452 }], "ease-in-out-quart": ["cubic-bezier(0.770, 0, 0.175, 1)", function (a, b, c, d) { 453 return (a /= d / 2) < 1 ? c / 2 * a * a * a * a + b : -c / 2 * ((a -= 2) * a * a * a - 2) + b; 454 }], "ease-in-quint": ["cubic-bezier(0.755, 0.050, 0.855, 0.060)", function (a, b, c, d) { 455 return c * (a /= d) * a * a * a * a + b; 456 }], "ease-out-quint": ["cubic-bezier(0.230, 1, 0.320, 1)", function (a, b, c, d) { 457 return c * ((a = a / d - 1) * a * a * a * a + 1) + b; 458 }], "ease-in-out-quint": ["cubic-bezier(0.860, 0, 0.070, 1)", function (a, b, c, d) { 459 return (a /= d / 2) < 1 ? c / 2 * a * a * a * a * a + b : c / 2 * ((a -= 2) * a * a * a * a + 2) + b; 460 }], "ease-in-sine": ["cubic-bezier(0.470, 0, 0.745, 0.715)", function (a, b, c, d) { 461 return -c * Math.cos(a / d * (Math.PI / 2)) + c + b; 462 }], "ease-out-sine": ["cubic-bezier(0.390, 0.575, 0.565, 1)", function (a, b, c, d) { 463 return c * Math.sin(a / d * (Math.PI / 2)) + b; 464 }], "ease-in-out-sine": ["cubic-bezier(0.445, 0.050, 0.550, 0.950)", function (a, b, c, d) { 465 return -c / 2 * (Math.cos(Math.PI * a / d) - 1) + b; 466 }], "ease-in-expo": ["cubic-bezier(0.950, 0.050, 0.795, 0.035)", function (a, b, c, d) { 467 return 0 === a ? b : c * Math.pow(2, 10 * (a / d - 1)) + b; 468 }], "ease-out-expo": ["cubic-bezier(0.190, 1, 0.220, 1)", function (a, b, c, d) { 469 return a === d ? b + c : c * (-Math.pow(2, -10 * a / d) + 1) + b; 470 }], "ease-in-out-expo": ["cubic-bezier(1, 0, 0, 1)", function (a, b, c, d) { 471 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; 472 }], "ease-in-circ": ["cubic-bezier(0.600, 0.040, 0.980, 0.335)", function (a, b, c, d) { 473 return -c * (Math.sqrt(1 - (a /= d) * a) - 1) + b; 474 }], "ease-out-circ": ["cubic-bezier(0.075, 0.820, 0.165, 1)", function (a, b, c, d) { 475 return c * Math.sqrt(1 - (a = a / d - 1) * a) + b; 476 }], "ease-in-out-circ": ["cubic-bezier(0.785, 0.135, 0.150, 0.860)", function (a, b, c, d) { 477 return (a /= d / 2) < 1 ? -c / 2 * (Math.sqrt(1 - a * a) - 1) + b : c / 2 * (Math.sqrt(1 - (a -= 2) * a) + 1) + b; 478 }], "ease-in-back": ["cubic-bezier(0.600, -0.280, 0.735, 0.045)", function (a, b, c, d, e) { 479 return void 0 === e && (e = 1.70158), c * (a /= d) * a * ((e + 1) * a - e) + b; 480 }], "ease-out-back": ["cubic-bezier(0.175, 0.885, 0.320, 1.275)", function (a, b, c, d, e) { 481 return void 0 === e && (e = 1.70158), c * ((a = a / d - 1) * a * ((e + 1) * a + e) + 1) + b; 482 }], "ease-in-out-back": ["cubic-bezier(0.680, -0.550, 0.265, 1.550)", function (a, b, c, d, e) { 483 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; 484 }] }, 485 n = { "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)" }, 486 o = document, 487 p = window, 488 q = "bkwld-tram", 489 r = /[\-\.0-9]/g, 490 s = /[A-Z]/, 491 t = "number", 492 u = /^(rgb|#)/, 493 v = /(em|cm|mm|in|pt|pc|px)$/, 494 w = /(em|cm|mm|in|pt|pc|px|%)$/, 495 x = /(deg|rad|turn)$/, 496 y = "unitless", 497 z = /(all|none) 0s ease 0s/, 498 A = /^(width|height)$/, 499 B = " ", 500 C = o.createElement("a"), 501 D = ["Webkit", "Moz", "O", "ms"], 502 E = ["-webkit-", "-moz-", "-o-", "-ms-"], 503 F = function F(a) { 504 if (a in C.style) return { dom: a, css: a };var b, 505 c, 506 d = "", 507 e = a.split("-");for (b = 0; b < e.length; b++) { 508 d += e[b].charAt(0).toUpperCase() + e[b].slice(1); 509 }for (b = 0; b < D.length; b++) { 510 if (c = D[b] + d, c in C.style) return { dom: c, css: E[b] + a }; 511 } 512 }, 513 G = b.support = { bind: Function.prototype.bind, transform: F("transform"), transition: F("transition"), backface: F("backface-visibility"), timing: F("transition-timing-function") };if (G.transition) { 514 var H = G.timing.dom;if (C.style[H] = m["ease-in-back"][0], !C.style[H]) for (var I in n) { 515 m[I][0] = n[I]; 516 } 517 }var J = b.frame = function () { 518 var a = p.requestAnimationFrame || p.webkitRequestAnimationFrame || p.mozRequestAnimationFrame || p.oRequestAnimationFrame || p.msRequestAnimationFrame;return a && G.bind ? a.bind(p) : function (a) { 519 p.setTimeout(a, 16); 520 }; 521 }(), 522 K = b.now = function () { 523 var a = p.performance, 524 b = a && (a.now || a.webkitNow || a.msNow || a.mozNow);return b && G.bind ? b.bind(a) : Date.now || function () { 525 return +new Date(); 526 }; 527 }(), 528 L = l(function (b) { 529 function d(a, b) { 530 var c = k(("" + a).split(B)), 531 d = c[0];b = b || {};var e = Y[d];if (!e) return j("Unsupported property: " + d);if (!b.weak || !this.props[d]) { 532 var f = e[0], 533 g = this.props[d];return g || (g = this.props[d] = new f.Bare()), g.init(this.$el, c, e, b), g; 534 } 535 }function e(a, b, c) { 536 if (a) { 537 var e = typeof a === "undefined" ? "undefined" : _typeof(a);if (b || (this.timer && this.timer.destroy(), this.queue = [], this.active = !1), "number" == e && b) return this.timer = new S({ duration: a, context: this, c
537omplete: h }), void (this.active = !0);if ("string" == e && b) { 538 switch (a) {case "hide": 539 o.call(this);break;case "stop": 540 l.call(this);break;case "redraw": 541 p.call(this);break;default: 542 d.call(this, a, c && c[1]);}return h.call(this); 543 }if ("function" == e) return void a.call(this, this);if ("object" == e) { 544 var f = 0;u.call(this, a, function (a, b) { 545 a.span > f && (f = a.span), a.stop(), a.animate(b); 546 }, function (a) { 547 "wait" in a && (f = i(a.wait, 0)); 548 }), t.call(this), f > 0 && (this.timer = new S({ duration: f, context: this }), this.active = !0, b && (this.timer.complete = h));var g = this, 549 j = !1, 550 k = {};J(function () { 551 u.call(g, a, function (a) { 552 a.active && (j = !0, k[a.name] = a.nextStyle); 553 }), j && g.$el.css(k); 554 }); 555 } 556 } 557 }function f(a) { 558 a = i(a, 0), this.active ? this.queue.push({ options: a }) : (this.timer = new S({ duration: a, context: this, complete: h }), this.active = !0); 559 }function g(a) { 560 return this.active ? (this.queue.push({ options: a, args: arguments }), void (this.timer.complete = h)) : j("No active transition timer. Use start() or wait() before then()."); 561 }function h() { 562 if (this.timer && this.timer.destroy(), this.active = !1, this.queue.length) { 563 var a = this.queue.shift();e.call(this, a.options, !0, a.args); 564 } 565 }function l(a) { 566 this.timer && this.timer.destroy(), this.queue = [], this.active = !1;var b;"string" == typeof a ? (b = {}, b[a] = 1) : b = "object" == (typeof a === "undefined" ? "undefined" : _typeof(a)) && null != a ? a : this.props, u.call(this, b, v), t.call(this); 567 }function m(a) { 568 l.call(this, a), u.call(this, a, w, x); 569 }function n(a) { 570 "string" != typeof a && (a = "block"), this.el.style.display = a; 571 }function o() { 572 l.call(this), this.el.style.display = "none"; 573 }function p() { 574 this.el.offsetHeight; 575 }function r() { 576 l.call(this), a.removeData(this.el, q), this.$el = this.el = null; 577 }function t() { 578 var a, 579 b, 580 c = [];this.upstream && c.push(this.upstream);for (a in this.props) { 581 b = this.props[a], b.active && c.push(b.string); 582 }c = c.join(","), this.style !== c && (this.style = c, this.el.style[G.transition.dom] = c); 583 }function u(a, b, e) { 584 var f, 585 g, 586 h, 587 i, 588 j = b !== v, 589 k = {};for (f in a) { 590 h = a[f], f in Z ? (k.transform || (k.transform = {}), k.transform[f] = h) : (s.test(f) && (f = c(f)), f in Y ? k[f] = h : (i || (i = {}), i[f] = h)); 591 }for (f in k) { 592 if (h = k[f], g = this.props[f], !g) { 593 if (!j) continue;g = d.call(this, f); 594 }b.call(this, g, h); 595 }e && i && e.call(this, i); 596 }function v(a) { 597 a.stop(); 598 }function w(a, b) { 599 a.set(b); 600 }function x(a) { 601 this.$el.css(a); 602 }function y(a, c) { 603 b[a] = function () { 604 return this.children ? A.call(this, c, arguments) : (this.el && c.apply(this, arguments), this); 605 }; 606 }function A(a, b) { 607 var c, 608 d = this.children.length;for (c = 0; d > c; c++) { 609 a.apply(this.children[c], b); 610 }return this; 611 }b.init = function (b) { 612 if (this.$el = a(b), this.el = this.$el[0], this.props = {}, this.queue = [], this.style = "", this.active = !1, U.keepInherited && !U.fallback) { 613 var c = W(this.el, "transition");c && !z.test(c) && (this.upstream = c); 614 }G.backface && U.hideBackface && V(this.el, G.backface.css, "hidden"); 615 }, y("add", d), y("start", e), y("wait", f), y("then", g), y("next", h), y("stop", l), y("set", m), y("show", n), y("hide", o), y("redraw", p), y("destroy", r); 616 }), 617 M = l(L, function (b) { 618 function c(b, c) { 619 var d = a.data(b, q) || a.data(b, q, new L.Bare());return d.el || d.init(b), c ? d.start(c) : d; 620 }b.init = function (b, d) { 621 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) { 622 f.push(c(b, d)); 623 }), this.children = f, this; 624 }; 625 }), 626 N = l(function (a) { 627 function b() { 628 var a = this.get();this.update("auto");var b = this.get();return this.update(a), b; 629 }function c(a, b, c) { 630 return void 0 !== b && (c = b), a in m ? a : c; 631 }function d(a) { 632 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"); 633 }var f = { duration: 500, ease: "ease", delay: 0 };a.init = function (a, b, d, e) { 634 this.$el = a, this.el = a[0];var g = b[0];d[2] && (g = d[2]), X[g] && (g = X[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 = A.test(this.name), this.unit = e.unit || this.unit || U.defaultUnit, this.angle = e.angle || this.angle || U.defaultAngle, U.fallback || e.fallback ? this.animate = this.fallback : (this.animate = this.transition, this.string = this.name + B + this.duration + "ms" + ("ease" != this.ease ? B + m[this.ease][0] : "") + (this.delay ? B + this.delay + "ms" : "")); 635 }, a.set = function (a) { 636 a = this.convert(a, this.type), this.update(a), this.redraw(); 637 }, a.transition = function (a) { 638 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; 639 }, a.fallback = function (a) { 640 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 R({ from: c, to: a, duration: this.duration, delay: this.delay, ease: this.ease, update: this.update, context: this }); 641 }, a.get = function () { 642 return W(this.el, this.name); 643 }, a.update = function (a) { 644 V(this.el, this.name, a); 645 }, a.stop = function () { 646 (this.active || this.nextStyle) && (this.active = !1, this.nextStyle = null, V(this.el, this.name, this.get()));var a = this.tween;a && a.context && a.destroy(); 647 }, a.convert = function (a, b) { 648 if ("auto" == a && this.auto) return a;var c, 649 e = "number" == typeof a, 650 f = "string" == typeof a;switch (b) {case t: 651 if (e) return a;if (f && "" === a.replace(r, "")) return +a;c = "number(unitless)";break;case u: 652 if (f) { 653 if ("" === a && this.original) return this.original;if (b.test(a)) return "#" == a.charAt(0) && 7 == a.length ? a : d(a); 654 }c = "hex or rgb string";break;case v: 655 if (e) return a + this.unit;if (f && b.test(a)) return a;c = "number(px) or string(unit)";break;case w: 656 if (e) return a + this.unit;if (f && b.test(a)) return a;c = "number(px) or string(unit or %)";break;case x: 657 if (e) return a + this.angle;if (f && b.test(a)) return a;c = "number(deg) or string(angle)";break;case y: 658 if (e) return a;if (f && w.test(a)) return a;c = "number(unitless) or string(unit or %)";}return g(c, a), a; 659 }, a.redraw = function () { 660 this.el.offsetHeight; 661 }; 662 }), 663 O = l(N, function (a, b) { 664 a.init = function () {
665 b.init.apply(this, arguments), this.original || (this.original = this.convert(this.get(), u)); 666 }; 667 }), 668 P = l(N, function (a, b) { 669 a.init = function () { 670 b.init.apply(this, arguments), this.animate = this.fallback; 671 }, a.get = function () { 672 return this.$el[this.name](); 673 }, a.update = function (a) { 674 this.$el[this.name](a); 675 }; 676 }), 677 Q = l(N, function (a, b) { 678 function c(a, b) { 679 var c, d, e, f, g;for (c in a) { 680 f = Z[c], e = f[0], d = f[1] || c, g = this.convert(a[c], e), b.call(this, d, g, e); 681 } 682 }a.init = function () { 683 b.init.apply(this, arguments), this.current || (this.current = {}, Z.perspective && U.perspective && (this.current.perspective = U.perspective, V(this.el, this.name, this.style(this.current)), this.redraw())); 684 }, a.set = function (a) { 685 c.call(this, a, function (a, b) { 686 this.current[a] = b; 687 }), V(this.el, this.name, this.style(this.current)), this.redraw(); 688 }, a.transition = function (a) { 689 var b = this.values(a);this.tween = new T({ current: this.current, values: b, duration: this.duration, delay: this.delay, ease: this.ease });var c, 690 d = {};for (c in this.current) { 691 d[c] = c in b ? b[c] : this.current[c]; 692 }this.active = !0, this.nextStyle = this.style(d); 693 }, a.fallback = function (a) { 694 var b = this.values(a);this.tween = new T({ current: this.current, values: b, duration: this.duration, delay: this.delay, ease: this.ease, update: this.update, context: this }); 695 }, a.update = function () { 696 V(this.el, this.name, this.style(this.current)); 697 }, a.style = function (a) { 698 var b, 699 c = "";for (b in a) { 700 c += b + "(" + a[b] + ") "; 701 }return c; 702 }, a.values = function (a) { 703 var b, 704 d = {};return c.call(this, a, function (a, c, e) { 705 d[a] = c, void 0 === this.current[a] && (b = 0, ~a.indexOf("scale") && (b = 1), this.current[a] = this.convert(b, e)); 706 }), d; 707 }; 708 }), 709 R = l(function (b) { 710 function c(a) { 711 1 === n.push(a) && J(g); 712 }function g() { 713 var a, 714 b, 715 c, 716 d = n.length;if (d) for (J(g), b = K(), a = d; a--;) { 717 c = n[a], c && c.render(b); 718 } 719 }function i(b) { 720 var c, 721 d = a.inArray(b, n);d >= 0 && (c = n.slice(d + 1), n.length = d, c.length && (n = n.concat(c))); 722 }function j(a) { 723 return Math.round(a * o) / o; 724 }function k(a, b, c) { 725 return e(a[0] + c * (b[0] - a[0]), a[1] + c * (b[1] - a[1]), a[2] + c * (b[2] - a[2])); 726 }var l = { ease: m.ease[1], from: 0, to: 1 };b.init = function (a) { 727 this.duration = a.duration || 0, this.delay = a.delay || 0;var b = a.ease || l.ease;m[b] && (b = m[b][1]), "function" != typeof b && (b = l.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, 728 d = a.to;void 0 === c && (c = l.from), void 0 === d && (d = l.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 = K(), a.autoplay !== !1 && this.play(); 729 }, b.play = function () { 730 this.active || (this.start || (this.start = K()), this.active = !0, c(this)); 731 }, b.stop = function () { 732 this.active && (this.active = !1, i(this)); 733 }, b.render = function (a) { 734 var b, 735 c = a - this.start;if (this.delay) { 736 if (c <= this.delay) return;c -= this.delay; 737 }if (c < this.duration) { 738 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); 739 }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(); 740 }, b.format = function (a, b) { 741 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) { 742 var c = b.replace(r, ""), 743 e = a.replace(r, "");c !== e && h("tween", b, a), this.unit = c; 744 }b = parseFloat(b), a = parseFloat(a), this.begin = this.value = b, this.change = a - b; 745 }, b.destroy = function () { 746 this.stop(), this.context = null, this.ease = this.update = this.complete = f; 747 };var n = [], 748 o = 1e3; 749 }),
750 S = l(R, function (a) { 751 a.init = function (a) { 752 this.duration = a.duration || 0, this.complete = a.complete || f, this.context = a.context, this.play(); 753 }, a.render = function (a) { 754 var b = a - this.start;b < this.duration || (this.complete.call(this.context), this.destroy()); 755 }; 756 }), 757 T = l(R, function (a, b) { 758 a.init = function (a) { 759 this.context = a.context, this.update = a.update, this.tweens = [], this.current = a.current;var b, c;for (b in a.values) { 760 c = a.values[b], this.current[b] !== c && this.tweens.push(new R({ name: b, from: this.current[b], to: c, duration: a.duration, delay: a.delay, ease: a.ease, autoplay: !1 })); 761 }this.play(); 762 }, a.render = function (a) { 763 var b, 764 c, 765 d = this.tweens.length, 766 e = !1;for (b = d; b--;) { 767 c = this.tweens[b], c.context && (c.render(a), this.current[c.name] = c.value, e = !0); 768 }return e ? void (this.update && this.update.call(this.context)) : this.destroy(); 769 }, a.destroy = function () { 770 if (b.destroy.call(this), this.tweens) { 771 var a, 772 c = this.tweens.length;for (a = c; a--;) { 773 this.tweens[a].destroy(); 774 }this.tweens = null, this.current = null; 775 } 776 }; 777 }), 778 U = b.config = { debug: !1, defaultUnit: "px", defaultAngle: "deg", keepInherited: !1, hideBackface: !1, perspective: "", fallback: !G.transition, agentTests: [] };b.fallback = function (a) { 779 if (!G.transition) return U.fallback = !0;U.agentTests.push("(" + a + ")");var b = new RegExp(U.agentTests.join("|"), "i");U.fallback = b.test(navigator.userAgent); 780 }, b.fallback("6.0.[2-5] Safari"), b.tween = function (a) { 781 return new R(a); 782 }, b.delay = function (a, b, c) { 783 return new S({ complete: b, duration: a, context: c }); 784 }, a.fn.tram = function (a) { 785 return b.call(null, this, a); 786 };var V = a.style, 787 W = a.css, 788 X = { transform: G.transform && G.transform.css }, 789 Y = { color: [O, u], background: [O, u, "background-color"], "outline-color": [O, u], "border-color": [O, u], "border-top-color": [O, u], "border-right-color": [O, u], "border-bottom-color": [O, u], "border-left-color": [O, u], "border-width": [N, v], "border-top-width": [N, v], "border-right-width": [N, v], "border-bottom-width": [N, v], "border-left-width": [N, v], "border-spacing": [N, v], "letter-spacing": [N, v], margin: [N, v], "margin-top": [N, v], "margin-right": [N, v], "margin-bottom": [N, v], "margin-left": [N, v], padding: [N, v], "padding-top": [N, v], "padding-right": [N, v], "padding-bottom": [N, v], "padding-left": [N, v], "outline-width": [N, v], opacity: [N, t], top: [N, w], right: [N, w], bottom: [N, w], left: [N, w], "font-size": [N, w], "text-indent": [N, w], "word-spacing": [N, w], width: [N, w], "min-width": [N, w], "max-width": [N, w], height: [N, w], "min-height": [N, w], "max-height": [N, w], "line-height": [N, y], "scroll-top": [P, t, "scrollTop"], "scroll-left": [P, t, "scrollLeft"] }, 790 Z = {};G.transform && (Y.transform = [Q], Z = { x: [w, "translateX"], y: [w, "translateY"], rotate: [x], rotateX: [x], rotateY: [x], scale: [t], scaleX: [t], scaleY: [t], skew: [x], skewX: [x], skewY: [x] }), G.transform && G.backface && (Z.z = [w, "translateZ"], Z.rotateZ = [x], Z.scaleZ = [t], Z.perspective = [v]);var $ = /ms/, 791 _ = /s|\./;return a.tram = b; 792}(window.jQuery); 793 794/***/ }), 795/* 2 */ 796/***/ (function(module, exports, __webpack_require__) { 797 798"use strict"; 799 800 801/** 802 * Webflow: IX Event triggers for other modules 803 */ 804 805var $ = window.jQuery; 806var api = {}; 807var eventQueue = []; 808var namespace = '.w-ix'; 809 810var eventTriggers = { 811 reset: function reset(i, el) { 812 el.__wf_intro = null; 813 }, 814 intro: function intro(i, el) { 815 if (el.__wf_intro) return; 816 el.__wf_intro = true; 817 $(el).triggerHandler(api.types.INTRO); 818 }, 819 outro: function outro(i, el) { 820 if (!el.__wf_intro) return; 821 el.__wf_intro = null; 822 $(el).triggerHandler(api.types.OUTRO); 823 } 824}; 825 826api.triggers = {}; 827 828api.types = { 829 INTRO: 'w-ix-intro' + namespace, 830 OUTRO: 'w-ix-outro' + namespace 831}; 832 833// Trigger any events in queue + restore trigger methods 834api.init = function () { 835 var count = eventQueue.length; 836 for (var i = 0; i < count; i++) { 837 var memo = eventQueue[i]; 838 memo[0](0, memo[1]); 839 } 840 eventQueue = []; 841 $.extend(api.triggers, eventTriggers); 842}; 843 844// Replace all triggers with async wrapper to queue events until init 845api.async = function () { 846 for (var key in eventTriggers) { 847 var func = eventTriggers[key]; 848 if (!eventTriggers.hasOwnProperty(key)) continue; 849 850 // Replace trigger method with async wrapper 851 api.triggers[key] = function (i, el) { 852 eventQueue.push([func, el]); 853 }; 854 } 855}; 856 857// Default triggers to async queue 858api.async(); 859 860module.exports = api; 861 862/***/ }), 863/* 3 */ 864/***/ (function(module, exports, __webpack_require__) { 865 866"use strict"; 867 868 869var IXEvents = __webpack_require__(2); 870 871function dispatchCustomEvent(element, eventName) { 872 var event = document.createEvent('CustomEvent'); 873 event.initCustomEvent(eventName, true, true, null); 874 element.dispatchEvent(event); 875} 876 877/** 878 * Webflow: IX Event triggers for other modules 879 */ 880 881var $ = window.jQuery; 882var api = {}; 883var namespace = '.w-ix'; 884 885var eventTriggers = { 886 reset: function reset(i, el) { 887 IXEvents.triggers.reset(i, el); 888 }, 889 intro: function intro(i, el) { 890 IXEvents.triggers.intro(i, el); 891 dispatchCustomEvent(el, 'COMPONENT_ACTIVE'); 892 }, 893 outro: function outro(i, el) { 894 IXEvents.triggers.outro(i, el); 895 dispatchCustomEvent(el, 'COMPONENT_INACTIVE'); 896 } 897}; 898 899api.triggers = {}; 900 901api.types = { 902 INTRO: 'w-ix-intro' + namespace, 903 OUTRO: 'w-ix-outro' + namespace 904}; 905 906$.extend(api.triggers, eventTriggers); 907 908module.exports = api; 909 910/***/ }), 911/* 4 */ 912/***/ (function(module, exports, __webpack_require__) { 913 914__webpack_require__(5); 915__webpack_require__(7); 916__webpack_require__(9); 917__webpack_require__(10); 918__webpack_require__(11); 919__webpack_require__(12); 920__webpack_require__(13); 921module.exports = __webpack_require__(14); 922 923 924/***/ }), 925/* 5 */ 926/***/ (function(module, exports, __webpack_require__) { 927 928/** 929 * Webflow: Brand pages on the subdomain 930 */ 931 932var Webflow = __webpack_require__(0); 933 934Webflow.define('brand', module.exports = function ($) { 935 var api = {}; 936 var $html = $('html'); 937 var $body = $('body'); 938 var namespace = '.w-webflow-badge'; 939 var location = window.location; 940 var isPhantom = /PhantomJS/i.test(navigator.userAgent); 941 var brandElement; 942 943 // ----------------------------------- 944 // Module methods 945 946 api.ready = function () { 947 var shouldBrand = $html.attr('data-wf-status'); 948 var publishedDomain = $html.attr('data-wf-domain') || ''; 949 if (/\.webflow\.io$/i.test(publishedDomain) && location.hostname !== publishedDomain) { 950 shouldBrand = true; 951 } 952 if (shouldBrand && !isPhantom) { 953 brandElement = brandElement || createBadge(); 954 ensureBrand(); 955 setTimeout(ensureBrand, 500); 956 } 957 }; 958 959 function createBadge() { 960 var $brand = $('<a class="w-webflow-badge"></a>').attr('href', 'https://webflow.com?utm_campaign=brandjs'); 961 962 var $logoArt = $('<img>').attr('src', 'https://d1otoma47x30pg.cloudfront.net/img/webflow-badge-icon.60efbf6ec9.svg').css({ 963 marginRight: '8px', 964 width: '16px' 965 }); 966 967 var $logoText = $('<img>').attr('src', 'https://d1otoma47x30pg.cloudfront.net/img/webflow-badge-text.6faa6a38cd.svg'); 968 969 $brand.append($logoArt, $logoText); 970 return $brand[0]; 971 } 972 973 function ensureBrand() { 974 var found = $body.children(namespace); 975 var match = found.length && found.get(0) === brandElement; 976 var inEditor = Webflow.env('editor'); 977 if (match) { 978 // Remove brand when Editor is active 979 if (inEditor) { 980 found.remove(); 981 } 982 // Exit early, brand is in place 983 return; 984 }
985 // Remove any invalid brand elements 986 if (found.length) { 987 found.remove(); 988 } 989 // Append the brand (unless Editor is active) 990 if (!inEditor) { 991 $body.append(brandElement); 992 } 993 } 994 995 // Export module 996 return api; 997}); 998 999/***/ }), 1000/* 6 */ 1001/***/ (function(module, exports, __webpack_require__) { 1002 1003// Include tram for frame-throttling 1004var $ = window.$; 1005var tram = __webpack_require__(1) && $.tram; 1006 1007/*eslint-disable */ 1008 1009/*! 1010 * Webflow._ (aka) Underscore.js 1.6.0 (custom build) 1011 * _.each 1012 * _.map 1013 * _.find 1014 * _.filter 1015 * _.any 1016 * _.contains 1017 * _.delay 1018 * _.defer 1019 * _.throttle (webflow) 1020 * _.debounce 1021 * _.keys 1022 * _.has 1023 * _.now 1024 * 1025 * http://underscorejs.org 1026 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 1027 * Underscore may be freely distributed under the MIT license. 1028 * @license MIT 1029 */ 1030module.exports = function () { 1031 var _ = {}; 1032 1033 // Current version. 1034 _.VERSION = '1.6.0-Webflow'; 1035 1036 // Establish the object that gets returned to break out of a loop iteration. 1037 var breaker = {}; 1038 1039 // Save bytes in the minified (but not gzipped) version: 1040 var ArrayProto = Array.prototype, 1041 ObjProto = Object.prototype, 1042 FuncProto = Function.prototype; 1043 1044 // Create quick reference variables for speed access to core prototypes. 1045 var push = ArrayProto.push, 1046 slice = ArrayProto.slice, 1047 concat = ArrayProto.concat, 1048 toString = ObjProto.toString, 1049 hasOwnProperty = ObjProto.hasOwnProperty; 1050 1051 // All **ECMAScript 5** native function implementations that we hope to use 1052 // are declared here. 1053 var nativeForEach = ArrayProto.forEach, 1054 nativeMap = ArrayProto.map, 1055 nativeReduce = ArrayProto.reduce, 1056 nativeReduceRight = ArrayProto.reduceRight, 1057 nativeFilter = ArrayProto.filter, 1058 nativeEvery = ArrayProto.every, 1059 nativeSome = ArrayProto.some, 1060 nativeIndexOf = ArrayProto.indexOf, 1061 nativeLastIndexOf = ArrayProto.lastIndexOf, 1062 nativeIsArray = Array.isArray, 1063 nativeKeys = Object.keys, 1064 nativeBind = FuncProto.bind; 1065 1066 // Collection Functions 1067 // -------------------- 1068 1069 // The cornerstone, an `each` implementation, aka `forEach`. 1070 // Handles objects with the built-in `forEach`, arrays, and raw objects. 1071 // Delegates to **ECMAScript 5**'s native `forEach` if available. 1072 var each = _.each = _.forEach = function (obj, iterator, context) { 1073 /* jshint shadow:true */ 1074 if (obj == null) return obj; 1075 if (nativeForEach && obj.forEach === nativeForEach) { 1076 obj.forEach(iterator, context); 1077 } else if (obj.length === +obj.length) { 1078 for (var i = 0, length = obj.length; i < length; i++) { 1079 if (iterator.call(context, obj[i], i, obj) === breaker) return; 1080 } 1081 } else { 1082 var keys = _.keys(obj); 1083 for (var i = 0, length = keys.length; i < length; i++) { 1084 if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; 1085 } 1086 } 1087 return obj; 1088 }; 1089 1090 // Return the results of applying the iterator to each element. 1091 // Delegates to **ECMAScript 5**'s native `map` if available. 1092 _.map = _.collect = function (obj, iterator, context) { 1093 var results = []; 1094 if (obj == null) return results; 1095 if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 1096 each(obj, function (value, index, list) { 1097 results.push(iterator.call(context, value, index, list)); 1098 }); 1099 return results; 1100 }; 1101 1102 // Return the first value which passes a truth test. Aliased as `detect`. 1103 _.find = _.detect = function (obj, predicate, context) { 1104 var result; 1105 any(obj, function (value, index, list) { 1106 if (predicate.call(context, value, index, list)) { 1107 result = value; 1108 return true; 1109 } 1110 }); 1111 return result; 1112 }; 1113 1114 // Return all the elements that pass a truth test. 1115 // Delegates to **ECMAScript 5**'s native `filter` if available. 1116 // Aliased as `select`. 1117 _.filter = _.select = function (obj, predicate, context) { 1118 var results = []; 1119 if (obj == null) return results; 1120 if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); 1121 each(obj, function (value, index, list) { 1122 if (predicate.call(context, value, index, list)) results.push(value); 1123 }); 1124 return results; 1125 }; 1126 1127 // Determine if at least one element in the object matches a truth test. 1128 // Delegates to **ECMAScript 5**'s native `some` if available. 1129 // Aliased as `any`. 1130 var any = _.some = _.any = function (obj, predicate, context) { 1131 predicate || (predicate = _.identity); 1132 var result = false;
1133 if (obj == null) return result; 1134 if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); 1135 each(obj, function (value, index, list) { 1136 if (result || (result = predicate.call(context, value, index, list))) return breaker; 1137 }); 1138 return !!result; 1139 }; 1140 1141 // Determine if the array or object contains a given value (using `===`). 1142 // Aliased as `include`. 1143 _.contains = _.include = function (obj, target) { 1144 if (obj == null) return false; 1145 if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; 1146 return any(obj, function (value) { 1147 return value === target; 1148 }); 1149 }; 1150 1151 // Function (ahem) Functions 1152 // -------------------- 1153 1154 // Delays a function for the given number of milliseconds, and then calls 1155 // it with the arguments supplied. 1156 _.delay = function (func, wait) { 1157 var args = slice.call(arguments, 2); 1158 return setTimeout(function () { 1159 return func.apply(null, args); 1160 }, wait); 1161 }; 1162 1163 // Defers a function, scheduling it to run after the current call stack has 1164 // cleared. 1165 _.defer = function (func) { 1166 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); 1167 }; 1168 1169 // Returns a function, that, when invoked, will only be triggered once every 1170 // browser animation frame - using tram's requestAnimationFrame polyfill. 1171 _.throttle = function (func) { 1172 var wait, args, context; 1173 return function () { 1174 if (wait) return; 1175 wait = true; 1176 args = arguments; 1177 context = this; 1178 tram.frame(function () { 1179 wait = false; 1180 func.apply(context, args); 1181 }); 1182 }; 1183 }; 1184 1185 // Returns a function, that, as long as it continues to be invoked, will not 1186 // be triggered. The function will be called after it stops being called for 1187 // N milliseconds. If `immediate` is passed, trigger the function on the 1188 // leading edge, instead of the trailing. 1189 _.debounce = function (func, wait, immediate) { 1190 var timeout, args, context, timestamp, result; 1191 1192 var later = function later() { 1193 var last = _.now() - timestamp; 1194 if (last < wait) { 1195 timeout = setTimeout(later, wait - last); 1196 } else { 1197 timeout = null; 1198 if (!immediate) { 1199 result = func.apply(context, args); 1200 context = args = null; 1201 } 1202 } 1203 }; 1204 1205 return function () { 1206 context = this; 1207 args = arguments; 1208 timestamp = _.now(); 1209 var callNow = immediate && !timeout; 1210 if (!timeout) { 1211 timeout = setTimeout(later, wait); 1212 } 1213 if (callNow) { 1214 result = func.apply(context, args); 1215 context = args = null; 1216 } 1217 1218 return result; 1219 }; 1220 }; 1221 1222 // Object Functions 1223 // ---------------- 1224 1225 // Fill in a given object with default properties. 1226 _.defaults = function (obj) { 1227 if (!_.isObject(obj)) return obj; 1228 for (var i = 1, length = arguments.length; i < length; i++) { 1229 var source = arguments[i]; 1230 for (var prop in source) { 1231 if (obj[prop] === void 0) obj[prop] = source[prop]; 1232 } 1233 } 1234 return obj; 1235 }; 1236 1237 // Retrieve the names of an object's properties. 1238 // Delegates to **ECMAScript 5**'s native `Object.keys` 1239 _.keys = function (obj) { 1240 if (!_.isObject(obj)) return []; 1241 if (nativeKeys) return nativeKeys(obj); 1242 var keys = []; 1243 for (var key in obj) { 1244 if (_.has(obj, key)) keys.push(key); 1245 }return keys; 1246 }; 1247 1248 // Shortcut function for checking if an object has a given property directly 1249 // on itself (in other words, not on a prototype). 1250 _.has = function (obj, key) { 1251 return hasOwnProperty.call(obj, key); 1252 }; 1253 1254 // Is a given variable an object? 1255 _.isObject = function (obj) { 1256 return obj === Object(obj); 1257 }; 1258 1259 // Utility Functions 1260 // ----------------- 1261 1262 // A (possibly faster) way to get the current timestamp as an integer. 1263 _.now = Date.now || function () { 1264 return new Date().getTime(); 1265 }; 1266 1267 // By default, Underscore uses ERB-style template delimiters, change the 1268 // following template settings to use alternative delimiters. 1269 _.templateSettings = { 1270 evaluate: /<%([\s\S]+?)%>/g, 1271 interpolate: /<%=([\s\S]+?)%>/g, 1272 escape: /<%-([\s\S]+?)%>/g 1273 }; 1274 1275 // When customizing `templateSettings`, if you don't want to define an 1276 // interpolation, evaluation or escaping regex, we need one that is 1277 // guaranteed not to match. 1278 var noMatch = /(.)^/; 1279 1280 // Certain characters need to be escaped so that they can be put into a 1281 // string literal. 1282 var escapes = { 1283 "'": "'", 1284 '\\': '\\', 1285 '\r': 'r', 1286 '\n': 'n', 1287 '\u2028': 'u2028', 1288 '\u2029': 'u2029' 1289 }; 1290 1291 var escaper = /\\|'|\r|\n|\u2028|\u2029/g; 1292 1293 var escapeChar = function escapeChar(match) { 1294 return '\\' + escapes[match]; 1295 }; 1296 1297 // JavaScript micro-templating, similar to John Resig's implementation. 1298 // Underscore templating handles arbitrary delimiters, preserves whitespace, 1299 // and correctly escapes quotes within interpolated code. 1300 // NB: `oldSettings` only exists for backwards compatibility. 1301 _.template = function (text, settings, oldSettings) { 1302 if (!settings && oldSettings) settings = oldSettings; 1303 settings = _.defaults({}, settings, _.templateSettings); 1304 1305 // Combine delimiters into one regular expression via alternation. 1306 var matcher = RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g'); 1307 1308 // Compile the template source, escaping string literals appropriately. 1309 var index = 0; 1310 var source = "__p+='"; 1311 text.replace(matcher, function (match, escape, interpolate, evaluate, offset) { 1312 source += text.slice(index, offset).replace(escaper, escapeChar); 1313 index = offset + match.length; 1314 1315 if (escape) { 1316 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; 1317 } else if (interpolate) { 1318 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1319 } else if (evaluate) { 1320 source += "';\n" + evaluate + "\n__p+='"; 1321 } 1322 1323 // Adobe VMs need the match returned to produce the correct offest. 1324 return match; 1325 }); 1326 source += "';\n"; 1327 1328 // If a variable is not specified, place data values in local scope. 1329 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; 1330 1331 source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + 'return __p;\n'; 1332 1333 try { 1334 var render = new Function(settings.variable || 'obj', '_', source); 1335 } catch (e) { 1336 e.source = source; 1337 throw e; 1338 } 1339 1340 var template = function template(data) { 1341 return render.call(this, data, _); 1342 }; 1343 1344 // Provide the compiled source as a convenience for precompilation. 1345 var argument = settings.variable || 'obj'; 1346 template.source = 'function(' + argument + '){\n' + source + '}'; 1347 1348 return template; 1349 }; 1350 1351 // Export underscore 1352 return _; 1353}(); 1354 1355/* eslint-enable */ 1356 1357/***/ }), 1358/* 7 */ 1359/***/ (function(module, exports, __webpack_require__) { 1360 1361/** 1362 * Webflow: Forms 1363 */ 1364 1365var Webflow = __webpack_require__(0); 1366 1367Webflow.define('forms', module.exports = function ($, _) { 1368 var api = {}; 1369 1370 // Cross-Domain AJAX for IE8 1371 __webpack_require__(8); 1372 1373 var $doc = $(document); 1374 var $forms; 1375 var loc = window.location; 1376 var retro = window.XDomainRequest && !window.atob; 1377 var namespace = '.w-form'; 1378 var siteId; 1379 var emailField = /e(-)?mail/i; 1380 var emailValue = /^\S+@\S+$/; 1381 var alert = window.alert; 1382 var inApp = Webflow.env(); 1383 var listening; 1384 1385 // MailChimp domains: list-manage.com + mirrors 1386 var chimpRegex = /list-manage[1-9]?.com/i; 1387 1388 var disconnected = _.debounce(function () { 1389 alert('Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.'); 1390 }, 100); 1391 1392 api.ready = api.design = api.preview = function () { 1393 // Init forms 1394 init(); 1395 1396 // Wire document events on published site only once 1397 if (!inApp && !listening) { 1398 addListeners(); 1399 } 1400 }; 1401 1402 function init() { 1403 siteId = $('html').attr('data-wf-site'); 1404 1405 $forms = $(namespace + ' form'); 1406 if (!$forms.length) return; 1407 $forms.each(build); 1408 } 1409 1410 function build(i, el) { 1411 // Store form state using namespace 1412 var $el = $(el); 1413 var data = $.data(el, namespace); 1414 if (!data) data = $.data(el, namespace, { form: $el }); // data.form 1415 1416 reset(data); 1417 var wrap = $el.closest('div.w-form'); 1418 data.done = wrap.find('> .w-form-done'); 1419 data.fail = wrap.find('> .w-form-fail'); 1420 1421 var action = data.action = $el.attr('action'); 1422 data.handler = null; 1423 data.redirect = $el.attr('data-redirect'); 1424 1425 // MailChimp form 1426 if (chimpRegex.test(action)) { 1427 data.handler = submitMailChimp;return; 1428 } 1429 1430 // Custom form action 1431 if (action) return; 1432 1433 // Webflow form 1434 if (siteId) { 1435 data.handler = submitWebflow;return; 1436 } 1437 1438 // Alert for disconnected Webflow forms 1439 disconnected(); 1440 } 1441 1442 function addListeners() { 1443 listening = true; 1444 1445 // Handle form submission for Webflow forms 1446 $doc.on('submit', namespace + ' form', function (evt) { 1447 var data = $.data(this, namespace); 1448 if (data.handler) { 1449 data.evt = evt; 1450 data.handler(data); 1451 } 1452 }); 1453 } 1454 1455 // Reset data common to all submit handlers 1456 function reset(data) { 1457 var btn = data.btn = data.form.find(':input[type="submit"]'); 1458 data.wait = data.btn.attr('data-wait') || null; 1459 data.success = false; 1460 btn.prop('disabled', false); 1461 data.label && btn.val(data.label); 1462 } 1463 1464 // Disable submit button 1465 function disableBtn(data) { 1466 var btn = data.btn; 1467 var wait = data.wait; 1468 btn.prop('disabled', true); 1469 // Show wait text and store previous label 1470 if (wait) { 1471 data.label = btn.val(); 1472 btn.val(wait); 1473 } 1474 } 1475 1476 // Find form fields, validate, and set value pairs 1477 function findFields(form, result) { 1478 var status = null; 1479 result = result || {}; 1480 1481 // The ":input" selector is a jQuery shortcut to select all inputs, selects, textareas 1482 form.find(':input:not([type="submit"])').each(function (i, el) { 1483 var field = $(el); 1484 var type = field.attr('type'); 1485 var name = field.attr('data-name') || field.attr('name') || 'Field ' + (i + 1); 1486 var value = field.val(); 1487 1488 if (type === 'checkbox') { 1489 value = field.is(':checked'); 1490 }if (type === 'radio') { 1491 // Radio group value already processed 1492 if (result[name] === null || typeof result[name] === 'string') { 1493 return; 1494 } 1495 1496 value = form.find('input[name="' + field.attr('name') + '"]:checked').val() || null; 1497 } 1498 1499 if (typeof value === 'string') value = $.trim(value); 1500 result[name] = value; 1501 status = status || getStatus(field, type, name, value); 1502 }); 1503 1504 return status; 1505 } 1506 1507 function getStatus(field, type, name, value) { 1508 var status = null; 1509 1510 if (type === 'password') { 1511 status = 'Passwords cannot be submitted.'; 1512 } else if (field.attr('required')) { 1513 if (!value) { 1514 status = 'Please fill out the required field: ' + name; 1515 } else if (emailField.test(name) || emailField.test(field.attr('type'))) { 1516 if (!emailValue.test(value)) status = 'Please enter a valid email address for: ' + name; 1517 } 1518 } 1519 1520 return status; 1521 } 1522 1523 // Submit form to Webflow 1524 function submitWebflow(data) { 1525 reset(data); 1526 1527 var form = data.form; 1528 var payload = { 1529 name: form.attr('data-name') || form.attr('name') || 'Untitled Form', 1530 source: loc.href, 1531 test: Webflow.env(), 1532 fields: {}, 1533 dolphin: /pass[\s-_]?(word|code)|secret|login|credentials/i.test(form.html()) 1534 }; 1535 1536 preventDefault(data); 1537 1538 // Find & populate all fields 1539 var status = findFields(form, payload.fields); 1540 if (status) return alert(status); 1541 1542 // Disable submit button 1543 disableBtn(data); 1544 1545 // Read site ID 1546 // NOTE: If this site is exported, the HTML tag must retain the data-wf-site attribute for forms to work 1547 if (!siteId) { 1548 afterSubmit(data);return; 1549 } 1550 var url = "https://webflow.com" + '/api/v1/form/' + siteId; 1551 1552 // Work around same-protocol IE XDR limitation - without this IE9 and below forms won't submit 1553 if (retro && url.indexOf("https://webflow.com") >= 0) { 1554 url = url.replace("https://webflow.com", "http://formdata.webflow.com"); 1555 } 1556 1557 $.ajax({ 1558 url: url, 1559 type: 'POST', 1560 data: payload, 1561 dataType: 'json', 1562 crossDomain: true 1563 }).done(function () { 1564 data.success = true; 1565 afterSubmit(data); 1566 }).fail(function () { 1567 afterSubmit(data); 1568 }); 1569 } 1570 1571 // Submit form to MailChimp 1572 function submitMailChimp(data) { 1573 reset(data); 1574 1575 var form = data.form; 1576 var payload = {}; 1577 1578 // Skip Ajax submission if http/s mismatch, fallback to POST instead 1579 if (/^https/.test(loc.href) && !/^https/.test(data.action)) { 1580 form.attr('method', 'post'); 1581 return; 1582 } 1583 1584 preventDefault(data); 1585 1586 // Find & populate all fields 1587 var status = findFields(form, payload); 1588 if (status) return alert(status); 1589 1590 // Disable submit button 1591 disableBtn(data); 1592 1593 // Use special format for MailChimp params 1594 var fullName; 1595 _.each(payload, function (value, key) { 1596 if (emailField.test(key)) payload.EMAIL = value; 1597 if (/^((full[ _-]?)?name)$/i.test(key)) fullName = value; 1598 if (/^(first[ _-]?name)$/i.test(key)) payload.FNAME = value; 1599 if (/^(last[ _-]?name)$/i.test(key)) payload.LNAME = value; 1600 }); 1601 1602 if (fullName && !payload.FNAME) { 1603 fullName = fullName.split(' '); 1604 payload.FNAME = fullName[0]; 1605 payload.LNAME = payload.LNAME || fullName[1]; 1606 } 1607 1608 // Use the (undocumented) MailChimp jsonp api 1609 var url = data.action.replace('/post?', '/post-json?') + '&c=?'; 1610 // Add special param to prevent bot signups 1611 var userId = url.indexOf('u=') + 2; 1612 userId = url.substring(userId, url.indexOf('&', userId)); 1613 var listId = url.indexOf('id=') + 3; 1614 listId = url.substring(listId, url.indexOf('&', listId)); 1615 payload['b_' + userId + '_' + listId] = ''; 1616 1617 $.ajax({ 1618 url: url, 1619 data: payload, 1620 dataType: 'jsonp' 1621 }).done(function (resp) { 1622 data.success = resp.result === 'success' || /already/.test(resp.msg); 1623 if (!data.success) console.info('MailChimp error: ' + resp.msg); 1624 afterSubmit(data); 1625 }).fail(function () { 1626 afterSubmit(data); 1627 }); 1628 } 1629 1630 // Common callback which runs after all Ajax submissions 1631 function afterSubmit(data) { 1632 var form = data.form; 1633 var redirect = data.redirect; 1634 var success = data.success; 1635 1636 // Redirect to a success url if defined 1637 if (success && redirect) { 1638 Webflow.location(redirect); 1639 return; 1640 } 1641 1642 // Show or hide status divs 1643 data.done.toggle(success); 1644 data.fail.toggle(!success); 1645 1646 // Hide form on success 1647 form.toggle(!success); 1648 1649 // Reset data and enable submit button 1650 reset(data); 1651 } 1652 1653 function preventDefault(data) { 1654 data.evt && data.evt.preventDefault(); 1655 data.evt = null; 1656 } 1657 1658 // Export module 1659 return api; 1660}); 1661 1662/***/ }), 1663/* 8 */
1664/***/ (function(module, exports) { 1665 1666/*! 1667 * jQuery-ajaxTransport-XDomainRequest - v1.0.3 1668 * 2014-12-16 WEBFLOW - Removed UMD wrapper 1669 * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest 1670 * Copyright (c) 2014 Jason Moon (@JSONMOON) 1671 * @license MIT (/blob/master/LICENSE.txt) 1672 */ 1673module.exports = function ($) { 1674 if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) { 1675 return; 1676 }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) { 1677 if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) { 1678 return; 1679 }var xdr = null;return { send: function send(headers, complete) { 1680 var postData = "";var userType = (userOptions.dataType || "").toLowerCase();xdr = new XDomainRequest();if (/^\d+$/.test(userOptions.timeout)) { 1681 xdr.timeout = userOptions.timeout; 1682 }xdr.ontimeout = function () { 1683 complete(500, "timeout"); 1684 };xdr.onload = function () { 1685 var allResponseHeaders = "Content-Length: " + xdr.responseText.length + "\r\nContent-Type: " + xdr.contentType;var status = { code: 200, message: "success" };var responses = { text: xdr.responseText };try { 1686 if (userType === "html" || /text\/html/i.test(xdr.contentType)) { 1687 responses.html = xdr.responseText; 1688 } else if (userType === "json" || userType !== "text" && /\/json/i.test(xdr.contentType)) { 1689 try { 1690 responses.json = JSON.parse(xdr.responseText); 1691 } catch (e) { 1692 status.code = 500;status.message = "parseerror"; 1693 } 1694 } else if (userType === "xml" || userType !== "text" && /\/xml/i.test(xdr.contentType)) { 1695 var doc = new ActiveXObject("Microsoft.XMLDOM");doc.async = false;try { 1696 doc.loadXML(xdr.responseText); 1697 } catch (e) { 1698 doc = undefined; 1699 }if (!doc || !doc.documentElement || doc.getElementsByTagName("parsererror").length) { 1700 status.code = 500;status.message = "parseerror";throw "Invalid XML: " + xdr.responseText; 1701 }responses.xml = doc; 1702 } 1703 } catch (parseMessage) { 1704 throw parseMessage; 1705 } finally { 1706 complete(status.code, status.message, responses, allResponseHeaders); 1707 } 1708 };xdr.onprogress = function () {};xdr.onerror = function () { 1709 complete(500, "error", { text: xdr.responseText }); 1710 };if (userOptions.data) { 1711 postData = $.type(userOptions.data) === "string" ? userOptions.data : $.param(userOptions.data); 1712 }xdr.open(options.type, options.url);xdr.send(postData); 1713 }, abort: function abort() { 1714 if (xdr) { 1715 xdr.abort(); 1716 } 1717 } }; 1718 }); 1719}(window.jQuery); 1720 1721/***/ }), 1722/* 9 */ 1723/***/ (function(module, exports, __webpack_require__) { 1724 1725/** 1726 * Webflow: Interactions 1727 */ 1728 1729var Webflow = __webpack_require__(0); 1730var IXEvents = __webpack_require__(2); 1731 1732Webflow.define('ix', module.exports = function ($, _) { 1733 var api = {}; 1734 var designer; 1735 var $win = $(window); 1736 var namespace = '.w-ix'; 1737 var tram = $.tram; 1738 var env = Webflow.env; 1739 var inApp = env(); 1740 var emptyFix = env.chrome && env.chrome < 35; 1741 var transNone = 'none 0s ease 0s'; 1742 var $subs = $(); 1743 var config = {}; 1744 var anchors = []; 1745 var loads = []; 1746 var readys = []; 1747 var destroyed; 1748 var readyDelay = 1; 1749 1750 // Component types and proxy selectors 1751 var components = { 1752 tabs: '.w-tab-link, .w-tab-pane', 1753 dropdown: '.w-dropdown', 1754 slider: '.w-slide', 1755 navbar: '.w-nav' 1756 }; 1757 1758 // ----------------------------------- 1759 // Module methods 1760 1761 api.init = function (list) { 1762 setTimeout(function () { 1763 configure(list); 1764 }, 1); 1765 }; 1766 1767 api.preview = function () { 1768 designer = false;
1769 readyDelay = 100; 1770 setTimeout(function () { 1771 configure(window.__wf_ix); 1772 }, 1); 1773 }; 1774 1775 api.design = function () { 1776 designer = true; 1777 api.destroy(); 1778 }; 1779 1780 api.destroy = function () { 1781 destroyed = true; 1782 $subs.each(teardown); 1783 Webflow.scroll.off(scroll); 1784 IXEvents.async(); 1785 anchors = []; 1786 loads = []; 1787 readys = []; 1788 }; 1789 1790 api.ready = function () { 1791 // Redirect IX init while in design/preview modes 1792 if (inApp) return env('design') ? api.design() : api.preview(); 1793 1794 // Ready should only be used after destroy, as a way to re-init 1795 if (config && destroyed) { 1796 destroyed = false; 1797 init(); 1798 } 1799 }; 1800 1801 api.run = run; 1802 api.style = inApp ? styleApp : stylePub; 1803 1804 // ----------------------------------- 1805 // Private methods 1806 1807 function configure(list) { 1808 if (!list) return; 1809 1810 // Map all interactions by slug 1811 config = {}; 1812 _.each(list, function (item) { 1813 config[item.slug] = item.value; 1814 }); 1815 1816 // Init ix after config 1817 init(); 1818 } 1819 1820 function init() { 1821 1822 initIX1Engine(); 1823 1824 // Need init IXEvents regardless if IX1 events exist since 1825 // IXEvents _also_ dispatch IX2 events. 1826 1827 // Trigger queued events, must happen after init 1828 IXEvents.init(); 1829 1830 // Trigger a redraw to ensure all IX intros play 1831 Webflow.redraw.up(); 1832 } 1833 1834 function initIX1Engine() { 1835 // Build each element's interaction keying from data attribute 1836 var els = $('[data-ix]'); 1837 if (!els.length) { 1838 return; 1839 } 1840 1841 els.each(teardown); 1842 els.each(build); 1843 1844 // Listen for scroll events if any anchors exist 1845 if (anchors.length) { 1846 Webflow.scroll.on(scroll); 1847 setTimeout(scroll, 1); 1848 } 1849 1850 // Handle loads or readys if they exist 1851 if (loads.length) Webflow.load(runLoads); 1852 if (readys.length) setTimeout(runReadys, readyDelay); 1853 } 1854 1855 function build(i, el) { 1856 var $el = $(el); 1857 var id = $el.attr('data-ix'); 1858 var ix = config[id]; 1859 if (!ix) return; 1860 var triggers = ix.triggers; 1861 if (!triggers) return; 1862 1863 // Set styles immediately to provide tram with starting transform values 1864 api.style($el, ix.style); 1865 1866 _.each(triggers, function (trigger) { 1867 var state = {}; 1868 var type = trigger.type; 1869 var stepsB = trigger.stepsB && trigger.stepsB.length; 1870 1871 function runA() { 1872 run(trigger, $el, { group: 'A' }); 1873 } 1874 function runB() { 1875 run(trigger, $el, { group: 'B' }); 1876 } 1877 1878 if (type === 'load') { 1879 trigger.preload && !inApp ? loads.push(runA) : readys.push(runA); 1880 return; 1881 } 1882 1883 if (type === 'click') { 1884 $el.on('click' + namespace, function (evt) { 1885 // Avoid late clicks on touch devices 1886 if (!Webflow.validClick(evt.currentTarget)) return; 1887 1888 // Prevent default on empty hash urls 1889 if ($el.attr('href') === '#') evt.preventDefault(); 1890 1891 run(trigger, $el, { group: state.clicked ? 'B' : 'A' }); 1892 if (stepsB) state.clicked = !state.clicked; 1893 }); 1894 $subs = $subs.add($el); 1895 return; 1896 } 1897 1898 if (type === 'hover') { 1899 $el.on('mouseenter' + namespace, runA); 1900 $el.on('mouseleave' + namespace, runB); 1901 $subs = $subs.add($el); 1902 return; 1903 } 1904 1905 if (type === 'scroll') { 1906 anchors.push({ 1907 el: $el, trigger: trigger, state: { active: false }, 1908 offsetTop: convert(trigger.offsetTop), 1909 offsetBot: convert(trigger.offsetBot) 1910 }); 1911 return; 1912 } 1913 1914 // Check for a proxy component selector 1915 // type == [tabs, dropdown, slider, navbar] 1916 var proxy = components[type]; 1917 if (proxy) { 1918 var $proxy = $el.closest(proxy); 1919 $proxy.on(IXEvents.types.INTRO, runA).on(IXEvents.types.OUTRO, runB); 1920 $subs = $subs.add($proxy); 1921 return; 1922 } 1923 }); 1924 } 1925 1926 function convert(offset) { 1927 if (!offset) return 0; 1928 offset = String(offset); 1929 var result = parseInt(offset, 10); 1930 if (result !== result) return 0; 1931 if (offset.indexOf('%') > 0) { 1932 result /= 100; 1933 if (result >= 1) result = 0.999; 1934 } 1935 return result; 1936 } 1937 1938 function teardown(i, el) { 1939 $(el).off(namespace); 1940 } 1941 1942 function scroll() { 1943 var viewTop = $win.scrollTop(); 1944 var viewHeight = $win.height(); 1945 1946 // Check each anchor for a valid scroll trigger 1947 var count = anchors.length; 1948 for (var i = 0; i < count; i++) { 1949 var anchor = anchors[i]; 1950 var $el = anchor.el; 1951 var trigger = anchor.trigger; 1952 var stepsB = trigger.stepsB && trigger.stepsB.length; 1953 var state = anchor.state; 1954 var top = $el.offset().top; 1955 var height = $el.outerHeight(); 1956 var offsetTop = anchor.offsetTop; 1957 var offsetBot = anchor.offsetBot; 1958 if (offsetTop < 1 && offsetTop > 0) offsetTop *= viewHeight; 1959 if (offsetBot < 1 && offsetBot > 0) offsetBot *= viewHeight; 1960 var active = top + height - offsetTop >= viewTop && top + offsetBot <= viewTop + viewHeight; 1961 if (active === state.active) continue; 1962 if (active === false && !stepsB) continue; 1963 state.active = active; 1964 run(trigger, $el, { group: active ? 'A' : 'B' }); 1965 } 1966 } 1967 1968 function runLoads() { 1969 var count = loads.length; 1970 for (var i = 0; i < count; i++) { 1971 loads[i](); 1972 } 1973 } 1974 1975 function runReadys() { 1976 var count = readys.length; 1977 for (var i = 0; i < count; i++) { 1978 readys[i](); 1979 } 1980 } 1981 1982 function run(trigger, $el, opts, replay) { 1983 opts = opts || {}; 1984 var done = opts.done; 1985 var preserve3d = trigger.preserve3d; 1986
1987 // Do not run in designer unless forced 1988 if (designer && !opts.force) return; 1989 1990 // Operate on a set of grouped steps 1991 var group = opts.group || 'A'; 1992 var loop = trigger['loop' + group]; 1993 var steps = trigger['steps' + group]; 1994 if (!steps || !steps.length) return; 1995 if (steps.length < 2) loop = false; 1996 1997 // One-time init before any loops 1998 if (!replay) { 1999 2000 // Find selector within element descendants, siblings, or query whole document 2001 var selector = trigger.selector; 2002 if (selector) { 2003 if (trigger.descend) { 2004 $el = $el.find(selector); 2005 } else if (trigger.siblings) { 2006 $el = $el.siblings(selector); 2007 } else { 2008 $el = $(selector); 2009 } 2010 if (inApp) $el.attr('data-ix-affect', 1); 2011 } 2012 2013 // Apply empty fix for certain Chrome versions 2014 if (emptyFix) $el.addClass('w-ix-emptyfix'); 2015 2016 // Set preserve3d for triggers with 3d transforms 2017 if (preserve3d) $el.css('transform-style', 'preserve-3d'); 2018 } 2019 2020 var _tram = tram($el); 2021 2022 // Add steps 2023 var meta = { omit3d: !preserve3d }; 2024 for (var i = 0; i < steps.length; i++) { 2025 addStep(_tram, steps[i], meta); 2026 } 2027 2028 function fin() { 2029 // Run trigger again if looped 2030 if (loop) return run(trigger, $el, opts, true); 2031 2032 // Reset any 'auto' values 2033 if (meta.width === 'auto') _tram.set({ width: 'auto' }); 2034 if (meta.height === 'auto') _tram.set({ height: 'auto' }); 2035 2036 // Run callback 2037 done && done(); 2038 } 2039 2040 // Add final step to queue if tram has started 2041 meta.start ? _tram.then(fin) : fin(); 2042 } 2043 2044 function addStep(_tram, step, meta) { 2045 var addMethod = 'add'; 2046 var startMethod = 'start'; 2047 2048 // Once the transition has started, we will always use then() to add to the queue. 2049 if (meta.start) addMethod = startMethod = 'then'; 2050 2051 // Parse transitions string on the current step 2052 var transitions = step.transition; 2053 if (transitions) { 2054 transitions = transitions.split(','); 2055 for (var i = 0; i < transitions.length; i++) { 2056 var transition = transitions[i]; 2057 _tram[addMethod](transition); 2058 } 2059 } 2060 2061 // Build a clean object to pass to the tram method 2062 var clean = tramify(step, meta) || {}; 2063 2064 // Store last width and height values 2065 if (clean.width != null) meta.width = clean.width; 2066 if (clean.height != null) meta.height = clean.height; 2067 2068 // When transitions are not present, set values immediately and continue queue. 2069 if (transitions == null) { 2070 2071 // If we have started, wrap set() in then() and reset queue 2072 if (meta.start) { 2073 _tram.then(function () { 2074 var queue = this.queue; 2075 this.set(clean); 2076 if (clean.display) { 2077 _tram.redraw(); 2078 Webflow.redraw.up(); 2079 } 2080 this.queue = queue; 2081 this.next(); 2082 }); 2083 } else { 2084 _tram.set(clean); 2085 2086 // Always redraw after setting display 2087 if (clean.display) { 2088 _tram.redraw(); 2089 Webflow.redraw.up(); 2090 } 2091 } 2092 2093 // Use the wait() method to kick off queue in absence of transitions. 2094 var wait = clean.wait; 2095 if (wait != null) { 2096 _tram.wait(wait); 2097 meta.start = true; 2098 } 2099 2100 // Otherwise, when transitions are present 2101 } else { 2102 2103 // If display is present, handle it separately 2104 if (clean.display) { 2105 var display = clean.display; 2106 delete clean.display; 2107 2108 // If we've already started, we need to wrap it in a then() 2109 if (meta.start) { 2110 _tram.then(function () { 2111 var queue = this.queue; 2112 this.set({ display: display }).redraw(); 2113 Webflow.redraw.up(); 2114 this.queue = queue; 2115 this.next(); 2116 }); 2117 } else { 2118 _tram.set({ display: display }).redraw(); 2119 Webflow.redraw.up(); 2120 } 2121 } 2122 2123 // Otherwise, start a transition using the current start method. 2124 _tram[startMethod](clean); 2125 meta.start = true; 2126 } 2127 } 2128 2129 // (In app) Set styles immediately and manage upstream transition
2130 function styleApp(el, data) { 2131 var _tram = tram(el); 2132 2133 // Exit early when data is empty to avoid clearing upstream 2134 if ($.isEmptyObject(data)) return; 2135 2136 // Get computed transition value 2137 el.css('transition', ''); 2138 var computed = el.css('transition'); 2139 2140 // If computed is set to none, clear upstream 2141 if (computed === transNone) computed = _tram.upstream = null; 2142 2143 // Set upstream transition to none temporarily 2144 _tram.upstream = transNone; 2145 2146 // Set values immediately 2147 _tram.set(tramify(data)); 2148 2149 // Only restore upstream in preview mode 2150 _tram.upstream = computed; 2151 } 2152 2153 // (Published) Set styles immediately on specified jquery element 2154 function stylePub(el, data) { 2155 tram(el).set(tramify(data)); 2156 } 2157 2158 // Build a clean object for tram 2159 function tramify(obj, meta) { 2160 var omit3d = meta && meta.omit3d; 2161 var result = {}; 2162 var found = false; 2163 for (var key in obj) { 2164 if (key === 'transition') continue; 2165 if (key === 'keysort') continue; 2166 if (omit3d) { 2167 if (key === 'z' || key === 'rotateX' || key === 'rotateY' || key === 'scaleZ') { 2168 continue; 2169 } 2170 } 2171 result[key] = obj[key]; 2172 found = true; 2173 } 2174 // If empty, return null for tram.set/stop compliance 2175 return found ? result : null; 2176 } 2177 2178 // Export module 2179 return api; 2180}); 2181 2182/***/ }), 2183/* 10 */ 2184/***/ (function(module, exports, __webpack_require__) { 2185 2186/** 2187 * Webflow: Auto-select links to current page or section 2188 */ 2189 2190var Webflow = __webpack_require__(0); 2191 2192Webflow.define('links', module.exports = function ($, _) { 2193 var api = {}; 2194 var $win = $(window); 2195 var designer; 2196 var inApp = Webflow.env(); 2197 var location = window.location; 2198 var tempLink = document.createElement('a'); 2199 var linkCurrent = 'w--current'; 2200 var validHash = /^#[\w:.-]+$/; 2201 var indexPage = /index\.(html|php)$/; 2202 var dirList = /\/$/; 2203 var anchors; 2204 var slug; 2205 2206 // ----------------------------------- 2207 // Module methods 2208 2209 api.ready = api.design = api.preview = init; 2210 2211 // ----------------------------------- 2212 // Private methods 2213 2214 function init() { 2215 designer = inApp && Webflow.env('design'); 2216 slug = Webflow.env('slug') || location.pathname || ''; 2217 2218 // Reset scroll listener, init anchors 2219 Webflow.scroll.off(scroll); 2220 anchors = []; 2221 2222 // Test all links for a selectable href 2223 var links = document.links; 2224 for (var i = 0; i < links.length; ++i) { 2225 select(links[i]); 2226 } 2227 2228 // Listen for scroll if any anchors exist 2229 if (anchors.length) { 2230 Webflow.scroll.on(scroll); 2231 scroll(); 2232 } 2233 } 2234 2235 function select(link) { 2236 var href = designer && link.getAttribute('href-disabled') || link.getAttribute('href'); 2237 tempLink.href = href; 2238 2239 // Ignore any hrefs with a colon to safely avoid all uri schemes 2240 if (href.indexOf(':') >= 0) return; 2241 2242 var $link = $(link); 2243 2244 // Check for valid hash links w/ sections and use scroll anchor 2245 if (href.indexOf('#') === 0 && validHash.test(href)) { 2246 var $section = $(href); 2247 $section.length && anchors.push({ link: $link, sec: $section, active: false }); 2248 return; 2249 } 2250 2251 // Ignore empty # links 2252 if (href === '#') return; 2253 2254 // Determine whether the link should be selected 2255 var match = tempLink.href === location.href || href === slug || indexPage.test(href) && dirList.test(slug); 2256 setClass($link, linkCurrent, match); 2257 } 2258 2259 function scroll() { 2260 var viewTop = $win.scrollTop(); 2261 var viewHeight = $win.height(); 2262 2263 // Check each anchor for a section in view 2264 _.each(anchors, function (anchor) { 2265 var $link = anchor.link; 2266 var $section = anchor.sec; 2267 var top = $section.offset().top; 2268 var height = $section.outerHeight(); 2269 var offset = viewHeight * 0.5; 2270 var active = $section.is(':visible') && top + height - offset >= viewTop && top + offset <= viewTop + viewHeight; 2271 if (anchor.active === active) return; 2272 anchor.active = active; 2273 setClass($link, linkCurrent, active); 2274 }); 2275 } 2276 2277 function setClass($elem, className, add) { 2278 var exists = $elem.hasClass(className); 2279 if (add && exists) return; 2280 if (!add && !exists) return; 2281 add ? $elem.addClass(className) : $elem.removeClass(className); 2282 } 2283 2284 // Export module 2285 return api; 2286}); 2287 2288/***/ }), 2289/* 11 */ 2290/***/ (function(module, exports, __webpack_require__) { 2291 2292/** 2293 * Webflow: Navbar component 2294 */ 2295 2296var Webflow = __webpack_require__(0); 2297var IXEvents = __webpack_require__(3); 2298 2299Webflow.define('navbar', module.exports = function ($, _) { 2300 var api = {}; 2301 var tram = $.tram; 2302 var $win = $(window); 2303 var $doc = $(document); 2304 var $body; 2305 var $navbars; 2306 var designer; 2307 var inApp = Webflow.env();
2308 var overlay = '<div class="w-nav-overlay" data-wf-ignore />'; 2309 var namespace = '.w-nav'; 2310 var buttonOpen = 'w--open'; 2311 var menuOpen = 'w--nav-menu-open'; 2312 var linkOpen = 'w--nav-link-open'; 2313 var ix = IXEvents.triggers; 2314 var menuSibling = $(); 2315 2316 // ----------------------------------- 2317 // Module methods 2318 2319 api.ready = api.design = api.preview = init; 2320 2321 api.destroy = function () { 2322 menuSibling = $(); 2323 removeListeners(); 2324 if ($navbars && $navbars.length) { 2325 $navbars.each(teardown); 2326 } 2327 }; 2328 2329 // ----------------------------------- 2330 // Private methods 2331 2332 function init() { 2333 designer = inApp && Webflow.env('design'); 2334 $body = $(document.body); 2335 2336 // Find all instances on the page 2337 $navbars = $doc.find(namespace); 2338 if (!$navbars.length) return; 2339 $navbars.each(build); 2340 2341 // Wire events 2342 removeListeners(); 2343 addListeners(); 2344 } 2345 2346 function removeListeners() { 2347 Webflow.resize.off(resizeAll); 2348 } 2349 2350 function addListeners() { 2351 Webflow.resize.on(resizeAll); 2352 } 2353 2354 function resizeAll() { 2355 $navbars.each(resize); 2356 } 2357 2358 function build(i, el) { 2359 var $el = $(el); 2360 2361 // Store state in data 2362 var data = $.data(el, namespace); 2363 if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} }); 2364 data.menu = $el.find('.w-nav-menu'); 2365 data.links = data.menu.find('.w-nav-link'); 2366 data.dropdowns = data.menu.find('.w-dropdown'); 2367 data.button = $el.find('.w-nav-button'); 2368 data.container = $el.find('.w-container'); 2369 data.outside = outside(data); 2370 2371 // Remove old events 2372 data.el.off(namespace); 2373 data.button.off(namespace); 2374 data.menu.off(namespace); 2375 2376 // Set config from data attributes 2377 configure(data); 2378 2379 // Add events based on mode 2380 if (designer) { 2381 removeOverlay(data); 2382 data.el.on('setting' + namespace, handler(data)); 2383 } else { 2384 addOverlay(data); 2385 data.button.on('tap' + namespace, toggle(data)); 2386 data.menu.on('click' + namespace, 'a', navigate(data)); 2387 } 2388 2389 // Trigger initial resize 2390 resize(i, el); 2391 } 2392 2393 function teardown(i, el) { 2394 var data = $.data(el, namespace); 2395 if (data) { 2396 removeOverlay(data); 2397 $.removeData(el, namespace); 2398 } 2399 } 2400 2401 function removeOverlay(data) { 2402 if (!data.overlay) return; 2403 close(data, true); 2404 data.overlay.remove(); 2405 data.overlay = null; 2406 } 2407 2408 function addOverlay(data) { 2409 if (data.overlay) return; 2410 data.overlay = $(overlay).appendTo(data.el); 2411 data.parent = data.menu.parent(); 2412 close(data, true); 2413 } 2414 2415 function configure(data) { 2416 var config = {}; 2417 var old = data.config || {}; 2418 2419 // Set config options from data attributes 2420 var animation = config.animation = data.el.attr('data-animation') || 'default'; 2421 config.animOver = /^over/.test(animation); 2422 config.animDirect = /left$/.test(animation) ? -1 : 1; 2423 2424 // Re-open menu if the animation type changed 2425 if (old.animation !== animation) { 2426 data.open && _.defer(reopen, data); 2427 } 2428 2429 config.easing = data.el.attr('data-easing') || 'ease'; 2430 config.easing2 = data.el.attr('data-easing2') || 'ease'; 2431 2432 var duration = data.el.attr('data-duration'); 2433 config.duration = duration != null ? Number(duration) : 400; 2434 2435 config.docHeight = data.el.attr('data-doc-height'); 2436 2437 // Store config in data 2438 data.config = config; 2439 } 2440 2441 function handler(data) { 2442 return function (evt, options) { 2443 options = options || {}; 2444 var winWidth = $win.width(); 2445 configure(data); 2446 options.open === true && open(data, true); 2447 options.open === false && close(data, true); 2448 // Reopen if media query changed after setting 2449 data.open && _.defer(function () { 2450 if (winWidth !== $win.width()) reopen(data); 2451 }); 2452 }; 2453 } 2454 2455 function reopen(data) { 2456 if (!data.open) return; 2457 close(data, true); 2458 open(data, true); 2459 } 2460 2461 function toggle(data) { 2462 // Debounce toggle to wait for accurate open state 2463 return _.debounce(function () { 2464 data.open ? close(data) : open(data); 2465 }); 2466 } 2467 2468 function navigate(data) { 2469 return function (evt) { 2470 var link = $(this); 2471 var href = link.attr('href'); 2472 2473 // Avoid late clicks on touch devices 2474 if (!Webflow.validClick(evt.currentTarget)) { 2475 evt.preventDefault(); 2476 return; 2477 } 2478 2479 // Close when navigating to an in-page anchor 2480 if (href && href.indexOf('#') === 0 && data.open) { 2481 close(data); 2482 } 2483 }; 2484 } 2485 2486 function outside(data) { 2487 // Unbind previous tap handler if it exists 2488 if (data.outside) $doc.off('tap' + namespace, data.outside); 2489 2490 // Close menu when tapped outside, debounced to wait for state 2491 return _.debounce(function (evt) { 2492 if (!data.open) return; 2493 var menu = $(evt.target).closest('.w-nav-menu'); 2494 if (!data.menu.is(menu)) { 2495 close(data); 2496 } 2497 }); 2498 } 2499 2500 function resize(i, el) { 2501 var data = $.data(el, namespace);
2502 // Check for collapsed state based on button display 2503 var collapsed = data.collapsed = data.button.css('display') !== 'none'; 2504 // Close menu if button is no longer visible (and not in designer) 2505 if (data.open && !collapsed && !designer) close(data, true); 2506 // Set max-width of links + dropdowns to match container 2507 if (data.container.length) { 2508 var updateEachMax = updateMax(data); 2509 data.links.each(updateEachMax); 2510 data.dropdowns.each(updateEachMax); 2511 } 2512 // If currently open, update height to match body 2513 if (data.open) { 2514 setOverlayHeight(data); 2515 } 2516 } 2517 2518 var maxWidth = 'max-width'; 2519 function updateMax(data) { 2520 // Set max-width of each element to match container 2521 var containMax = data.container.css(maxWidth); 2522 if (containMax === 'none') containMax = ''; 2523 return function (i, link) { 2524 link = $(link); 2525 link.css(maxWidth, ''); 2526 // Don't set the max-width if an upstream value exists 2527 if (link.css(maxWidth) === 'none') link.css(maxWidth, containMax); 2528 }; 2529 } 2530 2531 function open(data, immediate) { 2532 if (data.open) return; 2533 data.open = true; 2534 data.menu.addClass(menuOpen); 2535 data.links.addClass(linkOpen); 2536 data.button.addClass(buttonOpen); 2537 var config = data.config; 2538 var animation = config.animation; 2539 if (animation === 'none' || !tram.support.transform) immediate = true; 2540 var bodyHeight = setOverlayHeight(data); 2541 var menuHeight = data.menu.outerHeight(true); 2542 var menuWidth = data.menu.outerWidth(true); 2543 var navHeight = data.el.height(); 2544 var navbarEl = data.el[0]; 2545 resize(0, navbarEl); 2546 ix.intro(0, navbarEl); 2547 Webflow.redraw.up(); 2548 2549 // Listen for tap outside events 2550 if (!designer) $doc.on('tap' + namespace, data.outside); 2551 2552 // No transition for immediate 2553 if (immediate) return; 2554 2555 var transConfig = 'transform ' + config.duration + 'ms ' + config.easing; 2556 2557 // Add menu to overlay 2558 if (data.overlay) { 2559 menuSibling = data.menu.prev(); 2560 data.overlay.show().append(data.menu); 2561 } 2562 2563 // Over left/right 2564 if (config.animOver) { 2565 tram(data.menu).add(transConfig).set({ x: config.animDirect * menuWidth, height: bodyHeight }).start({ x: 0 }); 2566 data.overlay && data.overlay.width(menuWidth); 2567 return; 2568 } 2569 2570 // Drop Down 2571 var offsetY = navHeight + menuHeight; 2572 tram(data.menu).add(transConfig).set({ y: -offsetY }).start({ y: 0 }); 2573 } 2574 2575 function setOverlayHeight(data) { 2576 var config = data.config; 2577 var bodyHeight = config.docHeight ? $doc.height() : $body.height(); 2578 if (config.animOver) { 2579 data.menu.height(bodyHeight); 2580 } else if (data.el.css('position') !== 'fixed') { 2581 bodyHeight -= data.el.height(); 2582 } 2583 data.overlay && data.overlay.height(bodyHeight); 2584 return bodyHeight; 2585 } 2586 2587 function close(data, immediate) { 2588 if (!data.open) return; 2589 data.open = false; 2590 data.button.removeClass(buttonOpen); 2591 var config = data.config; 2592 if (config.animation === 'none' || !tram.support.transform || config.duration <= 0) immediate = true; 2593 ix.outro(0, data.el[0]); 2594 2595 // Stop listening for tap outside events 2596 $doc.off('tap' + namespace, data.outside); 2597 2598 if (immediate) { 2599 tram(data.menu).stop(); 2600 complete(); 2601 return; 2602 } 2603 2604 var transConfig = 'transform ' + config.duration + 'ms ' + config.easing2; 2605 var menuHeight = data.menu.outerHeight(true); 2606 var menuWidth = data.menu.outerWidth(true); 2607 var navHeight = data.el.height(); 2608 2609 // Over left/right 2610 if (config.animOver) { 2611 tram(data.menu).add(transConfig).start({ x: menuWidth * config.animDirect }).then(complete); 2612 return; 2613 } 2614 2615 // Drop Down 2616 var offsetY = navHeight + menuHeight; 2617 tram(data.menu).add(transConfig).start({ y: -offsetY }).then(complete); 2618 2619 function complete() { 2620 data.menu.height(''); 2621 tram(data.menu).set({ x: 0, y: 0 }); 2622 data.menu.removeClass(menuOpen); 2623 data.links.removeClass(linkOpen); 2624 if (data.overlay && data.overlay.children().length) { 2625 // Move menu back to parent at the original location 2626 menuSibling.length ? data.menu.insertAfter(menuSibling) : data.menu.prependTo(data.parent); 2627 data.overlay.attr('style', '').hide(); 2628 } 2629 2630 // Trigger event so other components can hook in (dropdown) 2631 data.el.triggerHandler('w-close'); 2632 } 2633 } 2634 2635 // Export module 2636 return api; 2637}); 2638 2639/***/ }), 2640/* 12 */ 2641/***/ (function(module, exports, __webpack_require__) { 2642 2643/** 2644 * Webflow: Smooth scroll 2645 */ 2646 2647var Webflow = __webpack_require__(0); 2648 2649Webflow.define('scroll', module.exports = function ($) { 2650 var $doc = $(document); 2651 var win = window; 2652 var loc = win.location; 2653 var history = inIframe() ? null : win.history;
2654 var validHash = /^[a-zA-Z0-9][\w:.-]*$/; 2655 2656 function inIframe() { 2657 try { 2658 return Boolean(win.frameElement); 2659 } catch (e) { 2660 return true; 2661 } 2662 } 2663 2664 function ready() { 2665 // If hash is already present on page load, scroll to it right away 2666 if (loc.hash) { 2667 findEl(loc.hash.substring(1)); 2668 } 2669 2670 // The current page url without the hash part. 2671 var locHref = loc.href.split('#')[0]; 2672 2673 // When clicking on a link, check if it links to another part of the page 2674 $doc.on('click', 'a', function (e) { 2675 if (Webflow.env('design')) { 2676 return; 2677 } 2678 2679 // Ignore links being used by jQuery mobile 2680 if (window.$.mobile && $(e.currentTarget).hasClass('ui-link')) return; 2681 2682 // Ignore empty # links 2683 if (this.getAttribute('href') === '#') { 2684 e.preventDefault(); 2685 return; 2686 } 2687 2688 // The href property always contains the full url so we can compare 2689 // with the documentâs location to only target links on this page. 2690 var parts = this.href.split('#'); 2691 var hash = parts[0] === locHref ? parts[1] : null; 2692 if (hash) { 2693 findEl(hash, e); 2694 } 2695 }); 2696 } 2697 2698 function findEl(hash, e) { 2699 if (!validHash.test(hash)) return; 2700 2701 var el = $('#' + hash); 2702 if (!el.length) { 2703 return; 2704 } 2705 2706 if (e) { 2707 e.preventDefault(); 2708 e.stopPropagation(); 2709 } 2710 2711 // Push new history state 2712 if (loc.hash !== hash && history && history.pushState && 2713 // Navigation breaks Chrome when the protocol is `file:`. 2714 !(Webflow.env.chrome && loc.protocol === 'file:')) { 2715 var oldHash = history.state && history.state.hash; 2716 if (oldHash !== hash) { 2717 history.pushState({ hash: hash }, '', '#' + hash); 2718 } 2719 } 2720 2721 // If a fixed header exists, offset for the height 2722 var rootTag = Webflow.env('editor') ? '.w-editor-body' : 'body'; 2723 var header = $('header, ' + rootTag + ' > .header, ' + rootTag + ' > .w-nav:not([data-no-scroll])'); 2724 var offset = header.css('position') === 'fixed' ? header.outerHeight() : 0; 2725 2726 win.setTimeout(function () { 2727 scroll(el, offset); 2728 }, e ? 0 : 300); 2729 } 2730 2731 function scroll(el, offset) { 2732 var start = $(win).scrollTop(); 2733 var end = el.offset().top - offset; 2734 2735 // If specified, scroll so that the element ends up in the middle of the viewport 2736 if (el.data('scroll') === 'mid') { 2737 var available = $(win).height() - offset; 2738 var elHeight = el.outerHeight(); 2739 if (elHeight < available) { 2740 end -= Math.round((available - elHeight) / 2); 2741 } 2742 } 2743 2744 var mult = 1; 2745 2746 // Check for custom time multiplier on the body and the element 2747 $('body').add(el).each(function () { 2748 var time = parseFloat($(this).attr('data-scroll-time'), 10); 2749 if (!isNaN(time) && (time === 0 || time > 0)) { 2750 mult = time; 2751 } 2752 }); 2753 2754 // Shim for IE8 and below 2755 if (!Date.now) { 2756 Date.now = function () { 2757 return new Date().getTime(); 2758 }; 2759 } 2760 2761 var clock = Date.now(); 2762 var animate = win.requestAnimationFrame || win.mozRequestAnimationFrame || win.webkitRequestAnimationFrame || function (fn) { 2763 win.setTimeout(fn, 15); 2764 }; 2765 var duration = (472.143 * Math.log(Math.abs(start - end) + 125) - 2000) * mult; 2766 2767 var step = function step() { 2768 var elapsed = Date.now() - clock; 2769 win.scroll(0, getY(start, end, elapsed, duration)); 2770 2771 if (elapsed <= duration) { 2772 animate(step); 2773 } 2774 }; 2775 2776 step(); 2777 } 2778 2779 function getY(start, end, elapsed, duration) { 2780 if (elapsed > duration) { 2781 return end; 2782 } 2783 2784 return start + (end - start) * ease(elapsed / duration); 2785 } 2786 2787 function ease(t) { 2788 return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; 2789 } 2790 2791 // Export module 2792 return { ready: ready }; 2793}); 2794 2795/***/ }), 2796/* 13 */ 2797/***/ (function(module, exports, __webpack_require__) { 2798 2799/** 2800 * Webflow: Tabs component 2801 */ 2802 2803var Webflow = __webpack_require__(0); 2804var IXEvents = __webpack_require__(3); 2805 2806Webflow.define('tabs', module.exports = function ($) { 2807 var api = {}; 2808 var tram = $.tram; 2809 var $doc = $(document); 2810 var $tabs; 2811 var design; 2812 var env = Webflow.env; 2813 var safari = env.safari; 2814 var inApp = env(); 2815 var tabAttr = 'data-w-tab'; 2816 var namespace = '.w-tabs'; 2817 var linkCurrent = 'w--current'; 2818 var tabActive = 'w--tab-active'; 2819 var ix = IXEvents.triggers; 2820 2821 var inRedraw = false;
2822 2823 // ----------------------------------- 2824 // Module methods 2825 2826 api.ready = api.design = api.preview = init; 2827 2828 api.redraw = function () { 2829 inRedraw = true; 2830 init(); 2831 inRedraw = false; 2832 }; 2833 2834 api.destroy = function () { 2835 $tabs = $doc.find(namespace); 2836 if (!$tabs.length) return; 2837 $tabs.each(resetIX); 2838 removeListeners(); 2839 }; 2840 2841 // ----------------------------------- 2842 // Private methods 2843 2844 function init() { 2845 design = inApp && Webflow.env('design'); 2846 2847 // Find all instances on the page 2848 $tabs = $doc.find(namespace); 2849 if (!$tabs.length) return; 2850 $tabs.each(build); 2851 if (Webflow.env('preview') && !inRedraw) { 2852 $tabs.each(resetIX); 2853 } 2854 2855 removeListeners(); 2856 addListeners(); 2857 } 2858 2859 function removeListeners() { 2860 Webflow.redraw.off(api.redraw); 2861 } 2862 2863 function addListeners() { 2864 Webflow.redraw.on(api.redraw); 2865 } 2866 2867 function resetIX(i, el) { 2868 var data = $.data(el, namespace); 2869 if (!data) return; 2870 data.links && data.links.each(ix.reset); 2871 data.panes && data.panes.each(ix.reset); 2872 } 2873 2874 function build(i, el) { 2875 var $el = $(el); 2876 2877 // Store state in data 2878 var data = $.data(el, namespace); 2879 if (!data) data = $.data(el, namespace, { el: $el, config: {} }); 2880 data.current = null; 2881 data.menu = $el.children('.w-tab-menu'); 2882 data.links = data.menu.children('.w-tab-link'); 2883 data.content = $el.children('.w-tab-content'); 2884 data.panes = data.content.children('.w-tab-pane'); 2885 2886 // Remove old events 2887 data.el.off(namespace); 2888 data.links.off(namespace); 2889 2890 // Set config from data attributes 2891 configure(data); 2892 2893 // Wire up events when not in design mode 2894 if (!design) { 2895 data.links.on('click' + namespace, linkSelect(data)); 2896 2897 // Trigger first intro event from current tab 2898 var $link = data.links.filter('.' + linkCurrent); 2899 var tab = $link.attr(tabAttr); 2900 tab && changeTab(data, { tab: tab, immediate: true }); 2901 } 2902 } 2903 2904 function configure(data) { 2905 var config = {}; 2906 2907 // Set config options from data attributes 2908 config.easing = data.el.attr('data-easing') || 'ease'; 2909 2910 var intro = parseInt(data.el.attr('data-duration-in'), 10); 2911 intro = config.intro = intro === intro ? intro : 0; 2912 2913 var outro = parseInt(data.el.attr('data-duration-out'), 10); 2914 outro = config.outro = outro === outro ? outro : 0; 2915 2916 config.immediate = !intro && !outro; 2917 2918 // Store config in data 2919 data.config = config; 2920 } 2921 2922 function linkSelect(data) { 2923 return function (evt) { 2924 var tab = evt.currentTarget.getAttribute(tabAttr); 2925 tab && changeTab(data, { tab: tab }); 2926 }; 2927 } 2928 2929 function changeTab(data, options) { 2930 options = options || {}; 2931 2932 var config = data.config; 2933 var easing = config.easing; 2934 var tab = options.tab; 2935 2936 // Don't select the same tab twice 2937 if (tab === data.current) return; 2938 data.current = tab; 2939 2940 // Select the current link 2941 data.links.each(function (i, el) { 2942 var $el = $(el); 2943 if (el.getAttribute(tabAttr) === tab) $el.addClass(linkCurrent).each(ix.intro);else if ($el.hasClass(linkCurrent)) $el.removeClass(linkCurrent).each(ix.outro); 2944 }); 2945 2946 // Find the new tab panes and keep track of previous 2947 var targets = []; 2948 var previous = []; 2949 data.panes.each(function (i, el) { 2950 var $el = $(el); 2951 if (el.getAttribute(tabAttr) === tab) { 2952 targets.push(el); 2953 } else if ($el.hasClass(tabActive)) { 2954 previous.push(el); 2955 } 2956 }); 2957 2958 var $targets = $(targets); 2959 var $previous = $(previous); 2960 2961 // Switch tabs immediately and bypass transitions 2962 if (options.immediate || config.immediate) { 2963 $targets.addClass(tabActive).each(ix.intro); 2964 $previous.removeClass(tabActive); 2965 // Redraw to benefit components in the hidden tab pane 2966 // But only if not currently in the middle of a redraw 2967 if (!inRedraw) Webflow.redraw.up(); 2968 return; 2969 } 2970 2971 // Fade out the currently active tab before intro 2972 if ($previous.length && config.outro) { 2973 $previous.each(ix.outro); 2974 tram($previous).add('opacity ' + config.outro + 'ms ' + easing, { fallback: safari }).start({ opacity: 0 }).then(intro); 2975 } else { 2976 // Skip the outro and play intro 2977 intro(); 2978 } 2979 2980 // Fade in the new target 2981 function intro() { 2982 // Clear previous active class + styles touched by tram
2983 // We cannot remove the whole inline style because it could be dynamically bound 2984 $previous.removeClass(tabActive).css({ 2985 opacity: '', 2986 transition: '', 2987 transform: '', 2988 width: '', 2989 height: '' 2990 }); 2991 2992 // Add active class to new target 2993 $targets.addClass(tabActive).each(ix.intro); 2994 Webflow.redraw.up(); 2995 2996 // Set opacity immediately if intro is zero 2997 if (!config.intro) return tram($targets).set({ opacity: 1 }); 2998 2999 // Otherwise fade in opacity 3000 tram($targets).set({ opacity: 0 }).redraw().add('opacity ' + config.intro + 'ms ' + easing, { fallback: safari }).start({ opacity: 1 }); 3001 } 3002 } 3003 3004 // Export module 3005 return api; 3006}); 3007 3008/***/ }), 3009/* 14 */ 3010/***/ (function(module, exports, __webpack_require__) { 3011 3012/** 3013 * Webflow: Touch events 3014 */ 3015 3016var Webflow = __webpack_require__(0); 3017 3018Webflow.define('touch', module.exports = function ($) { 3019 var api = {}; 3020 var fallback = !document.addEventListener; 3021 var getSelection = window.getSelection; 3022 3023 // Fallback to click events in old IE 3024 if (fallback) { 3025 $.event.special.tap = { bindType: 'click', delegateType: 'click' }; 3026 } 3027 3028 api.init = function (el) { 3029 if (fallback) return null; 3030 el = typeof el === 'string' ? $(el).get(0) : el; 3031 return el ? new Touch(el) : null; 3032 }; 3033 3034 function Touch(el) { 3035 var active = false; 3036 var dirty = false; 3037 var useTouch = false; 3038 var thresholdX = Math.min(Math.round(window.innerWidth * 0.04), 40); 3039 var startX; 3040 var startY; 3041 var lastX; 3042 3043 el.addEventListener('touchstart', start, false); 3044 el.addEventListener('touchmove', move, false); 3045 el.addEventListener('touchend', end, false); 3046 el.addEventListener('touchcancel', cancel, false); 3047 el.addEventListener('mousedown', start, false); 3048 el.addEventListener('mousemove', move, false); 3049 el.addEventListener('mouseup', end, false); 3050 el.addEventListener('mouseout', cancel, false); 3051 3052 function start(evt) { 3053 // We donât handle multi-touch events yet. 3054 var touches = evt.touches; 3055 if (touches && touches.length > 1) { 3056 return; 3057 } 3058 3059 active = true; 3060 dirty = false; 3061 3062 if (touches) { 3063 useTouch = true; 3064 startX = touches[0].clientX; 3065 startY = touches[0].clientY; 3066 } else { 3067 startX = evt.clientX; 3068 startY = evt.clientY; 3069 } 3070 3071 lastX = startX; 3072 } 3073 3074 function move(evt) { 3075 if (!active) return; 3076 3077 if (useTouch && evt.type === 'mousemove') { 3078 evt.preventDefault(); 3079 evt.stopPropagation(); 3080 return; 3081 } 3082 3083 var touches = evt.touches; 3084 var x = touches ? touches[0].clientX : evt.clientX; 3085 var y = touches ? touches[0].clientY : evt.clientY; 3086 3087 var velocityX = x - lastX; 3088 lastX = x; 3089 3090 // Allow swipes while pointer is down, but prevent them during text selection 3091 if (Math.abs(velocityX) > thresholdX && getSelection && String(getSelection()) === '') { 3092 triggerEvent('swipe', evt, { direction: velocityX > 0 ? 'right' : 'left' }); 3093 cancel(); 3094 } 3095 3096 // If pointer moves more than 10px flag to cancel tap 3097 if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) { 3098 dirty = true; 3099 } 3100 } 3101 3102 function end(evt) { 3103 if (!active) return; 3104 active = false; 3105 3106 if (useTouch && evt.type === 'mouseup') { 3107 evt.preventDefault(); 3108 evt.stopPropagation(); 3109 useTouch = false; 3110 return; 3111 } 3112 3113 if (!dirty) triggerEvent('tap', evt); 3114 } 3115 3116 function cancel() { 3117 active = false; 3118 } 3119 3120 function destroy() { 3121 el.removeEventListener('touchstart', start, false); 3122 el.removeEventListener('touchmove', move, false); 3123 el.removeEventListener('touchend', end, false); 3124 el.removeEventListener('touchcancel', cancel, false); 3125 el.removeEventListener('mousedown', start, false); 3126 el.removeEventListener('mousemove', move, false); 3127 el.removeEventListener('mouseup', end, false); 3128 el.removeEventListener('mouseout', cancel, false); 3129 el = null; 3130 } 3131 3132 // Public instance methods 3133 this.destroy = destroy; 3134 } 3135 3136 // Wrap native event to supoprt preventdefault + stopPropagation 3137 function triggerEvent(type, evt, data) { 3138 var newEvent = $.Event(type, { originalEvent: evt }); 3139 $(evt.target).trigger(newEvent, data); 3140 } 3141 3142 // Listen for touch events on all nodes by default. 3143 api.instance = api.init(document); 3144 3145 // Export module 3146 return api; 3147}); 3148 3149/***/ }) 3150/******/ ]);/** 3151 * ---------------------------------------------------------------------- 3152 * Webflow: Interactions: Init 3153 */ 3154Webflow.require('ix').init([ 3155 {"slug":"dropdown-hover","name":"Dropdown Hover","value":{"style":{},"triggers":[{"type":"hover","selector":".dropdown-list","descend":true,"stepsA":[{"height":"auto","transition":"height 300ms ease-in-out 0ms"}],"stepsB":[{"height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}}, 3156 {"slug":"account-dd-action","name":"Account DD Action","value":{"style":{},"triggers":[{"type":"hover","selector":".account-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"height 300ms ease-in-out 0, opacity 300ms ease 0"}
3156],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}}, 3157 {"slug":"pickerdd-state","name":"PickerDD-State","value":{"style":{},"triggers":[{"type":"hover","selector":".picker-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"220px","transition":"height 300ms ease-in-out 0, opacity 300ms ease 0"}],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}}, 3158 {"slug":"pickerdd-region","name":"PickerDD-Region","value":{"style":{},"triggers":[{"type":"hover","selector":".picker-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"opacity 300ms ease 0, height 200 ease 0"}],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}}, 3159 {"slug":"search-open","name":"Search Open","value":{"style":{},"triggers":[{"type":"click","selector":".zip-search-form","stepsA":[{"width":"auto","transition":"width 500ms ease 0ms"}],"stepsB":[{"width":"30px","transition":"width 500ms ease 0ms"}]}]}}, 3160 {"slug":"mini-menu-open","name":"Mini Menu Open","value":{"style":{},"triggers":[{"type":"click","selector":".mini-menu-dropdown-list","siblings":true,"preserve3d":true,"stepsA":[{"opacity":1,"height":"auto","transition":"opacity 400ms ease 0ms, height 500ms ease 0ms"}],"stepsB":[{"opacity":0,"height":"0px","transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms, height 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}]}]}}, 3161 {"slug":"search-open-2","name":"Search Open 2","value":{"style":{},"triggers":[{"type":"click","selector":".search-field","stepsA":[{"opacity":1,"transition":"opacity 500ms ease 0ms"}],"stepsB":[{"opacity":0,"transition":"opacity 500ms ease 0ms"}]}]}}, 3162 {"slug":"hero-text-fade-in-out","name":"Hero Text Fade In-Out","value":{"style":{"opacity":0,"x":"0px","y":"-75px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":"850ms"},{"opacity":1,"transition":"transform 1000ms ease 0, opacity 500ms ease 0","x":"0px","y":"0px","z":"0px"},{"wait":"1000ms"},{"opacity":0,"transition":"transform 200 ease 0, opacity 1000ms ease-out 0"}],"stepsB":[]}]}}, 3163 {"slug":"map-legend-appear","name":"Map Legend Appear","value":{"style":{"opacity":0,"x":"0px","y":"125px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":"2000ms"},{"opacity":1,"transition":"transform 1000ms ease 0, opacity 1000ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 3164 {"slug":"headline-scroll-appear","name":"Headline Scroll Appear","value":{"style":{"opacity":0,"x":"0px","y":"40px","z":"0px"},"triggers":[{"type":"scroll","offsetTop":"0%","offsetBot":"25%","stepsA":[{"opacity":1,"transition":"transform 500ms ease 0, opacity 500ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 3165 {"slug":"about-scroll-appear","name":"About Scroll Appear","value":{"style":{"opacity":0,"x":"0px","y":"100px","z":"0px"},"triggers":[{"type":"scroll","offsetTop":"0%","offsetBot":"15%","stepsA":[{"wait":"150ms"},{"opacity":1,"transition":"transform 600ms ease 0, opacity 400ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}}, 3166 {"slug":"close-legend","name":"Close Legend","value":{"style":{},"triggers":[{"type":"click","selector":".legend-wrapper","preserve3d":true,"stepsA":[{"transition":"transform 500ms ease 0","x":"0px","y":"83%","z":"0px"}],"stepsB":[{"transition":"transform 500ms ease 0","x":"0px","y":"0px","z":"0px"}]}]}}, 3167 {"slug":"login-reveal","name":"Login Reveal","value":{"style":{},"triggers":[{"type":"click","stepsA":[{"display":"none"}],"stepsB":[]},{"type":"click","selector":".logged-in","stepsA":[{"display":"inline-block","opacity":1,"width":"auto","transition":"opacity 400ms ease 0, width 200 ease 0"}],"stepsB":[]},{"type":"click","selector":".account-dropdown","stepsA":[{"display":"block","opacity":1,"width":"auto","transition":"width 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}}, 3168 {"slug":"log-out","name":"Log Out","value":{"style":{},"triggers":[{"type":"click","selector":".login","stepsA":[{"display":"inline-block","opacity":1,"width":"100%","transition":"width 500ms ease 0, opacity 400ms ease 0"}],"stepsB":[]}
3168,{"type":"click","selector":".logged-in","stepsA":[{"display":"none","opacity":0,"width":"0px","transition":"opacity 200 ease 0, width 200 ease 0"}],"stepsB":[]}]}}, 3169 {"slug":"modal-close","name":"Modal Close","value":{"style":{},"triggers":[{"type":"click","selector":".ice-index-modal-bkgd","stepsA":[{"display":"none","opacity":0,"transition":"opacity 200 ease 0"}],"stepsB":[]}]}}, 3170 {"slug":"close-wind-speed-modal","name":"Close Wind Speed Modal","value":{"style":{},"triggers":[{"type":"click","selector":".wind-speed-modal-bkgd","stepsA":[{"display":"none","opacity":0,"transition":"opacity 200 ease 0"}],"stepsB":[]}]}}, 3171 {"slug":"view-spia-key-modal","name":"View SPIA Key Modal","value":{"style":{},"triggers":[{"type":"click","selector":".ice-index-modal-bkgd","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[]}]}}, 3172 {"slug":"view-wind-speed-modal","name":"View Wind Speed Modal","value":{"style":{},"triggers":[{"type":"click","selector":".wind-speed-modal-bkgd","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[]}]}}, 3173 {"slug":"show-maps","name":"Show Maps","value":{"style":{},"triggers":[{"type":"click","selector":".accordion-container","stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"height 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}}, 3174 {"slug":"new-interaction","name":"New Interaction","value":{"style":{},"triggers":[]}}, 3175 {"slug":"new-interaction-2","name":"New Interaction 2","value":{"style":{},"triggers":[{"type":"click","selector":".text-details-wrap","descend":true,"stepsA":[{"opacity":1,"height":"auto","transition":"height 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}}, 3176 {"slug":"text-details-reveal","name":"Text Details Reveal","value":{"style":{},"triggers":[{"type":"click","selector":".text-details-wrap","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[{"display":"none","opacity":0,"transition":"opacity 500ms ease 0"}]}]}}, 3177 {"slug":"email-details-reveal","name":"Email Details Reveal","value":{"style":{},"triggers":[{"type":"click","selector":".email-details-wrap","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[{"display":"none","opacity":0,"transition":"opacity 500ms ease 0"}]}]}} 3178]);
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.