vendor: 3,594 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // define getter function for harmony exports 37/******/ __webpack_require__.d = function(exports, name, getter) { 38/******/ if(!__webpack_require__.o(exports, name)) { 39/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40/******/ } 41/******/ }; 42/******/ 43/******/ // define __esModule on exports 44/******/ __webpack_require__.r = function(exports) { 45/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47/******/ } 48/******/ Object.defineProperty(exports, '__esModule', { value: true }); 49/******/ }; 50/******/ 51/******/ // create a fake namespace object 52/******/ // mode & 1: value is a module id, require it 53/******/ // mode & 2: merge all properties of value into the ns 54/******/ // mode & 4: return value when already ns object 55/******/ // mode & 8|1: behave like require 56/******/ __webpack_require__.t = function(value, mode) { 57/******/ if(mode & 1) value = __webpack_require__(value); 58/******/ if(mode & 8) return value; 59/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60/******/ var ns = Object.create(null); 61/******/ __webpack_require__.r(ns); 62/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64/******/ return ns; 65/******/ }; 66/******/ 67/******/ // getDefaultExport function for compatibility with non-harmony modules 68/******/ __webpack_require__.n = function(module) { 69/******/ var getter = module && module.__esModule ? 70/******/ function getDefault() { return module['default']; } : 71/******/ function getModuleExports() { return module; }; 72/******/ __webpack_require__.d(getter, 'a', getter); 73/******/ return getter; 74/******/ }; 75/******/ 76/******/ // Object.prototype.hasOwnProperty.call 77/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78/******/ 79/******/ // __webpack_public_path__ 80/******/ __webpack_require__.p = ""; 81/******/ 82/******/ 83/******/ // Load entry module and return exports 84/******/ return __webpack_require__(__webpack_require__.s = 0); 85/******/ }) 86/************************************************************************/ 87/******/ ({ 88
vendor: 69,943 bytes, lines 89-1488
89/***/ "./node_modules/gsap/CSSPlugin.js": 90/*!****************************************!*\ 91 !*** ./node_modules/gsap/CSSPlugin.js ***! 92 \****************************************/ 93/*! exports provided: CSSPlugin, default, _getBBox, _createElement, checkPrefix */ 94/***/ (function(module, __webpack_exports__, __webpack_require__) { 95 96"use strict"; 97__webpack_require__.r(__webpack_exports__); 98/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return CSSPlugin; }); 99/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CSSPlugin; }); 100/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getBBox", function() { return _getBBox; }); 101/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_createElement", function() { return _createElement; }); 102/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkPrefix", function() { return _checkPropPrefix; }); 103/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js"); 104/*** IMPORTS FROM imports-loader ***/ 105var define = false; 106 107/*! 108 * CSSPlugin 3.12.7 109 * https://gsap.com 110 * 111 * Copyright 2008-2025, GreenSock. All rights reserved. 112 * Subject to the terms at https://gsap.com/standard-license or for 113 * Club GSAP members, the agreement issued with that membership. 114 * @author: Jack Doyle, [email protected] 115*/ 116 117/* eslint-disable */ 118 119var _win, 120 _doc, 121 _docElement, 122 _pluginInitted, 123 _tempDiv, 124 _tempDivStyler, 125 _recentSetterPlugin, 126 _reverting, 127 _windowExists = function _windowExists() { 128 return typeof window !== "undefined"; 129 }, 130 _transformProps = {}, 131 _RAD2DEG = 180 / Math.PI, 132 _DEG2RAD = Math.PI / 180, 133 _atan2 = Math.atan2, 134 _bigNum = 1e8, 135 _capsExp = /([A-Z])/g, 136 _horizontalExp = /(left|right|width|margin|padding|x)/i, 137 _complexExp = /[\s,\(]\S/, 138 _propertyAliases = { 139 autoAlpha: "opacity,visibility", 140 scale: "scaleX,scaleY", 141 alpha: "opacity" 142 }, 143 _renderCSSProp = function _renderCSSProp(ratio, data) { 144 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 145 }, 146 _renderPropWithEnd = function _renderPropWithEnd(ratio, data) { 147 return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 148 }, 149 _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) { 150 return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data); 151 }, 152 //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0) 153 _renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) { 154 var value = data.s + data.c * ratio; 155 data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data); 156 }, 157 _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) { 158 return data.set(data.t, data.p, ratio ? data.e : data.b, data); 159 }, 160 _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) { 161 return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data); 162 }, 163 _setterCSSStyle = function _setterCSSStyle(target, property, value) { 164 return target.style[property] = value; 165 }, 166 _setterCSSProp = function _setterCSSProp(target, property, value) { 167 return target.style.setProperty(property, value); 168 }, 169 _setterTransform = function _setterTransform(target, property, value) { 170 return target._gsap[property] = value; 171 }, 172 _setterScale = function _setterScale(target, property, value) { 173 return target._gsap.scaleX = target._gsap.scaleY = value; 174 }, 175 _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) { 176 var cache = target._gsap; 177 cache.scaleX = cache.scaleY = value; 178 cache.renderTransform(ratio, cache); 179 }, 180 _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) { 181 var cache = target._gsap; 182 cache[property] = value; 183 cache.renderTransform(ratio, cache); 184 }, 185 _transformProp = "transform", 186 _transformOriginProp = _transformProp + "Origin", 187 _saveStyle = function _saveStyle(property, isNotCSS) { 188 var _this = this; 189 var target = this.target, 190 style = target.style, 191 cache = target._gsap; 192 if (property in _transformProps && style) { 193 this.tfm = this.tfm || {}; 194 if (property !== "transform") { 195 property = _propertyAliases[property] || property; 196 ~property.indexOf(",") ? property.split(",").forEach(function (a) { 197 return _this.tfm[a] = _get(target, a); 198 }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to "scaleX,scaleY", thus we loop and apply them both. 199 200 property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin); 201 } else { 202 return _propertyAliases.transform.split(",").forEach(function (p) { 203 return _saveStyle.call(_this, p, isNotCSS); 204 }); 205 } 206 if (this.props.indexOf(_transformProp) >= 0) { 207 return; 208 } 209 if (cache.svg) { 210 this.svgo = target.getAttribute("data-svg-origin"); 211 this.props.push(_transformOriginProp, isNotCSS, ""); 212 } 213 property = _transformProp; 214 } 215 (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]); 216 }, 217 _removeIndependentTransforms = function _removeIndependentTransforms(style) { 218 if (style.translate) { 219 style.removeProperty("translate"); 220 style.removeProperty("scale"); 221 style.removeProperty("rotate"); 222 } 223 }, 224 _revertStyle = function _revertStyle() { 225 var props = this.props, 226 target = this.target, 227 style = target.style, 228 cache = target._gsap, 229 i, 230 p; 231 for (i = 0; i < props.length; i += 3) { 232 // stored like this: property, isNotCSS, value 233 if (!props[i + 1]) { 234 props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === "--" ? props[i] : props[i].replace(_capsExp, "-$1").toLowerCase()); 235 } else if (props[i + 1] === 2) { 236 // non-CSS value (function-based) 237 target[props[i]](props[i + 2]); 238 } else { 239 // non-CSS value (not function-based) 240 target[props[i]] = props[i + 2]; 241 } 242 } 243 if (this.tfm) { 244 for (p in this.tfm) { 245 cache[p] = this.tfm[p]; 246 } 247 if (cache.svg) { 248 cache.renderTransform(); 249 target.setAttribute("data-svg-origin", this.svgo || ""); 250 } 251 i = _reverting(); 252 if ((!i || !i.isStart) && !style[_transformProp]) { 253 _removeIndependentTransforms(style); 254 if (cache.zOrigin && style[_transformOriginProp]) { 255 style[_transformOriginProp] += " " + cache.zOrigin + "px"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs. 256 257 cache.zOrigin = 0; 258 cache.renderTransform(); 259 } 260 cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization. 261 } 262 } 263 }, 264 _getStyleSaver = function _getStyleSaver(target, properties) { 265 var saver = { 266 target: target, 267 props: [], 268 revert: _revertStyle, 269 save: _saveStyle 270 }; 271 target._gsap || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once. 272 273 properties && target.style && target.nodeType && properties.split(",").forEach(function (p) { 274 return saver.save(p); 275 }); // make sure it's a DOM node too. 276 277 return saver; 278 }, 279 _supports3D, 280 _createElement = function _createElement(type, ns) { 281 var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible. 282 283 return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/). 284 }, 285 _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) { 286 var cs = getComputedStyle(target); 287 return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase. 288 }, 289 _prefixes = "O,Moz,ms,Ms,Webkit".split(","), 290 _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) { 291 var e = element || _tempDiv, 292 s = e.style, 293 i = 5; 294 if (property in s && !preferPrefix) { 295 return property; 296 } 297 property = property.charAt(0).toUpperCase() + property.substr(1); 298 while (i-- && !(_prefixes[i] + property in s)) {} 299 return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property; 300 }, 301 _initCore = function _initCore() { 302 if (_windowExists() && window.document) { 303 _win = window; 304 _doc = _win.document; 305 _docElement = _doc.documentElement; 306 _tempDiv = _createElement("div") || { 307 style: {} 308 }; 309 _tempDivStyler = _createElement("div"); 310 _transformProp = _checkPropPrefix(_transformProp); 311 _transformOriginProp = _transformProp + "Origin"; 312 _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets. 313 314 _supports3D = !!_checkPropPrefix("perspective"); 315 _reverting = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.reverting; 316 _pluginInitted = 1; 317 } 318 }, 319 _getReparentedCloneBBox = function _getReparentedCloneBBox(target) { 320 //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it). 321 var owner = target.ownerSVGElement, 322 svg = _createElement("svg", owner && owner.getAttribute("xmlns") || "http://www.w3.org/2000/svg"), 323 clone = target.cloneNode(true), 324 bbox; 325 clone.style.display = "block"; 326 svg.appendChild(clone); 327 _docElement.appendChild(svg); 328 try { 329 bbox = clone.getBBox(); 330 } catch (e) {} 331 svg.removeChild(clone); 332 _docElement.removeChild(svg); 333 return bbox; 334 }, 335 _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) { 336 var i = attributesArray.length; 337 while (i--) { 338 if (target.hasAttribute(attributesArray[i])) { 339 return target.getAttribute(attributesArray[i]); 340 } 341 } 342 }, 343 _getBBox = function _getBBox(target) { 344 var bounds, cloned; 345 try { 346 bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118 347 } catch (error) { 348 bounds = _getReparentedCloneBBox(target); 349 cloned = 1; 350 } 351 bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case. 352 353 return bounds && !bounds.width && !bounds.x && !bounds.y ? { 354 x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0, 355 y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0, 356 width: 0, 357 height: 0 358 } : bounds; 359 }, 360 _isSVG = function _isSVG(e) { 361 return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e)); 362 }, 363 //reports if the element is an SVG on which getBBox() actually works 364 _removeProperty = function _removeProperty(target, property) { 365 if (property) { 366 var style = target.style, 367 first2Chars; 368 if (property in _transformProps && property !== _transformOriginProp) { 369 property = _transformProp; 370 } 371 if (style.removeProperty) { 372 first2Chars = property.substr(0, 2); 373 if (first2Chars === "ms" || property.substr(0, 6) === "webkit") { 374 //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example) 375 property = "-" + property; 376 } 377 style.removeProperty(first2Chars === "--" ? property : property.replace(_capsExp, "-$1").toLowerCase()); 378 } else { 379 //note: old versions of IE use "removeAttribute()" instead of "removeProperty()" 380 style.removeAttribute(property); 381 } 382 } 383 }, 384 _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) { 385 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue); 386 plugin._pt = pt; 387 pt.b = beginning; 388 pt.e = end; 389 plugin._props.push(property); 390 return pt; 391 }, 392 _nonConvertibleUnits = { 393 deg: 1, 394 rad: 1, 395 turn: 1 396 }, 397 _nonStandardLayouts = { 398 grid: 1, 399 flex: 1 400 }, 401 //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount. 402 _convertToUnit = function _convertToUnit(target, property, value, unit) { 403 var curValue = parseFloat(value) || 0, 404 curUnit = (value + "").trim().substr((curValue + "").length) || "px", 405 // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim() 406 style = _tempDiv.style, 407 horizontal = _horizontalExp.test(property), 408 isRootSVG = target.tagName.toLowerCase() === "svg", 409 measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"), 410 amount = 100, 411 toPixels = unit === "px", 412 toPercent = unit === "%", 413 px, 414 parent, 415 cache, 416 isSVG; 417 if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) { 418 return curValue; 419 } 420 curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px")); 421 isSVG = target.getCTM && _isSVG(target); 422 if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) { 423 px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty]; 424 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPercent ? curValue / px * amount : curValue / 100 * px); 425 } 426 style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit); 427 parent = unit !== "rem" && ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode; 428 if (isSVG) { 429 parent = (target.ownerSVGElement || {}).parentNode; 430 } 431 if (!parent || parent === _doc || !parent.appendChild) { 432 parent = _doc.body; 433 } 434 cache = parent._gsap; 435 if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time && !cache.uncache) { 436 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(curValue / cache.width * amount); 437 } else { 438 if (toPercent && (property === "height" || property === "width")) { 439 // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding. 440 var v = target.style[property]; 441 target.style[property] = amount + unit; 442 px = target[measureProperty]; 443 v ? target.style[property] = v : _removeProperty(target, property); 444 } else { 445 (toPercent || curUnit === "%") && !_nonStandardLayouts[_getComputedProperty(parent, "display")] && (style.position = _getComputedProperty(target, "position")); 446 parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that. 447 448 parent.appendChild(_tempDiv); 449 px = _tempDiv[measureProperty]; 450 parent.removeChild(_tempDiv); 451 style.position = "absolute"; 452 } 453 if (horizontal && toPercent) { 454 cache = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(parent); 455 cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time; 456 cache.width = parent[measureProperty]; 457 } 458 } 459 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0); 460 }, 461 _get = function _get(target, property, unit, uncache) { 462 var value; 463 _pluginInitted || _initCore(); 464 if (property in _propertyAliases && property !== "transform") { 465 property = _propertyAliases[property]; 466 if (~property.indexOf(",")) { 467 property = property.split(",")[0]; 468 } 469 } 470 if (_transformProps[property] && property !== "transform") { 471 value = _parseTransform(target, uncache); 472 value = property !== "transformOrigin" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px"; 473 } else { 474 value = target.style[property]; 475 if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) { 476 value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getProperty"])(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius 477 } 478 } 479 return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value; 480 }, 481 _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) { 482 // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 483 if (!start || start === "none") { 484 // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/ 485 var p = _checkPropPrefix(prop, target, 1), 486 s = p && _getComputedProperty(target, p, 1); 487 if (s && s !== start) { 488 prop = p; 489 start = s; 490 } else if (prop === "borderColor") { 491 start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/ 492 } 493 } 494 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_renderComplexString"]), 495 index = 0, 496 matchIndex = 0, 497 a, 498 result, 499 startValues, 500 startNum, 501 color, 502 startValue, 503 endValue, 504 endNum, 505 chunk, 506 endUnit, 507 startUnit, 508 endValues; 509 pt.b = start; 510 pt.e = end; 511 start += ""; // ensure values are strings 512 513 end += ""; 514 if (end === "auto") { 515 startValue = target.style[prop]; 516 target.style[prop] = end; 517 end = _getComputedProperty(target, prop) || end; 518 startValue ? target.style[prop] = startValue : _removeProperty(target, prop); 519 } 520 a = [start, end]; 521 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorStringFilter"])(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow(). 522 523 start = a[0]; 524 end = a[1]; 525 startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || []; 526 endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || []; 527 if (endValues.length) { 528 while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].exec(end)) { 529 endValue = result[0]; 530 chunk = end.substring(index, result.index); 531 if (color) { 532 color = (color + 1) % 5; 533 } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") { 534 color = 1; 535 } 536 if (endValue !== (startValue = startValues[matchIndex++] || "")) { 537 startNum = parseFloat(startValue) || 0; 538 startUnit = startValue.substr((startNum + "").length); 539 endValue.charAt(1) === "=" && (endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, endValue) + startUnit); 540 endNum = parseFloat(endValue); 541 endUnit = endValue.substr((endNum + "").length); 542 index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].lastIndex - endUnit.length; 543 if (!endUnit) { 544 //if something like "perspective:300" is passed in and we must add a unit to the end 545 endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[prop] || startUnit; 546 if (index === end.length) { 547 end += endUnit; 548 pt.e += endUnit; 549 } 550 } 551 if (startUnit !== endUnit) { 552 startNum = _convertToUnit(target, prop, startValue, endUnit) || 0; 553 } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 554 555 pt._pt = { 556 _next: pt._pt, 557 p: chunk || matchIndex === 1 ? chunk : ",", 558 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 559 s: startNum, 560 c: endNum - startNum, 561 m: color && color < 4 || prop === "zIndex" ? Math.round : 0 562 }; 563 } 564 } 565 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 566 } else { 567 pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue; 568 } 569 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_relExp"].test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 570 571 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin. 572 573 return pt; 574 }, 575 _keywordToPercent = { 576 top: "0%", 577 bottom: "100%", 578 left: "0%", 579 right: "100%", 580 center: "50%" 581 }, 582 _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) { 583 var split = value.split(" "), 584 x = split[0], 585 y = split[1] || "50%"; 586 if (x === "top" || x === "bottom" || y === "left" || y === "right") { 587 //the user provided them in the wrong order, so flip them 588 value = x; 589 x = y; 590 y = value; 591 } 592 split[0] = _keywordToPercent[x] || x; 593 split[1] = _keywordToPercent[y] || y; 594 return split.join(" "); 595 }, 596 _renderClearProps = function _renderClearProps(ratio, data) { 597 if (data.tween && data.tween._time === data.tween._dur) { 598 var target = data.t, 599 style = target.style, 600 props = data.u, 601 cache = target._gsap, 602 prop, 603 clearTransforms, 604 i; 605 if (props === "all" || props === true) { 606 style.cssText = ""; 607 clearTransforms = 1; 608 } else { 609 props = props.split(","); 610 i = props.length; 611 while (--i > -1) { 612 prop = props[i]; 613 if (_transformProps[prop]) { 614 clearTransforms = 1; 615 prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp; 616 } 617 _removeProperty(target, prop); 618 } 619 } 620 if (clearTransforms) { 621 _removeProperty(target, _transformProp); 622 if (cache) { 623 cache.svg && target.removeAttribute("transform"); 624 style.scale = style.rotate = style.translate = "none"; 625 _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values. 626 627 cache.uncache = 1; 628 _removeIndependentTransforms(style); 629 } 630 } 631 } 632 }, 633 // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list. 634 _specialProps = { 635 clearProps: function clearProps(plugin, target, property, endValue, tween) { 636 if (tween.data !== "isFromStart") { 637 var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 0, _renderClearProps); 638 pt.u = endValue; 639 pt.pr = -10; 640 pt.tween = tween; 641 plugin._props.push(property); 642 return 1; 643 } 644 } 645 /* className feature (about 0.4kb gzipped). 646 , className(plugin, target, property, endValue, tween) { 647 let _renderClassName = (ratio, data) => { 648 data.css.render(ratio, data.css); 649 if (!ratio || ratio === 1) { 650 let inline = data.rmv, 651 target = data.t, 652 p; 653 target.setAttribute("class", ratio ? data.e : data.b); 654 for (p in inline) { 655 _removeProperty(target, p); 656 } 657 } 658 }, 659 _getAllStyles = (target) => { 660 let styles = {}, 661 computed = getComputedStyle(target), 662 p; 663 for (p in computed) { 664 if (isNaN(p) && p !== "cssText" && p !== "length") { 665 styles[p] = computed[p]; 666 } 667 } 668 _setDefaults(styles, _parseTransform(target, 1)); 669 return styles; 670 }, 671 startClassList = target.getAttribute("class"), 672 style = target.style, 673 cssText = style.cssText, 674 cache = target._gsap, 675 classPT = cache.classPT, 676 inlineToRemoveAtEnd = {}, 677 data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")}, 678 changingVars = {}, 679 startVars = _getAllStyles(target), 680 transformRelated = /(transform|perspective)/i, 681 endVars, p; 682 if (classPT) { 683 classPT.r(1, classPT.d); 684 _removeLinkedListItem(classPT.d.plugin, classPT, "_pt"); 685 } 686 target.setAttribute("class", data.e); 687 endVars = _getAllStyles(target, true); 688 target.setAttribute("class", startClassList); 689 for (p in endVars) { 690 if (endVars[p] !== startVars[p] && !transformRelated.test(p)) { 691 changingVars[p] = endVars[p]; 692 if (!style[p] && style[p] !== "0") { 693 inlineToRemoveAtEnd[p] = 1; 694 } 695 } 696 } 697 cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11); 698 if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/. 699 style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity). 700 } 701 _parseTransform(target, true); //to clear the caching of transforms 702 data.css = new gsap.plugins.css(); 703 data.css.init(target, changingVars, tween); 704 plugin._props.push(...data.css._props); 705 return 1; 706 } 707 */ 708 }, 709 /* 710 * -------------------------------------------------------------------------------------- 711 * TRANSFORMS 712 * -------------------------------------------------------------------------------------- 713 */ 714 _identity2DMatrix = [1, 0, 0, 1, 0, 0], 715 _rotationalProperties = {}, 716 _isNullTransform = function _isNullTransform(value) { 717 return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value; 718 }, 719 _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) { 720 var matrixString = _getComputedProperty(target, _transformProp); 721 return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numExp"]).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"]); 722 }, 723 _getMatrix = function _getMatrix(target, force2D) { 724 var cache = target._gsap || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(target), 725 style = target.style, 726 matrix = _getComputedTransformMatrixAsArray(target), 727 parent, 728 nextSibling, 729 temp, 730 addedToDOM; 731 if (cache.svg && target.getAttribute("transform")) { 732 temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix. 733 734 matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f]; 735 return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix; 736 } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) { 737 //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397 738 //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px). 739 temp = style.display; 740 style.display = "block"; 741 parent = target.parentNode; 742 if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) { 743 // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video. 744 addedToDOM = 1; //flag 745 746 nextSibling = target.nextElementSibling; 747 _docElement.appendChild(target); //we must add it to the DOM in order to get values properly 748 } 749 matrix = _getComputedTransformMatrixAsArray(target); 750 temp ? style.display = temp : _removeProperty(target, "display"); 751 if (addedToDOM) { 752 nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target); 753 } 754 } 755 return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix; 756 }, 757 _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) { 758 var cache = target._gsap, 759 matrix = matrixArray || _getMatrix(target, true), 760 xOriginOld = cache.xOrigin || 0, 761 yOriginOld = cache.yOrigin || 0, 762 xOffsetOld = cache.xOffset || 0, 763 yOffsetOld = cache.yOffset || 0, 764 a = matrix[0], 765 b = matrix[1], 766 c = matrix[2], 767 d = matrix[3], 768 tx = matrix[4], 769 ty = matrix[5], 770 originSplit = origin.split(" "), 771 xOrigin = parseFloat(originSplit[0]) || 0, 772 yOrigin = parseFloat(originSplit[1]) || 0, 773 bounds, 774 determinant, 775 x, 776 y; 777 if (!originIsAbsolute) { 778 bounds = _getBBox(target); 779 xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * bounds.width : xOrigin); 780 yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); // if (!("xOrigin" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration 781 // xOrigin -= bounds.x; 782 // yOrigin -= bounds.y; 783 // } 784 } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) { 785 //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero. 786 x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant; 787 y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant; 788 xOrigin = x; 789 yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute. 790 } 791 if (smooth || smooth !== false && cache.smooth) { 792 tx = xOrigin - xOriginOld; 793 ty = yOrigin - yOriginOld; 794 cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx; 795 cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty; 796 } else { 797 cache.xOffset = cache.yOffset = 0; 798 } 799 cache.xOrigin = xOrigin; 800 cache.yOrigin = yOrigin; 801 cache.smooth = !!smooth; 802 cache.origin = origin; 803 cache.originIsAbsolute = !!originIsAbsolute; 804 target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value). 805 806 if (pluginToAddPropTweensTo) { 807 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin); 808 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin); 809 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset); 810 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset); 811 } 812 target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin); 813 }, 814 _parseTransform = function _parseTransform(target, uncache) { 815 var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["GSCache"](target); 816 if ("x" in cache && !uncache && !cache.uncache) { 817 return cache; 818 } 819 var style = target.style, 820 invertedScaleX = cache.scaleX < 0, 821 px = "px", 822 deg = "deg", 823 cs = getComputedStyle(target), 824 origin = _getComputedProperty(target, _transformOriginProp) || "0", 825 x, 826 y, 827 z, 828 scaleX, 829 scaleY, 830 rotation, 831 rotationX, 832 rotationY, 833 skewX, 834 skewY, 835 perspective, 836 xOrigin, 837 yOrigin, 838 matrix, 839 angle, 840 cos, 841 sin, 842 a, 843 b, 844 c, 845 d, 846 a12, 847 a22, 848 t1, 849 t2, 850 t3, 851 a13, 852 a23, 853 a33, 854 a42, 855 a43, 856 a32; 857 x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0; 858 scaleX = scaleY = 1; 859 cache.svg = !!(target.getCTM && _isSVG(target)); 860 if (cs.translate) { 861 // accommodate independent transforms by combining them into normal ones. 862 if (cs.translate !== "none" || cs.scale !== "none" || cs.rotate !== "none") { 863 style[_transformProp] = (cs.translate !== "none" ? "translate3d(" + (cs.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (cs.rotate !== "none" ? "rotate(" + cs.rotate + ") " : "") + (cs.scale !== "none" ? "scale(" + cs.scale.split(" ").join(",") + ") " : "") + (cs[_transformProp] !== "none" ? cs[_transformProp] : ""); 864 } 865 style.scale = style.rotate = style.translate = "none"; 866 } 867 matrix = _getMatrix(target, cache.svg); 868 if (cache.svg) { 869 if (cache.uncache) { 870 // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + "px " + (cache.yOrigin - bbox.y) + "px". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things. 871 t2 = target.getBBox(); 872 origin = cache.xOrigin - t2.x + "px " + (cache.yOrigin - t2.y) + "px"; 873 t1 = ""; 874 } else { 875 t1 = !uncache && target.getAttribute("data-svg-origin"); // Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly. 876 } 877 _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix); 878 } 879 xOrigin = cache.xOrigin || 0; 880 yOrigin = cache.yOrigin || 0; 881 if (matrix !== _identity2DMatrix) { 882 a = matrix[0]; //a11 883 884 b = matrix[1]; //a21 885 886 c = matrix[2]; //a31 887 888 d = matrix[3]; //a41 889 890 x = a12 = matrix[4]; 891 y = a22 = matrix[5]; //2D matrix 892 893 if (matrix.length === 6) { 894 scaleX = Math.sqrt(a * a + b * b); 895 scaleY = Math.sqrt(d * d + c * c); 896 rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist). 897 898 skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0; 899 skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD))); 900 if (cache.svg) { 901 x -= xOrigin - (xOrigin * a + yOrigin * c); 902 y -= yOrigin - (xOrigin * b + yOrigin * d); 903 } //3D matrix 904 } else { 905 a32 = matrix[6]; 906 a42 = matrix[7]; 907 a13 = matrix[8]; 908 a23 = matrix[9]; 909 a33 = matrix[10]; 910 a43 = matrix[11]; 911 x = matrix[12]; 912 y = matrix[13]; 913 z = matrix[14]; 914 angle = _atan2(a32, a33); 915 rotationX = angle * _RAD2DEG; //rotationX 916 917 if (angle) { 918 cos = Math.cos(-angle); 919 sin = Math.sin(-angle); 920 t1 = a12 * cos + a13 * sin; 921 t2 = a22 * cos + a23 * sin; 922 t3 = a32 * cos + a33 * sin; 923 a13 = a12 * -sin + a13 * cos; 924 a23 = a22 * -sin + a23 * cos; 925 a33 = a32 * -sin + a33 * cos; 926 a43 = a42 * -sin + a43 * cos; 927 a12 = t1; 928 a22 = t2; 929 a32 = t3; 930 } //rotationY 931 932 angle = _atan2(-c, a33); 933 rotationY = angle * _RAD2DEG; 934 if (angle) { 935 cos = Math.cos(-angle); 936 sin = Math.sin(-angle); 937 t1 = a * cos - a13 * sin; 938 t2 = b * cos - a23 * sin; 939 t3 = c * cos - a33 * sin; 940 a43 = d * sin + a43 * cos; 941 a = t1; 942 b = t2; 943 c = t3; 944 } //rotationZ 945 946 angle = _atan2(b, a); 947 rotation = angle * _RAD2DEG; 948 if (angle) { 949 cos = Math.cos(angle); 950 sin = Math.sin(angle); 951 t1 = a * cos + b * sin; 952 t2 = a12 * cos + a22 * sin; 953 b = b * cos - a * sin; 954 a22 = a22 * cos - a12 * sin; 955 a = t1; 956 a12 = t2; 957 } 958 if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) { 959 //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here. 960 rotationX = rotation = 0; 961 rotationY = 180 - rotationY; 962 } 963 scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a * a + b * b + c * c)); 964 scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a22 * a22 + a32 * a32)); 965 angle = _atan2(a12, a22); 966 skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0; 967 perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0; 968 } 969 if (cache.svg) { 970 //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline). 971 t1 = target.getAttribute("transform"); 972 cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp)); 973 t1 && target.setAttribute("transform", t1); 974 } 975 } 976 if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) { 977 if (invertedScaleX) { 978 scaleX *= -1; 979 skewX += rotation <= 0 ? 180 : -180; 980 rotation += rotation <= 0 ? 180 : -180; 981 } else { 982 scaleY *= -1; 983 skewX += skewX <= 0 ? 180 : -180; 984 } 985 } 986 uncache = uncache || cache.uncache; 987 cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px; 988 cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px; 989 cache.z = z + px; 990 cache.scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleX); 991 cache.scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleY); 992 cache.rotation = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotation) + deg; 993 cache.rotationX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationX) + deg; 994 cache.rotationY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationY) + deg; 995 cache.skewX = skewX + deg; 996 cache.skewY = skewY + deg; 997 cache.transformPerspective = perspective + px; 998 if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || !uncache && cache.zOrigin || 0) { 999 style[_transformOriginProp] = _firstTwoOnly(origin); 1000 } 1001 cache.xOffset = cache.yOffset = 0; 1002 cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].force3D; 1003 cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms; 1004 cache.uncache = 0; 1005 return cache; 1006 }, 1007 _firstTwoOnly = function _firstTwoOnly(value) { 1008 return (value = value.split(" "))[0] + " " + value[1]; 1009 }, 1010 //for handling transformOrigin values, stripping out the 3rd dimension 1011 _addPxTranslate = function _addPxTranslate(target, start, value) { 1012 var unit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(start); 1013 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit; 1014 }, 1015 _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) { 1016 cache.z = "0px"; 1017 cache.rotationY = cache.rotationX = "0deg"; 1018 cache.force3D = 0; 1019 _renderCSSTransforms(ratio, cache); 1020 }, 1021 _zeroDeg = "0deg", 1022 _zeroPx = "0px", 1023 _endParenthesis = ") ", 1024 _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) { 1025 var _ref = cache || this, 1026 xPercent = _ref.xPercent, 1027 yPercent = _ref.yPercent, 1028 x = _ref.x, 1029 y = _ref.y, 1030 z = _ref.z, 1031 rotation = _ref.rotation, 1032 rotationY = _ref.rotationY, 1033 rotationX = _ref.rotationX, 1034 skewX = _ref.skewX, 1035 skewY = _ref.skewY, 1036 scaleX = _ref.scaleX, 1037 scaleY = _ref.scaleY, 1038 transformPerspective = _ref.transformPerspective, 1039 force3D = _ref.force3D, 1040 target = _ref.target, 1041 zOrigin = _ref.zOrigin, 1042 transforms = "", 1043 use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually) 1044 1045 if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) { 1046 var angle = parseFloat(rotationY) * _DEG2RAD, 1047 a13 = Math.sin(angle), 1048 a33 = Math.cos(angle), 1049 cos; 1050 angle = parseFloat(rotationX) * _DEG2RAD; 1051 cos = Math.cos(angle); 1052 x = _addPxTranslate(target, x, a13 * cos * -zOrigin); 1053 y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin); 1054 z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin); 1055 } 1056 if (transformPerspective !== _zeroPx) { 1057 transforms += "perspective(" + transformPerspective + _endParenthesis; 1058 } 1059 if (xPercent || yPercent) { 1060 transforms += "translate(" + xPercent + "%, " + yPercent + "%) "; 1061 } 1062 if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) { 1063 transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis; 1064 } 1065 if (rotation !== _zeroDeg) { 1066 transforms += "rotate(" + rotation + _endParenthesis; 1067 } 1068 if (rotationY !== _zeroDeg) { 1069 transforms += "rotateY(" + rotationY + _endParenthesis; 1070 } 1071 if (rotationX !== _zeroDeg) { 1072 transforms += "rotateX(" + rotationX + _endParenthesis; 1073 } 1074 if (skewX !== _zeroDeg || skewY !== _zeroDeg) { 1075 transforms += "skew(" + skewX + ", " + skewY + _endParenthesis; 1076 } 1077 if (scaleX !== 1 || scaleY !== 1) { 1078 transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis; 1079 } 1080 target.style[_transformProp] = transforms || "translate(0, 0)"; 1081 }, 1082 _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) { 1083 var _ref2 = cache || this, 1084 xPercent = _ref2.xPercent, 1085 yPercent = _ref2.yPercent, 1086 x = _ref2.x, 1087 y = _ref2.y, 1088 rotation = _ref2.rotation, 1089 skewX = _ref2.skewX, 1090 skewY = _ref2.skewY, 1091 scaleX = _ref2.scaleX, 1092 scaleY = _ref2.scaleY, 1093 target = _ref2.target, 1094 xOrigin = _ref2.xOrigin, 1095 yOrigin = _ref2.yOrigin, 1096 xOffset = _ref2.xOffset, 1097 yOffset = _ref2.yOffset, 1098 forceCSS = _ref2.forceCSS, 1099 tx = parseFloat(x), 1100 ty = parseFloat(y), 1101 a11, 1102 a21, 1103 a12, 1104 a22, 1105 temp; 1106 rotation = parseFloat(rotation); 1107 skewX = parseFloat(skewX); 1108 skewY = parseFloat(skewY); 1109 if (skewY) { 1110 //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees. 1111 skewY = parseFloat(skewY); 1112 skewX += skewY; 1113 rotation += skewY; 1114 } 1115 if (rotation || skewX) { 1116 rotation *= _DEG2RAD; 1117 skewX *= _DEG2RAD; 1118 a11 = Math.cos(rotation) * scaleX; 1119 a21 = Math.sin(rotation) * scaleX; 1120 a12 = Math.sin(rotation - skewX) * -scaleY; 1121 a22 = Math.cos(rotation - skewX) * scaleY; 1122 if (skewX) { 1123 skewY *= _DEG2RAD; 1124 temp = Math.tan(skewX - skewY); 1125 temp = Math.sqrt(1 + temp * temp); 1126 a12 *= temp; 1127 a22 *= temp; 1128 if (skewY) { 1129 temp = Math.tan(skewY); 1130 temp = Math.sqrt(1 + temp * temp); 1131 a11 *= temp; 1132 a21 *= temp; 1133 } 1134 } 1135 a11 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a11); 1136 a21 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a21); 1137 a12 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a12); 1138 a22 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a22); 1139 } else { 1140 a11 = scaleX; 1141 a22 = scaleY; 1142 a21 = a12 = 0; 1143 } 1144 if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) { 1145 tx = _convertToUnit(target, "x", x, "px"); 1146 ty = _convertToUnit(target, "y", y, "px"); 1147 } 1148 if (xOrigin || yOrigin || xOffset || yOffset) { 1149 tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset); 1150 ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset); 1151 } 1152 if (xPercent || yPercent) { 1153 //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it. 1154 temp = target.getBBox(); 1155 tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xPercent / 100 * temp.width); 1156 ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yPercent / 100 * temp.height); 1157 } 1158 temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")"; 1159 target.setAttribute("transform", temp); 1160 forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!) 1161 }, 1162 _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) { 1163 var cap = 360, 1164 isString = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(endValue), 1165 endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1), 1166 change = endNum - startNum, 1167 finalValue = startNum + change + "deg", 1168 direction, 1169 pt; 1170 if (isString) { 1171 direction = endValue.split("_")[1]; 1172 if (direction === "short") { 1173 change %= cap; 1174 if (change !== change % (cap / 2)) { 1175 change += change < 0 ? cap : -cap; 1176 } 1177 } 1178 if (direction === "cw" && change < 0) { 1179 change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap; 1180 } else if (direction === "ccw" && change > 0) { 1181 change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap; 1182 } 1183 } 1184 plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, startNum, change, _renderPropWithEnd); 1185 pt.e = finalValue; 1186 pt.u = "deg"; 1187 plugin._props.push(property); 1188 return pt; 1189 }, 1190 _assign = function _assign(target, source) { 1191 // Internet Explorer doesn't have Object.assign(), so we recreate it here. 1192 for (var p in source) { 1193 target[p] = source[p]; 1194 } 1195 return target; 1196 }, 1197 _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) { 1198 //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)" 1199 var startCache = _assign({}, target._gsap), 1200 exclude = "perspective,force3D,transformOrigin,svgOrigin", 1201 style = target.style, 1202 endCache, 1203 p, 1204 startValue, 1205 endValue, 1206 startNum, 1207 endNum, 1208 startUnit, 1209 endUnit; 1210 if (startCache.svg) { 1211 startValue = target.getAttribute("transform"); 1212 target.setAttribute("transform", ""); 1213 style[_transformProp] = transforms; 1214 endCache = _parseTransform(target, 1); 1215 _removeProperty(target, _transformProp); 1216 target.setAttribute("transform", startValue); 1217 } else { 1218 startValue = getComputedStyle(target)[_transformProp]; 1219 style[_transformProp] = transforms; 1220 endCache = _parseTransform(target, 1); 1221 style[_transformProp] = startValue; 1222 } 1223 for (p in _transformProps) { 1224 startValue = startCache[p]; 1225 endValue = endCache[p]; 1226 if (startValue !== endValue && exclude.indexOf(p) < 0) { 1227 //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case. 1228 startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue); 1229 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue); 1230 startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue); 1231 endNum = parseFloat(endValue); 1232 plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp); 1233 plugin._pt.u = endUnit || 0; 1234 plugin._props.push(p); 1235 } 1236 } 1237 _assign(endCache, startCache); 1238 }; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc. 1239 1240Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("padding,margin,Width,Radius", function (name, index) { 1241 var t = "Top", 1242 r = "Right", 1243 b = "Bottom", 1244 l = "Left", 1245 props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) { 1246 return index < 2 ? name + side : "border" + side + name; 1247 }); 1248 _specialProps[index > 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) { 1249 var a, vars; 1250 if (arguments.length < 4) { 1251 // getter, passed target, property, and unit (from _get()) 1252 a = props.map(function (prop) { 1253 return _get(plugin, prop, property); 1254 }); 1255 vars = a.join(" "); 1256 return vars.split(a[0]).length === 5 ? a[0] : vars; 1257 } 1258 a = (endValue + "").split(" "); 1259 vars = {}; 1260 props.forEach(function (prop, i) { 1261 return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0]; 1262 }); 1263 plugin.init(target, vars, tween); 1264 }; 1265}); 1266var CSSPlugin = { 1267 name: "css", 1268 register: _initCore, 1269 targetTest: function targetTest(target) { 1270 return target.style && target.nodeType; 1271 }, 1272 init: function init(target, vars, tween, index, targets) { 1273 var props = this._props, 1274 style = target.style, 1275 startAt = tween.vars.startAt, 1276 startValue, 1277 endValue, 1278 endNum, 1279 startNum, 1280 type, 1281 specialProp, 1282 p, 1283 startUnit, 1284 endUnit, 1285 relative, 1286 isTransformRelated, 1287 transformPropTween, 1288 cache, 1289 smooth, 1290 hasPriority, 1291 inlineProps; 1292 _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps 1293 1294 this.styles = this.styles || _getStyleSaver(target); 1295 inlineProps = this.styles.props; 1296 this.tween = tween; 1297 for (p in vars) { 1298 if (p === "autoRound") { 1299 continue; 1300 } 1301 endValue = vars[p]; 1302 if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_plugins"][p] && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_checkPlugin"])(p, vars, tween, index, target, targets)) { 1303 // plugins 1304 continue; 1305 } 1306 type = typeof endValue; 1307 specialProp = _specialProps[p]; 1308 if (type === "function") { 1309 endValue = endValue.call(tween, index, target, targets); 1310 type = typeof endValue; 1311 } 1312 if (type === "string" && ~endValue.indexOf("random(")) { 1313 endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(endValue); 1314 } 1315 if (specialProp) { 1316 specialProp(this, target, p, endValue, tween) && (hasPriority = 1); 1317 } else if (p.substr(0, 2) === "--") { 1318 //CSS variable 1319 startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim(); 1320 endValue += ""; 1321 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].lastIndex = 0; 1322 if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].test(startValue)) { 1323 // colors don't have units 1324 startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue); 1325 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue); 1326 } 1327 endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit); 1328 this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p); 1329 props.push(p); 1330 inlineProps.push(p, 0, style[p]); 1331 } else if (type !== "undefined") { 1332 if (startAt && p in startAt) { 1333 // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px) 1334 startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p]; 1335 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(startValue) && ~startValue.indexOf("random(") && (startValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(startValue)); 1336 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue + "") || startValue === "auto" || (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(_get(target, p)) || ""); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work. 1337 1338 (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values 1339 } else { 1340 startValue = _get(target, p); 1341 } 1342 startNum = parseFloat(startValue); 1343 relative = type === "string" && endValue.charAt(1) === "=" && endValue.substr(0, 2); 1344 relative && (endValue = endValue.substr(2)); 1345 endNum = parseFloat(endValue); 1346 if (p in _propertyAliases) { 1347 if (p === "autoAlpha") { 1348 //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened. 1349 if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) { 1350 //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience) 1351 startNum = 0; 1352 } 1353 inlineProps.push("visibility", 0, style.visibility); 1354 _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum); 1355 } 1356 if (p !== "scale" && p !== "transform") { 1357 p = _propertyAliases[p]; 1358 ~p.indexOf(",") && (p = p.split(",")[0]); 1359 } 1360 } 1361 isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED --- 1362 1363 if (isTransformRelated) { 1364 this.styles.save(p); 1365 if (!transformPropTween) { 1366 cache = target._gsap; 1367 cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here. 1368 1369 smooth = vars.smoothOrigin !== false && cache.smooth; 1370 transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning) 1371 1372 transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween. 1373 } 1374 if (p === "scale") { 1375 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, cache, "scaleY", cache.scaleY, (relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp); 1376 this._pt.u = 0; 1377 props.push("scaleY", p); 1378 p += "X"; 1379 } else if (p === "transformOrigin") { 1380 inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]); 1381 endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages. 1382 1383 if (cache.svg) { 1384 _applySVGOrigin(target, endValue, 0, smooth, 0, this); 1385 } else { 1386 endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately! 1387 1388 endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit); 1389 _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue)); 1390 } 1391 continue; 1392 } else if (p === "svgOrigin") { 1393 _applySVGOrigin(target, endValue, 1, smooth, 0, this); 1394 continue; 1395 } else if (p in _rotationalProperties) { 1396 _addRotationalPropTween(this, cache, p, startNum, relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, relative + endValue) : endValue); 1397 continue; 1398 } else if (p === "smoothOrigin") { 1399 _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue); 1400 continue; 1401 } else if (p === "force3D") { 1402 cache[p] = endValue; 1403 continue; 1404 } else if (p === "transform") { 1405 _addRawTransformPTs(this, endValue, target); 1406 continue; 1407 } 1408 } else if (!(p in style)) { 1409 p = _checkPropPrefix(p) || p; 1410 } 1411 if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) { 1412 startUnit = (startValue + "").substr((startNum + "").length); 1413 endNum || (endNum = 0); // protect against NaN 1414 1415 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] : startUnit); 1416 startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit)); 1417 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp); 1418 this._pt.u = endUnit || 0; 1419 if (startUnit !== endUnit && endUnit !== "%") { 1420 //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization) 1421 this._pt.b = startValue; 1422 this._pt.r = _renderCSSPropWithBeginning; 1423 } 1424 } else if (!(p in style)) { 1425 if (p in target) { 1426 //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that. 1427 this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets); 1428 } else if (p !== "parseTransform") { 1429 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_missingPlugin"])(p, endValue); 1430 continue; 1431 } 1432 } else { 1433 _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue); 1434 } 1435 isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === "function" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p])); 1436 props.push(p); 1437 } 1438 } 1439 hasPriority && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_sortPropTweensByPriority"])(this); 1440 }, 1441 render: function render(ratio, data) { 1442 if (data.tween._time || !_reverting()) { 1443 var pt = data._pt; 1444 while (pt) { 1445 pt.r(ratio, pt.d); 1446 pt = pt._next; 1447 } 1448 } else { 1449 data.styles.revert(); 1450 } 1451 }, 1452 get: _get, 1453 aliases: _propertyAliases, 1454 getSetter: function getSetter(target, property, plugin) { 1455 //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer. 1456 var p = _propertyAliases[property]; 1457 p && p.indexOf(",") < 0 && (property = p); 1458 return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isUndefined"])(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getSetter"])(target, property); 1459 }, 1460 core: { 1461 _removeProperty: _removeProperty, 1462 _getMatrix: _getMatrix 1463 } 1464}; 1465_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].utils.checkPrefix = _checkPropPrefix; 1466_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.getStyleSaver = _getStyleSaver; 1467(function (positionAndScale, rotation, others, aliases) { 1468 var all = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(positionAndScale + "," + rotation + "," + others, function (name) { 1469 _transformProps[name] = 1; 1470 }); 1471 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(rotation, function (name) { 1472 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "deg"; 1473 _rotationalProperties[name] = 1; 1474 }); 1475 _propertyAliases[all[13]] = positionAndScale + "," + rotation; 1476 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(aliases, function (name) { 1477 var split = name.split(":"); 1478 _propertyAliases[split[1]] = all[split[0]]; 1479 }); 1480})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY"); 1481Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) { 1482 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "px"; 1483}); 1484_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(CSSPlugin); 1485 1486 1487/***/ }), 1488
vendor: 9,921 bytes, lines 1489-1755
1489/***/ "./node_modules/gsap/ScrollToPlugin.js": 1490/*!*********************************************!*\ 1491 !*** ./node_modules/gsap/ScrollToPlugin.js ***! 1492 \*********************************************/ 1493/*! exports provided: ScrollToPlugin, default */ 1494/***/ (function(module, __webpack_exports__, __webpack_require__) { 1495 1496"use strict"; 1497__webpack_require__.r(__webpack_exports__); 1498/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScrollToPlugin", function() { return ScrollToPlugin; }); 1499/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScrollToPlugin; }); 1500/*** IMPORTS FROM imports-loader ***/ 1501var define = false; 1502 1503/*! 1504 * ScrollToPlugin 3.12.7 1505 * https://gsap.com 1506 * 1507 * @license Copyright 2008-2025, GreenSock. All rights reserved. 1508 * Subject to the terms at https://gsap.com/standard-license or for 1509 * Club GSAP members, the agreement issued with that membership. 1510 * @author: Jack Doyle, [email protected] 1511*/ 1512 1513/* eslint-disable */ 1514var gsap, 1515 _coreInitted, 1516 _window, 1517 _docEl, 1518 _body, 1519 _toArray, 1520 _config, 1521 ScrollTrigger, 1522 _windowExists = function _windowExists() { 1523 return typeof window !== "undefined"; 1524 }, 1525 _getGSAP = function _getGSAP() { 1526 return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap; 1527 }, 1528 _isString = function _isString(value) { 1529 return typeof value === "string"; 1530 }, 1531 _isFunction = function _isFunction(value) { 1532 return typeof value === "function"; 1533 }, 1534 _max = function _max(element, axis) { 1535 var dim = axis === "x" ? "Width" : "Height", 1536 scroll = "scroll" + dim, 1537 client = "client" + dim; 1538 return element === _window || element === _docEl || element === _body ? Math.max(_docEl[scroll], _body[scroll]) - (_window["inner" + dim] || _docEl[client] || _body[client]) : element[scroll] - element["offset" + dim]; 1539 }, 1540 _buildGetter = function _buildGetter(e, axis) { 1541 //pass in an element and an axis ("x" or "y") and it'll return a getter function for the scroll position of that element (like scrollTop or scrollLeft, although if the element is the window, it'll use the pageXOffset/pageYOffset or the documentElement's scrollTop/scrollLeft or document.body's. Basically this streamlines things and makes a very fast getter across browsers. 1542 var p = "scroll" + (axis === "x" ? "Left" : "Top"); 1543 if (e === _window) { 1544 if (e.pageXOffset != null) { 1545 p = "page" + axis.toUpperCase() + "Offset"; 1546 } else { 1547 e = _docEl[p] != null ? _docEl : _body; 1548 } 1549 } 1550 return function () { 1551 return e[p]; 1552 }; 1553 }, 1554 _clean = function _clean(value, index, target, targets) { 1555 _isFunction(value) && (value = value(index, target, targets)); 1556 if (typeof value !== "object") { 1557 return _isString(value) && value !== "max" && value.charAt(1) !== "=" ? { 1558 x: value, 1559 y: value 1560 } : { 1561 y: value 1562 }; //if we don't receive an object as the parameter, assume the user intends "y". 1563 } else if (value.nodeType) { 1564 return { 1565 y: value, 1566 x: value 1567 }; 1568 } else { 1569 var result = {}, 1570 p; 1571 for (p in value) { 1572 result[p] = p !== "onAutoKill" && _isFunction(value[p]) ? value[p](index, target, targets) : value[p]; 1573 } 1574 return result; 1575 } 1576 }, 1577 _getOffset = function _getOffset(element, container) { 1578 element = _toArray(element)[0]; 1579 if (!element || !element.getBoundingClientRect) { 1580 return console.warn("scrollTo target doesn't exist. Using 0") || { 1581 x: 0, 1582 y: 0 1583 }; 1584 } 1585 var rect = element.getBoundingClientRect(), 1586 isRoot = !container || container === _window || container === _body, 1587 cRect = isRoot ? { 1588 top: _docEl.clientTop - (_window.pageYOffset || _docEl.scrollTop || _body.scrollTop || 0), 1589 left: _docEl.clientLeft - (_window.pageXOffset || _docEl.scrollLeft || _body.scrollLeft || 0) 1590 } : container.getBoundingClientRect(), 1591 offsets = { 1592 x: rect.left - cRect.left, 1593 y: rect.top - cRect.top 1594 }; 1595 if (!isRoot && container) { 1596 //only add the current scroll position if it's not the window/body. 1597 offsets.x += _buildGetter(container, "x")(); 1598 offsets.y += _buildGetter(container, "y")(); 1599 } 1600 return offsets; 1601 }, 1602 _parseVal = function _parseVal(value, target, axis, currentVal, offset) { 1603 return !isNaN(value) && typeof value !== "object" ? parseFloat(value) - offset : _isString(value) && value.charAt(1) === "=" ? parseFloat(value.substr(2)) * (value.charAt(0) === "-" ? -1 : 1) + currentVal - offset : value === "max" ? _max(target, axis) - offset : Math.min(_max(target, axis), _getOffset(value, target)[axis] - offset); 1604 }, 1605 _initCore = function _initCore() { 1606 gsap = _getGSAP(); 1607 if (_windowExists() && gsap && typeof document !== "undefined" && document.body) { 1608 _window = window; 1609 _body = document.body; 1610 _docEl = document.documentElement; 1611 _toArray = gsap.utils.toArray; 1612 gsap.config({ 1613 autoKillThreshold: 7 1614 }); 1615 _config = gsap.config(); 1616 _coreInitted = 1; 1617 } 1618 }; 1619var ScrollToPlugin = { 1620 version: "3.12.7", 1621 name: "scrollTo", 1622 rawVars: 1, 1623 register: function register(core) { 1624 gsap = core; 1625 _initCore(); 1626 }, 1627 init: function init(target, value, tween, index, targets) { 1628 _coreInitted || _initCore(); 1629 var data = this, 1630 snapType = gsap.getProperty(target, "scrollSnapType"); 1631 data.isWin = target === _window; 1632 data.target = target; 1633 data.tween = tween; 1634 value = _clean(value, index, target, targets); 1635 data.vars = value; 1636 data.autoKill = !!("autoKill" in value ? value : _config).autoKill; 1637 data.getX = _buildGetter(target, "x"); 1638 data.getY = _buildGetter(target, "y"); 1639 data.x = data.xPrev = data.getX(); 1640 data.y = data.yPrev = data.getY(); 1641 ScrollTrigger || (ScrollTrigger = gsap.core.globals().ScrollTrigger); 1642 gsap.getProperty(target, "scrollBehavior") === "smooth" && gsap.set(target, { 1643 scrollBehavior: "auto" 1644 }); 1645 if (snapType && snapType !== "none") { 1646 // disable scroll snapping to avoid strange behavior 1647 data.snap = 1; 1648 data.snapInline = target.style.scrollSnapType; 1649 target.style.scrollSnapType = "none"; 1650 } 1651 if (value.x != null) { 1652 data.add(data, "x", data.x, _parseVal(value.x, target, "x", data.x, value.offsetX || 0), index, targets); 1653 data._props.push("scrollTo_x"); 1654 } else { 1655 data.skipX = 1; 1656 } 1657 if (value.y != null) { 1658 data.add(data, "y", data.y, _parseVal(value.y, target, "y", data.y, value.offsetY || 0), index, targets); 1659 data._props.push("scrollTo_y"); 1660 } else { 1661 data.skipY = 1; 1662 } 1663 }, 1664 render: function render(ratio, data) { 1665 var pt = data._pt, 1666 target = data.target, 1667 tween = data.tween, 1668 autoKill = data.autoKill, 1669 xPrev = data.xPrev, 1670 yPrev = data.yPrev, 1671 isWin = data.isWin, 1672 snap = data.snap, 1673 snapInline = data.snapInline, 1674 x, 1675 y, 1676 yDif, 1677 xDif, 1678 threshold; 1679 while (pt) { 1680 pt.r(ratio, pt.d); 1681 pt = pt._next; 1682 } 1683 x = isWin || !data.skipX ? data.getX() : xPrev; 1684 y = isWin || !data.skipY ? data.getY() : yPrev; 1685 yDif = y - yPrev; 1686 xDif = x - xPrev; 1687 threshold = _config.autoKillThreshold; 1688 if (data.x < 0) { 1689 //can't scroll to a position less than 0! Might happen if someone uses a Back.easeOut or Elastic.easeOut when scrolling back to the top of the page (for example) 1690 data.x = 0; 1691 } 1692 if (data.y < 0) { 1693 data.y = 0; 1694 } 1695 if (autoKill) { 1696 //note: iOS has a bug that throws off the scroll by several pixels, so we need to check if it's within 7 pixels of the previous one that we set instead of just looking for an exact match. 1697 if (!data.skipX && (xDif > threshold || xDif < -threshold) && x < _max(target, "x")) { 1698 data.skipX = 1; //if the user scrolls separately, we should stop tweening! 1699 } 1700 if (!data.skipY && (yDif > threshold || yDif < -threshold) && y < _max(target, "y")) { 1701 data.skipY = 1; //if the user scrolls separately, we should stop tweening! 1702 } 1703 if (data.skipX && data.skipY) { 1704 tween.kill(); 1705 data.vars.onAutoKill && data.vars.onAutoKill.apply(tween, data.vars.onAutoKillParams || []); 1706 } 1707 } 1708 if (isWin) { 1709 _window.scrollTo(!data.skipX ? data.x : x, !data.skipY ? data.y : y); 1710 } else { 1711 data.skipY || (target.scrollTop = data.y); 1712 data.skipX || (target.scrollLeft = data.x); 1713 } 1714 if (snap && (ratio === 1 || ratio === 0)) { 1715 y = target.scrollTop; 1716 x = target.scrollLeft; 1717 snapInline ? target.style.scrollSnapType = snapInline : target.style.removeProperty("scroll-snap-type"); 1718 target.scrollTop = y + 1; // bug in Safari causes the element to totally reset its scroll position when scroll-snap-type changes, so we need to set it to a slightly different value and then back again to work around this bug. 1719 1720 target.scrollLeft = x + 1; 1721 target.scrollTop = y; 1722 target.scrollLeft = x; 1723 } 1724 data.xPrev = data.x; 1725 data.yPrev = data.y; 1726 ScrollTrigger && ScrollTrigger.update(); 1727 }, 1728 kill: function kill(property) { 1729 var both = property === "scrollTo", 1730 i = this._props.indexOf(property); 1731 if (both || property === "scrollTo_x") { 1732 this.skipX = 1; 1733 } 1734 if (both || property === "scrollTo_y") { 1735 this.skipY = 1; 1736 } 1737 i > -1 && this._props.splice(i, 1); 1738 return !this._props.length; 1739 } 1740}; 1741ScrollToPlugin.max = _max; 1742ScrollToPlugin.getOffset = _getOffset; 1743ScrollToPlugin.buildGetter = _buildGetter; 1744ScrollToPlugin.config = function (vars) { 1745 _config || _initCore() || (_config = gsap.config()); // in case the window hasn't been defined yet. 1746 1747 for (var p in vars) { 1748 _config[p] = vars[p]; 1749 } 1750}; 1751_getGSAP() && gsap.registerPlugin(ScrollToPlugin); 1752 1753 1754/***/ }), 1755
vendor: 182,503 bytes, lines 1756-5690
1756/***/ "./node_modules/gsap/gsap-core.js": 1757/*!****************************************!*\ 1758 !*** ./node_modules/gsap/gsap-core.js ***! 1759 \****************************************/ 1760/*! exports provided: GSCache, Animation, Timeline, Tween, PropTween, gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenMax, TweenLite, TimelineMax, TimelineLite, default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle, _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative */ 1761/***/ (function(module, __webpack_exports__, __webpack_require__) { 1762 1763"use strict"; 1764__webpack_require__.r(__webpack_exports__); 1765/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GSCache", function() { return GSCache; }); 1766/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Animation", function() { return Animation; }); 1767/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timeline", function() { return Timeline; }); 1768/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tween", function() { return Tween; }); 1769/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropTween", function() { return PropTween; }); 1770/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsap; }); 1771/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return Power0; }); 1772/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return Power1; }); 1773/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return Power2; }); 1774/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return Power3; }); 1775/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return Power4; }); 1776/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return Linear; }); 1777/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return Quad; }); 1778/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return Cubic; }); 1779/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return Quart; }); 1780/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return Quint; }); 1781/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return Strong; }); 1782/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return Elastic; }); 1783/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return Back; }); 1784/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return SteppedEase; }); 1785/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return Bounce; }); 1786/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return Sine; }); 1787/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return Expo; }); 1788/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return Circ; }); 1789/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return Tween; }); 1790/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return Tween; }); 1791/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return Timeline; }); 1792/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return Timeline; }); 1793/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsap; }); 1794/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; }); 1795/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrapYoyo", function() { return wrapYoyo; }); 1796/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distribute", function() { return distribute; }); 1797/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; }); 1798/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snap", function() { return snap; }); 1799/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; }); 1800/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnit", function() { return getUnit; }); 1801/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clamp", function() { return clamp; }); 1802/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitColor", function() { return splitColor; }); 1803/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); 1804/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selector", function() { return selector; }); 1805/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapRange", function() { return mapRange; }); 1806/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); 1807/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unitize", function() { return unitize; }); 1808/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return interpolate; }); 1809/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; }); 1810/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getProperty", function() { return _getProperty; }); 1811/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numExp", function() { return _numExp; }); 1812/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numWithUnitExp", function() { return _numWithUnitExp; }); 1813/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isString", function() { return _isString; }); 1814/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isUndefined", function() { return _isUndefined; }); 1815/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_renderComplexString", function() { return _renderComplexString; }); 1816/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_relExp", function() { return _relExp; }); 1817/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_setDefaults", function() { return _setDefaults; }); 1818/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_removeLinkedListItem", function() { return _removeLinkedListItem; }); 1819/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_forEachName", function() { return _forEachName; }); 1820/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_sortPropTweensByPriority", function() { return _sortPropTweensByPriority; }); 1821/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorStringFilter", function() { return _colorStringFilter; }); 1822/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_replaceRandom", function() { return _replaceRandom; }); 1823/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_checkPlugin", function() { return _checkPlugin; }); 1824/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_plugins", function() { return _plugins; }); 1825/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ticker", function() { return _ticker; }); 1826/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_config", function() { return _config; }); 1827/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_roundModifier", function() { return _roundModifier; }); 1828/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_round", function() { return _round; }); 1829/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_missingPlugin", function() { return _missingPlugin; }); 1830/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getSetter", function() { return _getSetter; }); 1831/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getCache", function() { return _getCache; }); 1832/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorExp", function() { return _colorExp; }); 1833/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_parseRelative", function() { return _parseRelative; }); 1834/*** IMPORTS FROM imports-loader ***/ 1835var define = false; 1836function _assertThisInitialized(self) { 1837 if (self === void 0) { 1838 throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 1839 } 1840 return self; 1841} 1842function _inheritsLoose(subClass, superClass) { 1843 subClass.prototype = Object.create(superClass.prototype); 1844 subClass.prototype.constructor = subClass; 1845 subClass.__proto__ = superClass; 1846} 1847 1848/*! 1849 * GSAP 3.12.7 1850 * https://gsap.com 1851 * 1852 * @license Copyright 2008-2025, GreenSock. All rights reserved. 1853 * Subject to the terms at https://gsap.com/standard-license or for 1854 * Club GSAP members, the agreement issued with that membership. 1855 * @author: Jack Doyle, [email protected] 1856*/ 1857 1858/* eslint-disable */ 1859var _config = { 1860 autoSleep: 120, 1861 force3D: "auto", 1862 nullTargetWarn: 1, 1863 units: { 1864 lineHeight: "" 1865 } 1866 }, 1867 _defaults = { 1868 duration: .5, 1869 overwrite: false, 1870 delay: 0 1871 }, 1872 _suppressOverwrites, 1873 _reverting, 1874 _context, 1875 _bigNum = 1e8, 1876 _tinyNum = 1 / _bigNum, 1877 _2PI = Math.PI * 2, 1878 _HALF_PI = _2PI / 4, 1879 _gsID = 0, 1880 _sqrt = Math.sqrt, 1881 _cos = Math.cos, 1882 _sin = Math.sin, 1883 _isString = function _isString(value) { 1884 return typeof value === "string"; 1885 }, 1886 _isFunction = function _isFunction(value) { 1887 return typeof value === "function"; 1888 }, 1889 _isNumber = function _isNumber(value) { 1890 return typeof value === "number"; 1891 }, 1892 _isUndefined = function _isUndefined(value) { 1893 return typeof value === "undefined"; 1894 }, 1895 _isObject = function _isObject(value) { 1896 return typeof value === "object"; 1897 }, 1898 _isNotFalse = function _isNotFalse(value) { 1899 return value !== false; 1900 }, 1901 _windowExists = function _windowExists() { 1902 return typeof window !== "undefined"; 1903 }, 1904 _isFuncOrString = function _isFuncOrString(value) { 1905 return _isFunction(value) || _isString(value); 1906 }, 1907 _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {}, 1908 // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView(). 1909 _isArray = Array.isArray, 1910 _strictNumExp = /(?:-?\.?\d|\.)+/gi, 1911 //only numbers (including negatives and decimals) but NOT relative values. 1912 _numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g, 1913 //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8. 1914 _numWithUnitExp = /[-+=.]*\d+[.e-]*\d*[a-z%]*/g, 1915 _complexStringNumExp = /[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi, 1916 //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too. 1917 _relExp = /[+-]=-?[.\d]+/, 1918 _delimitedValueExp = /[^,'"\[\]\s]+/gi, 1919 // previously /[#\-+.]*\b[a-z\d\-=+%.]+/gi but didn't catch special characters. 1920 _unitExp = /^[+\-=e\s\d]*\d+[.\d]*([a-z]*|%)\s*$/i, 1921 _globalTimeline, 1922 _win, 1923 _coreInitted, 1924 _doc, 1925 _globals = {}, 1926 _installScope = {}, 1927 _coreReady, 1928 _install = function _install(scope) { 1929 return (_installScope = _merge(scope, _globals)) && gsap; 1930 }, 1931 _missingPlugin = function _missingPlugin(property, value) { 1932 return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()"); 1933 }, 1934 _warn = function _warn(message, suppress) { 1935 return !suppress && console.warn(message); 1936 }, 1937 _addGlobal = function _addGlobal(name, obj) { 1938 return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals; 1939 }, 1940 _emptyFunc = function _emptyFunc() { 1941 return 0; 1942 }, 1943 _startAtRevertConfig = { 1944 suppressEvents: true, 1945 isStart: true, 1946 kill: false 1947 }, 1948 _revertConfigNoKill = { 1949 suppressEvents: true, 1950 kill: false 1951 }, 1952 _revertConfig = { 1953 suppressEvents: true 1954 }, 1955 _reservedProps = {}, 1956 _lazyTweens = [], 1957 _lazyLookup = {}, 1958 _lastRenderedFrame, 1959 _plugins = {}, 1960 _effects = {}, 1961 _nextGCFrame = 30, 1962 _harnessPlugins = [], 1963 _callbackNames = "", 1964 _harness = function _harness(targets) { 1965 var target = targets[0], 1966 harnessPlugin, 1967 i; 1968 _isObject(target) || _isFunction(target) || (targets = [targets]); 1969 if (!(harnessPlugin = (target._gsap || {}).harness)) { 1970 // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization) 1971 i = _harnessPlugins.length; 1972 while (i-- && !_harnessPlugins[i].targetTest(target)) {} 1973 harnessPlugin = _harnessPlugins[i]; 1974 } 1975 i = targets.length; 1976 while (i--) { 1977 targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1); 1978 } 1979 return targets; 1980 }, 1981 _getCache = function _getCache(target) { 1982 return target._gsap || _harness(toArray(target))[0]._gsap; 1983 }, 1984 _getProperty = function _getProperty(target, property, v) { 1985 return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v; 1986 }, 1987 _forEachName = function _forEachName(names, func) { 1988 return (names = names.split(",")).forEach(func) || names; 1989 }, 1990 //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code). 1991 _round = function _round(value) { 1992 return Math.round(value * 100000) / 100000 || 0; 1993 }, 1994 _roundPrecise = function _roundPrecise(value) { 1995 return Math.round(value * 10000000) / 10000000 || 0; 1996 }, 1997 // increased precision mostly for timing values. 1998 _parseRelative = function _parseRelative(start, value) { 1999 var operator = value.charAt(0), 2000 end = parseFloat(value.substr(2)); 2001 start = parseFloat(start); 2002 return operator === "+" ? start + end : operator === "-" ? start - end : operator === "*" ? start * end : start / end; 2003 }, 2004 _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) { 2005 //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search. 2006 var l = toFind.length, 2007 i = 0; 2008 for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {} 2009 return i < l; 2010 }, 2011 _lazyRender = function _lazyRender() { 2012 var l = _lazyTweens.length, 2013 a = _lazyTweens.slice(0), 2014 i, 2015 tween; 2016 _lazyLookup = {}; 2017 _lazyTweens.length = 0; 2018 for (i = 0; i < l; i++) { 2019 tween = a[i]; 2020 tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0); 2021 } 2022 }, 2023 _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) { 2024 _lazyTweens.length && !_reverting && _lazyRender(); 2025 animation.render(time, suppressEvents, force || _reverting && time < 0 && (animation._initted || animation._startAt)); 2026 _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render. 2027 }, 2028 _numericIfPossible = function _numericIfPossible(value) { 2029 var n = parseFloat(value); 2030 return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value; 2031 }, 2032 _passThrough = function _passThrough(p) { 2033 return p; 2034 }, 2035 _setDefaults = function _setDefaults(obj, defaults) { 2036 for (var p in defaults) { 2037 p in obj || (obj[p] = defaults[p]); 2038 } 2039 return obj; 2040 }, 2041 _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) { 2042 return function (obj, defaults) { 2043 for (var p in defaults) { 2044 p in obj || p === "duration" && excludeDuration || p === "ease" || (obj[p] = defaults[p]); 2045 } 2046 }; 2047 }, 2048 _merge = function _merge(base, toMerge) { 2049 for (var p in toMerge) { 2050 base[p] = toMerge[p]; 2051 } 2052 return base; 2053 }, 2054 _mergeDeep = function _mergeDeep(base, toMerge) { 2055 for (var p in toMerge) { 2056 p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]); 2057 } 2058 return base; 2059 }, 2060 _copyExcluding = function _copyExcluding(obj, excluding) { 2061 var copy = {}, 2062 p; 2063 for (p in obj) { 2064 p in excluding || (copy[p] = obj[p]); 2065 } 2066 return copy; 2067 }, 2068 _inheritDefaults = function _inheritDefaults(vars) { 2069 var parent = vars.parent || _globalTimeline, 2070 func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults; 2071 if (_isNotFalse(vars.inherit)) { 2072 while (parent) { 2073 func(vars, parent.vars.defaults); 2074 parent = parent.parent || parent._dp; 2075 } 2076 } 2077 return vars; 2078 }, 2079 _arraysMatch = function _arraysMatch(a1, a2) { 2080 var i = a1.length, 2081 match = i === a2.length; 2082 while (match && i-- && a1[i] === a2[i]) {} 2083 return i < 0; 2084 }, 2085 _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) { 2086 if (firstProp === void 0) { 2087 firstProp = "_first"; 2088 } 2089 if (lastProp === void 0) { 2090 lastProp = "_last"; 2091 } 2092 var prev = parent[lastProp], 2093 t; 2094 if (sortBy) { 2095 t = child[sortBy]; 2096 while (prev && prev[sortBy] > t) { 2097 prev = prev._prev; 2098 } 2099 } 2100 if (prev) { 2101 child._next = prev._next; 2102 prev._next = child; 2103 } else { 2104 child._next = parent[firstProp]; 2105 parent[firstProp] = child; 2106 } 2107 if (child._next) { 2108 child._next._prev = child; 2109 } else { 2110 parent[lastProp] = child; 2111 } 2112 child._prev = prev; 2113 child.parent = child._dp = parent; 2114 return child; 2115 }, 2116 _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) { 2117 if (firstProp === void 0) { 2118 firstProp = "_first"; 2119 } 2120 if (lastProp === void 0) { 2121 lastProp = "_last"; 2122 } 2123 var prev = child._prev, 2124 next = child._next; 2125 if (prev) { 2126 prev._next = next; 2127 } else if (parent[firstProp] === child) { 2128 parent[firstProp] = next; 2129 } 2130 if (next) { 2131 next._prev = prev; 2132 } else if (parent[lastProp] === child) { 2133 parent[lastProp] = prev; 2134 } 2135 child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list. 2136 }, 2137 _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) { 2138 child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child); 2139 child._act = 0; 2140 }, 2141 _uncache = function _uncache(animation, child) { 2142 if (animation && (!child || child._end > animation._dur || child._start < 0)) { 2143 // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end) 2144 var a = animation; 2145 while (a) { 2146 a._dirty = 1; 2147 a = a.parent; 2148 } 2149 } 2150 return animation; 2151 }, 2152 _recacheAncestors = function _recacheAncestors(animation) { 2153 var parent = animation.parent; 2154 while (parent && parent.parent) { 2155 //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though. 2156 parent._dirty = 1; 2157 parent.totalDuration(); 2158 parent = parent.parent; 2159 } 2160 return animation; 2161 }, 2162 _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) { 2163 return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force)); 2164 }, 2165 _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) { 2166 return !animation || animation._ts && _hasNoPausedAncestors(animation.parent); 2167 }, 2168 _elapsedCycleDuration = function _elapsedCycleDuration(animation) { 2169 return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0; 2170 }, 2171 // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle. 2172 _animationCycle = function _animationCycle(tTime, cycleDuration) { 2173 var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration)); 2174 return tTime && whole === tTime ? whole - 1 : whole; 2175 }, 2176 _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) { 2177 return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur); 2178 }, 2179 _setEnd = function _setEnd(animation) { 2180 return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0)); 2181 }, 2182 _alignPlayhead = function _alignPlayhead(animation, totalTime) { 2183 // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for. 2184 var parent = animation._dp; 2185 if (parent && parent.smoothChildTiming && animation._ts) { 2186 animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts)); 2187 _setEnd(animation); 2188 parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here. 2189 } 2190 return animation; 2191 }, 2192 /* 2193 _totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => { 2194 let cycleDuration = duration + repeatDelay, 2195 time = _round(clampedTotalTime % cycleDuration); 2196 if (time > duration) { 2197 time = duration; 2198 } 2199 return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time; 2200 }, 2201 */ 2202 _postAddChecks = function _postAddChecks(timeline, child) { 2203 var t; 2204 if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) { 2205 // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true). 2206 t = _parentToChildTotalTime(timeline.rawTime(), child); 2207 if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) { 2208 child.render(t, true); 2209 } 2210 } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate. 2211 2212 if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) { 2213 //in case any of the ancestors had completed but should now be enabled... 2214 if (timeline._dur < timeline.duration()) { 2215 t = timeline; 2216 while (t._dp) { 2217 t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead. 2218 2219 t = t._dp; 2220 } 2221 } 2222 timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order. 2223 } 2224 }, 2225 _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) { 2226 child.parent && _removeFromParent(child); 2227 child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay); 2228 child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0)); 2229 _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0); 2230 _isFromOrFromStart(child) || (timeline._recent = child); 2231 skipChecks || _postAddChecks(timeline, child); 2232 timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back) 2233 2234 return timeline; 2235 }, 2236 _scrollTrigger = function _scrollTrigger(animation, trigger) { 2237 return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation); 2238 }, 2239 _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) { 2240 _initTween(tween, time, tTime); 2241 if (!tween._initted) { 2242 return 1; 2243 } 2244 if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) { 2245 _lazyTweens.push(tween); 2246 tween._lazy = [tTime, suppressEvents]; 2247 return 1; 2248 } 2249 }, 2250 _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) { 2251 var parent = _ref.parent; 2252 return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent)); 2253 }, 2254 // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0 2255 _isFromOrFromStart = function _isFromOrFromStart(_ref2) { 2256 var data = _ref2.data; 2257 return data === "isFromStart" || data === "isStart"; 2258 }, 2259 _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) { 2260 var prevRatio = tween.ratio, 2261 ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1, 2262 // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the "startAt" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any "from" and "fromTo" startAt tweens are rendered the first time at a ratio of 1. 2263 repeatDelay = tween._rDelay, 2264 tTime = 0, 2265 pt, 2266 iteration, 2267 prevIteration; 2268 if (repeatDelay && tween._repeat) { 2269 // in case there's a zero-duration tween that has a repeat with a repeatDelay 2270 tTime = _clamp(0, tween._tDur, totalTime); 2271 iteration = _animationCycle(tTime, repeatDelay); 2272 tween._yoyo && iteration & 1 && (ratio = 1 - ratio); 2273 if (iteration !== _animationCycle(tween._tTime, repeatDelay)) { 2274 // if iteration changed 2275 prevRatio = 1 - ratio; 2276 tween.vars.repeatRefresh && tween._initted && tween.invalidate(); 2277 } 2278 } 2279 if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) { 2280 if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) { 2281 // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately. 2282 return; 2283 } 2284 prevIteration = tween._zTime; 2285 tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 2286 2287 suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates. 2288 2289 tween.ratio = ratio; 2290 tween._from && (ratio = 1 - ratio); 2291 tween._time = 0; 2292 tween._tTime = tTime; 2293 pt = tween._pt; 2294 while (pt) { 2295 pt.r(ratio, pt.d); 2296 pt = pt._next; 2297 } 2298 totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true); 2299 tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate"); 2300 tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat"); 2301 if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) { 2302 ratio && _removeFromParent(tween, 1); 2303 if (!suppressEvents && !_reverting) { 2304 _callback(tween, ratio ? "onComplete" : "onReverseComplete", true); 2305 tween._prom && tween._prom(); 2306 } 2307 } 2308 } else if (!tween._zTime) { 2309 tween._zTime = totalTime; 2310 } 2311 }, 2312 _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) { 2313 var child; 2314 if (time > prevTime) { 2315 child = animation._first; 2316 while (child && child._start <= time) { 2317 if (child.data === "isPause" && child._start > prevTime) { 2318 return child; 2319 } 2320 child = child._next; 2321 } 2322 } else { 2323 child = animation._last; 2324 while (child && child._start >= time) { 2325 if (child.data === "isPause" && child._start < prevTime) { 2326 return child; 2327 } 2328 child = child._prev; 2329 } 2330 } 2331 }, 2332 _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) { 2333 var repeat = animation._repeat, 2334 dur = _roundPrecise(duration) || 0, 2335 totalProgress = animation._tTime / animation._tDur; 2336 totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur); 2337 animation._dur = dur; 2338 animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat); 2339 totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress); 2340 animation.parent && _setEnd(animation); 2341 skipUncache || _uncache(animation.parent, animation); 2342 return animation; 2343 }, 2344 _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) { 2345 return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur); 2346 }, 2347 _zeroPosition = { 2348 _start: 0, 2349 endTime: _emptyFunc, 2350 totalDuration: _emptyFunc 2351 }, 2352 _parsePosition = function _parsePosition(animation, position, percentAnimation) { 2353 var labels = animation.labels, 2354 recent = animation._recent || _zeroPosition, 2355 clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur, 2356 //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead. 2357 i, 2358 offset, 2359 isPercent; 2360 if (_isString(position) && (isNaN(position) || position in labels)) { 2361 //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value). 2362 offset = position.charAt(0); 2363 isPercent = position.substr(-1) === "%"; 2364 i = position.indexOf("="); 2365 if (offset === "<" || offset === ">") { 2366 i >= 0 && (position = position.replace(/=/, "")); 2367 return (offset === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1); 2368 } 2369 if (i < 0) { 2370 position in labels || (labels[position] = clippedDuration); 2371 return labels[position]; 2372 } 2373 offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1)); 2374 if (isPercent && percentAnimation) { 2375 offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration(); 2376 } 2377 return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset; 2378 } 2379 return position == null ? clippedDuration : +position; 2380 }, 2381 _createTweenType = function _createTweenType(type, params, timeline) { 2382 var isLegacy = _isNumber(params[1]), 2383 varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1), 2384 vars = params[varsIndex], 2385 irVars, 2386 parent; 2387 isLegacy && (vars.duration = params[1]); 2388 vars.parent = timeline; 2389 if (type) { 2390 irVars = vars; 2391 parent = timeline; 2392 while (parent && !("immediateRender" in irVars)) { 2393 // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed. 2394 irVars = parent.vars.defaults || {}; 2395 parent = _isNotFalse(parent.vars.inherit) && parent.parent; 2396 } 2397 vars.immediateRender = _isNotFalse(irVars.immediateRender); 2398 type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars 2399 } 2400 return new Tween(params[0], vars, params[varsIndex + 1]); 2401 }, 2402 _conditionalReturn = function _conditionalReturn(value, func) { 2403 return value || value === 0 ? func(value) : func; 2404 }, 2405 _clamp = function _clamp(min, max, value) { 2406 return value < min ? min : value > max ? max : value; 2407 }, 2408 getUnit = function getUnit(value, v) { 2409 return !_isString(value) || !(v = _unitExp.exec(value)) ? "" : v[1]; 2410 }, 2411 // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit. 2412 clamp = function clamp(min, max, value) { 2413 return _conditionalReturn(value, function (v) { 2414 return _clamp(min, max, v); 2415 }); 2416 }, 2417 _slice = [].slice, 2418 _isArrayLike = function _isArrayLike(value, nonEmpty) { 2419 return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win; 2420 }, 2421 _flatten = function _flatten(ar, leaveStrings, accumulator) { 2422 if (accumulator === void 0) { 2423 accumulator = []; 2424 } 2425 return ar.forEach(function (value) { 2426 var _accumulator; 2427 return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value); 2428 }) || accumulator; 2429 }, 2430 //takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects. 2431 toArray = function toArray(value, scope, leaveStrings) { 2432 return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : []; 2433 }, 2434 selector = function selector(value) { 2435 value = toArray(value)[0] || _warn("Invalid scope") || {}; 2436 return function (v) { 2437 var el = value.current || value.nativeElement || value; 2438 return toArray(v, el.querySelectorAll ? el : el === value ? _warn("Invalid scope") || _doc.createElement("div") : value); 2439 }; 2440 }, 2441 shuffle = function shuffle(a) { 2442 return a.sort(function () { 2443 return .5 - Math.random(); 2444 }); 2445 }, 2446 // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a; 2447 //for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following 2448 distribute = function distribute(v) { 2449 if (_isFunction(v)) { 2450 return v; 2451 } 2452 var vars = _isObject(v) ? v : { 2453 each: v 2454 }, 2455 //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all. 2456 ease = _parseEase(vars.ease), 2457 from = vars.from || 0, 2458 base = parseFloat(vars.base) || 0, 2459 cache = {}, 2460 isDecimal = from > 0 && from < 1, 2461 ratios = isNaN(from) || isDecimal, 2462 axis = vars.axis, 2463 ratioX = from, 2464 ratioY = from; 2465 if (_isString(from)) { 2466 ratioX = ratioY = { 2467 center: .5, 2468 edges: .5, 2469 end: 1 2470 }[from] || 0; 2471 } else if (!isDecimal && ratios) { 2472 ratioX = from[0]; 2473 ratioY = from[1]; 2474 } 2475 return function (i, target, a) { 2476 var l = (a || vars).length, 2477 distances = cache[l], 2478 originX, 2479 originY, 2480 x, 2481 y, 2482 d, 2483 j, 2484 max, 2485 min, 2486 wrapAt; 2487 if (!distances) { 2488 wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1]; 2489 if (!wrapAt) { 2490 max = -_bigNum; 2491 while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {} 2492 wrapAt < l && wrapAt--; 2493 } 2494 distances = cache[l] = []; 2495 originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt; 2496 originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0; 2497 max = 0; 2498 min = _bigNum; 2499 for (j = 0; j < l; j++) { 2500 x = j % wrapAt - originX; 2501 y = originY - (j / wrapAt | 0); 2502 distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x); 2503 d > max && (max = d); 2504 d < min && (min = d); 2505 } 2506 from === "random" && shuffle(distances); 2507 distances.max = max - min; 2508 distances.min = min; 2509 distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1); 2510 distances.b = l < 0 ? base - l : base; 2511 distances.u = getUnit(vars.amount || vars.each) || 0; //unit 2512 2513 ease = ease && l < 0 ? _invertEase(ease) : ease; 2514 } 2515 l = (distances[i] - distances.min) / distances.max || 0; 2516 return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors 2517 }; 2518 }, 2519 _roundModifier = function _roundModifier(v) { 2520 //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc. 2521 var p = Math.pow(10, ((v + "").split(".")[1] || "").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed()) 2522 2523 return function (raw) { 2524 var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p); 2525 return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151! 2526 }; 2527 }, 2528 snap = function snap(snapTo, value) { 2529 var isArray = _isArray(snapTo), 2530 radius, 2531 is2D; 2532 if (!isArray && _isObject(snapTo)) { 2533 radius = isArray = snapTo.radius || _bigNum; 2534 if (snapTo.values) { 2535 snapTo = toArray(snapTo.values); 2536 if (is2D = !_isNumber(snapTo[0])) { 2537 radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop. 2538 } 2539 } else { 2540 snapTo = _roundModifier(snapTo.increment); 2541 } 2542 } 2543 return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) { 2544 is2D = snapTo(raw); 2545 return Math.abs(is2D - raw) <= radius ? is2D : raw; 2546 } : function (raw) { 2547 var x = parseFloat(is2D ? raw.x : raw), 2548 y = parseFloat(is2D ? raw.y : 0), 2549 min = _bigNum, 2550 closest = 0, 2551 i = snapTo.length, 2552 dx, 2553 dy; 2554 while (i--) { 2555 if (is2D) { 2556 dx = snapTo[i].x - x; 2557 dy = snapTo[i].y - y; 2558 dx = dx * dx + dy * dy; 2559 } else { 2560 dx = Math.abs(snapTo[i] - x); 2561 } 2562 if (dx < min) { 2563 min = dx; 2564 closest = i; 2565 } 2566 } 2567 closest = !radius || min <= radius ? snapTo[closest] : raw; 2568 return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw); 2569 }); 2570 }, 2571 random = function random(min, max, roundingIncrement, returnFunction) { 2572 return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () { 2573 return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction; 2574 }); 2575 }, 2576 pipe = function pipe() { 2577 for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) { 2578 functions[_key] = arguments[_key]; 2579 } 2580 return function (value) { 2581 return functions.reduce(function (v, f) { 2582 return f(v); 2583 }, value); 2584 }; 2585 }, 2586 unitize = function unitize(func, unit) { 2587 return function (value) { 2588 return func(parseFloat(value)) + (unit || getUnit(value)); 2589 }; 2590 }, 2591 normalize = function normalize(min, max, value) { 2592 return mapRange(min, max, 0, 1, value); 2593 }, 2594 _wrapArray = function _wrapArray(a, wrapper, value) { 2595 return _conditionalReturn(value, function (index) { 2596 return a[~~wrapper(index)]; 2597 }); 2598 }, 2599 wrap = function wrap(min, max, value) { 2600 // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP). 2601 var range = max - min; 2602 return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) { 2603 return (range + (value - min) % range) % range + min; 2604 }); 2605 }, 2606 wrapYoyo = function wrapYoyo(min, max, value) { 2607 var range = max - min, 2608 total = range * 2; 2609 return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) { 2610 value = (total + (value - min) % total) % total || 0; 2611 return min + (value > range ? total - value : value); 2612 }); 2613 }, 2614 _replaceRandom = function _replaceRandom(value) { 2615 //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500]) 2616 var prev = 0, 2617 s = "", 2618 i, 2619 nums, 2620 end, 2621 isArray; 2622 while (~(i = value.indexOf("random(", prev))) { 2623 end = value.indexOf(")", i); 2624 isArray = value.charAt(i + 7) === "["; 2625 nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp); 2626 s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5); 2627 prev = end + 1; 2628 } 2629 return s + value.substr(prev, value.length - prev); 2630 }, 2631 mapRange = function mapRange(inMin, inMax, outMin, outMax, value) { 2632 var inRange = inMax - inMin, 2633 outRange = outMax - outMin; 2634 return _conditionalReturn(value, function (value) { 2635 return outMin + ((value - inMin) / inRange * outRange || 0); 2636 }); 2637 }, 2638 interpolate = function interpolate(start, end, progress, mutate) { 2639 var func = isNaN(start + end) ? 0 : function (p) { 2640 return (1 - p) * start + p * end; 2641 }; 2642 if (!func) { 2643 var isString = _isString(start), 2644 master = {}, 2645 p, 2646 i, 2647 interpolators, 2648 l, 2649 il; 2650 progress === true && (mutate = 1) && (progress = null); 2651 if (isString) { 2652 start = { 2653 p: start 2654 }; 2655 end = { 2656 p: end 2657 }; 2658 } else if (_isArray(start) && !_isArray(end)) { 2659 interpolators = []; 2660 l = start.length; 2661 il = l - 2; 2662 for (i = 1; i < l; i++) { 2663 interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them. 2664 } 2665 l--; 2666 func = function func(p) { 2667 p *= l; 2668 var i = Math.min(il, ~~p); 2669 return interpolators[i](p - i); 2670 }; 2671 progress = end; 2672 } else if (!mutate) { 2673 start = _merge(_isArray(start) ? [] : {}, start); 2674 } 2675 if (!interpolators) { 2676 for (p in end) { 2677 _addPropTween.call(master, start, p, "get", end[p]); 2678 } 2679 func = function func(p) { 2680 return _renderPropTweens(p, master) || (isString ? start.p : start); 2681 }; 2682 } 2683 } 2684 return _conditionalReturn(progress, func); 2685 }, 2686 _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) { 2687 //used for nextLabel() and previousLabel() 2688 var labels = timeline.labels, 2689 min = _bigNum, 2690 p, 2691 distance, 2692 label; 2693 for (p in labels) { 2694 distance = labels[p] - fromTime; 2695 if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) { 2696 label = p; 2697 min = distance; 2698 } 2699 } 2700 return label; 2701 }, 2702 _callback = function _callback(animation, type, executeLazyFirst) { 2703 var v = animation.vars, 2704 callback = v[type], 2705 prevContext = _context, 2706 context = animation._ctx, 2707 params, 2708 scope, 2709 result; 2710 if (!callback) { 2711 return; 2712 } 2713 params = v[type + "Params"]; 2714 scope = v.callbackScope || animation; 2715 executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values. 2716 2717 context && (_context = context); 2718 result = params ? callback.apply(scope, params) : callback.call(scope); 2719 _context = prevContext; 2720 return result; 2721 }, 2722 _interrupt = function _interrupt(animation) { 2723 _removeFromParent(animation); 2724 animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting); 2725 animation.progress() < 1 && _callback(animation, "onInterrupt"); 2726 return animation; 2727 }, 2728 _quickTween, 2729 _registerPluginQueue = [], 2730 _createPlugin = function _createPlugin(config) { 2731 if (!config) return; 2732 config = !config.name && config["default"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}. 2733 2734 if (_windowExists() || config.headless) { 2735 // edge case: some build tools may pass in a null/undefined value 2736 var name = config.name, 2737 isFunc = _isFunction(config), 2738 Plugin = name && !isFunc && config.init ? function () { 2739 this._props = []; 2740 } : config, 2741 //in case someone passes in an object that's not a plugin, like CustomEase 2742 instanceDefaults = { 2743 init: _emptyFunc, 2744 render: _renderPropTweens, 2745 add: _addPropTween, 2746 kill: _killPropTweensOf, 2747 modifier: _addPluginModifier, 2748 rawVars: 0 2749 }, 2750 statics = { 2751 targetTest: 0, 2752 get: 0, 2753 getSetter: _getSetter, 2754 aliases: {}, 2755 register: 0 2756 }; 2757 _wake(); 2758 if (config !== Plugin) { 2759 if (_plugins[name]) { 2760 return; 2761 } 2762 _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods 2763 2764 _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods 2765 2766 _plugins[Plugin.prop = name] = Plugin; 2767 if (config.targetTest) { 2768 _harnessPlugins.push(Plugin); 2769 _reservedProps[name] = 1; 2770 } 2771 name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin 2772 } 2773 _addGlobal(name, Plugin); 2774 config.register && config.register(gsap, Plugin, PropTween); 2775 } else { 2776 _registerPluginQueue.push(config); 2777 } 2778 }, 2779 /* 2780 * -------------------------------------------------------------------------------------- 2781 * COLORS 2782 * -------------------------------------------------------------------------------------- 2783 */ 2784 _255 = 255, 2785 _colorLookup = { 2786 aqua: [0, _255, _255], 2787 lime: [0, _255, 0], 2788 silver: [192, 192, 192], 2789 black: [0, 0, 0], 2790 maroon: [128, 0, 0], 2791 teal: [0, 128, 128], 2792 blue: [0, 0, _255], 2793 navy: [0, 0, 128], 2794 white: [_255, _255, _255], 2795 olive: [128, 128, 0], 2796 yellow: [_255, _255, 0], 2797 orange: [_255, 165, 0], 2798 gray: [128, 128, 128], 2799 purple: [128, 0, 128], 2800 green: [0, 128, 0], 2801 red: [_255, 0, 0], 2802 pink: [_255, 192, 203], 2803 cyan: [0, _255, _255], 2804 transparent: [_255, _255, _255, 0] 2805 }, 2806 // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc: 2807 // let ctx = _doc.createElement("canvas").getContext("2d"); 2808 // _forEachName("aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)}); 2809 _hue = function _hue(h, m1, m2) { 2810 h += h < 0 ? 1 : h > 1 ? -1 : 0; 2811 return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0; 2812 }, 2813 splitColor = function splitColor(v, toHSL, forceAlpha) { 2814 var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0, 2815 r, 2816 g, 2817 b, 2818 h, 2819 s, 2820 l, 2821 max, 2822 min, 2823 d, 2824 wasHSL; 2825 if (!a) { 2826 if (v.substr(-1) === ",") { 2827 //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value. 2828 v = v.substr(0, v.length - 1); 2829 } 2830 if (_colorLookup[v]) { 2831 a = _colorLookup[v]; 2832 } else if (v.charAt(0) === "#") { 2833 if (v.length < 6) { 2834 //for shorthand like #9F0 or #9F0F (could have alpha) 2835 r = v.charAt(1); 2836 g = v.charAt(2); 2837 b = v.charAt(3); 2838 v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : ""); 2839 } 2840 if (v.length === 9) { 2841 // hex with alpha, like #fd5e53ff 2842 a = parseInt(v.substr(1, 6), 16); 2843 return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255]; 2844 } 2845 v = parseInt(v.substr(1), 16); 2846 a = [v >> 16, v >> 8 & _255, v & _255]; 2847 } else if (v.substr(0, 3) === "hsl") { 2848 a = wasHSL = v.match(_strictNumExp); 2849 if (!toHSL) { 2850 h = +a[0] % 360 / 360; 2851 s = +a[1] / 100; 2852 l = +a[2] / 100; 2853 g = l <= .5 ? l * (s + 1) : l + s - l * s; 2854 r = l * 2 - g; 2855 a.length > 3 && (a[3] *= 1); //cast as number 2856 2857 a[0] = _hue(h + 1 / 3, r, g); 2858 a[1] = _hue(h, r, g); 2859 a[2] = _hue(h - 1 / 3, r, g); 2860 } else if (~v.indexOf("=")) { 2861 //if relative values are found, just return the raw strings with the relative prefixes in place. 2862 a = v.match(_numExp); 2863 forceAlpha && a.length < 4 && (a[3] = 1); 2864 return a; 2865 } 2866 } else { 2867 a = v.match(_strictNumExp) || _colorLookup.transparent; 2868 } 2869 a = a.map(Number); 2870 } 2871 if (toHSL && !wasHSL) { 2872 r = a[0] / _255; 2873 g = a[1] / _255; 2874 b = a[2] / _255; 2875 max = Math.max(r, g, b); 2876 min = Math.min(r, g, b); 2877 l = (max + min) / 2; 2878 if (max === min) { 2879 h = s = 0; 2880 } else { 2881 d = max - min; 2882 s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 2883 h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4; 2884 h *= 60; 2885 } 2886 a[0] = ~~(h + .5); 2887 a[1] = ~~(s * 100 + .5); 2888 a[2] = ~~(l * 100 + .5); 2889 } 2890 forceAlpha && a.length < 4 && (a[3] = 1); 2891 return a; 2892 }, 2893 _colorOrderData = function _colorOrderData(v) { 2894 // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors() 2895 var values = [], 2896 c = [], 2897 i = -1; 2898 v.split(_colorExp).forEach(function (v) { 2899 var a = v.match(_numWithUnitExp) || []; 2900 values.push.apply(values, a); 2901 c.push(i += a.length + 1); 2902 }); 2903 values.c = c; 2904 return values; 2905 }, 2906 _formatColors = function _formatColors(s, toHSL, orderMatchData) { 2907 var result = "", 2908 colors = (s + result).match(_colorExp), 2909 type = toHSL ? "hsla(" : "rgba(", 2910 i = 0, 2911 c, 2912 shell, 2913 d, 2914 l; 2915 if (!colors) { 2916 return s; 2917 } 2918 colors = colors.map(function (color) { 2919 return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")"; 2920 }); 2921 if (orderMatchData) { 2922 d = _colorOrderData(s); 2923 c = orderMatchData.c; 2924 if (c.join(result) !== d.c.join(result)) { 2925 shell = s.replace(_colorExp, "1").split(_numWithUnitExp); 2926 l = shell.length - 1; 2927 for (; i < l; i++) { 2928 result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift()); 2929 } 2930 } 2931 } 2932 if (!shell) { 2933 shell = s.split(_colorExp); 2934 l = shell.length - 1; 2935 for (; i < l; i++) { 2936 result += shell[i] + colors[i]; 2937 } 2938 } 2939 return result + shell[l]; 2940 }, 2941 _colorExp = function () { 2942 var s = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b", 2943 //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc., 2944 p; 2945 for (p in _colorLookup) { 2946 s += "|" + p + "\\b"; 2947 } 2948 return new RegExp(s + ")", "gi"); 2949 }(), 2950 _hslExp = /hsl[a]?\(/, 2951 _colorStringFilter = function _colorStringFilter(a) { 2952 var combined = a.join(" "), 2953 toHSL; 2954 _colorExp.lastIndex = 0; 2955 if (_colorExp.test(combined)) { 2956 toHSL = _hslExp.test(combined); 2957 a[1] = _formatColors(a[1], toHSL); 2958 a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value. 2959 2960 return true; 2961 } 2962 }, 2963 /* 2964 * -------------------------------------------------------------------------------------- 2965 * TICKER 2966 * -------------------------------------------------------------------------------------- 2967 */ 2968 _tickerActive, 2969 _ticker = function () { 2970 var _getTime = Date.now, 2971 _lagThreshold = 500, 2972 _adjustedLag = 33, 2973 _startTime = _getTime(), 2974 _lastUpdate = _startTime, 2975 _gap = 1000 / 240, 2976 _nextTime = _gap, 2977 _listeners = [], 2978 _id, 2979 _req, 2980 _raf, 2981 _self, 2982 _delta, 2983 _i, 2984 _tick = function _tick(v) { 2985 var elapsed = _getTime() - _lastUpdate, 2986 manual = v === true, 2987 overlap, 2988 dispatch, 2989 time, 2990 frame; 2991 (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag); 2992 _lastUpdate += elapsed; 2993 time = _lastUpdate - _startTime; 2994 overlap = time - _nextTime; 2995 if (overlap > 0 || manual) { 2996 frame = ++_self.frame; 2997 _delta = time - _self.time * 1000; 2998 _self.time = time = time / 1000; 2999 _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap); 3000 dispatch = 1; 3001 } 3002 manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise. 3003 3004 if (dispatch) { 3005 for (_i = 0; _i < _listeners.length; _i++) { 3006 // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop. 3007 _listeners[_i](time, _delta, frame, v); 3008 } 3009 } 3010 }; 3011 _self = { 3012 time: 0, 3013 frame: 0, 3014 tick: function tick() { 3015 _tick(true); 3016 }, 3017 deltaRatio: function deltaRatio(fps) { 3018 return _delta / (1000 / (fps || 60)); 3019 }, 3020 wake: function wake() { 3021 if (_coreReady) { 3022 if (!_coreInitted && _windowExists()) { 3023 _win = _coreInitted = window; 3024 _doc = _win.document || {}; 3025 _globals.gsap = gsap; 3026 (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version); 3027 _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {}); 3028 _registerPluginQueue.forEach(_createPlugin); 3029 } 3030 _raf = typeof requestAnimationFrame !== "undefined" && requestAnimationFrame; 3031 _id && _self.sleep(); 3032 _req = _raf || function (f) { 3033 return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0); 3034 }; 3035 _tickerActive = 1; 3036 _tick(2); 3037 } 3038 }, 3039 sleep: function sleep() { 3040 (_raf ? cancelAnimationFrame : clearTimeout)(_id); 3041 _tickerActive = 0; 3042 _req = _emptyFunc; 3043 }, 3044 lagSmoothing: function lagSmoothing(threshold, adjustedLag) { 3045 _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited 3046 3047 _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold); 3048 }, 3049 fps: function fps(_fps) { 3050 _gap = 1000 / (_fps || 240); 3051 _nextTime = _self.time * 1000 + _gap; 3052 }, 3053 add: function add(callback, once, prioritize) { 3054 var func = once ? function (t, d, f, v) { 3055 callback(t, d, f, v); 3056 _self.remove(func); 3057 } : callback; 3058 _self.remove(callback); 3059 _listeners[prioritize ? "unshift" : "push"](func); 3060 _wake(); 3061 return func; 3062 }, 3063 remove: function remove(callback, i) { 3064 ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--; 3065 }, 3066 _listeners: _listeners 3067 }; 3068 return _self; 3069 }(), 3070 _wake = function _wake() { 3071 return !_tickerActive && _ticker.wake(); 3072 }, 3073 //also ensures the core classes are initialized. 3074 3075 /* 3076 * ------------------------------------------------- 3077 * EASING 3078 * ------------------------------------------------- 3079 */ 3080 _easeMap = {}, 3081 _customEaseExp = /^[\d.\-M][\d.\-,\s]/, 3082 _quotesExp = /["']/g, 3083 _parseObjectInString = function _parseObjectInString(value) { 3084 //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability. 3085 var obj = {}, 3086 split = value.substr(1, value.length - 3).split(":"), 3087 key = split[0], 3088 i = 1, 3089 l = split.length, 3090 index, 3091 val, 3092 parsedVal; 3093 for (; i < l; i++) { 3094 val = split[i]; 3095 index = i !== l - 1 ? val.lastIndexOf(",") : val.length; 3096 parsedVal = val.substr(0, index); 3097 obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal; 3098 key = val.substr(index + 1).trim(); 3099 } 3100 return obj; 3101 }, 3102 _valueInParentheses = function _valueInParentheses(value) { 3103 var open = value.indexOf("(") + 1, 3104 close = value.indexOf(")"), 3105 nested = value.indexOf("(", open); 3106 return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close); 3107 }, 3108 _configEaseFromString = function _configEaseFromString(name) { 3109 //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE). 3110 var split = (name + "").split("("), 3111 ease = _easeMap[split[0]]; 3112 return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease; 3113 }, 3114 _invertEase = function _invertEase(ease) { 3115 return function (p) { 3116 return 1 - ease(1 - p); 3117 }; 3118 }, 3119 // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos. 3120 _propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) { 3121 var child = timeline._first, 3122 ease; 3123 while (child) { 3124 if (child instanceof Timeline) { 3125 _propagateYoyoEase(child, isYoyo); 3126 } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) { 3127 if (child.timeline) { 3128 _propagateYoyoEase(child.timeline, isYoyo); 3129 } else { 3130 ease = child._ease; 3131 child._ease = child._yEase; 3132 child._yEase = ease; 3133 child._yoyo = isYoyo; 3134 } 3135 } 3136 child = child._next; 3137 } 3138 }, 3139 _parseEase = function _parseEase(ease, defaultEase) { 3140 return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase; 3141 }, 3142 _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) { 3143 if (easeOut === void 0) { 3144 easeOut = function easeOut(p) { 3145 return 1 - easeIn(1 - p); 3146 }; 3147 } 3148 if (easeInOut === void 0) { 3149 easeInOut = function easeInOut(p) { 3150 return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2; 3151 }; 3152 } 3153 var ease = { 3154 easeIn: easeIn, 3155 easeOut: easeOut, 3156 easeInOut: easeInOut 3157 }, 3158 lowercaseName; 3159 _forEachName(names, function (name) { 3160 _easeMap[name] = _globals[name] = ease; 3161 _easeMap[lowercaseName = name.toLowerCase()] = easeOut; 3162 for (var p in ease) { 3163 _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p]; 3164 } 3165 }); 3166 return ease; 3167 }, 3168 _easeInOutFromOut = function _easeInOutFromOut(easeOut) { 3169 return function (p) { 3170 return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2; 3171 }; 3172 }, 3173 _configElastic = function _configElastic(type, amplitude, period) { 3174 var p1 = amplitude >= 1 ? amplitude : 1, 3175 //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1. 3176 p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1), 3177 p3 = p2 / _2PI * (Math.asin(1 / p1) || 0), 3178 easeOut = function easeOut(p) { 3179 return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1; 3180 }, 3181 ease = type === "out" ? easeOut : type === "in" ? function (p) { 3182 return 1 - easeOut(1 - p); 3183 } : _easeInOutFromOut(easeOut); 3184 p2 = _2PI / p2; //precalculate to optimize 3185 3186 ease.config = function (amplitude, period) { 3187 return _configElastic(type, amplitude, period); 3188 }; 3189 return ease; 3190 }, 3191 _configBack = function _configBack(type, overshoot) { 3192 if (overshoot === void 0) { 3193 overshoot = 1.70158; 3194 } 3195 var easeOut = function easeOut(p) { 3196 return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0; 3197 }, 3198 ease = type === "out" ? easeOut : type === "in" ? function (p) { 3199 return 1 - easeOut(1 - p); 3200 } : _easeInOutFromOut(easeOut); 3201 ease.config = function (overshoot) { 3202 return _configBack(type, overshoot); 3203 }; 3204 return ease; 3205 }; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 3206// _weightedEase = ratio => { 3207// let y = 0.5 + ratio / 2; 3208// return p => (2 * (1 - p) * p * y + p * p); 3209// }, 3210// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 3211// _weightedEaseStrong = ratio => { 3212// ratio = .5 + ratio / 2; 3213// let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio), 3214// b = ratio - o, 3215// c = ratio + o; 3216// return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p; 3217// }; 3218 3219_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) { 3220 var power = i < 5 ? i + 1 : i; 3221 _insertEase(name + ",Power" + (power - 1), i ? function (p) { 3222 return Math.pow(p, power); 3223 } : function (p) { 3224 return p; 3225 }, function (p) { 3226 return 1 - Math.pow(1 - p, power); 3227 }, function (p) { 3228 return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2; 3229 }); 3230}); 3231_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn; 3232_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic()); 3233(function (n, c) { 3234 var n1 = 1 / c, 3235 n2 = 2 * n1, 3236 n3 = 2.5 * n1, 3237 easeOut = function easeOut(p) { 3238 return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375; 3239 }; 3240 _insertEase("Bounce", function (p) { 3241 return 1 - easeOut(1 - p); 3242 }, easeOut); 3243})(7.5625, 2.75); 3244_insertEase("Expo", function (p) { 3245 return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p); 3246}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly. 3247 3248_insertEase("Circ", function (p) { 3249 return -(_sqrt(1 - p * p) - 1); 3250}); 3251_insertEase("Sine", function (p) { 3252 return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1; 3253}); 3254_insertEase("Back", _configBack("in"), _configBack("out"), _configBack()); 3255_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = { 3256 config: function config(steps, immediateStart) { 3257 if (steps === void 0) { 3258 steps = 1; 3259 } 3260 var p1 = 1 / steps, 3261 p2 = steps + (immediateStart ? 0 : 1), 3262 p3 = immediateStart ? 1 : 0, 3263 max = 1 - _tinyNum; 3264 return function (p) { 3265 return ((p2 * _clamp(0, max, p) | 0) + p3) * p1; 3266 }; 3267 } 3268}; 3269_defaults.ease = _easeMap["quad.out"]; 3270_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) { 3271 return _callbackNames += name + "," + name + "Params,"; 3272}); 3273/* 3274 * -------------------------------------------------------------------------------------- 3275 * CACHE 3276 * -------------------------------------------------------------------------------------- 3277 */ 3278 3279var GSCache = function GSCache(target, harness) { 3280 this.id = _gsID++; 3281 target._gsap = this; 3282 this.target = target; 3283 this.harness = harness; 3284 this.get = harness ? harness.get : _getProperty; 3285 this.set = harness ? harness.getSetter : _getSetter; 3286}; 3287/* 3288 * -------------------------------------------------------------------------------------- 3289 * ANIMATION 3290 * -------------------------------------------------------------------------------------- 3291 */ 3292 3293var Animation = /*#__PURE__*/function () { 3294 function Animation(vars) { 3295 this.vars = vars; 3296 this._delay = +vars.delay || 0; 3297 if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) { 3298 // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start. 3299 this._rDelay = vars.repeatDelay || 0; 3300 this._yoyo = !!vars.yoyo || !!vars.yoyoEase; 3301 } 3302 this._ts = 1; 3303 _setDuration(this, +vars.duration, 1, 1); 3304 this.data = vars.data; 3305 if (_context) { 3306 this._ctx = _context; 3307 _context.data.push(this); 3308 } 3309 _tickerActive || _ticker.wake(); 3310 } 3311 var _proto = Animation.prototype; 3312 _proto.delay = function delay(value) { 3313 if (value || value === 0) { 3314 this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay); 3315 this._delay = value; 3316 return this; 3317 } 3318 return this._delay; 3319 }; 3320 _proto.duration = function duration(value) { 3321 return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur; 3322 }; 3323 _proto.totalDuration = function totalDuration(value) { 3324 if (!arguments.length) { 3325 return this._tDur; 3326 } 3327 this._dirty = 0; 3328 return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1)); 3329 }; 3330 _proto.totalTime = function totalTime(_totalTime, suppressEvents) { 3331 _wake(); 3332 if (!arguments.length) { 3333 return this._tTime; 3334 } 3335 var parent = this._dp; 3336 if (parent && parent.smoothChildTiming && this._ts) { 3337 _alignPlayhead(this, _totalTime); 3338 !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent. 3339 //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed. 3340 3341 while (parent && parent.parent) { 3342 if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) { 3343 parent.totalTime(parent._tTime, true); 3344 } 3345 parent = parent.parent; 3346 } 3347 if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) { 3348 //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in. 3349 _addToTimeline(this._dp, this, this._start - this._delay); 3350 } 3351 } 3352 if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) { 3353 // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional) 3354 this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause 3355 //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit) 3356 // this._lock = 1; 3357 3358 _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0; 3359 //} 3360 } 3361 return this; 3362 }; 3363 _proto.time = function time(value, suppressEvents) { 3364 return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START! 3365 }; 3366 _proto.totalProgress = function totalProgress(value, suppressEvents) { 3367 return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0; 3368 }; 3369 _proto.progress = function progress(value, suppressEvents) { 3370 return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0; 3371 }; 3372 _proto.iteration = function iteration(value, suppressEvents) { 3373 var cycleDuration = this.duration() + this._rDelay; 3374 return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1; 3375 } // potential future addition: 3376 // isPlayingBackwards() { 3377 // let animation = this, 3378 // orientation = 1; // 1 = forward, -1 = backward 3379 // while (animation) { 3380 // orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1; 3381 // animation = animation.parent; 3382 // } 3383 // return orientation < 0; 3384 // } 3385 ; 3386 _proto.timeScale = function timeScale(value, suppressEvents) { 3387 if (!arguments.length) { 3388 return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed. 3389 } 3390 if (this._rts === value) { 3391 return this; 3392 } 3393 var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation. 3394 // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called. 3395 //(+value < 0 && this._rts >= 0) && _callback(this, "onReverse", true); 3396 // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes. 3397 3398 this._rts = +value || 0; 3399 this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused. 3400 3401 this.totalTime(_clamp(-Math.abs(this._delay), this._tDur, tTime), suppressEvents !== false); 3402 _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here. 3403 3404 return _recacheAncestors(this); 3405 }; 3406 _proto.paused = function paused(value) { 3407 if (!arguments.length) { 3408 return this._ps; 3409 } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC. 3410 // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this); 3411 3412 if (this._ps !== value) { 3413 this._ps = value; 3414 if (value) { 3415 this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming. 3416 3417 this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale) 3418 } else { 3419 _wake(); 3420 this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated. 3421 3422 this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise. 3423 } 3424 } 3425 return this; 3426 }; 3427 _proto.startTime = function startTime(value) { 3428 if (arguments.length) { 3429 this._start = value; 3430 var parent = this.parent || this._dp; 3431 parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay); 3432 return this; 3433 } 3434 return this._start; 3435 }; 3436 _proto.endTime = function endTime(includeRepeats) { 3437 return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1); 3438 }; 3439 _proto.rawTime = function rawTime(wrapRepeats) { 3440 var parent = this.parent || this._dp; // _dp = detached parent 3441 3442 return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this); 3443 }; 3444 _proto.revert = function revert(config) { 3445 if (config === void 0) { 3446 config = _revertConfig; 3447 } 3448 var prevIsReverting = _reverting; 3449 _reverting = config; 3450 if (this._initted || this._startAt) { 3451 this.timeline && this.timeline.revert(config); 3452 this.totalTime(-0.01, config.suppressEvents); 3453 } 3454 this.data !== "nested" && config.kill !== false && this.kill(); 3455 _reverting = prevIsReverting; 3456 return this; 3457 }; 3458 _proto.globalTime = function globalTime(rawTime) { 3459 var animation = this, 3460 time = arguments.length ? rawTime : animation.rawTime(); 3461 while (animation) { 3462 time = animation._start + time / (Math.abs(animation._ts) || 1); 3463 animation = animation._dp; 3464 } 3465 return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). "_sat" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert(). 3466 }; 3467 _proto.repeat = function repeat(value) { 3468 if (arguments.length) { 3469 this._repeat = value === Infinity ? -2 : value; 3470 return _onUpdateTotalDuration(this); 3471 } 3472 return this._repeat === -2 ? Infinity : this._repeat; 3473 }; 3474 _proto.repeatDelay = function repeatDelay(value) { 3475 if (arguments.length) { 3476 var time = this._time; 3477 this._rDelay = value; 3478 _onUpdateTotalDuration(this); 3479 return time ? this.time(time) : this; 3480 } 3481 return this._rDelay; 3482 }; 3483 _proto.yoyo = function yoyo(value) { 3484 if (arguments.length) { 3485 this._yoyo = value; 3486 return this; 3487 } 3488 return this._yoyo; 3489 }; 3490 _proto.seek = function seek(position, suppressEvents) { 3491 return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents)); 3492 }; 3493 _proto.restart = function restart(includeDelay, suppressEvents) { 3494 this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents)); 3495 this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted. 3496 3497 return this; 3498 }; 3499 _proto.play = function play(from, suppressEvents) { 3500 from != null && this.seek(from, suppressEvents); 3501 return this.reversed(false).paused(false); 3502 }; 3503 _proto.reverse = function reverse(from, suppressEvents) { 3504 from != null && this.seek(from || this.totalDuration(), suppressEvents); 3505 return this.reversed(true).paused(false); 3506 }; 3507 _proto.pause = function pause(atTime, suppressEvents) { 3508 atTime != null && this.seek(atTime, suppressEvents); 3509 return this.paused(true); 3510 }; 3511 _proto.resume = function resume() { 3512 return this.paused(false); 3513 }; 3514 _proto.reversed = function reversed(value) { 3515 if (arguments.length) { 3516 !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum. 3517 3518 return this; 3519 } 3520 return this._rts < 0; 3521 }; 3522 _proto.invalidate = function invalidate() { 3523 this._initted = this._act = 0; 3524 this._zTime = -_tinyNum; 3525 return this; 3526 }; 3527 _proto.isActive = function isActive() { 3528 var parent = this.parent || this._dp, 3529 start = this._start, 3530 rawTime; 3531 return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum); 3532 }; 3533 _proto.eventCallback = function eventCallback(type, callback, params) { 3534 var vars = this.vars; 3535 if (arguments.length > 1) { 3536 if (!callback) { 3537 delete vars[type]; 3538 } else { 3539 vars[type] = callback; 3540 params && (vars[type + "Params"] = params); 3541 type === "onUpdate" && (this._onUpdate = callback); 3542 } 3543 return this; 3544 } 3545 return vars[type]; 3546 }; 3547 _proto.then = function then(onFulfilled) { 3548 var self = this; 3549 return new Promise(function (resolve) { 3550 var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough, 3551 _resolve = function _resolve() { 3552 var _then = self.then; 3553 self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322) 3554 3555 _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then); 3556 resolve(f); 3557 self.then = _then; 3558 }; 3559 if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) { 3560 _resolve(); 3561 } else { 3562 self._prom = _resolve; 3563 } 3564 }); 3565 }; 3566 _proto.kill = function kill() { 3567 _interrupt(this); 3568 }; 3569 return Animation; 3570}(); 3571_setDefaults(Animation.prototype, { 3572 _time: 0, 3573 _start: 0, 3574 _end: 0, 3575 _tTime: 0, 3576 _tDur: 0, 3577 _dirty: 0, 3578 _repeat: 0, 3579 _yoyo: false, 3580 parent: null, 3581 _initted: false, 3582 _rDelay: 0, 3583 _ts: 1, 3584 _dp: 0, 3585 ratio: 0, 3586 _zTime: -_tinyNum, 3587 _prom: 0, 3588 _ps: false, 3589 _rts: 1 3590}); 3591/* 3592 * ------------------------------------------------- 3593 * TIMELINE 3594 * ------------------------------------------------- 3595 */ 3596 3597var Timeline = /*#__PURE__*/function (_Animation) { 3598 _inheritsLoose(Timeline, _Animation); 3599 function Timeline(vars, position) { 3600 var _this; 3601 if (vars === void 0) { 3602 vars = {}; 3603 } 3604 _this = _Animation.call(this, vars) || this; 3605 _this.labels = {}; 3606 _this.smoothChildTiming = !!vars.smoothChildTiming; 3607 _this.autoRemoveChildren = !!vars.autoRemoveChildren; 3608 _this._sort = _isNotFalse(vars.sortChildren); 3609 _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position); 3610 vars.reversed && _this.reverse(); 3611 vars.paused && _this.paused(true); 3612 vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger); 3613 return _this; 3614 } 3615 var _proto2 = Timeline.prototype; 3616 _proto2.to = function to(targets, vars, position) { 3617 _createTweenType(0, arguments, this); 3618 return this; 3619 }; 3620 _proto2.from = function from(targets, vars, position) { 3621 _createTweenType(1, arguments, this); 3622 return this; 3623 }; 3624 _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) { 3625 _createTweenType(2, arguments, this); 3626 return this; 3627 }; 3628 _proto2.set = function set(targets, vars, position) { 3629 vars.duration = 0; 3630 vars.parent = this; 3631 _inheritDefaults(vars).repeatDelay || (vars.repeat = 0); 3632 vars.immediateRender = !!vars.immediateRender; 3633 new Tween(targets, vars, _parsePosition(this, position), 1); 3634 return this; 3635 }; 3636 _proto2.call = function call(callback, params, position) { 3637 return _addToTimeline(this, Tween.delayedCall(0, callback, params), position); 3638 } //ONLY for backward compatibility! Maybe delete? 3639 ; 3640 _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 3641 vars.duration = duration; 3642 vars.stagger = vars.stagger || stagger; 3643 vars.onComplete = onCompleteAll; 3644 vars.onCompleteParams = onCompleteAllParams; 3645 vars.parent = this; 3646 new Tween(targets, vars, _parsePosition(this, position)); 3647 return this; 3648 }; 3649 _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 3650 vars.runBackwards = 1; 3651 _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender); 3652 return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams); 3653 }; 3654 _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) { 3655 toVars.startAt = fromVars; 3656 _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender); 3657 return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams); 3658 }; 3659 _proto2.render = function render(totalTime, suppressEvents, force) { 3660 var prevTime = this._time, 3661 tDur = this._dirty ? this.totalDuration() : this._tDur, 3662 dur = this._dur, 3663 tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime), 3664 // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example. 3665 crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur), 3666 time, 3667 child, 3668 next, 3669 iteration, 3670 cycleDuration, 3671 prevPaused, 3672 pauseTween, 3673 timeScale, 3674 prevStart, 3675 prevIteration, 3676 yoyo, 3677 isYoyo; 3678 this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur); 3679 if (tTime !== this._tTime || force || crossingStart) { 3680 if (prevTime !== this._time && dur) { 3681 //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump). 3682 tTime += this._time - prevTime; 3683 totalTime += this._time - prevTime; 3684 } 3685 time = tTime; 3686 prevStart = this._start; 3687 timeScale = this._ts; 3688 prevPaused = !timeScale; 3689 if (crossingStart) { 3690 dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 3691 3692 (totalTime || !suppressEvents) && (this._zTime = totalTime); 3693 } 3694 if (this._repeat) { 3695 //adjust the time for repeats and yoyos 3696 yoyo = this._yoyo; 3697 cycleDuration = dur + this._rDelay; 3698 if (this._repeat < -1 && totalTime < 0) { 3699 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 3700 } 3701 time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 3702 3703 if (tTime === tDur) { 3704 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 3705 iteration = this._repeat; 3706 time = dur; 3707 } else { 3708 prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency) 3709 3710 iteration = ~~prevIteration; 3711 if (iteration && iteration === prevIteration) { 3712 time = dur; 3713 iteration--; 3714 } 3715 time > dur && (time = dur); 3716 } 3717 prevIteration = _animationCycle(this._tTime, cycleDuration); 3718 !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the "repeatDelay" portion 3719 3720 if (yoyo && iteration & 1) { 3721 time = dur - time; 3722 isYoyo = 1; 3723 } 3724 /* 3725 make sure children at the end/beginning of the timeline are rendered properly. If, for example, 3726 a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which 3727 would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there 3728 could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So 3729 we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must 3730 ensure that zero-duration tweens at the very beginning or end of the Timeline work. 3731 */ 3732 3733 if (iteration !== prevIteration && !this._lock) { 3734 var rewinding = yoyo && prevIteration & 1, 3735 doesWrap = rewinding === (yoyo && iteration & 1); 3736 iteration < prevIteration && (rewinding = !rewinding); 3737 prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time. 3738 3739 this._lock = 1; 3740 this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0; 3741 this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate. 3742 3743 !suppressEvents && this.parent && _callback(this, "onRepeat"); 3744 this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1); 3745 if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) { 3746 // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well. 3747 return this; 3748 } 3749 dur = this._dur; // in case the duration changed in the onRepeat 3750 3751 tDur = this._tDur; 3752 if (doesWrap) { 3753 this._lock = 2; 3754 prevTime = rewinding ? dur : -0.0001; 3755 this.render(prevTime, true); 3756 this.vars.repeatRefresh && !isYoyo && this.invalidate(); 3757 } 3758 this._lock = 0; 3759 if (!this._ts && !prevPaused) { 3760 return this; 3761 } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween. 3762 3763 _propagateYoyoEase(this, isYoyo); 3764 } 3765 } 3766 if (this._hasPause && !this._forcing && this._lock < 2) { 3767 pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time)); 3768 if (pauseTween) { 3769 tTime -= time - (time = pauseTween._start); 3770 } 3771 } 3772 this._tTime = tTime; 3773 this._time = time; 3774 this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 3775 3776 if (!this._initted) { 3777 this._onUpdate = this.vars.onUpdate; 3778 this._initted = 1; 3779 this._zTime = totalTime; 3780 prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}). 3781 } 3782 if (!prevTime && time && !suppressEvents && !iteration) { 3783 _callback(this, "onStart"); 3784 if (this._tTime !== tTime) { 3785 // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart. 3786 return this; 3787 } 3788 } 3789 if (time >= prevTime && totalTime >= 0) { 3790 child = this._first; 3791 while (child) { 3792 next = child._next; 3793 if ((child._act || time >= child._start) && child._ts && pauseTween !== child) { 3794 if (child.parent !== this) { 3795 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 3796 return this.render(totalTime, suppressEvents, force); 3797 } 3798 child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force); 3799 if (time !== this._time || !this._ts && !prevPaused) { 3800 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 3801 pauseTween = 0; 3802 next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children) 3803 3804 break; 3805 } 3806 } 3807 child = next; 3808 } 3809 } else { 3810 child = this._last; 3811 var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values. 3812 3813 while (child) { 3814 next = child._prev; 3815 if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) { 3816 if (child.parent !== this) { 3817 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 3818 return this.render(totalTime, suppressEvents, force); 3819 } 3820 child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && (child._initted || child._startAt)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert. 3821 3822 if (time !== this._time || !this._ts && !prevPaused) { 3823 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 3824 pauseTween = 0; 3825 next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children) 3826 3827 break; 3828 } 3829 } 3830 child = next; 3831 } 3832 } 3833 if (pauseTween && !suppressEvents) { 3834 this.pause(); 3835 pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1; 3836 if (this._ts) { 3837 //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened). 3838 this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift. 3839 3840 _setEnd(this); 3841 return this.render(totalTime, suppressEvents, force); 3842 } 3843 } 3844 this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true); 3845 if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) { 3846 // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks. 3847 (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 3848 3849 if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) { 3850 _callback(this, tTime === tDur && totalTime >= 0 ? "onComplete" : "onReverseComplete", true); 3851 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 3852 } 3853 } 3854 } 3855 return this; 3856 }; 3857 _proto2.add = function add(child, position) { 3858 var _this2 = this; 3859 _isNumber(position) || (position = _parsePosition(this, position, child)); 3860 if (!(child instanceof Animation)) { 3861 if (_isArray(child)) { 3862 child.forEach(function (obj) { 3863 return _this2.add(obj, position); 3864 }); 3865 return this; 3866 } 3867 if (_isString(child)) { 3868 return this.addLabel(child, position); 3869 } 3870 if (_isFunction(child)) { 3871 child = Tween.delayedCall(0, child); 3872 } else { 3873 return this; 3874 } 3875 } 3876 return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child! 3877 }; 3878 _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) { 3879 if (nested === void 0) { 3880 nested = true; 3881 } 3882 if (tweens === void 0) { 3883 tweens = true; 3884 } 3885 if (timelines === void 0) { 3886 timelines = true; 3887 } 3888 if (ignoreBeforeTime === void 0) { 3889 ignoreBeforeTime = -_bigNum; 3890 } 3891 var a = [], 3892 child = this._first; 3893 while (child) { 3894 if (child._start >= ignoreBeforeTime) { 3895 if (child instanceof Tween) { 3896 tweens && a.push(child); 3897 } else { 3898 timelines && a.push(child); 3899 nested && a.push.apply(a, child.getChildren(true, tweens, timelines)); 3900 } 3901 } 3902 child = child._next; 3903 } 3904 return a; 3905 }; 3906 _proto2.getById = function getById(id) { 3907 var animations = this.getChildren(1, 1, 1), 3908 i = animations.length; 3909 while (i--) { 3910 if (animations[i].vars.id === id) { 3911 return animations[i]; 3912 } 3913 } 3914 }; 3915 _proto2.remove = function remove(child) { 3916 if (_isString(child)) { 3917 return this.removeLabel(child); 3918 } 3919 if (_isFunction(child)) { 3920 return this.killTweensOf(child); 3921 } 3922 child.parent === this && _removeLinkedListItem(this, child); 3923 if (child === this._recent) { 3924 this._recent = this._last; 3925 } 3926 return _uncache(this); 3927 }; 3928 _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) { 3929 if (!arguments.length) { 3930 return this._tTime; 3931 } 3932 this._forcing = 1; 3933 if (!this._dp && this._ts) { 3934 //special case for the global timeline (or any other that has no parent or detached parent). 3935 this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts)); 3936 } 3937 _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents); 3938 this._forcing = 0; 3939 return this; 3940 }; 3941 _proto2.addLabel = function addLabel(label, position) { 3942 this.labels[label] = _parsePosition(this, position); 3943 return this; 3944 }; 3945 _proto2.removeLabel = function removeLabel(label) { 3946 delete this.labels[label]; 3947 return this; 3948 }; 3949 _proto2.addPause = function addPause(position, callback, params) { 3950 var t = Tween.delayedCall(0, callback || _emptyFunc, params); 3951 t.data = "isPause"; 3952 this._hasPause = 1; 3953 return _addToTimeline(this, t, _parsePosition(this, position)); 3954 }; 3955 _proto2.removePause = function removePause(position) { 3956 var child = this._first; 3957 position = _parsePosition(this, position); 3958 while (child) { 3959 if (child._start === position && child.data === "isPause") { 3960 _removeFromParent(child); 3961 } 3962 child = child._next; 3963 } 3964 }; 3965 _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) { 3966 var tweens = this.getTweensOf(targets, onlyActive), 3967 i = tweens.length; 3968 while (i--) { 3969 _overwritingTween !== tweens[i] && tweens[i].kill(targets, props); 3970 } 3971 return this; 3972 }; 3973 _proto2.getTweensOf = function getTweensOf(targets, onlyActive) { 3974 var a = [], 3975 parsedTargets = toArray(targets), 3976 child = this._first, 3977 isGlobalTime = _isNumber(onlyActive), 3978 // a number is interpreted as a global time. If the animation spans 3979 children; 3980 while (child) { 3981 if (child instanceof Tween) { 3982 if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) { 3983 // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted. 3984 a.push(child); 3985 } 3986 } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) { 3987 a.push.apply(a, children); 3988 } 3989 child = child._next; 3990 } 3991 return a; 3992 } // potential future feature - targets() on timelines 3993 // targets() { 3994 // let result = []; 3995 // this.getChildren(true, true, false).forEach(t => result.push(...t.targets())); 3996 // return result.filter((v, i) => result.indexOf(v) === i); 3997 // } 3998 ; 3999 _proto2.tweenTo = function tweenTo(position, vars) { 4000 vars = vars || {}; 4001 var tl = this, 4002 endTime = _parsePosition(tl, position), 4003 _vars = vars, 4004 startAt = _vars.startAt, 4005 _onStart = _vars.onStart, 4006 onStartParams = _vars.onStartParams, 4007 immediateRender = _vars.immediateRender, 4008 initted, 4009 tween = Tween.to(tl, _setDefaults({ 4010 ease: vars.ease || "none", 4011 lazy: false, 4012 immediateRender: false, 4013 time: endTime, 4014 overwrite: "auto", 4015 duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum, 4016 onStart: function onStart() { 4017 tl.pause(); 4018 if (!initted) { 4019 var duration = vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()); 4020 tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true); 4021 initted = 1; 4022 } 4023 _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it. 4024 } 4025 }, vars)); 4026 return immediateRender ? tween.render(0) : tween; 4027 }; 4028 _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) { 4029 return this.tweenTo(toPosition, _setDefaults({ 4030 startAt: { 4031 time: _parsePosition(this, fromPosition) 4032 } 4033 }, vars)); 4034 }; 4035 _proto2.recent = function recent() { 4036 return this._recent; 4037 }; 4038 _proto2.nextLabel = function nextLabel(afterTime) { 4039 if (afterTime === void 0) { 4040 afterTime = this._time; 4041 } 4042 return _getLabelInDirection(this, _parsePosition(this, afterTime)); 4043 }; 4044 _proto2.previousLabel = function previousLabel(beforeTime) { 4045 if (beforeTime === void 0) { 4046 beforeTime = this._time; 4047 } 4048 return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1); 4049 }; 4050 _proto2.currentLabel = function currentLabel(value) { 4051 return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum); 4052 }; 4053 _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) { 4054 if (ignoreBeforeTime === void 0) { 4055 ignoreBeforeTime = 0; 4056 } 4057 var child = this._first, 4058 labels = this.labels, 4059 p; 4060 while (child) { 4061 if (child._start >= ignoreBeforeTime) { 4062 child._start += amount; 4063 child._end += amount; 4064 } 4065 child = child._next; 4066 } 4067 if (adjustLabels) { 4068 for (p in labels) { 4069 if (labels[p] >= ignoreBeforeTime) { 4070 labels[p] += amount; 4071 } 4072 } 4073 } 4074 return _uncache(this); 4075 }; 4076 _proto2.invalidate = function invalidate(soft) { 4077 var child = this._first; 4078 this._lock = 0; 4079 while (child) { 4080 child.invalidate(soft); 4081 child = child._next; 4082 } 4083 return _Animation.prototype.invalidate.call(this, soft); 4084 }; 4085 _proto2.clear = function clear(includeLabels) { 4086 if (includeLabels === void 0) { 4087 includeLabels = true; 4088 } 4089 var child = this._first, 4090 next; 4091 while (child) { 4092 next = child._next; 4093 this.remove(child); 4094 child = next; 4095 } 4096 this._dp && (this._time = this._tTime = this._pTime = 0); 4097 includeLabels && (this.labels = {}); 4098 return _uncache(this); 4099 }; 4100 _proto2.totalDuration = function totalDuration(value) { 4101 var max = 0, 4102 self = this, 4103 child = self._last, 4104 prevStart = _bigNum, 4105 prev, 4106 start, 4107 parent; 4108 if (arguments.length) { 4109 return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value)); 4110 } 4111 if (self._dirty) { 4112 parent = self.parent; 4113 while (child) { 4114 prev = child._prev; //record it here in case the tween changes position in the sequence... 4115 4116 child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it. 4117 4118 start = child._start; 4119 if (start > prevStart && self._sort && child._ts && !self._lock) { 4120 //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence 4121 self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add(). 4122 4123 _addToTimeline(self, child, start - child._delay, 1)._lock = 0; 4124 } else { 4125 prevStart = start; 4126 } 4127 if (start < 0 && child._ts) { 4128 //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found. 4129 max -= start; 4130 if (!parent && !self._dp || parent && parent.smoothChildTiming) { 4131 self._start += start / self._ts; 4132 self._time -= start; 4133 self._tTime -= start; 4134 } 4135 self.shiftChildren(-start, false, -1e999); 4136 prevStart = 0; 4137 } 4138 child._end > max && child._ts && (max = child._end); 4139 child = prev; 4140 } 4141 _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1); 4142 self._dirty = 0; 4143 } 4144 return self._tDur; 4145 }; 4146 Timeline.updateRoot = function updateRoot(time) { 4147 if (_globalTimeline._ts) { 4148 _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline)); 4149 _lastRenderedFrame = _ticker.frame; 4150 } 4151 if (_ticker.frame >= _nextGCFrame) { 4152 _nextGCFrame += _config.autoSleep || 120; 4153 var child = _globalTimeline._first; 4154 if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) { 4155 while (child && !child._ts) { 4156 child = child._next; 4157 } 4158 child || _ticker.sleep(); 4159 } 4160 } 4161 }; 4162 return Timeline; 4163}(Animation); 4164_setDefaults(Timeline.prototype, { 4165 _lock: 0, 4166 _hasPause: 0, 4167 _forcing: 0 4168}); 4169var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) { 4170 //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 4171 var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter), 4172 index = 0, 4173 matchIndex = 0, 4174 result, 4175 startNums, 4176 color, 4177 endNum, 4178 chunk, 4179 startNum, 4180 hasRandom, 4181 a; 4182 pt.b = start; 4183 pt.e = end; 4184 start += ""; //ensure values are strings 4185 4186 end += ""; 4187 if (hasRandom = ~end.indexOf("random(")) { 4188 end = _replaceRandom(end); 4189 } 4190 if (stringFilter) { 4191 a = [start, end]; 4192 stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. 4193 4194 start = a[0]; 4195 end = a[1]; 4196 } 4197 startNums = start.match(_complexStringNumExp) || []; 4198 while (result = _complexStringNumExp.exec(end)) { 4199 endNum = result[0]; 4200 chunk = end.substring(index, result.index); 4201 if (color) { 4202 color = (color + 1) % 5; 4203 } else if (chunk.substr(-5) === "rgba(") { 4204 color = 1; 4205 } 4206 if (endNum !== startNums[matchIndex++]) { 4207 startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 4208 4209 pt._pt = { 4210 _next: pt._pt, 4211 p: chunk || matchIndex === 1 ? chunk : ",", 4212 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 4213 s: startNum, 4214 c: endNum.charAt(1) === "=" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum, 4215 m: color && color < 4 ? Math.round : 0 4216 }; 4217 index = _complexStringNumExp.lastIndex; 4218 } 4219 } 4220 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 4221 4222 pt.fp = funcParam; 4223 if (_relExp.test(end) || hasRandom) { 4224 pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 4225 } 4226 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 4227 4228 return pt; 4229 }, 4230 _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) { 4231 _isFunction(end) && (end = end(index || 0, target, targets)); 4232 var currentValue = target[prop], 4233 parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](), 4234 setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc, 4235 pt; 4236 if (_isString(end)) { 4237 if (~end.indexOf("random(")) { 4238 end = _replaceRandom(end); 4239 } 4240 if (end.charAt(1) === "=") { 4241 pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0); 4242 if (pt || pt === 0) { 4243 // to avoid isNaN, like if someone passes in a value like "!= whatever" 4244 end = pt; 4245 } 4246 } 4247 } 4248 if (!optional || parsedStart !== end || _forceAllPropTweens) { 4249 if (!isNaN(parsedStart * end) && end !== "") { 4250 // fun fact: any number multiplied by "" is evaluated as the number 0! 4251 pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter); 4252 funcParam && (pt.fp = funcParam); 4253 modifier && pt.modifier(modifier, this, target); 4254 return this._pt = pt; 4255 } 4256 !currentValue && !(prop in target) && _missingPlugin(prop, end); 4257 return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam); 4258 } 4259 }, 4260 //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values. 4261 _processVars = function _processVars(vars, index, target, targets, tween) { 4262 _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets)); 4263 if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) { 4264 return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars; 4265 } 4266 var copy = {}, 4267 p; 4268 for (p in vars) { 4269 copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets); 4270 } 4271 return copy; 4272 }, 4273 _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) { 4274 var plugin, pt, ptLookup, i; 4275 if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) { 4276 tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority); 4277 if (tween !== _quickTween) { 4278 ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger. 4279 4280 i = plugin._props.length; 4281 while (i--) { 4282 ptLookup[plugin._props[i]] = pt; 4283 } 4284 } 4285 } 4286 return plugin; 4287 }, 4288 _overwritingTween, 4289 //store a reference temporarily so we can avoid overwriting itself. 4290 _forceAllPropTweens, 4291 _initTween = function _initTween(tween, time, tTime) { 4292 var vars = tween.vars, 4293 ease = vars.ease, 4294 startAt = vars.startAt, 4295 immediateRender = vars.immediateRender, 4296 lazy = vars.lazy, 4297 onUpdate = vars.onUpdate, 4298 runBackwards = vars.runBackwards, 4299 yoyoEase = vars.yoyoEase, 4300 keyframes = vars.keyframes, 4301 autoRevert = vars.autoRevert, 4302 dur = tween._dur, 4303 prevStartAt = tween._startAt, 4304 targets = tween._targets, 4305 parent = tween.parent, 4306 fullTargets = parent && parent.data === "nested" ? parent.vars.targets : targets, 4307 autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites, 4308 tl = tween.timeline, 4309 cleanVars, 4310 i, 4311 p, 4312 pt, 4313 target, 4314 hasPriority, 4315 gsData, 4316 harness, 4317 plugin, 4318 ptLookup, 4319 index, 4320 harnessVars, 4321 overwritten; 4322 tl && (!keyframes || !ease) && (ease = "none"); 4323 tween._ease = _parseEase(ease, _defaults.ease); 4324 tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0; 4325 if (yoyoEase && tween._yoyo && !tween._repeat) { 4326 //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases. 4327 yoyoEase = tween._yEase; 4328 tween._yEase = tween._ease; 4329 tween._ease = yoyoEase; 4330 } 4331 tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens. 4332 4333 if (!tl || keyframes && !vars.stagger) { 4334 //if there's an internal timeline, skip all the parsing because we passed that task down the chain. 4335 harness = targets[0] ? _getCache(targets[0]).harness : 0; 4336 harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example. 4337 4338 cleanVars = _copyExcluding(vars, _reservedProps); 4339 if (prevStartAt) { 4340 prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet. 4341 4342 time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a "startAt" (not "from()" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin) 4343 // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for "startAt" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded. 4344 4345 prevStartAt._lazy = 0; 4346 } 4347 if (startAt) { 4348 _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({ 4349 data: "isStart", 4350 overwrite: false, 4351 parent: parent, 4352 immediateRender: true, 4353 lazy: !prevStartAt && _isNotFalse(lazy), 4354 startAt: null, 4355 delay: 0, 4356 onUpdate: onUpdate && function () { 4357 return _callback(tween, "onUpdate"); 4358 }, 4359 stagger: 0 4360 }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from); 4361 4362 tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set. 4363 4364 tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween 4365 4366 time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween. 4367 4368 if (immediateRender) { 4369 if (dur && time <= 0 && tTime <= 0) { 4370 // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly. 4371 time && (tween._zTime = time); 4372 return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting. 4373 } 4374 } 4375 } else if (runBackwards && dur) { 4376 //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards) 4377 if (!prevStartAt) { 4378 time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0 4379 4380 p = _setDefaults({ 4381 overwrite: false, 4382 data: "isFromStart", 4383 //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in. 4384 lazy: immediateRender && !prevStartAt && _isNotFalse(lazy), 4385 immediateRender: immediateRender, 4386 //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after) 4387 stagger: 0, 4388 parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y: gsap.utils.wrap([-100,100]), stagger: 0.5}) 4389 }, cleanVars); 4390 harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}}) 4391 4392 _removeFromParent(tween._startAt = Tween.set(targets, p)); 4393 tween._startAt._dp = 0; // don't allow it to get put back into root timeline! 4394 4395 tween._startAt._sat = tween; // used in globalTime() 4396 4397 time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true)); 4398 tween._zTime = time; 4399 if (!immediateRender) { 4400 _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded 4401 } else if (!time) { 4402 return; 4403 } 4404 } 4405 } 4406 tween._pt = tween._ptCache = 0; 4407 lazy = dur && _isNotFalse(lazy) || lazy && !dur; 4408 for (i = 0; i < targets.length; i++) { 4409 target = targets[i]; 4410 gsData = target._gsap || _harness(targets)[i]._gsap; 4411 tween._ptLookup[i] = ptLookup = {}; 4412 _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end) 4413 4414 index = fullTargets === targets ? i : fullTargets.indexOf(target); 4415 if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) { 4416 tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority); 4417 plugin._props.forEach(function (name) { 4418 ptLookup[name] = pt; 4419 }); 4420 plugin.priority && (hasPriority = 1); 4421 } 4422 if (!harness || harnessVars) { 4423 for (p in cleanVars) { 4424 if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) { 4425 plugin.priority && (hasPriority = 1); 4426 } else { 4427 ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter); 4428 } 4429 } 4430 } 4431 tween._op && tween._op[i] && tween.kill(target, tween._op[i]); 4432 if (autoOverwrite && tween._pt) { 4433 _overwritingTween = tween; 4434 _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!! 4435 4436 overwritten = !tween.parent; 4437 _overwritingTween = 0; 4438 } 4439 tween._pt && lazy && (_lazyLookup[gsData.id] = 1); 4440 } 4441 hasPriority && _sortPropTweensByPriority(tween); 4442 tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down. 4443 } 4444 tween._onUpdate = onUpdate; 4445 tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick. 4446 4447 keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the "before" state for any staggered/delayed animations thus when the following tween initializes, it'll use the "before" state instead of the "after" state as the initial values. 4448 }, 4449 _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) { 4450 var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property], 4451 pt, 4452 rootPT, 4453 lookup, 4454 i; 4455 if (!ptCache) { 4456 ptCache = tween._ptCache[property] = []; 4457 lookup = tween._ptLookup; 4458 i = tween._targets.length; 4459 while (i--) { 4460 pt = lookup[i][property]; 4461 if (pt && pt.d && pt.d._pt) { 4462 // it's a plugin, so find the nested PropTween 4463 pt = pt.d._pt; 4464 while (pt && pt.p !== property && pt.fp !== property) { 4465 // "fp" is functionParam for things like setting CSS variables which require .setProperty("--var-name", value) 4466 pt = pt._next; 4467 } 4468 } 4469 if (!pt) { 4470 // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this 4471 // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo("x", 200) for example. 4472 _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it. 4473 4474 tween.vars[property] = "+=0"; 4475 _initTween(tween, time); 4476 _forceAllPropTweens = 0; 4477 return skipRecursion ? _warn(property + " not eligible for reset") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo(). 4478 } 4479 ptCache.push(pt); 4480 } 4481 } 4482 i = ptCache.length; 4483 while (i--) { 4484 rootPT = ptCache[i]; 4485 pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value. 4486 4487 pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c; 4488 pt.c = value - pt.s; 4489 rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value) 4490 4491 rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value) 4492 } 4493 }, 4494 _addAliasesToVars = function _addAliasesToVars(targets, vars) { 4495 var harness = targets[0] ? _getCache(targets[0]).harness : 0, 4496 propertyAliases = harness && harness.aliases, 4497 copy, 4498 p, 4499 i, 4500 aliases; 4501 if (!propertyAliases) { 4502 return vars; 4503 } 4504 copy = _merge({}, vars); 4505 for (p in propertyAliases) { 4506 if (p in copy) { 4507 aliases = propertyAliases[p].split(","); 4508 i = aliases.length; 4509 while (i--) { 4510 copy[aliases[i]] = copy[p]; 4511 } 4512 } 4513 } 4514 return copy; 4515 }, 4516 // parses multiple formats, like {"0%": {x: 100}, {"50%": {x: -20}} and { x: {"0%": 100, "50%": -20} }, and an "ease" can be set on any object. We populate an "allProps" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a "t" (time), "v", (value), and "e" (ease) property. This allows us to piece together a timeline later. 4517 _parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) { 4518 var ease = obj.ease || easeEach || "power1.inOut", 4519 p, 4520 a; 4521 if (_isArray(obj)) { 4522 a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease 4523 4524 obj.forEach(function (value, i) { 4525 return a.push({ 4526 t: i / (obj.length - 1) * 100, 4527 v: value, 4528 e: ease 4529 }); 4530 }); 4531 } else { 4532 for (p in obj) { 4533 a = allProps[p] || (allProps[p] = []); 4534 p === "ease" || a.push({ 4535 t: parseFloat(prop), 4536 v: obj[p], 4537 e: ease 4538 }); 4539 } 4540 } 4541 }, 4542 _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) { 4543 return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value; 4544 }, 4545 _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert", 4546 _staggerPropsToSkip = {}; 4547_forEachName(_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger", function (name) { 4548 return _staggerPropsToSkip[name] = 1; 4549}); 4550/* 4551 * -------------------------------------------------------------------------------------- 4552 * TWEEN 4553 * -------------------------------------------------------------------------------------- 4554 */ 4555 4556var Tween = /*#__PURE__*/function (_Animation2) { 4557 _inheritsLoose(Tween, _Animation2); 4558 function Tween(targets, vars, position, skipInherit) { 4559 var _this3; 4560 if (typeof vars === "number") { 4561 position.duration = vars; 4562 vars = position; 4563 position = null; 4564 } 4565 _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this; 4566 var _this3$vars = _this3.vars, 4567 duration = _this3$vars.duration, 4568 delay = _this3$vars.delay, 4569 immediateRender = _this3$vars.immediateRender, 4570 stagger = _this3$vars.stagger, 4571 overwrite = _this3$vars.overwrite, 4572 keyframes = _this3$vars.keyframes, 4573 defaults = _this3$vars.defaults, 4574 scrollTrigger = _this3$vars.scrollTrigger, 4575 yoyoEase = _this3$vars.yoyoEase, 4576 parent = vars.parent || _globalTimeline, 4577 parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets), 4578 tl, 4579 i, 4580 copy, 4581 l, 4582 p, 4583 curTarget, 4584 staggerFunc, 4585 staggerVarsToMerge; 4586 _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://gsap.com", !_config.nullTargetWarn) || []; 4587 _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property 4588 4589 _this3._overwrite = overwrite; 4590 if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) { 4591 vars = _this3.vars; 4592 tl = _this3.timeline = new Timeline({ 4593 data: "nested", 4594 defaults: defaults || {}, 4595 targets: parent && parent.data === "nested" ? parent.vars.targets : parsedTargets 4596 }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets. 4597 4598 tl.kill(); 4599 tl.parent = tl._dp = _assertThisInitialized(_this3); 4600 tl._start = 0; 4601 if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) { 4602 l = parsedTargets.length; 4603 staggerFunc = stagger && distribute(stagger); 4604 if (_isObject(stagger)) { 4605 //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween. 4606 for (p in stagger) { 4607 if (~_staggerTweenProps.indexOf(p)) { 4608 staggerVarsToMerge || (staggerVarsToMerge = {}); 4609 staggerVarsToMerge[p] = stagger[p]; 4610 } 4611 } 4612 } 4613 for (i = 0; i < l; i++) { 4614 copy = _copyExcluding(vars, _staggerPropsToSkip); 4615 copy.stagger = 0; 4616 yoyoEase && (copy.yoyoEase = yoyoEase); 4617 staggerVarsToMerge && _merge(copy, staggerVarsToMerge); 4618 curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0. 4619 4620 copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets); 4621 copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay; 4622 if (!stagger && l === 1 && copy.delay) { 4623 // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat. 4624 _this3._delay = delay = copy.delay; 4625 _this3._start += delay; 4626 copy.delay = 0; 4627 } 4628 tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0); 4629 tl._ease = _easeMap.none; 4630 } 4631 tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally! 4632 } else if (keyframes) { 4633 _inheritDefaults(_setDefaults(tl.vars.defaults, { 4634 ease: "none" 4635 })); 4636 tl._ease = _parseEase(keyframes.ease || vars.ease || "none"); 4637 var time = 0, 4638 a, 4639 kf, 4640 v; 4641 if (_isArray(keyframes)) { 4642 keyframes.forEach(function (frame) { 4643 return tl.to(parsedTargets, frame, ">"); 4644 }); 4645 tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method. 4646 } else { 4647 copy = {}; 4648 for (p in keyframes) { 4649 p === "ease" || p === "easeEach" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach); 4650 } 4651 for (p in copy) { 4652 a = copy[p].sort(function (a, b) { 4653 return a.t - b.t; 4654 }); 4655 time = 0; 4656 for (i = 0; i < a.length; i++) { 4657 kf = a[i]; 4658 v = { 4659 ease: kf.e, 4660 duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration 4661 }; 4662 v[p] = kf.v; 4663 tl.to(parsedTargets, v, time); 4664 time += v.duration; 4665 } 4666 } 4667 tl.duration() < duration && tl.to({}, { 4668 duration: duration - tl.duration() 4669 }); // in case keyframes didn't go to 100% 4670 } 4671 } 4672 duration || _this3.duration(duration = tl.duration()); 4673 } else { 4674 _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain) 4675 } 4676 if (overwrite === true && !_suppressOverwrites) { 4677 _overwritingTween = _assertThisInitialized(_this3); 4678 _globalTimeline.killTweensOf(parsedTargets); 4679 _overwritingTween = 0; 4680 } 4681 _addToTimeline(parent, _assertThisInitialized(_this3), position); 4682 vars.reversed && _this3.reverse(); 4683 vars.paused && _this3.paused(true); 4684 if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") { 4685 _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render) 4686 4687 _this3.render(Math.max(0, -delay) || 0); //in case delay is negative 4688 } 4689 scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger); 4690 return _this3; 4691 } 4692 var _proto3 = Tween.prototype; 4693 _proto3.render = function render(totalTime, suppressEvents, force) { 4694 var prevTime = this._time, 4695 tDur = this._tDur, 4696 dur = this._dur, 4697 isNegative = totalTime < 0, 4698 tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime, 4699 time, 4700 pt, 4701 iteration, 4702 cycleDuration, 4703 prevIteration, 4704 isYoyo, 4705 ratio, 4706 timeline, 4707 yoyoEase; 4708 if (!dur) { 4709 _renderZeroDurationTween(this, totalTime, suppressEvents, force); 4710 } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) { 4711 // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0) 4712 time = tTime; 4713 timeline = this.timeline; 4714 if (this._repeat) { 4715 //adjust the time for repeats and yoyos 4716 cycleDuration = dur + this._rDelay; 4717 if (this._repeat < -1 && isNegative) { 4718 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 4719 } 4720 time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 4721 4722 if (tTime === tDur) { 4723 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 4724 iteration = this._repeat; 4725 time = dur; 4726 } else { 4727 prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency) 4728 4729 iteration = ~~prevIteration; 4730 if (iteration && iteration === prevIteration) { 4731 time = dur; 4732 iteration--; 4733 } else if (time > dur) { 4734 time = dur; 4735 } 4736 } 4737 isYoyo = this._yoyo && iteration & 1; 4738 if (isYoyo) { 4739 yoyoEase = this._yEase; 4740 time = dur - time; 4741 } 4742 prevIteration = _animationCycle(this._tTime, cycleDuration); 4743 if (time === prevTime && !force && this._initted && iteration === prevIteration) { 4744 //could be during the repeatDelay part. No need to render and fire callbacks. 4745 this._tTime = tTime; 4746 return this; 4747 } 4748 if (iteration !== prevIteration) { 4749 timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality 4750 4751 if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) { 4752 // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick). 4753 this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick. 4754 4755 this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0; 4756 } 4757 } 4758 } 4759 if (!this._initted) { 4760 if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) { 4761 this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number. 4762 4763 return this; 4764 } 4765 if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) { 4766 // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render! 4767 return this; 4768 } 4769 if (dur !== this._dur) { 4770 // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should. 4771 return this.render(totalTime, suppressEvents, force); 4772 } 4773 } 4774 this._tTime = tTime; 4775 this._time = time; 4776 if (!this._act && this._ts) { 4777 this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 4778 4779 this._lazy = 0; 4780 } 4781 this.ratio = ratio = (yoyoEase || this._ease)(time / dur); 4782 if (this._from) { 4783 this.ratio = ratio = 1 - ratio; 4784 } 4785 if (time && !prevTime && !suppressEvents && !iteration) { 4786 _callback(this, "onStart"); 4787 if (this._tTime !== tTime) { 4788 // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart. 4789 return this; 4790 } 4791 } 4792 pt = this._pt; 4793 while (pt) { 4794 pt.r(ratio, pt.d); 4795 pt = pt._next; 4796 } 4797 timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime); 4798 if (this._onUpdate && !suppressEvents) { 4799 isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete. 4800 4801 _callback(this, "onUpdate"); 4802 } 4803 this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat"); 4804 if ((tTime === this._tDur || !tTime) && this._tTime === tTime) { 4805 isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true); 4806 (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 4807 4808 if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) { 4809 // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play(); 4810 _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true); 4811 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 4812 } 4813 } 4814 } 4815 return this; 4816 }; 4817 _proto3.targets = function targets() { 4818 return this._targets; 4819 }; 4820 _proto3.invalidate = function invalidate(soft) { 4821 // "soft" gives us a way to clear out everything EXCEPT the recorded pre-"from" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the "from" values would persist and then on the next render, the from() tweens would initialize and the current value would match the "from" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page. 4822 (!soft || !this.vars.runBackwards) && (this._startAt = 0); 4823 this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0; 4824 this._ptLookup = []; 4825 this.timeline && this.timeline.invalidate(soft); 4826 return _Animation2.prototype.invalidate.call(this, soft); 4827 }; 4828 _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) { 4829 _tickerActive || _ticker.wake(); 4830 this._ts || this.play(); 4831 var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts), 4832 ratio; 4833 this._initted || _initTween(this, time); 4834 ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet. 4835 // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method. 4836 // if (_isObject(property)) { // performance optimization 4837 // for (p in property) { 4838 // if (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) { 4839 // return this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again. 4840 // } 4841 // } 4842 // } else { 4843 4844 if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) { 4845 return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again. 4846 } //} 4847 4848 _alignPlayhead(this, 0); 4849 this.parent || _addLinkedListItem(this._dp, this, "_first", "_last", this._dp._sort ? "_start" : 0); 4850 return this.render(0); 4851 }; 4852 _proto3.kill = function kill(targets, vars) { 4853 if (vars === void 0) { 4854 vars = "all"; 4855 } 4856 if (!targets && (!vars || vars === "all")) { 4857 this._lazy = this._pt = 0; 4858 this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting); 4859 return this; 4860 } 4861 if (this.timeline) { 4862 var tDur = this.timeline.totalDuration(); 4863 this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt. 4864 4865 this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to. 4866 4867 return this; 4868 } 4869 var parsedTargets = this._targets, 4870 killingTargets = targets ? toArray(targets) : parsedTargets, 4871 propTweenLookup = this._ptLookup, 4872 firstPT = this._pt, 4873 overwrittenProps, 4874 curLookup, 4875 curOverwriteProps, 4876 props, 4877 p, 4878 pt, 4879 i; 4880 if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) { 4881 vars === "all" && (this._pt = 0); 4882 return _interrupt(this); 4883 } 4884 overwrittenProps = this._op = this._op || []; 4885 if (vars !== "all") { 4886 //so people can pass in a comma-delimited list of property names 4887 if (_isString(vars)) { 4888 p = {}; 4889 _forEachName(vars, function (name) { 4890 return p[name] = 1; 4891 }); 4892 vars = p; 4893 } 4894 vars = _addAliasesToVars(parsedTargets, vars); 4895 } 4896 i = parsedTargets.length; 4897 while (i--) { 4898 if (~killingTargets.indexOf(parsedTargets[i])) { 4899 curLookup = propTweenLookup[i]; 4900 if (vars === "all") { 4901 overwrittenProps[i] = vars; 4902 props = curLookup; 4903 curOverwriteProps = {}; 4904 } else { 4905 curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {}; 4906 props = vars; 4907 } 4908 for (p in props) { 4909 pt = curLookup && curLookup[p]; 4910 if (pt) { 4911 if (!("kill" in pt.d) || pt.d.kill(p) === true) { 4912 _removeLinkedListItem(this, pt, "_pt"); 4913 } 4914 delete curLookup[p]; 4915 } 4916 if (curOverwriteProps !== "all") { 4917 curOverwriteProps[p] = 1; 4918 } 4919 } 4920 } 4921 } 4922 this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening. 4923 4924 return this; 4925 }; 4926 Tween.to = function to(targets, vars) { 4927 return new Tween(targets, vars, arguments[2]); 4928 }; 4929 Tween.from = function from(targets, vars) { 4930 return _createTweenType(1, arguments); 4931 }; 4932 Tween.delayedCall = function delayedCall(delay, callback, params, scope) { 4933 return new Tween(callback, 0, { 4934 immediateRender: false, 4935 lazy: false, 4936 overwrite: false, 4937 delay: delay, 4938 onComplete: callback, 4939 onReverseComplete: callback, 4940 onCompleteParams: params, 4941 onReverseCompleteParams: params, 4942 callbackScope: scope 4943 }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse) 4944 }; 4945 Tween.fromTo = function fromTo(targets, fromVars, toVars) { 4946 return _createTweenType(2, arguments); 4947 }; 4948 Tween.set = function set(targets, vars) { 4949 vars.duration = 0; 4950 vars.repeatDelay || (vars.repeat = 0); 4951 return new Tween(targets, vars); 4952 }; 4953 Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) { 4954 return _globalTimeline.killTweensOf(targets, props, onlyActive); 4955 }; 4956 return Tween; 4957}(Animation); 4958_setDefaults(Tween.prototype, { 4959 _targets: [], 4960 _lazy: 0, 4961 _startAt: 0, 4962 _op: 0, 4963 _onInit: 0 4964}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners) 4965// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => { 4966// Tween.prototype[name] = function() { 4967// let tl = new Timeline(); 4968// return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments)); 4969// } 4970// }); 4971//for backward compatibility. Leverage the timeline calls. 4972 4973_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) { 4974 Tween[name] = function () { 4975 var tl = new Timeline(), 4976 params = _slice.call(arguments, 0); 4977 params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0); 4978 return tl[name].apply(tl, params); 4979 }; 4980}); 4981/* 4982 * -------------------------------------------------------------------------------------- 4983 * PROPTWEEN 4984 * -------------------------------------------------------------------------------------- 4985 */ 4986 4987var _setterPlain = function _setterPlain(target, property, value) { 4988 return target[property] = value; 4989 }, 4990 _setterFunc = function _setterFunc(target, property, value) { 4991 return target[property](value); 4992 }, 4993 _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) { 4994 return target[property](data.fp, value); 4995 }, 4996 _setterAttribute = function _setterAttribute(target, property, value) { 4997 return target.setAttribute(property, value); 4998 }, 4999 _getSetter = function _getSetter(target, property) { 5000 return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain; 5001 }, 5002 _renderPlain = function _renderPlain(ratio, data) { 5003 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data); 5004 }, 5005 _renderBoolean = function _renderBoolean(ratio, data) { 5006 return data.set(data.t, data.p, !!(data.s + data.c * ratio), data); 5007 }, 5008 _renderComplexString = function _renderComplexString(ratio, data) { 5009 var pt = data._pt, 5010 s = ""; 5011 if (!ratio && data.b) { 5012 //b = beginning string 5013 s = data.b; 5014 } else if (ratio === 1 && data.e) { 5015 //e = ending string 5016 s = data.e; 5017 } else { 5018 while (pt) { 5019 s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors. 5020 5021 pt = pt._next; 5022 } 5023 s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text. 5024 } 5025 data.set(data.t, data.p, s, data); 5026 }, 5027 _renderPropTweens = function _renderPropTweens(ratio, data) { 5028 var pt = data._pt; 5029 while (pt) { 5030 pt.r(ratio, pt.d); 5031 pt = pt._next; 5032 } 5033 }, 5034 _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) { 5035 var pt = this._pt, 5036 next; 5037 while (pt) { 5038 next = pt._next; 5039 pt.p === property && pt.modifier(modifier, tween, target); 5040 pt = next; 5041 } 5042 }, 5043 _killPropTweensOf = function _killPropTweensOf(property) { 5044 var pt = this._pt, 5045 hasNonDependentRemaining, 5046 next; 5047 while (pt) { 5048 next = pt._next; 5049 if (pt.p === property && !pt.op || pt.op === property) { 5050 _removeLinkedListItem(this, pt, "_pt"); 5051 } else if (!pt.dep) { 5052 hasNonDependentRemaining = 1; 5053 } 5054 pt = next; 5055 } 5056 return !hasNonDependentRemaining; 5057 }, 5058 _setterWithModifier = function _setterWithModifier(target, property, value, data) { 5059 data.mSet(target, property, data.m.call(data.tween, value, data.mt), data); 5060 }, 5061 _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) { 5062 var pt = parent._pt, 5063 next, 5064 pt2, 5065 first, 5066 last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin) 5067 5068 while (pt) { 5069 next = pt._next; 5070 pt2 = first; 5071 while (pt2 && pt2.pr > pt.pr) { 5072 pt2 = pt2._next; 5073 } 5074 if (pt._prev = pt2 ? pt2._prev : last) { 5075 pt._prev._next = pt; 5076 } else { 5077 first = pt; 5078 } 5079 if (pt._next = pt2) { 5080 pt2._prev = pt; 5081 } else { 5082 last = pt; 5083 } 5084 pt = next; 5085 } 5086 parent._pt = first; 5087 }; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added) 5088 5089var PropTween = /*#__PURE__*/function () { 5090 function PropTween(next, target, prop, start, change, renderer, data, setter, priority) { 5091 this.t = target; 5092 this.s = start; 5093 this.c = change; 5094 this.p = prop; 5095 this.r = renderer || _renderPlain; 5096 this.d = data || this; 5097 this.set = setter || _setterPlain; 5098 this.pr = priority || 0; 5099 this._next = next; 5100 if (next) { 5101 next._prev = this; 5102 } 5103 } 5104 var _proto4 = PropTween.prototype; 5105 _proto4.modifier = function modifier(func, tween, target) { 5106 this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier) 5107 5108 this.set = _setterWithModifier; 5109 this.m = func; 5110 this.mt = target; //modifier target 5111 5112 this.tween = tween; 5113 }; 5114 return PropTween; 5115}(); //Initialization tasks 5116 5117_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger", function (name) { 5118 return _reservedProps[name] = 1; 5119}); 5120_globals.TweenMax = _globals.TweenLite = Tween; 5121_globals.TimelineLite = _globals.TimelineMax = Timeline; 5122_globalTimeline = new Timeline({ 5123 sortChildren: false, 5124 defaults: _defaults, 5125 autoRemoveChildren: true, 5126 id: "root", 5127 smoothChildTiming: true 5128}); 5129_config.stringFilter = _colorStringFilter; 5130var _media = [], 5131 _listeners = {}, 5132 _emptyArray = [], 5133 _lastMediaTime = 0, 5134 _contextID = 0, 5135 _dispatch = function _dispatch(type) { 5136 return (_listeners[type] || _emptyArray).map(function (f) { 5137 return f(); 5138 }); 5139 }, 5140 _onMediaChange = function _onMediaChange() { 5141 var time = Date.now(), 5142 matches = []; 5143 if (time - _lastMediaTime > 2) { 5144 _dispatch("matchMediaInit"); 5145 _media.forEach(function (c) { 5146 var queries = c.queries, 5147 conditions = c.conditions, 5148 match, 5149 p, 5150 anyMatch, 5151 toggled; 5152 for (p in queries) { 5153 match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the "matches" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate. 5154 5155 match && (anyMatch = 1); 5156 if (match !== conditions[p]) { 5157 conditions[p] = match; 5158 toggled = 1; 5159 } 5160 } 5161 if (toggled) { 5162 c.revert(); 5163 anyMatch && matches.push(c); 5164 } 5165 }); 5166 _dispatch("matchMediaRevert"); 5167 matches.forEach(function (c) { 5168 return c.onMatch(c, function (func) { 5169 return c.add(null, func); 5170 }); 5171 }); 5172 _lastMediaTime = time; 5173 _dispatch("matchMedia"); 5174 } 5175 }; 5176var Context = /*#__PURE__*/function () { 5177 function Context(func, scope) { 5178 this.selector = scope && selector(scope); 5179 this.data = []; 5180 this._r = []; // returned/cleanup functions 5181 5182 this.isReverted = false; 5183 this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because "this" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely 5184 5185 func && this.add(func); 5186 } 5187 var _proto5 = Context.prototype; 5188 _proto5.add = function add(name, func, scope) { 5189 // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function. 5190 // if (name && _isFunction(name.revert)) { 5191 // this.data.push(name); 5192 // return (name._ctx = this); 5193 // } 5194 if (_isFunction(name)) { 5195 scope = func; 5196 func = name; 5197 name = _isFunction; 5198 } 5199 var self = this, 5200 f = function f() { 5201 var prev = _context, 5202 prevSelector = self.selector, 5203 result; 5204 prev && prev !== self && prev.data.push(self); 5205 scope && (self.selector = selector(scope)); 5206 _context = self; 5207 result = func.apply(self, arguments); 5208 _isFunction(result) && self._r.push(result); 5209 _context = prev; 5210 self.selector = prevSelector; 5211 self.isReverted = false; 5212 return result; 5213 }; 5214 self.last = f; 5215 return name === _isFunction ? f(self, function (func) { 5216 return self.add(null, func); 5217 }) : name ? self[name] = f : f; 5218 }; 5219 _proto5.ignore = function ignore(func) { 5220 var prev = _context; 5221 _context = null; 5222 func(this); 5223 _context = prev; 5224 }; 5225 _proto5.getTweens = function getTweens() { 5226 var a = []; 5227 this.data.forEach(function (e) { 5228 return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === "nested") && a.push(e); 5229 }); 5230 return a; 5231 }; 5232 _proto5.clear = function clear() { 5233 this._r.length = this.data.length = 0; 5234 }; 5235 _proto5.kill = function kill(revert, matchMedia) { 5236 var _this4 = this; 5237 if (revert) { 5238 (function () { 5239 var tweens = _this4.getTweens(), 5240 i = _this4.data.length, 5241 t; 5242 while (i--) { 5243 // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted. 5244 t = _this4.data[i]; 5245 if (t.data === "isFlip") { 5246 t.revert(); 5247 t.getChildren(true, true, false).forEach(function (tween) { 5248 return tweens.splice(tweens.indexOf(tween), 1); 5249 }); 5250 } 5251 } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort 5252 5253 tweens.map(function (t) { 5254 return { 5255 g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity, 5256 t: t 5257 }; 5258 }).sort(function (a, b) { 5259 return b.g - a.g || -Infinity; 5260 }).forEach(function (o) { 5261 return o.t.revert(revert); 5262 }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the " || -1" in the sort keeps the order properly. 5263 5264 i = _this4.data.length; 5265 while (i--) { 5266 // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first 5267 t = _this4.data[i]; 5268 if (t instanceof Timeline) { 5269 if (t.data !== "nested") { 5270 t.scrollTrigger && t.scrollTrigger.revert(); 5271 t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens 5272 } 5273 } else { 5274 !(t instanceof Tween) && t.revert && t.revert(revert); 5275 } 5276 } 5277 _this4._r.forEach(function (f) { 5278 return f(revert, _this4); 5279 }); 5280 _this4.isReverted = true; 5281 })(); 5282 } else { 5283 this.data.forEach(function (e) { 5284 return e.kill && e.kill(); 5285 }); 5286 } 5287 this.clear(); 5288 if (matchMedia) { 5289 var i = _media.length; 5290 while (i--) { 5291 // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead. 5292 _media[i].id === this.id && _media.splice(i, 1); 5293 } 5294 } 5295 } // killWithCleanup() { 5296 // this.kill(); 5297 // this._r.forEach(f => f(false, this)); 5298 // } 5299 ; 5300 _proto5.revert = function revert(config) { 5301 this.kill(config || {}); 5302 }; 5303 return Context; 5304}(); 5305var MatchMedia = /*#__PURE__*/function () { 5306 function MatchMedia(scope) { 5307 this.contexts = []; 5308 this.scope = scope; 5309 _context && _context.data.push(this); 5310 } 5311 var _proto6 = MatchMedia.prototype; 5312 _proto6.add = function add(conditions, func, scope) { 5313 _isObject(conditions) || (conditions = { 5314 matches: conditions 5315 }); 5316 var context = new Context(0, scope || this.scope), 5317 cond = context.conditions = {}, 5318 mq, 5319 p, 5320 active; 5321 _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context() 5322 5323 this.contexts.push(context); 5324 func = context.add("onMatch", func); 5325 context.queries = conditions; 5326 for (p in conditions) { 5327 if (p === "all") { 5328 active = 1; 5329 } else { 5330 mq = _win.matchMedia(conditions[p]); 5331 if (mq) { 5332 _media.indexOf(context) < 0 && _media.push(context); 5333 (cond[p] = mq.matches) && (active = 1); 5334 mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener("change", _onMediaChange); 5335 } 5336 } 5337 } 5338 active && func(context, function (f) { 5339 return context.add(null, f); 5340 }); 5341 return this; 5342 } // refresh() { 5343 // let time = _lastMediaTime, 5344 // media = _media; 5345 // _lastMediaTime = -1; 5346 // _media = this.contexts; 5347 // _onMediaChange(); 5348 // _lastMediaTime = time; 5349 // _media = media; 5350 // } 5351 ; 5352 _proto6.revert = function revert(config) { 5353 this.kill(config || {}); 5354 }; 5355 _proto6.kill = function kill(revert) { 5356 this.contexts.forEach(function (c) { 5357 return c.kill(revert, true); 5358 }); 5359 }; 5360 return MatchMedia; 5361}(); 5362/* 5363 * -------------------------------------------------------------------------------------- 5364 * GSAP 5365 * -------------------------------------------------------------------------------------- 5366 */ 5367 5368var _gsap = { 5369 registerPlugin: function registerPlugin() { 5370 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 5371 args[_key2] = arguments[_key2]; 5372 } 5373 args.forEach(function (config) { 5374 return _createPlugin(config); 5375 }); 5376 }, 5377 timeline: function timeline(vars) { 5378 return new Timeline(vars); 5379 }, 5380 getTweensOf: function getTweensOf(targets, onlyActive) { 5381 return _globalTimeline.getTweensOf(targets, onlyActive); 5382 }, 5383 getProperty: function getProperty(target, property, unit, uncache) { 5384 _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in 5385 5386 var getter = _getCache(target || {}).get, 5387 format = unit ? _passThrough : _numericIfPossible; 5388 unit === "native" && (unit = ""); 5389 return !target ? target : !property ? function (property, unit, uncache) { 5390 return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 5391 } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 5392 }, 5393 quickSetter: function quickSetter(target, property, unit) { 5394 target = toArray(target); 5395 if (target.length > 1) { 5396 var setters = target.map(function (t) { 5397 return gsap.quickSetter(t, property, unit); 5398 }), 5399 l = setters.length; 5400 return function (value) { 5401 var i = l; 5402 while (i--) { 5403 setters[i](value); 5404 } 5405 }; 5406 } 5407 target = target[0] || {}; 5408 var Plugin = _plugins[property], 5409 cache = _getCache(target), 5410 p = cache.harness && (cache.harness.aliases || {})[property] || property, 5411 // in case it's an alias, like "rotate" for "rotation". 5412 setter = Plugin ? function (value) { 5413 var p = new Plugin(); 5414 _quickTween._pt = 0; 5415 p.init(target, unit ? value + unit : value, _quickTween, 0, [target]); 5416 p.render(1, p); 5417 _quickTween._pt && _renderPropTweens(1, _quickTween); 5418 } : cache.set(target, p); 5419 return Plugin ? setter : function (value) { 5420 return setter(target, p, unit ? value + unit : value, cache, 1); 5421 }; 5422 }, 5423 quickTo: function quickTo(target, property, vars) { 5424 var _setDefaults2; 5425 var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = "+=0.1", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})), 5426 func = function func(value, start, startIsRelative) { 5427 return tween.resetTo(property, value, start, startIsRelative); 5428 }; 5429 func.tween = tween; 5430 return func; 5431 }, 5432 isTweening: function isTweening(targets) { 5433 return _globalTimeline.getTweensOf(targets, true).length > 0; 5434 }, 5435 defaults: function defaults(value) { 5436 value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease)); 5437 return _mergeDeep(_defaults, value || {}); 5438 }, 5439 config: function config(value) { 5440 return _mergeDeep(_config, value || {}); 5441 }, 5442 registerEffect: function registerEffect(_ref3) { 5443 var name = _ref3.name, 5444 effect = _ref3.effect, 5445 plugins = _ref3.plugins, 5446 defaults = _ref3.defaults, 5447 extendTimeline = _ref3.extendTimeline; 5448 (plugins || "").split(",").forEach(function (pluginName) { 5449 return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin."); 5450 }); 5451 _effects[name] = function (targets, vars, tl) { 5452 return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl); 5453 }; 5454 if (extendTimeline) { 5455 Timeline.prototype[name] = function (targets, vars, position) { 5456 return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position); 5457 }; 5458 } 5459 }, 5460 registerEase: function registerEase(name, ease) { 5461 _easeMap[name] = _parseEase(ease); 5462 }, 5463 parseEase: function parseEase(ease, defaultEase) { 5464 return arguments.length ? _parseEase(ease, defaultEase) : _easeMap; 5465 }, 5466 getById: function getById(id) { 5467 return _globalTimeline.getById(id); 5468 }, 5469 exportRoot: function exportRoot(vars, includeDelayedCalls) { 5470 if (vars === void 0) { 5471 vars = {}; 5472 } 5473 var tl = new Timeline(vars), 5474 child, 5475 next; 5476 tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming); 5477 _globalTimeline.remove(tl); 5478 tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself). 5479 5480 tl._time = tl._tTime = _globalTimeline._time; 5481 child = _globalTimeline._first; 5482 while (child) { 5483 next = child._next; 5484 if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) { 5485 _addToTimeline(tl, child, child._start - child._delay); 5486 } 5487 child = next; 5488 } 5489 _addToTimeline(_globalTimeline, tl, 0); 5490 return tl; 5491 }, 5492 context: function context(func, scope) { 5493 return func ? new Context(func, scope) : _context; 5494 }, 5495 matchMedia: function matchMedia(scope) { 5496 return new MatchMedia(scope); 5497 }, 5498 matchMediaRefresh: function matchMediaRefresh() { 5499 return _media.forEach(function (c) { 5500 var cond = c.conditions, 5501 found, 5502 p; 5503 for (p in cond) { 5504 if (cond[p]) { 5505 cond[p] = false; 5506 found = 1; 5507 } 5508 } 5509 found && c.revert(); 5510 }) || _onMediaChange(); 5511 }, 5512 addEventListener: function addEventListener(type, callback) { 5513 var a = _listeners[type] || (_listeners[type] = []); 5514 ~a.indexOf(callback) || a.push(callback); 5515 }, 5516 removeEventListener: function removeEventListener(type, callback) { 5517 var a = _listeners[type], 5518 i = a && a.indexOf(callback); 5519 i >= 0 && a.splice(i, 1); 5520 }, 5521 utils: { 5522 wrap: wrap, 5523 wrapYoyo: wrapYoyo, 5524 distribute: distribute, 5525 random: random, 5526 snap: snap, 5527 normalize: normalize, 5528 getUnit: getUnit, 5529 clamp: clamp, 5530 splitColor: splitColor, 5531 toArray: toArray, 5532 selector: selector, 5533 mapRange: mapRange, 5534 pipe: pipe, 5535 unitize: unitize, 5536 interpolate: interpolate, 5537 shuffle: shuffle 5538 }, 5539 install: _install, 5540 effects: _effects, 5541 ticker: _ticker, 5542 updateRoot: Timeline.updateRoot, 5543 plugins: _plugins, 5544 globalTimeline: _globalTimeline, 5545 core: { 5546 PropTween: PropTween, 5547 globals: _addGlobal, 5548 Tween: Tween, 5549 Timeline: Timeline, 5550 Animation: Animation, 5551 getCache: _getCache, 5552 _removeLinkedListItem: _removeLinkedListItem, 5553 reverting: function reverting() { 5554 return _reverting; 5555 }, 5556 context: function context(toAdd) { 5557 if (toAdd && _context) { 5558 _context.data.push(toAdd); 5559 toAdd._ctx = _context; 5560 } 5561 return _context; 5562 }, 5563 suppressOverwrites: function suppressOverwrites(value) { 5564 return _suppressOverwrites = value; 5565 } 5566 } 5567}; 5568_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) { 5569 return _gsap[name] = Tween[name]; 5570}); 5571_ticker.add(Timeline.updateRoot); 5572_quickTween = _gsap.to({}, { 5573 duration: 0 5574}); // ---- EXTRA PLUGINS -------------------------------------------------------- 5575 5576var _getPluginPropTween = function _getPluginPropTween(plugin, prop) { 5577 var pt = plugin._pt; 5578 while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) { 5579 pt = pt._next; 5580 } 5581 return pt; 5582 }, 5583 _addModifiers = function _addModifiers(tween, modifiers) { 5584 var targets = tween._targets, 5585 p, 5586 i, 5587 pt; 5588 for (p in modifiers) { 5589 i = targets.length; 5590 while (i--) { 5591 pt = tween._ptLookup[i][p]; 5592 if (pt && (pt = pt.d)) { 5593 if (pt._pt) { 5594 // is a plugin 5595 pt = _getPluginPropTween(pt, p); 5596 } 5597 pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p); 5598 } 5599 } 5600 } 5601 }, 5602 _buildModifierPlugin = function _buildModifierPlugin(name, modifier) { 5603 return { 5604 name: name, 5605 rawVars: 1, 5606 //don't pre-process function-based values or "random()" strings. 5607 init: function init(target, vars, tween) { 5608 tween._onInit = function (tween) { 5609 var temp, p; 5610 if (_isString(vars)) { 5611 temp = {}; 5612 _forEachName(vars, function (name) { 5613 return temp[name] = 1; 5614 }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers. 5615 5616 vars = temp; 5617 } 5618 if (modifier) { 5619 temp = {}; 5620 for (p in vars) { 5621 temp[p] = modifier(vars[p]); 5622 } 5623 vars = temp; 5624 } 5625 _addModifiers(tween, vars); 5626 }; 5627 } 5628 }; 5629 }; //register core plugins 5630 5631var gsap = _gsap.registerPlugin({ 5632 name: "attr", 5633 init: function init(target, vars, tween, index, targets) { 5634 var p, pt, v; 5635 this.tween = tween; 5636 for (p in vars) { 5637 v = target.getAttribute(p) || ""; 5638 pt = this.add(target, "setAttribute", (v || 0) + "", vars[p], index, targets, 0, 0, p); 5639 pt.op = p; 5640 pt.b = v; // record the beginning value so we can revert() 5641 5642 this._props.push(p); 5643 } 5644 }, 5645 render: function render(ratio, data) { 5646 var pt = data._pt; 5647 while (pt) { 5648 _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b) 5649 5650 pt = pt._next; 5651 } 5652 } 5653}, { 5654 name: "endArray", 5655 init: function init(target, value) { 5656 var i = value.length; 5657 while (i--) { 5658 this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1); 5659 } 5660 } 5661}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way. 5662 5663Tween.version = Timeline.version = gsap.version = "3.12.7"; 5664_coreReady = 1; 5665_windowExists() && _wake(); 5666var Power0 = _easeMap.Power0, 5667 Power1 = _easeMap.Power1, 5668 Power2 = _easeMap.Power2, 5669 Power3 = _easeMap.Power3, 5670 Power4 = _easeMap.Power4, 5671 Linear = _easeMap.Linear, 5672 Quad = _easeMap.Quad, 5673 Cubic = _easeMap.Cubic, 5674 Quart = _easeMap.Quart, 5675 Quint = _easeMap.Quint, 5676 Strong = _easeMap.Strong, 5677 Elastic = _easeMap.Elastic, 5678 Back = _easeMap.Back, 5679 SteppedEase = _easeMap.SteppedEase, 5680 Bounce = _easeMap.Bounce, 5681 Sine = _easeMap.Sine, 5682 Expo = _easeMap.Expo, 5683 Circ = _easeMap.Circ; 5684 5685 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it. 5686 5687 5688 5689/***/ }), 5690
vendor: 5,122 bytes, lines 5691-5759
5691/***/ "./node_modules/gsap/index.js": 5692/*!************************************!*\ 5693 !*** ./node_modules/gsap/index.js ***! 5694 \************************************/ 5695/*! exports provided: gsap, default, CSSPlugin, TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ */ 5696/***/ (function(module, __webpack_exports__, __webpack_require__) { 5697 5698"use strict"; 5699__webpack_require__.r(__webpack_exports__); 5700/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsapWithCSS; }); 5701/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsapWithCSS; }); 5702/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return TweenMaxWithCSS; }); 5703/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js"); 5704/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TweenLite"]; }); 5705 5706/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineMax"]; }); 5707 5708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineLite"]; }); 5709 5710/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power0"]; }); 5711 5712/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power1"]; }); 5713 5714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power2"]; }); 5715 5716/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power3"]; }); 5717 5718/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power4"]; }); 5719 5720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Linear"]; }); 5721 5722/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quad"]; }); 5723 5724/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Cubic"]; }); 5725 5726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quart"]; }); 5727 5728/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quint"]; }); 5729 5730/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Strong"]; }); 5731 5732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Elastic"]; }); 5733 5734/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Back"]; }); 5735 5736/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["SteppedEase"]; }); 5737 5738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Bounce"]; }); 5739 5740/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Sine"]; }); 5741 5742/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Expo"]; }); 5743 5744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Circ"]; }); 5745 5746/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/gsap/CSSPlugin.js"); 5747/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]; }); 5748 5749/*** IMPORTS FROM imports-loader ***/ 5750var define = false; 5751 5752 5753var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"], 5754 // to protect from tree shaking 5755 TweenMaxWithCSS = gsapWithCSS.core.Tween; 5756 5757 5758/***/ }), 5759
vendor: 315,455 bytes, lines 5760-14771
5760/***/ "./node_modules/jquery/dist/jquery.js": 5761/*!********************************************!*\ 5762 !*** ./node_modules/jquery/dist/jquery.js ***! 5763 \********************************************/ 5764/*! no static exports found */ 5765/***/ (function(module, exports, __webpack_require__) { 5766 5767/*** IMPORTS FROM imports-loader ***/ 5768var define = false; 5769 5770/*! 5771 * jQuery JavaScript Library v3.7.1 5772 * https://jquery.com/ 5773 * 5774 * Copyright OpenJS Foundation and other contributors 5775 * Released under the MIT license 5776 * https://jquery.org/license 5777 * 5778 * Date: 2023-08-28T13:37Z 5779 */ 5780(function (global, factory) { 5781 "use strict"; 5782 5783 if ( true && typeof module.exports === "object") { 5784 // For CommonJS and CommonJS-like environments where a proper `window` 5785 // is present, execute the factory and get jQuery. 5786 // For environments that do not have a `window` with a `document` 5787 // (such as Node.js), expose a factory as module.exports. 5788 // This accentuates the need for the creation of a real `window`. 5789 // e.g. var jQuery = require("jquery")(window); 5790 // See ticket trac-14549 for more info. 5791 module.exports = global.document ? factory(global, true) : function (w) { 5792 if (!w.document) { 5793 throw new Error("jQuery requires a window with a document"); 5794 } 5795 return factory(w); 5796 }; 5797 } else { 5798 factory(global); 5799 } 5800 5801 // Pass this if window is not defined yet 5802})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { 5803 // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 5804 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 5805 // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 5806 // enough that all such attempts are guarded in a try block. 5807 "use strict"; 5808 5809 var arr = []; 5810 var getProto = Object.getPrototypeOf; 5811 var slice = arr.slice; 5812 var flat = arr.flat ? function (array) { 5813 return arr.flat.call(array); 5814 } : function (array) { 5815 return arr.concat.apply([], array); 5816 }; 5817 var push = arr.push; 5818 var indexOf = arr.indexOf; 5819 var class2type = {}; 5820 var toString = class2type.toString; 5821 var hasOwn = class2type.hasOwnProperty; 5822 var fnToString = hasOwn.toString; 5823 var ObjectFunctionString = fnToString.call(Object); 5824 var support = {}; 5825 var isFunction = function isFunction(obj) { 5826 // Support: Chrome <=57, Firefox <=52 5827 // In some browsers, typeof returns "function" for HTML <object> elements 5828 // (i.e., `typeof document.createElement( "object" ) === "function"`). 5829 // We don't want to classify *any* DOM node as a function. 5830 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 5831 // Plus for old WebKit, typeof returns "function" for HTML collections 5832 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 5833 return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function"; 5834 }; 5835 var isWindow = function isWindow(obj) { 5836 return obj != null && obj === obj.window; 5837 }; 5838 var document = window.document; 5839 var preservedScriptAttributes = { 5840 type: true, 5841 src: true, 5842 nonce: true, 5843 noModule: true 5844 }; 5845 function DOMEval(code, node, doc) { 5846 doc = doc || document; 5847 var i, 5848 val, 5849 script = doc.createElement("script"); 5850 script.text = code; 5851 if (node) { 5852 for (i in preservedScriptAttributes) { 5853 // Support: Firefox 64+, Edge 18+ 5854 // Some browsers don't support the "nonce" property on scripts. 5855 // On the other hand, just using `getAttribute` is not enough as 5856 // the `nonce` attribute is reset to an empty string whenever it 5857 // becomes browsing-context connected. 5858 // See https://github.com/whatwg/html/issues/2369 5859 // See https://html.spec.whatwg.org/#nonce-attributes 5860 // The `node.getAttribute` check was added for the sake of 5861 // `jQuery.globalEval` so that it can fake a nonce-containing node 5862 // via an object. 5863 val = node[i] || node.getAttribute && node.getAttribute(i); 5864 if (val) { 5865 script.setAttribute(i, val); 5866 } 5867 } 5868 } 5869 doc.head.appendChild(script).parentNode.removeChild(script); 5870 } 5871 function toType(obj) { 5872 if (obj == null) { 5873 return obj + ""; 5874 } 5875 5876 // Support: Android <=2.3 only (functionish RegExp) 5877 return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj; 5878 } 5879 /* global Symbol */ 5880 // Defining this global in .eslintrc.json would create a danger of using the global 5881 // unguarded in another place, it seems safer to define global only for this module 5882 5883 var version = "3.7.1", 5884 rhtmlSuffix = /HTML$/i, 5885 // Define a local copy of jQuery 5886 jQuery = function (selector, context) { 5887 // The jQuery object is actually just the init constructor 'enhanced' 5888 // Need init if jQuery is called (just allow error to be thrown if not included) 5889 return new jQuery.fn.init(selector, context); 5890 }; 5891 jQuery.fn = jQuery.prototype = { 5892 // The current version of jQuery being used 5893 jquery: version, 5894 constructor: jQuery, 5895 // The default length of a jQuery object is 0 5896 length: 0, 5897 toArray: function () { 5898 return slice.call(this); 5899 }, 5900 // Get the Nth element in the matched element set OR 5901 // Get the whole matched element set as a clean array 5902 get: function (num) { 5903 // Return all the elements in a clean array 5904 if (num == null) { 5905 return slice.call(this); 5906 } 5907 5908 // Return just the one element from the set 5909 return num < 0 ? this[num + this.length] : this[num]; 5910 }, 5911 // Take an array of elements and push it onto the stack 5912 // (returning the new matched element set) 5913 pushStack: function (elems) { 5914 // Build a new jQuery matched element set 5915 var ret = jQuery.merge(this.constructor(), elems); 5916 5917 // Add the old object onto the stack (as a reference) 5918 ret.prevObject = this; 5919 5920 // Return the newly-formed element set 5921 return ret; 5922 }, 5923 // Execute a callback for every element in the matched set. 5924 each: function (callback) { 5925 return jQuery.each(this, callback); 5926 }, 5927 map: function (callback) { 5928 return this.pushStack(jQuery.map(this, function (elem, i) { 5929 return callback.call(elem, i, elem); 5930 })); 5931 }, 5932 slice: function () { 5933 return this.pushStack(slice.apply(this, arguments)); 5934 }, 5935 first: function () { 5936 return this.eq(0); 5937 }, 5938 last: function () { 5939 return this.eq(-1); 5940 }, 5941 even: function () { 5942 return this.pushStack(jQuery.grep(this, function (_elem, i) { 5943 return (i + 1) % 2; 5944 })); 5945 }, 5946 odd: function () { 5947 return this.pushStack(jQuery.grep(this, function (_elem, i) { 5948 return i % 2; 5949 })); 5950 }, 5951 eq: function (i) { 5952 var len = this.length, 5953 j = +i + (i < 0 ? len : 0); 5954 return this.pushStack(j >= 0 && j < len ? [this[j]] : []); 5955 }, 5956 end: function () { 5957 return this.prevObject || this.constructor(); 5958 }, 5959 // For internal use only. 5960 // Behaves like an Array's method, not like a jQuery method. 5961 push: push, 5962 sort: arr.sort, 5963 splice: arr.splice 5964 }; 5965 jQuery.extend = jQuery.fn.extend = function () { 5966 var options, 5967 name, 5968 src, 5969 copy, 5970 copyIsArray, 5971 clone, 5972 target = arguments[0] || {}, 5973 i = 1, 5974 length = arguments.length, 5975 deep = false; 5976 5977 // Handle a deep copy situation 5978 if (typeof target === "boolean") { 5979 deep = target; 5980 5981 // Skip the boolean and the target 5982 target = arguments[i] || {}; 5983 i++; 5984 } 5985 5986 // Handle case when target is a string or something (possible in deep copy) 5987 if (typeof target !== "object" && !isFunction(target)) { 5988 target = {}; 5989 } 5990 5991 // Extend jQuery itself if only one argument is passed 5992 if (i === length) { 5993 target = this; 5994 i--; 5995 } 5996 for (; i < length; i++) { 5997 // Only deal with non-null/undefined values 5998 if ((options = arguments[i]) != null) { 5999 // Extend the base object 6000 for (name in options) { 6001 copy = options[name]; 6002 6003 // Prevent Object.prototype pollution 6004 // Prevent never-ending loop 6005 if (name === "__proto__" || target === copy) { 6006 continue; 6007 } 6008 6009 // Recurse if we're merging plain objects or arrays 6010 if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { 6011 src = target[name]; 6012 6013 // Ensure proper type for the source value 6014 if (copyIsArray && !Array.isArray(src)) { 6015 clone = []; 6016 } else if (!copyIsArray && !jQuery.isPlainObject(src)) { 6017 clone = {}; 6018 } else { 6019 clone = src; 6020 } 6021 copyIsArray = false; 6022 6023 // Never move original objects, clone them 6024 target[name] = jQuery.extend(deep, clone, copy); 6025 6026 // Don't bring in undefined values 6027 } else if (copy !== undefined) { 6028 target[name] = copy; 6029 } 6030 } 6031 } 6032 } 6033 6034 // Return the modified object 6035 return target; 6036 }; 6037 jQuery.extend({ 6038 // Unique for each copy of jQuery on the page 6039 expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), 6040 // Assume jQuery is ready without the ready module 6041 isReady: true, 6042 error: function (msg) { 6043 throw new Error(msg); 6044 }, 6045 noop: function () {}, 6046 isPlainObject: function (obj) { 6047 var proto, Ctor; 6048 6049 // Detect obvious negatives 6050 // Use toString instead of jQuery.type to catch host objects 6051 if (!obj || toString.call(obj) !== "[object Object]") { 6052 return false; 6053 } 6054 proto = getProto(obj); 6055 6056 // Objects with no prototype (e.g., `Object.create( null )`) are plain 6057 if (!proto) { 6058 return true; 6059 } 6060 6061 // Objects with prototype are plain iff they were constructed by a global Object function 6062 Ctor = hasOwn.call(proto, "constructor") && proto.constructor; 6063 return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; 6064 }, 6065 isEmptyObject: function (obj) { 6066 var name; 6067 for (name in obj) { 6068 return false; 6069 } 6070 return true; 6071 }, 6072 // Evaluates a script in a provided context; falls back to the global one 6073 // if not specified. 6074 globalEval: function (code, options, doc) { 6075 DOMEval(code, { 6076 nonce: options && options.nonce 6077 }, doc); 6078 }, 6079 each: function (obj, callback) { 6080 var length, 6081 i = 0; 6082 if (isArrayLike(obj)) { 6083 length = obj.length; 6084 for (; i < length; i++) { 6085 if (callback.call(obj[i], i, obj[i]) === false) { 6086 break; 6087 } 6088 } 6089 } else { 6090 for (i in obj) { 6091 if (callback.call(obj[i], i, obj[i]) === false) { 6092 break; 6093 } 6094 } 6095 } 6096 return obj; 6097 }, 6098 // Retrieve the text value of an array of DOM nodes 6099 text: function (elem) { 6100 var node, 6101 ret = "", 6102 i = 0, 6103 nodeType = elem.nodeType; 6104 if (!nodeType) { 6105 // If no nodeType, this is expected to be an array 6106 while (node = elem[i++]) { 6107 // Do not traverse comment nodes 6108 ret += jQuery.text(node); 6109 } 6110 } 6111 if (nodeType === 1 || nodeType === 11) { 6112 return elem.textContent; 6113 } 6114 if (nodeType === 9) { 6115 return elem.documentElement.textContent; 6116 } 6117 if (nodeType === 3 || nodeType === 4) { 6118 return elem.nodeValue; 6119 } 6120 6121 // Do not include comment or processing instruction nodes 6122 6123 return ret; 6124 }, 6125 // results is for internal usage only 6126 makeArray: function (arr, results) { 6127 var ret = results || []; 6128 if (arr != null) { 6129 if (isArrayLike(Object(arr))) { 6130 jQuery.merge(ret, typeof arr === "string" ? [arr] : arr); 6131 } else { 6132 push.call(ret, arr); 6133 } 6134 } 6135 return ret; 6136 }, 6137 inArray: function (elem, arr, i) { 6138 return arr == null ? -1 : indexOf.call(arr, elem, i); 6139 }, 6140 isXMLDoc: function (elem) { 6141 var namespace = elem && elem.namespaceURI, 6142 docElem = elem && (elem.ownerDocument || elem).documentElement; 6143 6144 // Assume HTML when documentElement doesn't yet exist, such as inside 6145 // document fragments. 6146 return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML"); 6147 }, 6148 // Support: Android <=4.0 only, PhantomJS 1 only 6149 // push.apply(_, arraylike) throws on ancient WebKit 6150 merge: function (first, second) { 6151 var len = +second.length, 6152 j = 0, 6153 i = first.length; 6154 for (; j < len; j++) { 6155 first[i++] = second[j]; 6156 } 6157 first.length = i; 6158 return first; 6159 }, 6160 grep: function (elems, callback, invert) { 6161 var callbackInverse, 6162 matches = [], 6163 i = 0, 6164 length = elems.length, 6165 callbackExpect = !invert; 6166 6167 // Go through the array, only saving the items 6168 // that pass the validator function 6169 for (; i < length; i++) { 6170 callbackInverse = !callback(elems[i], i); 6171 if (callbackInverse !== callbackExpect) { 6172 matches.push(elems[i]); 6173 } 6174 } 6175 return matches; 6176 }, 6177 // arg is for internal usage only 6178 map: function (elems, callback, arg) { 6179 var length, 6180 value, 6181 i = 0, 6182 ret = []; 6183 6184 // Go through the array, translating each of the items to their new values 6185 if (isArrayLike(elems)) { 6186 length = elems.length; 6187 for (; i < length; i++) { 6188 value = callback(elems[i], i, arg); 6189 if (value != null) { 6190 ret.push(value); 6191 } 6192 } 6193 6194 // Go through every key on the object, 6195 } else { 6196 for (i in elems) { 6197 value = callback(elems[i], i, arg); 6198 if (value != null) { 6199 ret.push(value); 6200 } 6201 } 6202 } 6203 6204 // Flatten any nested arrays 6205 return flat(ret); 6206 }, 6207 // A global GUID counter for objects 6208 guid: 1, 6209 // jQuery.support is not used in Core but other projects attach their 6210 // properties to it so it needs to exist. 6211 support: support 6212 }); 6213 if (typeof Symbol === "function") { 6214 jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; 6215 } 6216 6217 // Populate the class2type map 6218 jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (_i, name) { 6219 class2type["[object " + name + "]"] = name.toLowerCase(); 6220 }); 6221 function isArrayLike(obj) { 6222 // Support: real iOS 8.2 only (not reproducible in simulator) 6223 // `in` check used to prevent JIT error (gh-2145) 6224 // hasOwn isn't used here due to false negatives 6225 // regarding Nodelist length in IE 6226 var length = !!obj && "length" in obj && obj.length, 6227 type = toType(obj); 6228 if (isFunction(obj) || isWindow(obj)) { 6229 return false; 6230 } 6231 return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; 6232 } 6233 function nodeName(elem, name) { 6234 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 6235 } 6236 var pop = arr.pop; 6237 var sort = arr.sort; 6238 var splice = arr.splice; 6239 var whitespace = "[\\x20\\t\\r\\n\\f]"; 6240 var rtrimCSS = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"); 6241 6242 // Note: an element does not contain itself 6243 jQuery.contains = function (a, b) { 6244 var bup = b && b.parentNode; 6245 return a === bup || !!(bup && bup.nodeType === 1 && ( 6246 // Support: IE 9 - 11+ 6247 // IE doesn't have `contains` on SVG. 6248 a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); 6249 }; 6250 6251 // CSS string/identifier serialization 6252 // https://drafts.csswg.org/cssom/#common-serializing-idioms 6253 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 6254 function fcssescape(ch, asCodePoint) { 6255 if (asCodePoint) { 6256 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 6257 if (ch === "\0") { 6258 return "\uFFFD"; 6259 } 6260 6261 // Control characters and (dependent upon position) numbers get escaped as code points 6262 return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; 6263 } 6264 6265 // Other potentially-special ASCII characters get backslash-escaped 6266 return "\\" + ch; 6267 } 6268 jQuery.escapeSelector = function (sel) { 6269 return (sel + "").replace(rcssescape, fcssescape); 6270 }; 6271 var preferredDoc = document, 6272 pushNative = push; 6273 (function () { 6274 var i, 6275 Expr, 6276 outermostContext, 6277 sortInput, 6278 hasDuplicate, 6279 push = pushNative, 6280 // Local document vars 6281 document, 6282 documentElement, 6283 documentIsHTML, 6284 rbuggyQSA, 6285 matches, 6286 // Instance-specific data 6287 expando = jQuery.expando, 6288 dirruns = 0, 6289 done = 0, 6290 classCache = createCache(), 6291 tokenCache = createCache(), 6292 compilerCache = createCache(), 6293 nonnativeSelectorCache = createCache(), 6294 sortOrder = function (a, b) { 6295 if (a === b) { 6296 hasDuplicate = true; 6297 } 6298 return 0; 6299 }, 6300 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + "loop|multiple|open|readonly|required|scoped", 6301 // Regular expressions 6302 6303 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 6304 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 6305 // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors 6306 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 6307 // Operator (capture 2) 6308 "*([*^$|!~]?=)" + whitespace + 6309 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 6310 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", 6311 pseudos = ":(" + identifier + ")(?:\\((" + 6312 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 6313 // 1. quoted (capture 3; capture 4 or capture 5) 6314 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 6315 // 2. simple (capture 6) 6316 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 6317 // 3. anything else (capture 2) 6318 ".*" + ")\\)|)", 6319 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 6320 rwhitespace = new RegExp(whitespace + "+", "g"), 6321 rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), 6322 rleadingCombinator = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), 6323 rdescend = new RegExp(whitespace + "|>"), 6324 rpseudo = new RegExp(pseudos), 6325 ridentifier = new RegExp("^" + identifier + "$"), 6326 matchExpr = { 6327 ID: new RegExp("^#(" + identifier + ")"), 6328 CLASS: new RegExp("^\\.(" + identifier + ")"), 6329 TAG: new RegExp("^(" + identifier + "|[*])"), 6330 ATTR: new RegExp("^" + attributes), 6331 PSEUDO: new RegExp("^" + pseudos), 6332 CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), 6333 bool: new RegExp("^(?:" + booleans + ")$", "i"), 6334 // For use in libraries implementing .is() 6335 // We use this for POS matching in `select` 6336 needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") 6337 }, 6338 rinputs = /^(?:input|select|textarea|button)$/i, 6339 rheader = /^h\d$/i, 6340 // Easily-parseable/retrievable ID or TAG or CLASS selectors 6341 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 6342 rsibling = /[+~]/, 6343 // CSS escapes 6344 // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters 6345 runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), 6346 funescape = function (escape, nonHex) { 6347 var high = "0x" + escape.slice(1) - 0x10000; 6348 if (nonHex) { 6349 // Strip the backslash prefix from a non-hex escape sequence 6350 return nonHex; 6351 } 6352 6353 // Replace a hexadecimal escape sequence with the encoded Unicode code point 6354 // Support: IE <=11+ 6355 // For values outside the Basic Multilingual Plane (BMP), manually construct a 6356 // surrogate pair 6357 return high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); 6358 }, 6359 // Used for iframes; see `setDocument`. 6360 // Support: IE 9 - 11+, Edge 12 - 18+ 6361 // Removing the function wrapper causes a "Permission Denied" 6362 // error in IE/Edge. 6363 unloadHandler = function () { 6364 setDocument(); 6365 }, 6366 inDisabledFieldset = addCombinator(function (elem) { 6367 return elem.disabled === true && nodeName(elem, "fieldset"); 6368 }, { 6369 dir: "parentNode", 6370 next: "legend" 6371 }); 6372 6373 // Support: IE <=9 only 6374 // Accessing document.activeElement can throw unexpectedly 6375 // https://bugs.jquery.com/ticket/13393 6376 function safeActiveElement() { 6377 try { 6378 return document.activeElement; 6379 } catch (err) {} 6380 } 6381 6382 // Optimize for push.apply( _, NodeList ) 6383 try { 6384 push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes); 6385 6386 // Support: Android <=4.0 6387 // Detect silently failing push.apply 6388 // eslint-disable-next-line no-unused-expressions 6389 arr[preferredDoc.childNodes.length].nodeType; 6390 } catch (e) { 6391 push = { 6392 apply: function (target, els) { 6393 pushNative.apply(target, slice.call(els)); 6394 }, 6395 call: function (target) { 6396 pushNative.apply(target, slice.call(arguments, 1)); 6397 } 6398 }; 6399 } 6400 function find(selector, context, results, seed) { 6401 var m, 6402 i, 6403 elem, 6404 nid, 6405 match, 6406 groups, 6407 newSelector, 6408 newContext = context && context.ownerDocument, 6409 // nodeType defaults to 9, since context defaults to document 6410 nodeType = context ? context.nodeType : 9; 6411 results = results || []; 6412 6413 // Return early from calls with invalid selector or context 6414 if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { 6415 return results; 6416 } 6417 6418 // Try to shortcut find operations (as opposed to filters) in HTML documents 6419 if (!seed) { 6420 setDocument(context); 6421 context = context || document; 6422 if (documentIsHTML) { 6423 // If the selector is sufficiently simple, try using a "get*By*" DOM method 6424 // (excepting DocumentFragment context, where the methods don't exist) 6425 if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { 6426 // ID selector 6427 if (m = match[1]) { 6428 // Document context 6429 if (nodeType === 9) { 6430 if (elem = context.getElementById(m)) { 6431 // Support: IE 9 only 6432 // getElementById can match elements by name instead of ID 6433 if (elem.id === m) { 6434 push.call(results, elem); 6435 return results; 6436 } 6437 } else { 6438 return results; 6439 } 6440 6441 // Element context 6442 } else { 6443 // Support: IE 9 only 6444 // getElementById can match elements by name instead of ID 6445 if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) { 6446 push.call(results, elem); 6447 return results; 6448 } 6449 } 6450 6451 // Type selector 6452 } else if (match[2]) { 6453 push.apply(results, context.getElementsByTagName(selector)); 6454 return results; 6455 6456 // Class selector 6457 } else if ((m = match[3]) && context.getElementsByClassName) { 6458 push.apply(results, context.getElementsByClassName(m)); 6459 return results; 6460 } 6461 } 6462 6463 // Take advantage of querySelectorAll 6464 if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { 6465 newSelector = selector; 6466 newContext = context; 6467 6468 // qSA considers elements outside a scoping root when evaluating child or 6469 // descendant combinators, which is not what we want. 6470 // In such cases, we work around the behavior by prefixing every selector in the 6471 // list with an ID selector referencing the scope context. 6472 // The technique has to be used as well when a leading combinator is used 6473 // as such selectors are not recognized by querySelectorAll. 6474 // Thanks to Andrew Dupont for this technique. 6475 if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) { 6476 // Expand context for sibling selectors 6477 newContext = rsibling.test(selector) && testContext(context.parentNode) || context; 6478 6479 // We can use :scope instead of the ID hack if the browser 6480 // supports it & if we're not changing the context. 6481 // Support: IE 11+, Edge 17 - 18+ 6482 // IE/Edge sometimes throw a "Permission denied" error when 6483 // strict-comparing two documents; shallow comparisons work. 6484 // eslint-disable-next-line eqeqeq 6485 if (newContext != context || !support.scope) { 6486 // Capture the context ID, setting it first if necessary 6487 if (nid = context.getAttribute("id")) { 6488 nid = jQuery.escapeSelector(nid); 6489 } else { 6490 context.setAttribute("id", nid = expando); 6491 } 6492 } 6493 6494 // Prefix every selector in the list 6495 groups = tokenize(selector); 6496 i = groups.length; 6497 while (i--) { 6498 groups[i] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i]); 6499 } 6500 newSelector = groups.join(","); 6501 } 6502 try { 6503 push.apply(results, newContext.querySelectorAll(newSelector)); 6504 return results; 6505 } catch (qsaError) { 6506 nonnativeSelectorCache(selector, true); 6507 } finally { 6508 if (nid === expando) { 6509 context.removeAttribute("id"); 6510 } 6511 } 6512 } 6513 } 6514 } 6515 6516 // All others 6517 return select(selector.replace(rtrimCSS, "$1"), context, results, seed); 6518 } 6519 6520 /** 6521 * Create key-value caches of limited size 6522 * @returns {function(string, object)} Returns the Object data after storing it on itself with 6523 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 6524 * deleting the oldest entry 6525 */ 6526 function createCache() { 6527 var keys = []; 6528 function cache(key, value) { 6529 // Use (key + " ") to avoid collision with native prototype properties 6530 // (see https://github.com/jquery/sizzle/issues/157) 6531 if (keys.push(key + " ") > Expr.cacheLength) { 6532 // Only keep the most recent entries 6533 delete cache[keys.shift()]; 6534 } 6535 return cache[key + " "] = value; 6536 } 6537 return cache; 6538 } 6539 6540 /** 6541 * Mark a function for special use by jQuery selector module 6542 * @param {Function} fn The function to mark 6543 */ 6544 function markFunction(fn) { 6545 fn[expando] = true; 6546 return fn; 6547 } 6548 6549 /** 6550 * Support testing using an element 6551 * @param {Function} fn Passed the created element and returns a boolean result 6552 */ 6553 function assert(fn) { 6554 var el = document.createElement("fieldset"); 6555 try { 6556 return !!fn(el); 6557 } catch (e) { 6558 return false; 6559 } finally { 6560 // Remove from its parent by default 6561 if (el.parentNode) { 6562 el.parentNode.removeChild(el); 6563 } 6564 6565 // release memory in IE 6566 el = null; 6567 } 6568 } 6569 6570 /** 6571 * Returns a function to use in pseudos for input types 6572 * @param {String} type 6573 */ 6574 function createInputPseudo(type) { 6575 return function (elem) { 6576 return nodeName(elem, "input") && elem.type === type; 6577 }; 6578 } 6579 6580 /** 6581 * Returns a function to use in pseudos for buttons 6582 * @param {String} type 6583 */ 6584 function createButtonPseudo(type) { 6585 return function (elem) { 6586 return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type; 6587 }; 6588 } 6589 6590 /** 6591 * Returns a function to use in pseudos for :enabled/:disabled 6592 * @param {Boolean} disabled true for :disabled; false for :enabled 6593 */ 6594 function createDisabledPseudo(disabled) { 6595 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 6596 return function (elem) { 6597 // Only certain elements can match :enabled or :disabled 6598 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 6599 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 6600 if ("form" in elem) { 6601 // Check for inherited disabledness on relevant non-disabled elements: 6602 // * listed form-associated elements in a disabled fieldset 6603 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 6604 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 6605 // * option elements in a disabled optgroup 6606 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 6607 // All such elements have a "form" property. 6608 if (elem.parentNode && elem.disabled === false) { 6609 // Option elements defer to a parent optgroup if present 6610 if ("label" in elem) { 6611 if ("label" in elem.parentNode) { 6612 return elem.parentNode.disabled === disabled; 6613 } else { 6614 return elem.disabled === disabled; 6615 } 6616 } 6617 6618 // Support: IE 6 - 11+ 6619 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 6620 return elem.isDisabled === disabled || 6621 // Where there is no isDisabled, check manually 6622 elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled; 6623 } 6624 return elem.disabled === disabled; 6625 6626 // Try to winnow out elements that can't be disabled before trusting the disabled property. 6627 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 6628 // even exist on them, let alone have a boolean value. 6629 } else if ("label" in elem) { 6630 return elem.disabled === disabled; 6631 } 6632 6633 // Remaining elements are neither :enabled nor :disabled 6634 return false; 6635 }; 6636 } 6637 6638 /** 6639 * Returns a function to use in pseudos for positionals 6640 * @param {Function} fn 6641 */ 6642 function createPositionalPseudo(fn) { 6643 return markFunction(function (argument) { 6644 argument = +argument; 6645 return markFunction(function (seed, matches) { 6646 var j, 6647 matchIndexes = fn([], seed.length, argument), 6648 i = matchIndexes.length; 6649 6650 // Match elements found at the specified indexes 6651 while (i--) { 6652 if (seed[j = matchIndexes[i]]) { 6653 seed[j] = !(matches[j] = seed[j]); 6654 } 6655 } 6656 }); 6657 }); 6658 } 6659 6660 /** 6661 * Checks a node for validity as a jQuery selector context 6662 * @param {Element|Object=} context 6663 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 6664 */ 6665 function testContext(context) { 6666 return context && typeof context.getElementsByTagName !== "undefined" && context; 6667 } 6668 6669 /** 6670 * Sets document-related variables once based on the current document 6671 * @param {Element|Object} [node] An element or document object to use to set the document 6672 * @returns {Object} Returns the current document 6673 */ 6674 function setDocument(node) { 6675 var subWindow, 6676 doc = node ? node.ownerDocument || node : preferredDoc; 6677 6678 // Return early if doc is invalid or already selected 6679 // Support: IE 11+, Edge 17 - 18+ 6680 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6681 // two documents; shallow comparisons work. 6682 // eslint-disable-next-line eqeqeq 6683 if (doc == document || doc.nodeType !== 9 || !doc.documentElement) { 6684 return document; 6685 } 6686 6687 // Update global variables 6688 document = doc; 6689 documentElement = document.documentElement; 6690 documentIsHTML = !jQuery.isXMLDoc(document); 6691 6692 // Support: iOS 7 only, IE 9 - 11+ 6693 // Older browsers didn't support unprefixed `matches`. 6694 matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.msMatchesSelector; 6695 6696 // Support: IE 9 - 11+, Edge 12 - 18+ 6697 // Accessing iframe documents after unload throws "permission denied" errors 6698 // (see trac-13936). 6699 // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, 6700 // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. 6701 if (documentElement.msMatchesSelector && 6702 // Support: IE 11+, Edge 17 - 18+ 6703 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6704 // two documents; shallow comparisons work. 6705 // eslint-disable-next-line eqeqeq 6706 preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) { 6707 // Support: IE 9 - 11+, Edge 12 - 18+ 6708 subWindow.addEventListener("unload", unloadHandler); 6709 } 6710 6711 // Support: IE <10 6712 // Check if getElementById returns elements by name 6713 // The broken getElementById methods don't pick up programmatically-set names, 6714 // so use a roundabout getElementsByName test 6715 support.getById = assert(function (el) { 6716 documentElement.appendChild(el).id = jQuery.expando; 6717 return !document.getElementsByName || !document.getElementsByName(jQuery.expando).length; 6718 }); 6719 6720 // Support: IE 9 only 6721 // Check to see if it's possible to do matchesSelector 6722 // on a disconnected node. 6723 support.disconnectedMatch = assert(function (el) { 6724 return matches.call(el, "*"); 6725 }); 6726 6727 // Support: IE 9 - 11+, Edge 12 - 18+ 6728 // IE/Edge don't support the :scope pseudo-class. 6729 support.scope = assert(function () { 6730 return document.querySelectorAll(":scope"); 6731 }); 6732 6733 // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only 6734 // Make sure the `:has()` argument is parsed unforgivingly. 6735 // We include `*` in the test to detect buggy implementations that are 6736 // _selectively_ forgiving (specifically when the list includes at least 6737 // one valid selector). 6738 // Note that we treat complete lack of support for `:has()` as if it were 6739 // spec-compliant support, which is fine because use of `:has()` in such 6740 // environments will fail in the qSA path and fall back to jQuery traversal 6741 // anyway. 6742 support.cssHas = assert(function () { 6743 try { 6744 document.querySelector(":has(*,:jqfake)"); 6745 return false; 6746 } catch (e) { 6747 return true; 6748 } 6749 }); 6750 6751 // ID filter and find 6752 if (support.getById) { 6753 Expr.filter.ID = function (id) { 6754 var attrId = id.replace(runescape, funescape); 6755 return function (elem) { 6756 return elem.getAttribute("id") === attrId; 6757 }; 6758 }; 6759 Expr.find.ID = function (id, context) { 6760 if (typeof context.getElementById !== "undefined" && documentIsHTML) { 6761 var elem = context.getElementById(id); 6762 return elem ? [elem] : []; 6763 } 6764 }; 6765 } else { 6766 Expr.filter.ID = function (id) { 6767 var attrId = id.replace(runescape, funescape); 6768 return function (elem) { 6769 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 6770 return node && node.value === attrId; 6771 }; 6772 }; 6773 6774 // Support: IE 6 - 7 only 6775 // getElementById is not reliable as a find shortcut 6776 Expr.find.ID = function (id, context) { 6777 if (typeof context.getElementById !== "undefined" && documentIsHTML) { 6778 var node, 6779 i, 6780 elems, 6781 elem = context.getElementById(id); 6782 if (elem) { 6783 // Verify the id attribute 6784 node = elem.getAttributeNode("id"); 6785 if (node && node.value === id) { 6786 return [elem]; 6787 } 6788 6789 // Fall back on getElementsByName 6790 elems = context.getElementsByName(id); 6791 i = 0; 6792 while (elem = elems[i++]) { 6793 node = elem.getAttributeNode("id"); 6794 if (node && node.value === id) { 6795 return [elem]; 6796 } 6797 } 6798 } 6799 return []; 6800 } 6801 }; 6802 } 6803 6804 // Tag 6805 Expr.find.TAG = function (tag, context) { 6806 if (typeof context.getElementsByTagName !== "undefined") { 6807 return context.getElementsByTagName(tag); 6808 6809 // DocumentFragment nodes don't have gEBTN 6810 } else { 6811 return context.querySelectorAll(tag); 6812 } 6813 }; 6814 6815 // Class 6816 Expr.find.CLASS = function (className, context) { 6817 if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { 6818 return context.getElementsByClassName(className); 6819 } 6820 }; 6821 6822 /* QSA/matchesSelector 6823 ---------------------------------------------------------------------- */ 6824 6825 // QSA and matchesSelector support 6826 6827 rbuggyQSA = []; 6828 6829 // Build QSA regex 6830 // Regex strategy adopted from Diego Perini 6831 assert(function (el) { 6832 var input; 6833 documentElement.appendChild(el).innerHTML = "<a id='" + expando + "' href='' disabled='disabled'></a>" + "<select id='" + expando + "-\r\\' disabled='disabled'>" + "<option selected=''></option></select>"; 6834 6835 // Support: iOS <=7 - 8 only 6836 // Boolean attributes and "value" are not treated correctly in some XML documents 6837 if (!el.querySelectorAll("[selected]").length) { 6838 rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); 6839 } 6840 6841 // Support: iOS <=7 - 8 only 6842 if (!el.querySelectorAll("[id~=" + expando + "-]").length) { 6843 rbuggyQSA.push("~="); 6844 } 6845 6846 // Support: iOS 8 only 6847 // https://bugs.webkit.org/show_bug.cgi?id=136851 6848 // In-page `selector#id sibling-combinator selector` fails 6849 if (!el.querySelectorAll("a#" + expando + "+*").length) { 6850 rbuggyQSA.push(".#.+[+~]"); 6851 } 6852 6853 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 6854 // In some of the document kinds, these selectors wouldn't work natively. 6855 // This is probably OK but for backwards compatibility we want to maintain 6856 // handling them through jQuery traversal in jQuery 3.x. 6857 if (!el.querySelectorAll(":checked").length) { 6858 rbuggyQSA.push(":checked"); 6859 } 6860 6861 // Support: Windows 8 Native Apps 6862 // The type and name attributes are restricted during .innerHTML assignment 6863 input = document.createElement("input"); 6864 input.setAttribute("type", "hidden"); 6865 el.appendChild(input).setAttribute("name", "D"); 6866 6867 // Support: IE 9 - 11+ 6868 // IE's :disabled selector does not pick up the children of disabled fieldsets 6869 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 6870 // In some of the document kinds, these selectors wouldn't work natively. 6871 // This is probably OK but for backwards compatibility we want to maintain 6872 // handling them through jQuery traversal in jQuery 3.x. 6873 documentElement.appendChild(el).disabled = true; 6874 if (el.querySelectorAll(":disabled").length !== 2) { 6875 rbuggyQSA.push(":enabled", ":disabled"); 6876 } 6877 6878 // Support: IE 11+, Edge 15 - 18+ 6879 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 6880 // Adding a temporary attribute to the document before the selection works 6881 // around the issue. 6882 // Interestingly, IE 10 & older don't seem to have the issue. 6883 input = document.createElement("input"); 6884 input.setAttribute("name", ""); 6885 el.appendChild(input); 6886 if (!el.querySelectorAll("[name='']").length) { 6887 rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")"); 6888 } 6889 }); 6890 if (!support.cssHas) { 6891 // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ 6892 // Our regular `try-catch` mechanism fails to detect natively-unsupported 6893 // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) 6894 // in browsers that parse the `:has()` argument as a forgiving selector list. 6895 // https://drafts.csswg.org/selectors/#relational now requires the argument 6896 // to be parsed unforgivingly, but browsers have not yet fully adjusted. 6897 rbuggyQSA.push(":has"); 6898 } 6899 rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); 6900 6901 /* Sorting 6902 ---------------------------------------------------------------------- */ 6903 6904 // Document order sorting 6905 sortOrder = function (a, b) { 6906 // Flag for duplicate removal 6907 if (a === b) { 6908 hasDuplicate = true; 6909 return 0; 6910 } 6911 6912 // Sort on method existence if only one input has compareDocumentPosition 6913 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 6914 if (compare) { 6915 return compare; 6916 } 6917 6918 // Calculate position if both inputs belong to the same document 6919 // Support: IE 11+, Edge 17 - 18+ 6920 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6921 // two documents; shallow comparisons work. 6922 // eslint-disable-next-line eqeqeq 6923 compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 6924 // Otherwise we know they are disconnected 6925 1; 6926 6927 // Disconnected nodes 6928 if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) { 6929 // Choose the first element that is related to our preferred document 6930 // Support: IE 11+, Edge 17 - 18+ 6931 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6932 // two documents; shallow comparisons work. 6933 // eslint-disable-next-line eqeqeq 6934 if (a === document || a.ownerDocument == preferredDoc && find.contains(preferredDoc, a)) { 6935 return -1; 6936 } 6937 6938 // Support: IE 11+, Edge 17 - 18+ 6939 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6940 // two documents; shallow comparisons work. 6941 // eslint-disable-next-line eqeqeq 6942 if (b === document || b.ownerDocument == preferredDoc && find.contains(preferredDoc, b)) { 6943 return 1; 6944 } 6945 6946 // Maintain original order 6947 return sortInput ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) : 0; 6948 } 6949 return compare & 4 ? -1 : 1; 6950 }; 6951 return document; 6952 } 6953 find.matches = function (expr, elements) { 6954 return find(expr, null, null, elements); 6955 }; 6956 find.matchesSelector = function (elem, expr) { 6957 setDocument(elem); 6958 if (documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyQSA || !rbuggyQSA.test(expr))) { 6959 try { 6960 var ret = matches.call(elem, expr); 6961 6962 // IE 9's matchesSelector returns false on disconnected nodes 6963 if (ret || support.disconnectedMatch || 6964 // As well, disconnected nodes are said to be in a document 6965 // fragment in IE 9 6966 elem.document && elem.document.nodeType !== 11) { 6967 return ret; 6968 } 6969 } catch (e) { 6970 nonnativeSelectorCache(expr, true); 6971 } 6972 } 6973 return find(expr, document, null, [elem]).length > 0; 6974 }; 6975 find.contains = function (context, elem) { 6976 // Set document vars if needed 6977 // Support: IE 11+, Edge 17 - 18+ 6978 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6979 // two documents; shallow comparisons work. 6980 // eslint-disable-next-line eqeqeq 6981 if ((context.ownerDocument || context) != document) { 6982 setDocument(context); 6983 } 6984 return jQuery.contains(context, elem); 6985 }; 6986 find.attr = function (elem, name) { 6987 // Set document vars if needed 6988 // Support: IE 11+, Edge 17 - 18+ 6989 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 6990 // two documents; shallow comparisons work. 6991 // eslint-disable-next-line eqeqeq 6992 if ((elem.ownerDocument || elem) != document) { 6993 setDocument(elem); 6994 } 6995 var fn = Expr.attrHandle[name.toLowerCase()], 6996 // Don't get fooled by Object.prototype properties (see trac-13807) 6997 val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined; 6998 if (val !== undefined) { 6999 return val; 7000 } 7001 return elem.getAttribute(name); 7002 }; 7003 find.error = function (msg) { 7004 throw new Error("Syntax error, unrecognized expression: " + msg); 7005 }; 7006 7007 /** 7008 * Document sorting and removing duplicates 7009 * @param {ArrayLike} results 7010 */ 7011 jQuery.uniqueSort = function (results) { 7012 var elem, 7013 duplicates = [], 7014 j = 0, 7015 i = 0; 7016 7017 // Unless we *know* we can detect duplicates, assume their presence 7018 // 7019 // Support: Android <=4.0+ 7020 // Testing for detecting duplicates is unpredictable so instead assume we can't 7021 // depend on duplicate detection in all browsers without a stable sort. 7022 hasDuplicate = !support.sortStable; 7023 sortInput = !support.sortStable && slice.call(results, 0); 7024 sort.call(results, sortOrder); 7025 if (hasDuplicate) { 7026 while (elem = results[i++]) { 7027 if (elem === results[i]) { 7028 j = duplicates.push(i); 7029 } 7030 } 7031 while (j--) { 7032 splice.call(results, duplicates[j], 1); 7033 } 7034 } 7035 7036 // Clear input after sorting to release objects 7037 // See https://github.com/jquery/sizzle/pull/225 7038 sortInput = null; 7039 return results; 7040 }; 7041 jQuery.fn.uniqueSort = function () { 7042 return this.pushStack(jQuery.uniqueSort(slice.apply(this))); 7043 }; 7044 Expr = jQuery.expr = { 7045 // Can be adjusted by the user 7046 cacheLength: 50, 7047 createPseudo: markFunction, 7048 match: matchExpr, 7049 attrHandle: {}, 7050 find: {}, 7051 relative: { 7052 ">": { 7053 dir: "parentNode", 7054 first: true 7055 }, 7056 " ": { 7057 dir: "parentNode" 7058 }, 7059 "+": { 7060 dir: "previousSibling", 7061 first: true 7062 }, 7063 "~": { 7064 dir: "previousSibling" 7065 } 7066 }, 7067 preFilter: { 7068 ATTR: function (match) { 7069 match[1] = match[1].replace(runescape, funescape); 7070 7071 // Move the given value to match[3] whether quoted or unquoted 7072 match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); 7073 if (match[2] === "~=") { 7074 match[3] = " " + match[3] + " "; 7075 } 7076 return match.slice(0, 4); 7077 }, 7078 CHILD: function (match) { 7079 /* matches from matchExpr["CHILD"] 7080 1 type (only|nth|...) 7081 2 what (child|of-type) 7082 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 7083 4 xn-component of xn+y argument ([+-]?\d*n|) 7084 5 sign of xn-component 7085 6 x of xn-component 7086 7 sign of y-component 7087 8 y of y-component 7088 */ 7089 match[1] = match[1].toLowerCase(); 7090 if (match[1].slice(0, 3) === "nth") { 7091 // nth-* requires argument 7092 if (!match[3]) { 7093 find.error(match[0]); 7094 } 7095 7096 // numeric x and y parameters for Expr.filter.CHILD 7097 // remember that false/true cast respectively to 0/1 7098 match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); 7099 match[5] = +(match[7] + match[8] || match[3] === "odd"); 7100 7101 // other types prohibit arguments 7102 } else if (match[3]) { 7103 find.error(match[0]); 7104 } 7105 return match; 7106 }, 7107 PSEUDO: function (match) { 7108 var excess, 7109 unquoted = !match[6] && match[2]; 7110 if (matchExpr.CHILD.test(match[0])) { 7111 return null; 7112 } 7113 7114 // Accept quoted arguments as-is 7115 if (match[3]) { 7116 match[2] = match[4] || match[5] || ""; 7117 7118 // Strip excess characters from unquoted arguments 7119 } else if (unquoted && rpseudo.test(unquoted) && ( 7120 // Get excess from tokenize (recursively) 7121 excess = tokenize(unquoted, true)) && ( 7122 // advance to the next closing parenthesis 7123 excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { 7124 // excess is a negative index 7125 match[0] = match[0].slice(0, excess); 7126 match[2] = unquoted.slice(0, excess); 7127 } 7128 7129 // Return only captures needed by the pseudo filter method (type and argument) 7130 return match.slice(0, 3); 7131 } 7132 }, 7133 filter: { 7134 TAG: function (nodeNameSelector) { 7135 var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); 7136 return nodeNameSelector === "*" ? function () { 7137 return true; 7138 } : function (elem) { 7139 return nodeName(elem, expectedNodeName); 7140 }; 7141 }, 7142 CLASS: function (className) { 7143 var pattern = classCache[className + " "]; 7144 return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) { 7145 return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); 7146 }); 7147 }, 7148 ATTR: function (name, operator, check) { 7149 return function (elem) { 7150 var result = find.attr(elem, name); 7151 if (result == null) { 7152 return operator === "!="; 7153 } 7154 if (!operator) { 7155 return true; 7156 } 7157 result += ""; 7158 if (operator === "=") { 7159 return result === check; 7160 } 7161 if (operator === "!=") { 7162 return result !== check; 7163 } 7164 if (operator === "^=") { 7165 return check && result.indexOf(check) === 0; 7166 } 7167 if (operator === "*=") { 7168 return check && result.indexOf(check) > -1; 7169 } 7170 if (operator === "$=") { 7171 return check && result.slice(-check.length) === check; 7172 } 7173 if (operator === "~=") { 7174 return (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1; 7175 } 7176 if (operator === "|=") { 7177 return result === check || result.slice(0, check.length + 1) === check + "-"; 7178 } 7179 return false; 7180 }; 7181 }, 7182 CHILD: function (type, what, _argument, first, last) { 7183 var simple = type.slice(0, 3) !== "nth", 7184 forward = type.slice(-4) !== "last", 7185 ofType = what === "of-type"; 7186 return first === 1 && last === 0 ? 7187 // Shortcut for :nth-*(n) 7188 function (elem) { 7189 return !!elem.parentNode; 7190 } : function (elem, _context, xml) { 7191 var cache, 7192 outerCache, 7193 node, 7194 nodeIndex, 7195 start, 7196 dir = simple !== forward ? "nextSibling" : "previousSibling", 7197 parent = elem.parentNode, 7198 name = ofType && elem.nodeName.toLowerCase(), 7199 useCache = !xml && !ofType, 7200 diff = false; 7201 if (parent) { 7202 // :(first|last|only)-(child|of-type) 7203 if (simple) { 7204 while (dir) { 7205 node = elem; 7206 while (node = node[dir]) { 7207 if (ofType ? nodeName(node, name) : node.nodeType === 1) { 7208 return false; 7209 } 7210 } 7211 7212 // Reverse direction for :only-* (if we haven't yet done so) 7213 start = dir = type === "only" && !start && "nextSibling"; 7214 } 7215 return true; 7216 } 7217 start = [forward ? parent.firstChild : parent.lastChild]; 7218 7219 // non-xml :nth-child(...) stores cache data on `parent` 7220 if (forward && useCache) { 7221 // Seek `elem` from a previously-cached index 7222 outerCache = parent[expando] || (parent[expando] = {}); 7223 cache = outerCache[type] || []; 7224 nodeIndex = cache[0] === dirruns && cache[1]; 7225 diff = nodeIndex && cache[2]; 7226 node = nodeIndex && parent.childNodes[nodeIndex]; 7227 while (node = ++nodeIndex && node && node[dir] || ( 7228 // Fallback to seeking `elem` from the start 7229 diff = nodeIndex = 0) || start.pop()) { 7230 // When found, cache indexes on `parent` and break 7231 if (node.nodeType === 1 && ++diff && node === elem) { 7232 outerCache[type] = [dirruns, nodeIndex, diff]; 7233 break; 7234 } 7235 } 7236 } else { 7237 // Use previously-cached element index if available 7238 if (useCache) { 7239 outerCache = elem[expando] || (elem[expando] = {}); 7240 cache = outerCache[type] || []; 7241 nodeIndex = cache[0] === dirruns && cache[1]; 7242 diff = nodeIndex; 7243 } 7244 7245 // xml :nth-child(...) 7246 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 7247 if (diff === false) { 7248 // Use the same loop as above to seek `elem` from the start 7249 while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) { 7250 if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) { 7251 // Cache the index of each encountered element 7252 if (useCache) { 7253 outerCache = node[expando] || (node[expando] = {}); 7254 outerCache[type] = [dirruns, diff]; 7255 } 7256 if (node === elem) { 7257 break; 7258 } 7259 } 7260 } 7261 } 7262 } 7263 7264 // Incorporate the offset, then check against cycle size 7265 diff -= last; 7266 return diff === first || diff % first === 0 && diff / first >= 0; 7267 } 7268 }; 7269 }, 7270 PSEUDO: function (pseudo, argument) { 7271 // pseudo-class names are case-insensitive 7272 // https://www.w3.org/TR/selectors/#pseudo-classes 7273 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 7274 // Remember that setFilters inherits from pseudos 7275 var args, 7276 fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find.error("unsupported pseudo: " + pseudo); 7277 7278 // The user may use createPseudo to indicate that 7279 // arguments are needed to create the filter function 7280 // just as jQuery does 7281 if (fn[expando]) { 7282 return fn(argument); 7283 } 7284 7285 // But maintain support for old signatures 7286 if (fn.length > 1) { 7287 args = [pseudo, pseudo, "", argument]; 7288 return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) { 7289 var idx, 7290 matched = fn(seed, argument), 7291 i = matched.length; 7292 while (i--) { 7293 idx = indexOf.call(seed, matched[i]); 7294 seed[idx] = !(matches[idx] = matched[i]); 7295 } 7296 }) : function (elem) { 7297 return fn(elem, 0, args); 7298 }; 7299 } 7300 return fn; 7301 } 7302 }, 7303 pseudos: { 7304 // Potentially complex pseudos 7305 not: markFunction(function (selector) { 7306 // Trim the selector passed to compile 7307 // to avoid treating leading and trailing 7308 // spaces as combinators 7309 var input = [], 7310 results = [], 7311 matcher = compile(selector.replace(rtrimCSS, "$1")); 7312 return matcher[expando] ? markFunction(function (seed, matches, _context, xml) { 7313 var elem, 7314 unmatched = matcher(seed, null, xml, []), 7315 i = seed.length; 7316 7317 // Match elements unmatched by `matcher` 7318 while (i--) { 7319 if (elem = unmatched[i]) { 7320 seed[i] = !(matches[i] = elem); 7321 } 7322 } 7323 }) : function (elem, _context, xml) { 7324 input[0] = elem; 7325 matcher(input, null, xml, results); 7326 7327 // Don't keep the element 7328 // (see https://github.com/jquery/sizzle/issues/299) 7329 input[0] = null; 7330 return !results.pop(); 7331 }; 7332 }), 7333 has: markFunction(function (selector) { 7334 return function (elem) { 7335 return find(selector, elem).length > 0; 7336 }; 7337 }), 7338 contains: markFunction(function (text) { 7339 text = text.replace(runescape, funescape); 7340 return function (elem) { 7341 return (elem.textContent || jQuery.text(elem)).indexOf(text) > -1; 7342 }; 7343 }), 7344 // "Whether an element is represented by a :lang() selector 7345 // is based solely on the element's language value 7346 // being equal to the identifier C, 7347 // or beginning with the identifier C immediately followed by "-". 7348 // The matching of C against the element's language value is performed case-insensitively. 7349 // The identifier C does not have to be a valid language name." 7350 // https://www.w3.org/TR/selectors/#lang-pseudo 7351 lang: markFunction(function (lang) { 7352 // lang value must be a valid identifier 7353 if (!ridentifier.test(lang || "")) { 7354 find.error("unsupported lang: " + lang); 7355 } 7356 lang = lang.replace(runescape, funescape).toLowerCase(); 7357 return function (elem) { 7358 var elemLang; 7359 do { 7360 if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) { 7361 elemLang = elemLang.toLowerCase(); 7362 return elemLang === lang || elemLang.indexOf(lang + "-") === 0; 7363 } 7364 } while ((elem = elem.parentNode) && elem.nodeType === 1); 7365 return false; 7366 }; 7367 }), 7368 // Miscellaneous 7369 target: function (elem) { 7370 var hash = window.location && window.location.hash; 7371 return hash && hash.slice(1) === elem.id; 7372 }, 7373 root: function (elem) { 7374 return elem === documentElement; 7375 }, 7376 focus: function (elem) { 7377 return elem === safeActiveElement() && document.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex); 7378 }, 7379 // Boolean properties 7380 enabled: createDisabledPseudo(false), 7381 disabled: createDisabledPseudo(true), 7382 checked: function (elem) { 7383 // In CSS3, :checked should return both checked and selected elements 7384 // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 7385 return nodeName(elem, "input") && !!elem.checked || nodeName(elem, "option") && !!elem.selected; 7386 }, 7387 selected: function (elem) { 7388 // Support: IE <=11+ 7389 // Accessing the selectedIndex property 7390 // forces the browser to treat the default option as 7391 // selected when in an optgroup. 7392 if (elem.parentNode) { 7393 // eslint-disable-next-line no-unused-expressions 7394 elem.parentNode.selectedIndex; 7395 } 7396 return elem.selected === true; 7397 }, 7398 // Contents 7399 empty: function (elem) { 7400 // https://www.w3.org/TR/selectors/#empty-pseudo 7401 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 7402 // but not by others (comment: 8; processing instruction: 7; etc.) 7403 // nodeType < 6 works because attributes (2) do not appear as children 7404 for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 7405 if (elem.nodeType < 6) { 7406 return false; 7407 } 7408 } 7409 return true; 7410 }, 7411 parent: function (elem) { 7412 return !Expr.pseudos.empty(elem); 7413 }, 7414 // Element/input types 7415 header: function (elem) { 7416 return rheader.test(elem.nodeName); 7417 }, 7418 input: function (elem) { 7419 return rinputs.test(elem.nodeName); 7420 }, 7421 button: function (elem) { 7422 return nodeName(elem, "input") && elem.type === "button" || nodeName(elem, "button"); 7423 }, 7424 text: function (elem) { 7425 var attr; 7426 return nodeName(elem, "input") && elem.type === "text" && ( 7427 // Support: IE <10 only 7428 // New HTML5 attribute values (e.g., "search") appear 7429 // with elem.type === "text" 7430 (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); 7431 }, 7432 // Position-in-collection 7433 first: createPositionalPseudo(function () { 7434 return [0]; 7435 }), 7436 last: createPositionalPseudo(function (_matchIndexes, length) { 7437 return [length - 1]; 7438 }), 7439 eq: createPositionalPseudo(function (_matchIndexes, length, argument) { 7440 return [argument < 0 ? argument + length : argument]; 7441 }), 7442 even: createPositionalPseudo(function (matchIndexes, length) { 7443 var i = 0; 7444 for (; i < length; i += 2) { 7445 matchIndexes.push(i); 7446 } 7447 return matchIndexes; 7448 }), 7449 odd: createPositionalPseudo(function (matchIndexes, length) { 7450 var i = 1; 7451 for (; i < length; i += 2) { 7452 matchIndexes.push(i); 7453 } 7454 return matchIndexes; 7455 }), 7456 lt: createPositionalPseudo(function (matchIndexes, length, argument) { 7457 var i; 7458 if (argument < 0) { 7459 i = argument + length; 7460 } else if (argument > length) { 7461 i = length; 7462 } else { 7463 i = argument; 7464 } 7465 for (; --i >= 0;) { 7466 matchIndexes.push(i); 7467 } 7468 return matchIndexes; 7469 }), 7470 gt: createPositionalPseudo(function (matchIndexes, length, argument) { 7471 var i = argument < 0 ? argument + length : argument; 7472 for (; ++i < length;) { 7473 matchIndexes.push(i); 7474 } 7475 return matchIndexes; 7476 }) 7477 } 7478 }; 7479 Expr.pseudos.nth = Expr.pseudos.eq; 7480 7481 // Add button/input type pseudos 7482 for (i in { 7483 radio: true, 7484 checkbox: true, 7485 file: true, 7486 password: true, 7487 image: true 7488 }) { 7489 Expr.pseudos[i] = createInputPseudo(i); 7490 } 7491 for (i in { 7492 submit: true, 7493 reset: true 7494 }) { 7495 Expr.pseudos[i] = createButtonPseudo(i); 7496 } 7497 7498 // Easy API for creating new setFilters 7499 function setFilters() {} 7500 setFilters.prototype = Expr.filters = Expr.pseudos; 7501 Expr.setFilters = new setFilters(); 7502 function tokenize(selector, parseOnly) { 7503 var matched, 7504 match, 7505 tokens, 7506 type, 7507 soFar, 7508 groups, 7509 preFilters, 7510 cached = tokenCache[selector + " "]; 7511 if (cached) { 7512 return parseOnly ? 0 : cached.slice(0); 7513 } 7514 soFar = selector; 7515 groups = []; 7516 preFilters = Expr.preFilter; 7517 while (soFar) { 7518 // Comma and first run 7519 if (!matched || (match = rcomma.exec(soFar))) { 7520 if (match) { 7521 // Don't consume trailing commas as valid 7522 soFar = soFar.slice(match[0].length) || soFar; 7523 } 7524 groups.push(tokens = []); 7525 } 7526 matched = false; 7527 7528 // Combinators 7529 if (match = rleadingCombinator.exec(soFar)) { 7530 matched = match.shift(); 7531 tokens.push({ 7532 value: matched, 7533 // Cast descendant combinators to space 7534 type: match[0].replace(rtrimCSS, " ") 7535 }); 7536 soFar = soFar.slice(matched.length); 7537 } 7538 7539 // Filters 7540 for (type in Expr.filter) { 7541 if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) { 7542 matched = match.shift(); 7543 tokens.push({ 7544 value: matched, 7545 type: type, 7546 matches: match 7547 }); 7548 soFar = soFar.slice(matched.length); 7549 } 7550 } 7551 if (!matched) { 7552 break; 7553 } 7554 } 7555 7556 // Return the length of the invalid excess 7557 // if we're just parsing 7558 // Otherwise, throw an error or return tokens 7559 if (parseOnly) { 7560 return soFar.length; 7561 } 7562 return soFar ? find.error(selector) : 7563 // Cache the tokens 7564 tokenCache(selector, groups).slice(0); 7565 } 7566 function toSelector(tokens) { 7567 var i = 0, 7568 len = tokens.length, 7569 selector = ""; 7570 for (; i < len; i++) { 7571 selector += tokens[i].value; 7572 } 7573 return selector; 7574 } 7575 function addCombinator(matcher, combinator, base) { 7576 var dir = combinator.dir, 7577 skip = combinator.next, 7578 key = skip || dir, 7579 checkNonElements = base && key === "parentNode", 7580 doneName = done++; 7581 return combinator.first ? 7582 // Check against closest ancestor/preceding element 7583 function (elem, context, xml) { 7584 while (elem = elem[dir]) { 7585 if (elem.nodeType === 1 || checkNonElements) { 7586 return matcher(elem, context, xml); 7587 } 7588 } 7589 return false; 7590 } : 7591 // Check against all ancestor/preceding elements 7592 function (elem, context, xml) { 7593 var oldCache, 7594 outerCache, 7595 newCache = [dirruns, doneName]; 7596 7597 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 7598 if (xml) { 7599 while (elem = elem[dir]) { 7600 if (elem.nodeType === 1 || checkNonElements) { 7601 if (matcher(elem, context, xml)) { 7602 return true; 7603 } 7604 } 7605 } 7606 } else { 7607 while (elem = elem[dir]) { 7608 if (elem.nodeType === 1 || checkNonElements) { 7609 outerCache = elem[expando] || (elem[expando] = {}); 7610 if (skip && nodeName(elem, skip)) { 7611 elem = elem[dir] || elem; 7612 } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) { 7613 // Assign to newCache so results back-propagate to previous elements 7614 return newCache[2] = oldCache[2]; 7615 } else { 7616 // Reuse newcache so results back-propagate to previous elements 7617 outerCache[key] = newCache; 7618 7619 // A match means we're done; a fail means we have to keep checking 7620 if (newCache[2] = matcher(elem, context, xml)) { 7621 return true; 7622 } 7623 } 7624 } 7625 } 7626 } 7627 return false; 7628 }; 7629 } 7630 function elementMatcher(matchers) { 7631 return matchers.length > 1 ? function (elem, context, xml) { 7632 var i = matchers.length; 7633 while (i--) { 7634 if (!matchers[i](elem, context, xml)) { 7635 return false; 7636 } 7637 } 7638 return true; 7639 } : matchers[0]; 7640 } 7641 function multipleContexts(selector, contexts, results) { 7642 var i = 0, 7643 len = contexts.length; 7644 for (; i < len; i++) { 7645 find(selector, contexts[i], results); 7646 } 7647 return results; 7648 } 7649 function condense(unmatched, map, filter, context, xml) { 7650 var elem, 7651 newUnmatched = [], 7652 i = 0, 7653 len = unmatched.length, 7654 mapped = map != null; 7655 for (; i < len; i++) { 7656 if (elem = unmatched[i]) { 7657 if (!filter || filter(elem, context, xml)) { 7658 newUnmatched.push(elem); 7659 if (mapped) { 7660 map.push(i); 7661 } 7662 } 7663 } 7664 } 7665 return newUnmatched; 7666 } 7667 function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { 7668 if (postFilter && !postFilter[expando]) { 7669 postFilter = setMatcher(postFilter); 7670 } 7671 if (postFinder && !postFinder[expando]) { 7672 postFinder = setMatcher(postFinder, postSelector); 7673 } 7674 return markFunction(function (seed, results, context, xml) { 7675 var temp, 7676 i, 7677 elem, 7678 matcherOut, 7679 preMap = [], 7680 postMap = [], 7681 preexisting = results.length, 7682 // Get initial elements from seed or context 7683 elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), 7684 // Prefilter to get matcher input, preserving a map for seed-results synchronization 7685 matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems; 7686 if (matcher) { 7687 // If we have a postFinder, or filtered seed, or non-seed postFilter 7688 // or preexisting results, 7689 matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ? 7690 // ...intermediate processing is necessary 7691 [] : 7692 // ...otherwise use results directly 7693 results; 7694 7695 // Find primary matches 7696 matcher(matcherIn, matcherOut, context, xml); 7697 } else { 7698 matcherOut = matcherIn; 7699 } 7700 7701 // Apply postFilter 7702 if (postFilter) { 7703 temp = condense(matcherOut, postMap); 7704 postFilter(temp, [], context, xml); 7705 7706 // Un-match failing elements by moving them back to matcherIn 7707 i = temp.length; 7708 while (i--) { 7709 if (elem = temp[i]) { 7710 matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); 7711 } 7712 } 7713 } 7714 if (seed) { 7715 if (postFinder || preFilter) { 7716 if (postFinder) { 7717 // Get the final matcherOut by condensing this intermediate into postFinder contexts 7718 temp = []; 7719 i = matcherOut.length; 7720 while (i--) { 7721 if (elem = matcherOut[i]) { 7722 // Restore matcherIn since elem is not yet a final match 7723 temp.push(matcherIn[i] = elem); 7724 } 7725 } 7726 postFinder(null, matcherOut = [], temp, xml); 7727 } 7728 7729 // Move matched elements from seed to results to keep them synchronized 7730 i = matcherOut.length; 7731 while (i--) { 7732 if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) { 7733 seed[temp] = !(results[temp] = elem); 7734 } 7735 } 7736 } 7737 7738 // Add elements to results, through postFinder if defined 7739 } else { 7740 matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut); 7741 if (postFinder) { 7742 postFinder(null, results, matcherOut, xml); 7743 } else { 7744 push.apply(results, matcherOut); 7745 } 7746 } 7747 }); 7748 } 7749 function matcherFromTokens(tokens) { 7750 var checkContext, 7751 matcher, 7752 j, 7753 len = tokens.length, 7754 leadingRelative = Expr.relative[tokens[0].type], 7755 implicitRelative = leadingRelative || Expr.relative[" "], 7756 i = leadingRelative ? 1 : 0, 7757 // The foundational matcher ensures that elements are reachable from top-level context(s) 7758 matchContext = addCombinator(function (elem) { 7759 return elem === checkContext; 7760 }, implicitRelative, true), 7761 matchAnyContext = addCombinator(function (elem) { 7762 return indexOf.call(checkContext, elem) > -1; 7763 }, implicitRelative, true), 7764 matchers = [function (elem, context, xml) { 7765 // Support: IE 11+, Edge 17 - 18+ 7766 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7767 // two documents; shallow comparisons work. 7768 // eslint-disable-next-line eqeqeq 7769 var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); 7770 7771 // Avoid hanging onto element 7772 // (see https://github.com/jquery/sizzle/issues/299) 7773 checkContext = null; 7774 return ret; 7775 }]; 7776 for (; i < len; i++) { 7777 if (matcher = Expr.relative[tokens[i].type]) { 7778 matchers = [addCombinator(elementMatcher(matchers), matcher)]; 7779 } else { 7780 matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); 7781 7782 // Return special upon seeing a positional matcher 7783 if (matcher[expando]) { 7784 // Find the next relative operator (if any) for proper handling 7785 j = ++i; 7786 for (; j < len; j++) { 7787 if (Expr.relative[tokens[j].type]) { 7788 break; 7789 } 7790 } 7791 return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector( 7792 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 7793 tokens.slice(0, i - 1).concat({ 7794 value: tokens[i - 2].type === " " ? "*" : "" 7795 })).replace(rtrimCSS, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens)); 7796 } 7797 matchers.push(matcher); 7798 } 7799 } 7800 return elementMatcher(matchers); 7801 } 7802 function matcherFromGroupMatchers(elementMatchers, setMatchers) { 7803 var bySet = setMatchers.length > 0, 7804 byElement = elementMatchers.length > 0, 7805 superMatcher = function (seed, context, xml, results, outermost) { 7806 var elem, 7807 j, 7808 matcher, 7809 matchedCount = 0, 7810 i = "0", 7811 unmatched = seed && [], 7812 setMatched = [], 7813 contextBackup = outermostContext, 7814 // We must always have either seed elements or outermost context 7815 elems = seed || byElement && Expr.find.TAG("*", outermost), 7816 // Use integer dirruns iff this is the outermost matcher 7817 dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, 7818 len = elems.length; 7819 if (outermost) { 7820 // Support: IE 11+, Edge 17 - 18+ 7821 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7822 // two documents; shallow comparisons work. 7823 // eslint-disable-next-line eqeqeq 7824 outermostContext = context == document || context || outermost; 7825 } 7826 7827 // Add elements passing elementMatchers directly to results 7828 // Support: iOS <=7 - 9 only 7829 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching 7830 // elements by id. (see trac-14142) 7831 for (; i !== len && (elem = elems[i]) != null; i++) { 7832 if (byElement && elem) { 7833 j = 0; 7834 7835 // Support: IE 11+, Edge 17 - 18+ 7836 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7837 // two documents; shallow comparisons work. 7838 // eslint-disable-next-line eqeqeq 7839 if (!context && elem.ownerDocument != document) { 7840 setDocument(elem); 7841 xml = !documentIsHTML; 7842 } 7843 while (matcher = elementMatchers[j++]) { 7844 if (matcher(elem, context || document, xml)) { 7845 push.call(results, elem); 7846 break; 7847 } 7848 } 7849 if (outermost) { 7850 dirruns = dirrunsUnique; 7851 } 7852 } 7853 7854 // Track unmatched elements for set filters 7855 if (bySet) { 7856 // They will have gone through all possible matchers 7857 if (elem = !matcher && elem) { 7858 matchedCount--; 7859 } 7860 7861 // Lengthen the array for every element, matched or not 7862 if (seed) { 7863 unmatched.push(elem); 7864 } 7865 } 7866 } 7867 7868 // `i` is now the count of elements visited above, and adding it to `matchedCount` 7869 // makes the latter nonnegative. 7870 matchedCount += i; 7871 7872 // Apply set filters to unmatched elements 7873 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 7874 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 7875 // no element matchers and no seed. 7876 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 7877 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 7878 // numerically zero. 7879 if (bySet && i !== matchedCount) { 7880 j = 0; 7881 while (matcher = setMatchers[j++]) { 7882 matcher(unmatched, setMatched, context, xml); 7883 } 7884 if (seed) { 7885 // Reintegrate element matches to eliminate the need for sorting 7886 if (matchedCount > 0) { 7887 while (i--) { 7888 if (!(unmatched[i] || setMatched[i])) { 7889 setMatched[i] = pop.call(results); 7890 } 7891 } 7892 } 7893 7894 // Discard index placeholder values to get only actual matches 7895 setMatched = condense(setMatched); 7896 } 7897 7898 // Add matches to results 7899 push.apply(results, setMatched); 7900 7901 // Seedless set matches succeeding multiple successful matchers stipulate sorting 7902 if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) { 7903 jQuery.uniqueSort(results); 7904 } 7905 } 7906 7907 // Override manipulation of globals by nested matchers 7908 if (outermost) { 7909 dirruns = dirrunsUnique; 7910 outermostContext = contextBackup; 7911 } 7912 return unmatched; 7913 }; 7914 return bySet ? markFunction(superMatcher) : superMatcher; 7915 } 7916 function compile(selector, match /* Internal Use Only */) { 7917 var i, 7918 setMatchers = [], 7919 elementMatchers = [], 7920 cached = compilerCache[selector + " "]; 7921 if (!cached) { 7922 // Generate a function of recursive functions that can be used to check each element 7923 if (!match) { 7924 match = tokenize(selector); 7925 } 7926 i = match.length; 7927 while (i--) { 7928 cached = matcherFromTokens(match[i]); 7929 if (cached[expando]) { 7930 setMatchers.push(cached); 7931 } else { 7932 elementMatchers.push(cached); 7933 } 7934 } 7935 7936 // Cache the compiled function 7937 cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); 7938 7939 // Save selector and tokenization 7940 cached.selector = selector; 7941 } 7942 return cached; 7943 } 7944 7945 /** 7946 * A low-level selection function that works with jQuery's compiled 7947 * selector functions 7948 * @param {String|Function} selector A selector or a pre-compiled 7949 * selector function built with jQuery selector compile 7950 * @param {Element} context 7951 * @param {Array} [results] 7952 * @param {Array} [seed] A set of elements to match against 7953 */ 7954 function select(selector, context, results, seed) { 7955 var i, 7956 tokens, 7957 token, 7958 type, 7959 find, 7960 compiled = typeof selector === "function" && selector, 7961 match = !seed && tokenize(selector = compiled.selector || selector); 7962 results = results || []; 7963 7964 // Try to minimize operations if there is only one selector in the list and no seed 7965 // (the latter of which guarantees us context) 7966 if (match.length === 1) { 7967 // Reduce context if the leading compound selector is an ID 7968 tokens = match[0] = match[0].slice(0); 7969 if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) { 7970 context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0]; 7971 if (!context) { 7972 return results; 7973 7974 // Precompiled matchers will still verify ancestry, so step up a level 7975 } else if (compiled) { 7976 context = context.parentNode; 7977 } 7978 selector = selector.slice(tokens.shift().value.length); 7979 } 7980 7981 // Fetch a seed set for right-to-left matching 7982 i = matchExpr.needsContext.test(selector) ? 0 : tokens.length; 7983 while (i--) { 7984 token = tokens[i]; 7985 7986 // Abort if we hit a combinator 7987 if (Expr.relative[type = token.type]) { 7988 break; 7989 } 7990 if (find = Expr.find[type]) { 7991 // Search, expanding context for leading sibling combinators 7992 if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) { 7993 // If seed is empty or no tokens remain, we can return early 7994 tokens.splice(i, 1); 7995 selector = seed.length && toSelector(tokens); 7996 if (!selector) { 7997 push.apply(results, seed); 7998 return results; 7999 } 8000 break; 8001 } 8002 } 8003 } 8004 } 8005 8006 // Compile and execute a filtering function if one is not provided 8007 // Provide `match` to avoid retokenization if we modified the selector above 8008 (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context); 8009 return results; 8010 } 8011 8012 // One-time assignments 8013 8014 // Support: Android <=4.0 - 4.1+ 8015 // Sort stability 8016 support.sortStable = expando.split("").sort(sortOrder).join("") === expando; 8017 8018 // Initialize against the default document 8019 setDocument(); 8020 8021 // Support: Android <=4.0 - 4.1+ 8022 // Detached nodes confoundingly follow *each other* 8023 support.sortDetached = assert(function (el) { 8024 // Should return 1, but returns 4 (following) 8025 return el.compareDocumentPosition(document.createElement("fieldset")) & 1; 8026 }); 8027 jQuery.find = find; 8028 8029 // Deprecated 8030 jQuery.expr[":"] = jQuery.expr.pseudos; 8031 jQuery.unique = jQuery.uniqueSort; 8032 8033 // These have always been private, but they used to be documented as part of 8034 // Sizzle so let's maintain them for now for backwards compatibility purposes. 8035 find.compile = compile; 8036 find.select = select; 8037 find.setDocument = setDocument; 8038 find.tokenize = tokenize; 8039 find.escape = jQuery.escapeSelector; 8040 find.getText = jQuery.text; 8041 find.isXML = jQuery.isXMLDoc; 8042 find.selectors = jQuery.expr; 8043 find.support = jQuery.support; 8044 find.uniqueSort = jQuery.uniqueSort; 8045 8046 /* eslint-enable */ 8047 })(); 8048 var dir = function (elem, dir, until) { 8049 var matched = [], 8050 truncate = until !== undefined; 8051 while ((elem = elem[dir]) && elem.nodeType !== 9) { 8052 if (elem.nodeType === 1) { 8053 if (truncate && jQuery(elem).is(until)) { 8054 break; 8055 } 8056 matched.push(elem); 8057 } 8058 } 8059 return matched; 8060 }; 8061 var siblings = function (n, elem) { 8062 var matched = []; 8063 for (; n; n = n.nextSibling) { 8064 if (n.nodeType === 1 && n !== elem) { 8065 matched.push(n); 8066 } 8067 } 8068 return matched; 8069 }; 8070 var rneedsContext = jQuery.expr.match.needsContext; 8071 var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; 8072 8073 // Implement the identical functionality for filter and not 8074 function winnow(elements, qualifier, not) { 8075 if (isFunction(qualifier)) { 8076 return jQuery.grep(elements, function (elem, i) { 8077 return !!qualifier.call(elem, i, elem) !== not; 8078 }); 8079 } 8080 8081 // Single element 8082 if (qualifier.nodeType) { 8083 return jQuery.grep(elements, function (elem) { 8084 return elem === qualifier !== not; 8085 }); 8086 } 8087 8088 // Arraylike of elements (jQuery, arguments, Array) 8089 if (typeof qualifier !== "string") { 8090 return jQuery.grep(elements, function (elem) { 8091 return indexOf.call(qualifier, elem) > -1 !== not; 8092 }); 8093 } 8094 8095 // Filtered directly for both simple and complex selectors 8096 return jQuery.filter(qualifier, elements, not); 8097 } 8098 jQuery.filter = function (expr, elems, not) { 8099 var elem = elems[0]; 8100 if (not) { 8101 expr = ":not(" + expr + ")"; 8102 } 8103 if (elems.length === 1 && elem.nodeType === 1) { 8104 return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; 8105 } 8106 return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { 8107 return elem.nodeType === 1; 8108 })); 8109 }; 8110 jQuery.fn.extend({ 8111 find: function (selector) { 8112 var i, 8113 ret, 8114 len = this.length, 8115 self = this; 8116 if (typeof selector !== "string") { 8117 return this.pushStack(jQuery(selector).filter(function () { 8118 for (i = 0; i < len; i++) { 8119 if (jQuery.contains(self[i], this)) { 8120 return true; 8121 } 8122 } 8123 })); 8124 } 8125 ret = this.pushStack([]); 8126 for (i = 0; i < len; i++) { 8127 jQuery.find(selector, self[i], ret); 8128 } 8129 return len > 1 ? jQuery.uniqueSort(ret) : ret; 8130 }, 8131 filter: function (selector) { 8132 return this.pushStack(winnow(this, selector || [], false)); 8133 }, 8134 not: function (selector) { 8135 return this.pushStack(winnow(this, selector || [], true)); 8136 }, 8137 is: function (selector) { 8138 return !!winnow(this, 8139 // If this is a positional/relative selector, check membership in the returned set 8140 // so $("p:first").is("p:last") won't return true for a doc with two "p". 8141 typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length; 8142 } 8143 }); 8144 8145 // Initialize a jQuery object 8146 8147 // A central reference to the root jQuery(document) 8148 var rootjQuery, 8149 // A simple way to check for HTML strings 8150 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) 8151 // Strict HTML recognition (trac-11290: must start with <) 8152 // Shortcut simple #id case for speed 8153 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 8154 init = jQuery.fn.init = function (selector, context, root) { 8155 var match, elem; 8156 8157 // HANDLE: $(""), $(null), $(undefined), $(false) 8158 if (!selector) { 8159 return this; 8160 } 8161 8162 // Method init() accepts an alternate rootjQuery 8163 // so migrate can support jQuery.sub (gh-2101) 8164 root = root || rootjQuery; 8165 8166 // Handle HTML strings 8167 if (typeof selector === "string") { 8168 if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) { 8169 // Assume that strings that start and end with <> are HTML and skip the regex check 8170 match = [null, selector, null]; 8171 } else { 8172 match = rquickExpr.exec(selector); 8173 } 8174 8175 // Match html or make sure no context is specified for #id 8176 if (match && (match[1] || !context)) { 8177 // HANDLE: $(html) -> $(array) 8178 if (match[1]) { 8179 context = context instanceof jQuery ? context[0] : context; 8180 8181 // Option to run scripts is true for back-compat 8182 // Intentionally let the error be thrown if parseHTML is not present 8183 jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true)); 8184 8185 // HANDLE: $(html, props) 8186 if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { 8187 for (match in context) { 8188 // Properties of context are called as methods if possible 8189 if (isFunction(this[match])) { 8190 this[match](context[match]); 8191 8192 // ...and otherwise set as attributes 8193 } else { 8194 this.attr(match, context[match]); 8195 } 8196 } 8197 } 8198 return this; 8199 8200 // HANDLE: $(#id) 8201 } else { 8202 elem = document.getElementById(match[2]); 8203 if (elem) { 8204 // Inject the element directly into the jQuery object 8205 this[0] = elem; 8206 this.length = 1; 8207 } 8208 return this; 8209 } 8210 8211 // HANDLE: $(expr, $(...)) 8212 } else if (!context || context.jquery) { 8213 return (context || root).find(selector); 8214 8215 // HANDLE: $(expr, context) 8216 // (which is just equivalent to: $(context).find(expr) 8217 } else { 8218 return this.constructor(context).find(selector); 8219 } 8220 8221 // HANDLE: $(DOMElement) 8222 } else if (selector.nodeType) { 8223 this[0] = selector; 8224 this.length = 1; 8225 return this; 8226 8227 // HANDLE: $(function) 8228 // Shortcut for document ready 8229 } else if (isFunction(selector)) { 8230 return root.ready !== undefined ? root.ready(selector) : 8231 // Execute immediately if ready is not present 8232 selector(jQuery); 8233 } 8234 return jQuery.makeArray(selector, this); 8235 }; 8236 8237 // Give the init function the jQuery prototype for later instantiation 8238 init.prototype = jQuery.fn; 8239 8240 // Initialize central reference 8241 rootjQuery = jQuery(document); 8242 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 8243 // Methods guaranteed to produce a unique set when starting from a unique set 8244 guaranteedUnique = { 8245 children: true, 8246 contents: true, 8247 next: true, 8248 prev: true 8249 }; 8250 jQuery.fn.extend({ 8251 has: function (target) { 8252 var targets = jQuery(target, this), 8253 l = targets.length; 8254 return this.filter(function () { 8255 var i = 0; 8256 for (; i < l; i++) { 8257 if (jQuery.contains(this, targets[i])) { 8258 return true; 8259 } 8260 } 8261 }); 8262 }, 8263 closest: function (selectors, context) { 8264 var cur, 8265 i = 0, 8266 l = this.length, 8267 matched = [], 8268 targets = typeof selectors !== "string" && jQuery(selectors); 8269 8270 // Positional selectors never match, since there's no _selection_ context 8271 if (!rneedsContext.test(selectors)) { 8272 for (; i < l; i++) { 8273 for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { 8274 // Always skip document fragments 8275 if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : 8276 // Don't pass non-elements to jQuery#find 8277 cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) { 8278 matched.push(cur); 8279 break; 8280 } 8281 } 8282 } 8283 } 8284 return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); 8285 }, 8286 // Determine the position of an element within the set 8287 index: function (elem) { 8288 // No argument, return index in parent 8289 if (!elem) { 8290 return this[0] && this[0].parentNode ? this.first().prevAll().length : -1; 8291 } 8292 8293 // Index in selector 8294 if (typeof elem === "string") { 8295 return indexOf.call(jQuery(elem), this[0]); 8296 } 8297 8298 // Locate the position of the desired element 8299 return indexOf.call(this, 8300 // If it receives a jQuery object, the first element is used 8301 elem.jquery ? elem[0] : elem); 8302 }, 8303 add: function (selector, context) { 8304 return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context)))); 8305 }, 8306 addBack: function (selector) { 8307 return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector)); 8308 } 8309 }); 8310 function sibling(cur, dir) { 8311 while ((cur = cur[dir]) && cur.nodeType !== 1) {} 8312 return cur; 8313 } 8314 jQuery.each({ 8315 parent: function (elem) { 8316 var parent = elem.parentNode; 8317 return parent && parent.nodeType !== 11 ? parent : null; 8318 }, 8319 parents: function (elem) { 8320 return dir(elem, "parentNode"); 8321 }, 8322 parentsUntil: function (elem, _i, until) { 8323 return dir(elem, "parentNode", until); 8324 }, 8325 next: function (elem) { 8326 return sibling(elem, "nextSibling"); 8327 }, 8328 prev: function (elem) { 8329 return sibling(elem, "previousSibling"); 8330 }, 8331 nextAll: function (elem) { 8332 return dir(elem, "nextSibling"); 8333 }, 8334 prevAll: function (elem) { 8335 return dir(elem, "previousSibling"); 8336 }, 8337 nextUntil: function (elem, _i, until) { 8338 return dir(elem, "nextSibling", until); 8339 }, 8340 prevUntil: function (elem, _i, until) { 8341 return dir(elem, "previousSibling", until); 8342 }, 8343 siblings: function (elem) { 8344 return siblings((elem.parentNode || {}).firstChild, elem); 8345 }, 8346 children: function (elem) { 8347 return siblings(elem.firstChild); 8348 }, 8349 contents: function (elem) { 8350 if (elem.contentDocument != null && 8351 // Support: IE 11+ 8352 // <object> elements with no `data` attribute has an object 8353 // `contentDocument` with a `null` prototype. 8354 getProto(elem.contentDocument)) { 8355 return elem.contentDocument; 8356 } 8357 8358 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 8359 // Treat the template element as a regular one in browsers that 8360 // don't support it. 8361 if (nodeName(elem, "template")) { 8362 elem = elem.content || elem; 8363 } 8364 return jQuery.merge([], elem.childNodes); 8365 } 8366 }, function (name, fn) { 8367 jQuery.fn[name] = function (until, selector) { 8368 var matched = jQuery.map(this, fn, until); 8369 if (name.slice(-5) !== "Until") { 8370 selector = until; 8371 } 8372 if (selector && typeof selector === "string") { 8373 matched = jQuery.filter(selector, matched); 8374 } 8375 if (this.length > 1) { 8376 // Remove duplicates 8377 if (!guaranteedUnique[name]) { 8378 jQuery.uniqueSort(matched); 8379 } 8380 8381 // Reverse order for parents* and prev-derivatives 8382 if (rparentsprev.test(name)) { 8383 matched.reverse(); 8384 } 8385 } 8386 return this.pushStack(matched); 8387 }; 8388 }); 8389 var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; 8390 8391 // Convert String-formatted options into Object-formatted ones 8392 function createOptions(options) { 8393 var object = {}; 8394 jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) { 8395 object[flag] = true; 8396 }); 8397 return object; 8398 } 8399 8400 /* 8401 * Create a callback list using the following parameters: 8402 * 8403 * options: an optional list of space-separated options that will change how 8404 * the callback list behaves or a more traditional option object 8405 * 8406 * By default a callback list will act like an event callback list and can be 8407 * "fired" multiple times. 8408 * 8409 * Possible options: 8410 * 8411 * once: will ensure the callback list can only be fired once (like a Deferred) 8412 * 8413 * memory: will keep track of previous values and will call any callback added 8414 * after the list has been fired right away with the latest "memorized" 8415 * values (like a Deferred) 8416 * 8417 * unique: will ensure a callback can only be added once (no duplicate in the list) 8418 * 8419 * stopOnFalse: interrupt callings when a callback returns false 8420 * 8421 */ 8422 jQuery.Callbacks = function (options) { 8423 // Convert options from String-formatted to Object-formatted if needed 8424 // (we check in cache first) 8425 options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options); 8426 var 8427 // Flag to know if list is currently firing 8428 firing, 8429 // Last fire value for non-forgettable lists 8430 memory, 8431 // Flag to know if list was already fired 8432 fired, 8433 // Flag to prevent firing 8434 locked, 8435 // Actual callback list 8436 list = [], 8437 // Queue of execution data for repeatable lists 8438 queue = [], 8439 // Index of currently firing callback (modified by add/remove as needed) 8440 firingIndex = -1, 8441 // Fire callbacks 8442 fire = function () { 8443 // Enforce single-firing 8444 locked = locked || options.once; 8445 8446 // Execute callbacks for all pending executions, 8447 // respecting firingIndex overrides and runtime changes 8448 fired = firing = true; 8449 for (; queue.length; firingIndex = -1) { 8450 memory = queue.shift(); 8451 while (++firingIndex < list.length) { 8452 // Run callback and check for early termination 8453 if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) { 8454 // Jump to end and forget the data so .add doesn't re-fire 8455 firingIndex = list.length; 8456 memory = false; 8457 } 8458 } 8459 } 8460 8461 // Forget the data if we're done with it 8462 if (!options.memory) { 8463 memory = false; 8464 } 8465 firing = false; 8466 8467 // Clean up if we're done firing for good 8468 if (locked) { 8469 // Keep an empty list if we have data for future add calls 8470 if (memory) { 8471 list = []; 8472 8473 // Otherwise, this object is spent 8474 } else { 8475 list = ""; 8476 } 8477 } 8478 }, 8479 // Actual Callbacks object 8480 self = { 8481 // Add a callback or a collection of callbacks to the list 8482 add: function () { 8483 if (list) { 8484 // If we have memory from a past run, we should fire after adding 8485 if (memory && !firing) { 8486 firingIndex = list.length - 1; 8487 queue.push(memory); 8488 } 8489 (function add(args) { 8490 jQuery.each(args, function (_, arg) { 8491 if (isFunction(arg)) { 8492 if (!options.unique || !self.has(arg)) { 8493 list.push(arg); 8494 } 8495 } else if (arg && arg.length && toType(arg) !== "string") { 8496 // Inspect recursively 8497 add(arg); 8498 } 8499 }); 8500 })(arguments); 8501 if (memory && !firing) { 8502 fire(); 8503 } 8504 } 8505 return this; 8506 }, 8507 // Remove a callback from the list 8508 remove: function () { 8509 jQuery.each(arguments, function (_, arg) { 8510 var index; 8511 while ((index = jQuery.inArray(arg, list, index)) > -1) { 8512 list.splice(index, 1); 8513 8514 // Handle firing indexes 8515 if (index <= firingIndex) { 8516 firingIndex--; 8517 } 8518 } 8519 }); 8520 return this; 8521 }, 8522 // Check if a given callback is in the list. 8523 // If no argument is given, return whether or not list has callbacks attached. 8524 has: function (fn) { 8525 return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0; 8526 }, 8527 // Remove all callbacks from the list 8528 empty: function () { 8529 if (list) { 8530 list = []; 8531 } 8532 return this; 8533 }, 8534 // Disable .fire and .add 8535 // Abort any current/pending executions 8536 // Clear all callbacks and values 8537 disable: function () { 8538 locked = queue = []; 8539 list = memory = ""; 8540 return this; 8541 }, 8542 disabled: function () { 8543 return !list; 8544 }, 8545 // Disable .fire 8546 // Also disable .add unless we have memory (since it would have no effect) 8547 // Abort any pending executions 8548 lock: function () { 8549 locked = queue = []; 8550 if (!memory && !firing) { 8551 list = memory = ""; 8552 } 8553 return this; 8554 }, 8555 locked: function () { 8556 return !!locked; 8557 }, 8558 // Call all callbacks with the given context and arguments 8559 fireWith: function (context, args) { 8560 if (!locked) { 8561 args = args || []; 8562 args = [context, args.slice ? args.slice() : args]; 8563 queue.push(args); 8564 if (!firing) { 8565 fire(); 8566 } 8567 } 8568 return this; 8569 }, 8570 // Call all the callbacks with the given arguments 8571 fire: function () { 8572 self.fireWith(this, arguments); 8573 return this; 8574 }, 8575 // To know if the callbacks have already been called at least once 8576 fired: function () { 8577 return !!fired; 8578 } 8579 }; 8580 return self; 8581 }; 8582 function Identity(v) { 8583 return v; 8584 } 8585 function Thrower(ex) { 8586 throw ex; 8587 } 8588 function adoptValue(value, resolve, reject, noValue) { 8589 var method; 8590 try { 8591 // Check for promise aspect first to privilege synchronous behavior 8592 if (value && isFunction(method = value.promise)) { 8593 method.call(value).done(resolve).fail(reject); 8594 8595 // Other thenables 8596 } else if (value && isFunction(method = value.then)) { 8597 method.call(value, resolve, reject); 8598 8599 // Other non-thenables 8600 } else { 8601 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 8602 // * false: [ value ].slice( 0 ) => resolve( value ) 8603 // * true: [ value ].slice( 1 ) => resolve() 8604 resolve.apply(undefined, [value].slice(noValue)); 8605 } 8606 8607 // For Promises/A+, convert exceptions into rejections 8608 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 8609 // Deferred#then to conditionally suppress rejection. 8610 } catch (value) { 8611 // Support: Android 4.0 only 8612 // Strict mode functions invoked without .call/.apply get global-object context 8613 reject.apply(undefined, [value]); 8614 } 8615 } 8616 jQuery.extend({ 8617 Deferred: function (func) { 8618 var tuples = [ 8619 // action, add listener, callbacks, 8620 // ... .then handlers, argument index, [final state] 8621 ["notify", "progress", jQuery.Callbacks("memory"), jQuery.Callbacks("memory"), 2], ["resolve", "done", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 1, "rejected"]], 8622 state = "pending", 8623 promise = { 8624 state: function () { 8625 return state; 8626 }, 8627 always: function () { 8628 deferred.done(arguments).fail(arguments); 8629 return this; 8630 }, 8631 "catch": function (fn) { 8632 return promise.then(null, fn); 8633 }, 8634 // Keep pipe for back-compat 8635 pipe: function /* fnDone, fnFail, fnProgress */ 8636 () { 8637 var fns = arguments; 8638 return jQuery.Deferred(function (newDefer) { 8639 jQuery.each(tuples, function (_i, tuple) { 8640 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 8641 var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]]; 8642 8643 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 8644 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 8645 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 8646 deferred[tuple[1]](function () { 8647 var returned = fn && fn.apply(this, arguments); 8648 if (returned && isFunction(returned.promise)) { 8649 returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); 8650 } else { 8651 newDefer[tuple[0] + "With"](this, fn ? [returned] : arguments); 8652 } 8653 }); 8654 }); 8655 fns = null; 8656 }).promise(); 8657 }, 8658 then: function (onFulfilled, onRejected, onProgress) { 8659 var maxDepth = 0; 8660 function resolve(depth, deferred, handler, special) { 8661 return function () { 8662 var that = this, 8663 args = arguments, 8664 mightThrow = function () { 8665 var returned, then; 8666 8667 // Support: Promises/A+ section 2.3.3.3.3 8668 // https://promisesaplus.com/#point-59 8669 // Ignore double-resolution attempts 8670 if (depth < maxDepth) { 8671 return; 8672 } 8673 returned = handler.apply(that, args); 8674 8675 // Support: Promises/A+ section 2.3.1 8676 // https://promisesaplus.com/#point-48 8677 if (returned === deferred.promise()) { 8678 throw new TypeError("Thenable self-resolution"); 8679 } 8680 8681 // Support: Promises/A+ sections 2.3.3.1, 3.5 8682 // https://promisesaplus.com/#point-54 8683 // https://promisesaplus.com/#point-75 8684 // Retrieve `then` only once 8685 then = returned && ( 8686 // Support: Promises/A+ section 2.3.4 8687 // https://promisesaplus.com/#point-64 8688 // Only check objects and functions for thenability 8689 typeof returned === "object" || typeof returned === "function") && returned.then; 8690 8691 // Handle a returned thenable 8692 if (isFunction(then)) { 8693 // Special processors (notify) just wait for resolution 8694 if (special) { 8695 then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special)); 8696 8697 // Normal processors (resolve) also hook into progress 8698 } else { 8699 // ...and disregard older resolution values 8700 maxDepth++; 8701 then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith)); 8702 } 8703 8704 // Handle all other returned values 8705 } else { 8706 // Only substitute handlers pass on context 8707 // and multiple values (non-spec behavior) 8708 if (handler !== Identity) { 8709 that = undefined; 8710 args = [returned]; 8711 } 8712 8713 // Process the value(s) 8714 // Default process is resolve 8715 (special || deferred.resolveWith)(that, args); 8716 } 8717 }, 8718 // Only normal processors (resolve) catch and reject exceptions 8719 process = special ? mightThrow : function () { 8720 try { 8721 mightThrow(); 8722 } catch (e) { 8723 if (jQuery.Deferred.exceptionHook) { 8724 jQuery.Deferred.exceptionHook(e, process.error); 8725 } 8726 8727 // Support: Promises/A+ section 2.3.3.3.4.1 8728 // https://promisesaplus.com/#point-61 8729 // Ignore post-resolution exceptions 8730 if (depth + 1 >= maxDepth) { 8731 // Only substitute handlers pass on context 8732 // and multiple values (non-spec behavior) 8733 if (handler !== Thrower) { 8734 that = undefined; 8735 args = [e]; 8736 } 8737 deferred.rejectWith(that, args); 8738 } 8739 } 8740 }; 8741 8742 // Support: Promises/A+ section 2.3.3.3.1 8743 // https://promisesaplus.com/#point-57 8744 // Re-resolve promises immediately to dodge false rejection from 8745 // subsequent errors 8746 if (depth) { 8747 process(); 8748 } else { 8749 // Call an optional hook to record the error, in case of exception 8750 // since it's otherwise lost when execution goes async 8751 if (jQuery.Deferred.getErrorHook) { 8752 process.error = jQuery.Deferred.getErrorHook(); 8753 8754 // The deprecated alias of the above. While the name suggests 8755 // returning the stack, not an error instance, jQuery just passes 8756 // it directly to `console.warn` so both will work; an instance 8757 // just better cooperates with source maps. 8758 } else if (jQuery.Deferred.getStackHook) { 8759 process.error = jQuery.Deferred.getStackHook(); 8760 } 8761 window.setTimeout(process); 8762 } 8763 }; 8764 } 8765 return jQuery.Deferred(function (newDefer) { 8766 // progress_handlers.add( ... ) 8767 tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith)); 8768 8769 // fulfilled_handlers.add( ... ) 8770 tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity)); 8771 8772 // rejected_handlers.add( ... ) 8773 tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower)); 8774 }).promise(); 8775 }, 8776 // Get a promise for this deferred 8777 // If obj is provided, the promise aspect is added to the object 8778 promise: function (obj) { 8779 return obj != null ? jQuery.extend(obj, promise) : promise; 8780 } 8781 }, 8782 deferred = {}; 8783 8784 // Add list-specific methods 8785 jQuery.each(tuples, function (i, tuple) { 8786 var list = tuple[2], 8787 stateString = tuple[5]; 8788 8789 // promise.progress = list.add 8790 // promise.done = list.add 8791 // promise.fail = list.add 8792 promise[tuple[1]] = list.add; 8793 8794 // Handle state 8795 if (stateString) { 8796 list.add(function () { 8797 // state = "resolved" (i.e., fulfilled) 8798 // state = "rejected" 8799 state = stateString; 8800 }, 8801 // rejected_callbacks.disable 8802 // fulfilled_callbacks.disable 8803 tuples[3 - i][2].disable, 8804 // rejected_handlers.disable 8805 // fulfilled_handlers.disable 8806 tuples[3 - i][3].disable, 8807 // progress_callbacks.lock 8808 tuples[0][2].lock, 8809 // progress_handlers.lock 8810 tuples[0][3].lock); 8811 } 8812 8813 // progress_handlers.fire 8814 // fulfilled_handlers.fire 8815 // rejected_handlers.fire 8816 list.add(tuple[3].fire); 8817 8818 // deferred.notify = function() { deferred.notifyWith(...) } 8819 // deferred.resolve = function() { deferred.resolveWith(...) } 8820 // deferred.reject = function() { deferred.rejectWith(...) } 8821 deferred[tuple[0]] = function () { 8822 deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments); 8823 return this; 8824 }; 8825 8826 // deferred.notifyWith = list.fireWith 8827 // deferred.resolveWith = list.fireWith 8828 // deferred.rejectWith = list.fireWith 8829 deferred[tuple[0] + "With"] = list.fireWith; 8830 }); 8831 8832 // Make the deferred a promise 8833 promise.promise(deferred); 8834 8835 // Call given func if any 8836 if (func) { 8837 func.call(deferred, deferred); 8838 } 8839 8840 // All done! 8841 return deferred; 8842 }, 8843 // Deferred helper 8844 when: function (singleValue) { 8845 var 8846 // count of uncompleted subordinates 8847 remaining = arguments.length, 8848 // count of unprocessed arguments 8849 i = remaining, 8850 // subordinate fulfillment data 8851 resolveContexts = Array(i), 8852 resolveValues = slice.call(arguments), 8853 // the primary Deferred 8854 primary = jQuery.Deferred(), 8855 // subordinate callback factory 8856 updateFunc = function (i) { 8857 return function (value) { 8858 resolveContexts[i] = this; 8859 resolveValues[i] = arguments.length > 1 ? slice.call(arguments) : value; 8860 if (! --remaining) { 8861 primary.resolveWith(resolveContexts, resolveValues); 8862 } 8863 }; 8864 }; 8865 8866 // Single- and empty arguments are adopted like Promise.resolve 8867 if (remaining <= 1) { 8868 adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining); 8869 8870 // Use .then() to unwrap secondary thenables (cf. gh-3000) 8871 if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) { 8872 return primary.then(); 8873 } 8874 } 8875 8876 // Multiple arguments are aggregated like Promise.all array elements 8877 while (i--) { 8878 adoptValue(resolveValues[i], updateFunc(i), primary.reject); 8879 } 8880 return primary.promise(); 8881 } 8882 }); 8883 8884 // These usually indicate a programmer mistake during development, 8885 // warn about them ASAP rather than swallowing them by default. 8886 var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 8887 8888 // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error 8889 // captured before the async barrier to get the original error cause 8890 // which may otherwise be hidden. 8891 jQuery.Deferred.exceptionHook = function (error, asyncError) { 8892 // Support: IE 8 - 9 only 8893 // Console exists when dev tools are open, which can happen at any time 8894 if (window.console && window.console.warn && error && rerrorNames.test(error.name)) { 8895 window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, asyncError); 8896 } 8897 }; 8898 jQuery.readyException = function (error) { 8899 window.setTimeout(function () { 8900 throw error; 8901 }); 8902 }; 8903 8904 // The deferred used on DOM ready 8905 var readyList = jQuery.Deferred(); 8906 jQuery.fn.ready = function (fn) { 8907 readyList.then(fn) 8908 8909 // Wrap jQuery.readyException in a function so that the lookup 8910 // happens at the time of error handling instead of callback 8911 // registration. 8912 .catch(function (error) { 8913 jQuery.readyException(error); 8914 }); 8915 return this; 8916 }; 8917 jQuery.extend({ 8918 // Is the DOM ready to be used? Set to true once it occurs. 8919 isReady: false, 8920 // A counter to track how many items to wait for before 8921 // the ready event fires. See trac-6781 8922 readyWait: 1, 8923 // Handle when the DOM is ready 8924 ready: function (wait) { 8925 // Abort if there are pending holds or we're already ready 8926 if (wait === true ? --jQuery.readyWait : jQuery.isReady) { 8927 return; 8928 } 8929 8930 // Remember that the DOM is ready 8931 jQuery.isReady = true; 8932 8933 // If a normal DOM Ready event fired, decrement, and wait if need be 8934 if (wait !== true && --jQuery.readyWait > 0) { 8935 return; 8936 } 8937 8938 // If there are functions bound, to execute 8939 readyList.resolveWith(document, [jQuery]); 8940 } 8941 }); 8942 jQuery.ready.then = readyList.then; 8943 8944 // The ready event handler and self cleanup method 8945 function completed() { 8946 document.removeEventListener("DOMContentLoaded", completed); 8947 window.removeEventListener("load", completed); 8948 jQuery.ready(); 8949 } 8950 8951 // Catch cases where $(document).ready() is called 8952 // after the browser event has already occurred. 8953 // Support: IE <=9 - 10 only 8954 // Older IE sometimes signals "interactive" too soon 8955 if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) { 8956 // Handle it asynchronously to allow scripts the opportunity to delay ready 8957 window.setTimeout(jQuery.ready); 8958 } else { 8959 // Use the handy event callback 8960 document.addEventListener("DOMContentLoaded", completed); 8961 8962 // A fallback to window.onload, that will always work 8963 window.addEventListener("load", completed); 8964 } 8965 8966 // Multifunctional method to get and set values of a collection 8967 // The value/s can optionally be executed if it's a function 8968 var access = function (elems, fn, key, value, chainable, emptyGet, raw) { 8969 var i = 0, 8970 len = elems.length, 8971 bulk = key == null; 8972 8973 // Sets many values 8974 if (toType(key) === "object") { 8975 chainable = true; 8976 for (i in key) { 8977 access(elems, fn, i, key[i], true, emptyGet, raw); 8978 } 8979 8980 // Sets one value 8981 } else if (value !== undefined) { 8982 chainable = true; 8983 if (!isFunction(value)) { 8984 raw = true; 8985 } 8986 if (bulk) { 8987 // Bulk operations run against the entire set 8988 if (raw) { 8989 fn.call(elems, value); 8990 fn = null; 8991 8992 // ...except when executing function values 8993 } else { 8994 bulk = fn; 8995 fn = function (elem, _key, value) { 8996 return bulk.call(jQuery(elem), value); 8997 }; 8998 } 8999 } 9000 if (fn) { 9001 for (; i < len; i++) { 9002 fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); 9003 } 9004 } 9005 } 9006 if (chainable) { 9007 return elems; 9008 } 9009 9010 // Gets 9011 if (bulk) { 9012 return fn.call(elems); 9013 } 9014 return len ? fn(elems[0], key) : emptyGet; 9015 }; 9016 9017 // Matches dashed string for camelizing 9018 var rmsPrefix = /^-ms-/, 9019 rdashAlpha = /-([a-z])/g; 9020 9021 // Used by camelCase as callback to replace() 9022 function fcamelCase(_all, letter) { 9023 return letter.toUpperCase(); 9024 } 9025 9026 // Convert dashed to camelCase; used by the css and data modules 9027 // Support: IE <=9 - 11, Edge 12 - 15 9028 // Microsoft forgot to hump their vendor prefix (trac-9572) 9029 function camelCase(string) { 9030 return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); 9031 } 9032 var acceptData = function (owner) { 9033 // Accepts only: 9034 // - Node 9035 // - Node.ELEMENT_NODE 9036 // - Node.DOCUMENT_NODE 9037 // - Object 9038 // - Any 9039 return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; 9040 }; 9041 function Data() { 9042 this.expando = jQuery.expando + Data.uid++; 9043 } 9044 Data.uid = 1; 9045 Data.prototype = { 9046 cache: function (owner) { 9047 // Check if the owner object already has a cache 9048 var value = owner[this.expando]; 9049 9050 // If not, create one 9051 if (!value) { 9052 value = {}; 9053 9054 // We can accept data for non-element nodes in modern browsers, 9055 // but we should not, see trac-8335. 9056 // Always return an empty object. 9057 if (acceptData(owner)) { 9058 // If it is a node unlikely to be stringify-ed or looped over 9059 // use plain assignment 9060 if (owner.nodeType) { 9061 owner[this.expando] = value; 9062 9063 // Otherwise secure it in a non-enumerable property 9064 // configurable must be true to allow the property to be 9065 // deleted when data is removed 9066 } else { 9067 Object.defineProperty(owner, this.expando, { 9068 value: value, 9069 configurable: true 9070 }); 9071 } 9072 } 9073 } 9074 return value; 9075 }, 9076 set: function (owner, data, value) { 9077 var prop, 9078 cache = this.cache(owner); 9079 9080 // Handle: [ owner, key, value ] args 9081 // Always use camelCase key (gh-2257) 9082 if (typeof data === "string") { 9083 cache[camelCase(data)] = value; 9084 9085 // Handle: [ owner, { properties } ] args 9086 } else { 9087 // Copy the properties one-by-one to the cache object 9088 for (prop in data) { 9089 cache[camelCase(prop)] = data[prop]; 9090 } 9091 } 9092 return cache; 9093 }, 9094 get: function (owner, key) { 9095 return key === undefined ? this.cache(owner) : 9096 // Always use camelCase key (gh-2257) 9097 owner[this.expando] && owner[this.expando][camelCase(key)]; 9098 }, 9099 access: function (owner, key, value) { 9100 // In cases where either: 9101 // 9102 // 1. No key was specified 9103 // 2. A string key was specified, but no value provided 9104 // 9105 // Take the "read" path and allow the get method to determine 9106 // which value to return, respectively either: 9107 // 9108 // 1. The entire cache object 9109 // 2. The data stored at the key 9110 // 9111 if (key === undefined || key && typeof key === "string" && value === undefined) { 9112 return this.get(owner, key); 9113 } 9114 9115 // When the key is not a string, or both a key and value 9116 // are specified, set or extend (existing objects) with either: 9117 // 9118 // 1. An object of properties 9119 // 2. A key and value 9120 // 9121 this.set(owner, key, value); 9122 9123 // Since the "set" path can have two possible entry points 9124 // return the expected data based on which path was taken[*] 9125 return value !== undefined ? value : key; 9126 }, 9127 remove: function (owner, key) { 9128 var i, 9129 cache = owner[this.expando]; 9130 if (cache === undefined) { 9131 return; 9132 } 9133 if (key !== undefined) { 9134 // Support array or space separated string of keys 9135 if (Array.isArray(key)) { 9136 // If key is an array of keys... 9137 // We always set camelCase keys, so remove that. 9138 key = key.map(camelCase); 9139 } else { 9140 key = camelCase(key); 9141 9142 // If a key with the spaces exists, use it. 9143 // Otherwise, create an array by matching non-whitespace 9144 key = key in cache ? [key] : key.match(rnothtmlwhite) || []; 9145 } 9146 i = key.length; 9147 while (i--) { 9148 delete cache[key[i]]; 9149 } 9150 } 9151 9152 // Remove the expando if there's no more data 9153 if (key === undefined || jQuery.isEmptyObject(cache)) { 9154 // Support: Chrome <=35 - 45 9155 // Webkit & Blink performance suffers when deleting properties 9156 // from DOM nodes, so set to undefined instead 9157 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 9158 if (owner.nodeType) { 9159 owner[this.expando] = undefined; 9160 } else { 9161 delete owner[this.expando]; 9162 } 9163 } 9164 }, 9165 hasData: function (owner) { 9166 var cache = owner[this.expando]; 9167 return cache !== undefined && !jQuery.isEmptyObject(cache); 9168 } 9169 }; 9170 var dataPriv = new Data(); 9171 var dataUser = new Data(); 9172 9173 // Implementation Summary 9174 // 9175 // 1. Enforce API surface and semantic compatibility with 1.9.x branch 9176 // 2. Improve the module's maintainability by reducing the storage 9177 // paths to a single mechanism. 9178 // 3. Use the same single mechanism to support "private" and "user" data. 9179 // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 9180 // 5. Avoid exposing implementation details on user objects (eg. expando properties) 9181 // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 9182 9183 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 9184 rmultiDash = /[A-Z]/g; 9185 function getData(data) { 9186 if (data === "true") { 9187 return true; 9188 } 9189 if (data === "false") { 9190 return false; 9191 } 9192 if (data === "null") { 9193 return null; 9194 } 9195 9196 // Only convert to a number if it doesn't change the string 9197 if (data === +data + "") { 9198 return +data; 9199 } 9200 if (rbrace.test(data)) { 9201 return JSON.parse(data); 9202 } 9203 return data; 9204 } 9205 function dataAttr(elem, key, data) { 9206 var name; 9207 9208 // If nothing was found internally, try to fetch any 9209 // data from the HTML5 data-* attribute 9210 if (data === undefined && elem.nodeType === 1) { 9211 name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); 9212 data = elem.getAttribute(name); 9213 if (typeof data === "string") { 9214 try { 9215 data = getData(data); 9216 } catch (e) {} 9217 9218 // Make sure we set the data so it isn't changed later 9219 dataUser.set(elem, key, data); 9220 } else { 9221 data = undefined; 9222 } 9223 } 9224 return data; 9225 } 9226 jQuery.extend({ 9227 hasData: function (elem) { 9228 return dataUser.hasData(elem) || dataPriv.hasData(elem); 9229 }, 9230 data: function (elem, name, data) { 9231 return dataUser.access(elem, name, data); 9232 }, 9233 removeData: function (elem, name) { 9234 dataUser.remove(elem, name); 9235 }, 9236 // TODO: Now that all calls to _data and _removeData have been replaced 9237 // with direct calls to dataPriv methods, these can be deprecated. 9238 _data: function (elem, name, data) { 9239 return dataPriv.access(elem, name, data); 9240 }, 9241 _removeData: function (elem, name) { 9242 dataPriv.remove(elem, name); 9243 } 9244 }); 9245 jQuery.fn.extend({ 9246 data: function (key, value) { 9247 var i, 9248 name, 9249 data, 9250 elem = this[0], 9251 attrs = elem && elem.attributes; 9252 9253 // Gets all values 9254 if (key === undefined) { 9255 if (this.length) { 9256 data = dataUser.get(elem); 9257 if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { 9258 i = attrs.length; 9259 while (i--) { 9260 // Support: IE 11 only 9261 // The attrs elements can be null (trac-14894) 9262 if (attrs[i]) { 9263 name = attrs[i].name; 9264 if (name.indexOf("data-") === 0) { 9265 name = camelCase(name.slice(5)); 9266 dataAttr(elem, name, data[name]); 9267 } 9268 } 9269 } 9270 dataPriv.set(elem, "hasDataAttrs", true); 9271 } 9272 } 9273 return data; 9274 } 9275 9276 // Sets multiple values 9277 if (typeof key === "object") { 9278 return this.each(function () { 9279 dataUser.set(this, key); 9280 }); 9281 } 9282 return access(this, function (value) { 9283 var data; 9284 9285 // The calling jQuery object (element matches) is not empty 9286 // (and therefore has an element appears at this[ 0 ]) and the 9287 // `value` parameter was not undefined. An empty jQuery object 9288 // will result in `undefined` for elem = this[ 0 ] which will 9289 // throw an exception if an attempt to read a data cache is made. 9290 if (elem && value === undefined) { 9291 // Attempt to get data from the cache 9292 // The key will always be camelCased in Data 9293 data = dataUser.get(elem, key); 9294 if (data !== undefined) { 9295 return data; 9296 } 9297 9298 // Attempt to "discover" the data in 9299 // HTML5 custom data-* attrs 9300 data = dataAttr(elem, key); 9301 if (data !== undefined) { 9302 return data; 9303 } 9304 9305 // We tried really hard, but the data doesn't exist. 9306 return; 9307 } 9308 9309 // Set the data... 9310 this.each(function () { 9311 // We always store the camelCased key 9312 dataUser.set(this, key, value); 9313 }); 9314 }, null, value, arguments.length > 1, null, true); 9315 }, 9316 removeData: function (key) { 9317 return this.each(function () { 9318 dataUser.remove(this, key); 9319 }); 9320 } 9321 }); 9322 jQuery.extend({ 9323 queue: function (elem, type, data) { 9324 var queue; 9325 if (elem) { 9326 type = (type || "fx") + "queue"; 9327 queue = dataPriv.get(elem, type); 9328 9329 // Speed up dequeue by getting out quickly if this is just a lookup 9330 if (data) { 9331 if (!queue || Array.isArray(data)) { 9332 queue = dataPriv.access(elem, type, jQuery.makeArray(data)); 9333 } else { 9334 queue.push(data); 9335 } 9336 } 9337 return queue || []; 9338 } 9339 }, 9340 dequeue: function (elem, type) { 9341 type = type || "fx"; 9342 var queue = jQuery.queue(elem, type), 9343 startLength = queue.length, 9344 fn = queue.shift(), 9345 hooks = jQuery._queueHooks(elem, type), 9346 next = function () { 9347 jQuery.dequeue(elem, type); 9348 }; 9349 9350 // If the fx queue is dequeued, always remove the progress sentinel 9351 if (fn === "inprogress") { 9352 fn = queue.shift(); 9353 startLength--; 9354 } 9355 if (fn) { 9356 // Add a progress sentinel to prevent the fx queue from being 9357 // automatically dequeued 9358 if (type === "fx") { 9359 queue.unshift("inprogress"); 9360 } 9361 9362 // Clear up the last queue stop function 9363 delete hooks.stop; 9364 fn.call(elem, next, hooks); 9365 } 9366 if (!startLength && hooks) { 9367 hooks.empty.fire(); 9368 } 9369 }, 9370 // Not public - generate a queueHooks object, or return the current one 9371 _queueHooks: function (elem, type) { 9372 var key = type + "queueHooks"; 9373 return dataPriv.get(elem, key) || dataPriv.access(elem, key, { 9374 empty: jQuery.Callbacks("once memory").add(function () { 9375 dataPriv.remove(elem, [type + "queue", key]); 9376 }) 9377 }); 9378 } 9379 }); 9380 jQuery.fn.extend({ 9381 queue: function (type, data) { 9382 var setter = 2; 9383 if (typeof type !== "string") { 9384 data = type; 9385 type = "fx"; 9386 setter--; 9387 } 9388 if (arguments.length < setter) { 9389 return jQuery.queue(this[0], type); 9390 } 9391 return data === undefined ? this : this.each(function () { 9392 var queue = jQuery.queue(this, type, data); 9393 9394 // Ensure a hooks for this queue 9395 jQuery._queueHooks(this, type); 9396 if (type === "fx" && queue[0] !== "inprogress") { 9397 jQuery.dequeue(this, type); 9398 } 9399 }); 9400 }, 9401 dequeue: function (type) { 9402 return this.each(function () { 9403 jQuery.dequeue(this, type); 9404 }); 9405 }, 9406 clearQueue: function (type) { 9407 return this.queue(type || "fx", []); 9408 }, 9409 // Get a promise resolved when queues of a certain type 9410 // are emptied (fx is the type by default) 9411 promise: function (type, obj) { 9412 var tmp, 9413 count = 1, 9414 defer = jQuery.Deferred(), 9415 elements = this, 9416 i = this.length, 9417 resolve = function () { 9418 if (! --count) { 9419 defer.resolveWith(elements, [elements]); 9420 } 9421 }; 9422 if (typeof type !== "string") { 9423 obj = type; 9424 type = undefined; 9425 } 9426 type = type || "fx"; 9427 while (i--) { 9428 tmp = dataPriv.get(elements[i], type + "queueHooks"); 9429 if (tmp && tmp.empty) { 9430 count++; 9431 tmp.empty.add(resolve); 9432 } 9433 } 9434 resolve(); 9435 return defer.promise(obj); 9436 } 9437 }); 9438 var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; 9439 var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); 9440 var cssExpand = ["Top", "Right", "Bottom", "Left"]; 9441 var documentElement = document.documentElement; 9442 var isAttached = function (elem) { 9443 return jQuery.contains(elem.ownerDocument, elem); 9444 }, 9445 composed = { 9446 composed: true 9447 }; 9448 9449 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 9450 // Check attachment across shadow DOM boundaries when possible (gh-3504) 9451 // Support: iOS 10.0-10.2 only 9452 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 9453 // leading to errors. We need to check for `getRootNode`. 9454 if (documentElement.getRootNode) { 9455 isAttached = function (elem) { 9456 return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument; 9457 }; 9458 } 9459 var isHiddenWithinTree = function (elem, el) { 9460 // isHiddenWithinTree might be called from jQuery#filter function; 9461 // in that case, element will be second argument 9462 elem = el || elem; 9463 9464 // Inline style trumps all 9465 return elem.style.display === "none" || elem.style.display === "" && 9466 // Otherwise, check computed style 9467 // Support: Firefox <=43 - 45 9468 // Disconnected elements can have computed display: none, so first confirm that elem is 9469 // in the document. 9470 isAttached(elem) && jQuery.css(elem, "display") === "none"; 9471 }; 9472 function adjustCSS(elem, prop, valueParts, tween) { 9473 var adjusted, 9474 scale, 9475 maxIterations = 20, 9476 currentValue = tween ? function () { 9477 return tween.cur(); 9478 } : function () { 9479 return jQuery.css(elem, prop, ""); 9480 }, 9481 initial = currentValue(), 9482 unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), 9483 // Starting value computation is required for potential unit mismatches 9484 initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop)); 9485 if (initialInUnit && initialInUnit[3] !== unit) { 9486 // Support: Firefox <=54 9487 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 9488 initial = initial / 2; 9489 9490 // Trust units reported by jQuery.css 9491 unit = unit || initialInUnit[3]; 9492 9493 // Iteratively approximate from a nonzero starting point 9494 initialInUnit = +initial || 1; 9495 while (maxIterations--) { 9496 // Evaluate and update our best guess (doubling guesses that zero out). 9497 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 9498 jQuery.style(elem, prop, initialInUnit + unit); 9499 if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) { 9500 maxIterations = 0; 9501 } 9502 initialInUnit = initialInUnit / scale; 9503 } 9504 initialInUnit = initialInUnit * 2; 9505 jQuery.style(elem, prop, initialInUnit + unit); 9506 9507 // Make sure we update the tween properties later on 9508 valueParts = valueParts || []; 9509 } 9510 if (valueParts) { 9511 initialInUnit = +initialInUnit || +initial || 0; 9512 9513 // Apply relative offset (+=/-=) if specified 9514 adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2]; 9515 if (tween) { 9516 tween.unit = unit; 9517 tween.start = initialInUnit; 9518 tween.end = adjusted; 9519 } 9520 } 9521 return adjusted; 9522 } 9523 var defaultDisplayMap = {}; 9524 function getDefaultDisplay(elem) { 9525 var temp, 9526 doc = elem.ownerDocument, 9527 nodeName = elem.nodeName, 9528 display = defaultDisplayMap[nodeName]; 9529 if (display) { 9530 return display; 9531 } 9532 temp = doc.body.appendChild(doc.createElement(nodeName)); 9533 display = jQuery.css(temp, "display"); 9534 temp.parentNode.removeChild(temp); 9535 if (display === "none") { 9536 display = "block"; 9537 } 9538 defaultDisplayMap[nodeName] = display; 9539 return display; 9540 } 9541 function showHide(elements, show) { 9542 var display, 9543 elem, 9544 values = [], 9545 index = 0, 9546 length = elements.length; 9547 9548 // Determine new display value for elements that need to change 9549 for (; index < length; index++) { 9550 elem = elements[index]; 9551 if (!elem.style) { 9552 continue; 9553 } 9554 display = elem.style.display; 9555 if (show) { 9556 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 9557 // check is required in this first loop unless we have a nonempty display value (either 9558 // inline or about-to-be-restored) 9559 if (display === "none") { 9560 values[index] = dataPriv.get(elem, "display") || null; 9561 if (!values[index]) { 9562 elem.style.display = ""; 9563 } 9564 } 9565 if (elem.style.display === "" && isHiddenWithinTree(elem)) { 9566 values[index] = getDefaultDisplay(elem); 9567 } 9568 } else { 9569 if (display !== "none") { 9570 values[index] = "none"; 9571 9572 // Remember what we're overwriting 9573 dataPriv.set(elem, "display", display); 9574 } 9575 } 9576 } 9577 9578 // Set the display of the elements in a second loop to avoid constant reflow 9579 for (index = 0; index < length; index++) { 9580 if (values[index] != null) { 9581 elements[index].style.display = values[index]; 9582 } 9583 } 9584 return elements; 9585 } 9586 jQuery.fn.extend({ 9587 show: function () { 9588 return showHide(this, true); 9589 }, 9590 hide: function () { 9591 return showHide(this); 9592 }, 9593 toggle: function (state) { 9594 if (typeof state === "boolean") { 9595 return state ? this.show() : this.hide(); 9596 } 9597 return this.each(function () { 9598 if (isHiddenWithinTree(this)) { 9599 jQuery(this).show(); 9600 } else { 9601 jQuery(this).hide(); 9602 } 9603 }); 9604 } 9605 }); 9606 var rcheckableType = /^(?:checkbox|radio)$/i; 9607 var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; 9608 var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; 9609 (function () { 9610 var fragment = document.createDocumentFragment(), 9611 div = fragment.appendChild(document.createElement("div")), 9612 input = document.createElement("input"); 9613 9614 // Support: Android 4.0 - 4.3 only 9615 // Check state lost if the name is set (trac-11217) 9616 // Support: Windows Web Apps (WWA) 9617 // `name` and `type` must use .setAttribute for WWA (trac-14901) 9618 input.setAttribute("type", "radio"); 9619 input.setAttribute("checked", "checked"); 9620 input.setAttribute("name", "t"); 9621 div.appendChild(input); 9622 9623 // Support: Android <=4.1 only 9624 // Older WebKit doesn't clone checked state correctly in fragments 9625 support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; 9626 9627 // Support: IE <=11 only 9628 // Make sure textarea (and checkbox) defaultValue is properly cloned 9629 div.innerHTML = "<textarea>x</textarea>"; 9630 support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; 9631 9632 // Support: IE <=9 only 9633 // IE <=9 replaces <option> tags with their contents when inserted outside of 9634 // the select element. 9635 div.innerHTML = "<option></option>"; 9636 support.option = !!div.lastChild; 9637 })(); 9638 9639 // We have to close these tags to support XHTML (trac-13200) 9640 var wrapMap = { 9641 // XHTML parsers do not magically insert elements in the 9642 // same way that tag soup parsers do. So we cannot shorten 9643 // this by omitting <tbody> or other required elements. 9644 thead: [1, "<table>", "</table>"], 9645 col: [2, "<table><colgroup>", "</colgroup></table>"], 9646 tr: [2, "<table><tbody>", "</tbody></table>"], 9647 td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], 9648 _default: [0, "", ""] 9649 }; 9650 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 9651 wrapMap.th = wrapMap.td; 9652 9653 // Support: IE <=9 only 9654 if (!support.option) { 9655 wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"]; 9656 } 9657 function getAll(context, tag) { 9658 // Support: IE <=9 - 11 only 9659 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) 9660 var ret; 9661 if (typeof context.getElementsByTagName !== "undefined") { 9662 ret = context.getElementsByTagName(tag || "*"); 9663 } else if (typeof context.querySelectorAll !== "undefined") { 9664 ret = context.querySelectorAll(tag || "*"); 9665 } else { 9666 ret = []; 9667 } 9668 if (tag === undefined || tag && nodeName(context, tag)) { 9669 return jQuery.merge([context], ret); 9670 } 9671 return ret; 9672 } 9673 9674 // Mark scripts as having already been evaluated 9675 function setGlobalEval(elems, refElements) { 9676 var i = 0, 9677 l = elems.length; 9678 for (; i < l; i++) { 9679 dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval")); 9680 } 9681 } 9682 var rhtml = /<|&#?\w+;/; 9683 function buildFragment(elems, context, scripts, selection, ignored) { 9684 var elem, 9685 tmp, 9686 tag, 9687 wrap, 9688 attached, 9689 j, 9690 fragment = context.createDocumentFragment(), 9691 nodes = [], 9692 i = 0, 9693 l = elems.length; 9694 for (; i < l; i++) { 9695 elem = elems[i]; 9696 if (elem || elem === 0) { 9697 // Add nodes directly 9698 if (toType(elem) === "object") { 9699 // Support: Android <=4.0 only, PhantomJS 1 only 9700 // push.apply(_, arraylike) throws on ancient WebKit 9701 jQuery.merge(nodes, elem.nodeType ? [elem] : elem); 9702 9703 // Convert non-html into a text node 9704 } else if (!rhtml.test(elem)) { 9705 nodes.push(context.createTextNode(elem)); 9706 9707 // Convert html into DOM nodes 9708 } else { 9709 tmp = tmp || fragment.appendChild(context.createElement("div")); 9710 9711 // Deserialize a standard representation 9712 tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); 9713 wrap = wrapMap[tag] || wrapMap._default; 9714 tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; 9715 9716 // Descend through wrappers to the right content 9717 j = wrap[0]; 9718 while (j--) { 9719 tmp = tmp.lastChild; 9720 } 9721 9722 // Support: Android <=4.0 only, PhantomJS 1 only 9723 // push.apply(_, arraylike) throws on ancient WebKit 9724 jQuery.merge(nodes, tmp.childNodes); 9725 9726 // Remember the top-level container 9727 tmp = fragment.firstChild; 9728 9729 // Ensure the created nodes are orphaned (trac-12392) 9730 tmp.textContent = ""; 9731 } 9732 } 9733 } 9734 9735 // Remove wrapper from fragment 9736 fragment.textContent = ""; 9737 i = 0; 9738 while (elem = nodes[i++]) { 9739 // Skip elements already in the context collection (trac-4087) 9740 if (selection && jQuery.inArray(elem, selection) > -1) { 9741 if (ignored) { 9742 ignored.push(elem); 9743 } 9744 continue; 9745 } 9746 attached = isAttached(elem); 9747 9748 // Append to fragment 9749 tmp = getAll(fragment.appendChild(elem), "script"); 9750 9751 // Preserve script evaluation history 9752 if (attached) { 9753 setGlobalEval(tmp); 9754 } 9755 9756 // Capture executables 9757 if (scripts) { 9758 j = 0; 9759 while (elem = tmp[j++]) { 9760 if (rscriptType.test(elem.type || "")) { 9761 scripts.push(elem); 9762 } 9763 } 9764 } 9765 } 9766 return fragment; 9767 } 9768 var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 9769 function returnTrue() { 9770 return true; 9771 } 9772 function returnFalse() { 9773 return false; 9774 } 9775 function on(elem, types, selector, data, fn, one) { 9776 var origFn, type; 9777 9778 // Types can be a map of types/handlers 9779 if (typeof types === "object") { 9780 // ( types-Object, selector, data ) 9781 if (typeof selector !== "string") { 9782 // ( types-Object, data ) 9783 data = data || selector; 9784 selector = undefined; 9785 } 9786 for (type in types) { 9787 on(elem, type, selector, data, types[type], one); 9788 } 9789 return elem; 9790 } 9791 if (data == null && fn == null) { 9792 // ( types, fn ) 9793 fn = selector; 9794 data = selector = undefined; 9795 } else if (fn == null) { 9796 if (typeof selector === "string") { 9797 // ( types, selector, fn ) 9798 fn = data; 9799 data = undefined; 9800 } else { 9801 // ( types, data, fn ) 9802 fn = data; 9803 data = selector; 9804 selector = undefined; 9805 } 9806 } 9807 if (fn === false) { 9808 fn = returnFalse; 9809 } else if (!fn) { 9810 return elem; 9811 } 9812 if (one === 1) { 9813 origFn = fn; 9814 fn = function (event) { 9815 // Can use an empty set, since event contains the info 9816 jQuery().off(event); 9817 return origFn.apply(this, arguments); 9818 }; 9819 9820 // Use same guid so caller can remove using origFn 9821 fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); 9822 } 9823 return elem.each(function () { 9824 jQuery.event.add(this, types, fn, data, selector); 9825 }); 9826 } 9827 9828 /* 9829 * Helper functions for managing events -- not part of the public interface. 9830 * Props to Dean Edwards' addEvent library for many of the ideas. 9831 */ 9832 jQuery.event = { 9833 global: {}, 9834 add: function (elem, types, handler, data, selector) { 9835 var handleObjIn, 9836 eventHandle, 9837 tmp, 9838 events, 9839 t, 9840 handleObj, 9841 special, 9842 handlers, 9843 type, 9844 namespaces, 9845 origType, 9846 elemData = dataPriv.get(elem); 9847 9848 // Only attach events to objects that accept data 9849 if (!acceptData(elem)) { 9850 return; 9851 } 9852 9853 // Caller can pass in an object of custom data in lieu of the handler 9854 if (handler.handler) { 9855 handleObjIn = handler; 9856 handler = handleObjIn.handler; 9857 selector = handleObjIn.selector; 9858 } 9859 9860 // Ensure that invalid selectors throw exceptions at attach time 9861 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 9862 if (selector) { 9863 jQuery.find.matchesSelector(documentElement, selector); 9864 } 9865 9866 // Make sure that the handler has a unique ID, used to find/remove it later 9867 if (!handler.guid) { 9868 handler.guid = jQuery.guid++; 9869 } 9870 9871 // Init the element's event structure and main handler, if this is the first 9872 if (!(events = elemData.events)) { 9873 events = elemData.events = Object.create(null); 9874 } 9875 if (!(eventHandle = elemData.handle)) { 9876 eventHandle = elemData.handle = function (e) { 9877 // Discard the second event of a jQuery.event.trigger() and 9878 // when an event is called after a page has unloaded 9879 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined; 9880 }; 9881 } 9882 9883 // Handle multiple events separated by a space 9884 types = (types || "").match(rnothtmlwhite) || [""]; 9885 t = types.length; 9886 while (t--) { 9887 tmp = rtypenamespace.exec(types[t]) || []; 9888 type = origType = tmp[1]; 9889 namespaces = (tmp[2] || "").split(".").sort(); 9890 9891 // There *must* be a type, no attaching namespace-only handlers 9892 if (!type) { 9893 continue; 9894 } 9895 9896 // If event changes its type, use the special event handlers for the changed type 9897 special = jQuery.event.special[type] || {}; 9898 9899 // If selector defined, determine special event api type, otherwise given type 9900 type = (selector ? special.delegateType : special.bindType) || type; 9901 9902 // Update special based on newly reset type 9903 special = jQuery.event.special[type] || {}; 9904 9905 // handleObj is passed to all event handlers 9906 handleObj = jQuery.extend({ 9907 type: type, 9908 origType: origType, 9909 data: data, 9910 handler: handler, 9911 guid: handler.guid, 9912 selector: selector, 9913 needsContext: selector && jQuery.expr.match.needsContext.test(selector), 9914 namespace: namespaces.join(".") 9915 }, handleObjIn); 9916 9917 // Init the event handler queue if we're the first 9918 if (!(handlers = events[type])) { 9919 handlers = events[type] = []; 9920 handlers.delegateCount = 0; 9921 9922 // Only use addEventListener if the special events handler returns false 9923 if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { 9924 if (elem.addEventListener) { 9925 elem.addEventListener(type, eventHandle); 9926 } 9927 } 9928 } 9929 if (special.add) { 9930 special.add.call(elem, handleObj); 9931 if (!handleObj.handler.guid) { 9932 handleObj.handler.guid = handler.guid; 9933 } 9934 } 9935 9936 // Add to the element's handler list, delegates in front 9937 if (selector) { 9938 handlers.splice(handlers.delegateCount++, 0, handleObj); 9939 } else { 9940 handlers.push(handleObj); 9941 } 9942 9943 // Keep track of which events have ever been used, for event optimization 9944 jQuery.event.global[type] = true; 9945 } 9946 }, 9947 // Detach an event or set of events from an element 9948 remove: function (elem, types, handler, selector, mappedTypes) { 9949 var j, 9950 origCount, 9951 tmp, 9952 events, 9953 t, 9954 handleObj, 9955 special, 9956 handlers, 9957 type, 9958 namespaces, 9959 origType, 9960 elemData = dataPriv.hasData(elem) && dataPriv.get(elem); 9961 if (!elemData || !(events = elemData.events)) { 9962 return; 9963 } 9964 9965 // Once for each type.namespace in types; type may be omitted 9966 types = (types || "").match(rnothtmlwhite) || [""]; 9967 t = types.length; 9968 while (t--) { 9969 tmp = rtypenamespace.exec(types[t]) || []; 9970 type = origType = tmp[1]; 9971 namespaces = (tmp[2] || "").split(".").sort(); 9972 9973 // Unbind all events (on this namespace, if provided) for the element 9974 if (!type) { 9975 for (type in events) { 9976 jQuery.event.remove(elem, type + types[t], handler, selector, true); 9977 } 9978 continue; 9979 } 9980 special = jQuery.event.special[type] || {}; 9981 type = (selector ? special.delegateType : special.bindType) || type; 9982 handlers = events[type] || []; 9983 tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); 9984 9985 // Remove matching events 9986 origCount = j = handlers.length; 9987 while (j--) { 9988 handleObj = handlers[j]; 9989 if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { 9990 handlers.splice(j, 1); 9991 if (handleObj.selector) { 9992 handlers.delegateCount--; 9993 } 9994 if (special.remove) { 9995 special.remove.call(elem, handleObj); 9996 } 9997 } 9998 } 9999 10000 // Remove generic event handler if we removed something and no more handlers exist 10001 // (avoids potential for endless recursion during removal of special event handlers) 10002 if (origCount && !handlers.length) { 10003 if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { 10004 jQuery.removeEvent(elem, type, elemData.handle); 10005 } 10006 delete events[type]; 10007 } 10008 } 10009 10010 // Remove data and the expando if it's no longer used 10011 if (jQuery.isEmptyObject(events)) { 10012 dataPriv.remove(elem, "handle events"); 10013 } 10014 }, 10015 dispatch: function (nativeEvent) { 10016 var i, 10017 j, 10018 ret, 10019 matched, 10020 handleObj, 10021 handlerQueue, 10022 args = new Array(arguments.length), 10023 // Make a writable jQuery.Event from the native event object 10024 event = jQuery.event.fix(nativeEvent), 10025 handlers = (dataPriv.get(this, "events") || Object.create(null))[event.type] || [], 10026 special = jQuery.event.special[event.type] || {}; 10027 10028 // Use the fix-ed jQuery.Event rather than the (read-only) native event 10029 args[0] = event; 10030 for (i = 1; i < arguments.length; i++) { 10031 args[i] = arguments[i]; 10032 } 10033 event.delegateTarget = this; 10034 10035 // Call the preDispatch hook for the mapped type, and let it bail if desired 10036 if (special.preDispatch && special.preDispatch.call(this, event) === false) { 10037 return; 10038 } 10039 10040 // Determine handlers 10041 handlerQueue = jQuery.event.handlers.call(this, event, handlers); 10042 10043 // Run delegates first; they may want to stop propagation beneath us 10044 i = 0; 10045 while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { 10046 event.currentTarget = matched.elem; 10047 j = 0; 10048 while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { 10049 // If the event is namespaced, then each handler is only invoked if it is 10050 // specially universal or its namespaces are a superset of the event's. 10051 if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) { 10052 event.handleObj = handleObj; 10053 event.data = handleObj.data; 10054 ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args); 10055 if (ret !== undefined) { 10056 if ((event.result = ret) === false) { 10057 event.preventDefault(); 10058 event.stopPropagation(); 10059 } 10060 } 10061 } 10062 } 10063 } 10064 10065 // Call the postDispatch hook for the mapped type 10066 if (special.postDispatch) { 10067 special.postDispatch.call(this, event); 10068 } 10069 return event.result; 10070 }, 10071 handlers: function (event, handlers) { 10072 var i, 10073 handleObj, 10074 sel, 10075 matchedHandlers, 10076 matchedSelectors, 10077 handlerQueue = [], 10078 delegateCount = handlers.delegateCount, 10079 cur = event.target; 10080 10081 // Find delegate handlers 10082 if (delegateCount && 10083 // Support: IE <=9 10084 // Black-hole SVG <use> instance trees (trac-13180) 10085 cur.nodeType && 10086 // Support: Firefox <=42 10087 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 10088 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 10089 // Support: IE 11 only 10090 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 10091 !(event.type === "click" && event.button >= 1)) { 10092 for (; cur !== this; cur = cur.parentNode || this) { 10093 // Don't check non-elements (trac-13208) 10094 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) 10095 if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) { 10096 matchedHandlers = []; 10097 matchedSelectors = {}; 10098 for (i = 0; i < delegateCount; i++) { 10099 handleObj = handlers[i]; 10100 10101 // Don't conflict with Object.prototype properties (trac-13203) 10102 sel = handleObj.selector + " "; 10103 if (matchedSelectors[sel] === undefined) { 10104 matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length; 10105 } 10106 if (matchedSelectors[sel]) { 10107 matchedHandlers.push(handleObj); 10108 } 10109 } 10110 if (matchedHandlers.length) { 10111 handlerQueue.push({ 10112 elem: cur, 10113 handlers: matchedHandlers 10114 }); 10115 } 10116 } 10117 } 10118 } 10119 10120 // Add the remaining (directly-bound) handlers 10121 cur = this; 10122 if (delegateCount < handlers.length) { 10123 handlerQueue.push({ 10124 elem: cur, 10125 handlers: handlers.slice(delegateCount) 10126 }); 10127 } 10128 return handlerQueue; 10129 }, 10130 addProp: function (name, hook) { 10131 Object.defineProperty(jQuery.Event.prototype, name, { 10132 enumerable: true, 10133 configurable: true, 10134 get: isFunction(hook) ? function () { 10135 if (this.originalEvent) { 10136 return hook(this.originalEvent); 10137 } 10138 } : function () { 10139 if (this.originalEvent) { 10140 return this.originalEvent[name]; 10141 } 10142 }, 10143 set: function (value) { 10144 Object.defineProperty(this, name, { 10145 enumerable: true, 10146 configurable: true, 10147 writable: true, 10148 value: value 10149 }); 10150 } 10151 }); 10152 }, 10153 fix: function (originalEvent) { 10154 return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent); 10155 }, 10156 special: { 10157 load: { 10158 // Prevent triggered image.load events from bubbling to window.load 10159 noBubble: true 10160 }, 10161 click: { 10162 // Utilize native event to ensure correct state for checkable inputs 10163 setup: function (data) { 10164 // For mutual compressibility with _default, replace `this` access with a local var. 10165 // `|| data` is dead code meant only to preserve the variable through minification. 10166 var el = this || data; 10167 10168 // Claim the first handler 10169 if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { 10170 // dataPriv.set( el, "click", ... ) 10171 leverageNative(el, "click", true); 10172 } 10173 10174 // Return false to allow normal processing in the caller 10175 return false; 10176 }, 10177 trigger: function (data) { 10178 // For mutual compressibility with _default, replace `this` access with a local var. 10179 // `|| data` is dead code meant only to preserve the variable through minification. 10180 var el = this || data; 10181 10182 // Force setup before triggering a click 10183 if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { 10184 leverageNative(el, "click"); 10185 } 10186 10187 // Return non-false to allow normal event-path propagation 10188 return true; 10189 }, 10190 // For cross-browser consistency, suppress native .click() on links 10191 // Also prevent it if we're currently inside a leveraged native-event stack 10192 _default: function (event) { 10193 var target = event.target; 10194 return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a"); 10195 } 10196 }, 10197 beforeunload: { 10198 postDispatch: function (event) { 10199 // Support: Firefox 20+ 10200 // Firefox doesn't alert if the returnValue field is not set. 10201 if (event.result !== undefined && event.originalEvent) { 10202 event.originalEvent.returnValue = event.result; 10203 } 10204 } 10205 } 10206 } 10207 }; 10208 10209 // Ensure the presence of an event listener that handles manually-triggered 10210 // synthetic events by interrupting progress until reinvoked in response to 10211 // *native* events that it fires directly, ensuring that state changes have 10212 // already occurred before other listeners are invoked. 10213 function leverageNative(el, type, isSetup) { 10214 // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add 10215 if (!isSetup) { 10216 if (dataPriv.get(el, type) === undefined) { 10217 jQuery.event.add(el, type, returnTrue); 10218 } 10219 return; 10220 } 10221 10222 // Register the controller as a special universal handler for all event namespaces 10223 dataPriv.set(el, type, false); 10224 jQuery.event.add(el, type, { 10225 namespace: false, 10226 handler: function (event) { 10227 var result, 10228 saved = dataPriv.get(this, type); 10229 if (event.isTrigger & 1 && this[type]) { 10230 // Interrupt processing of the outer synthetic .trigger()ed event 10231 if (!saved) { 10232 // Store arguments for use when handling the inner native event 10233 // There will always be at least one argument (an event object), so this array 10234 // will not be confused with a leftover capture object. 10235 saved = slice.call(arguments); 10236 dataPriv.set(this, type, saved); 10237 10238 // Trigger the native event and capture its result 10239 this[type](); 10240 result = dataPriv.get(this, type); 10241 dataPriv.set(this, type, false); 10242 if (saved !== result) { 10243 // Cancel the outer synthetic event 10244 event.stopImmediatePropagation(); 10245 event.preventDefault(); 10246 return result; 10247 } 10248 10249 // If this is an inner synthetic event for an event with a bubbling surrogate 10250 // (focus or blur), assume that the surrogate already propagated from triggering 10251 // the native event and prevent that from happening again here. 10252 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 10253 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 10254 // less bad than duplication. 10255 } else if ((jQuery.event.special[type] || {}).delegateType) { 10256 event.stopPropagation(); 10257 } 10258 10259 // If this is a native event triggered above, everything is now in order 10260 // Fire an inner synthetic event with the original arguments 10261 } else if (saved) { 10262 // ...and capture the result 10263 dataPriv.set(this, type, jQuery.event.trigger(saved[0], saved.slice(1), this)); 10264 10265 // Abort handling of the native event by all jQuery handlers while allowing 10266 // native handlers on the same element to run. On target, this is achieved 10267 // by stopping immediate propagation just on the jQuery event. However, 10268 // the native event is re-wrapped by a jQuery one on each level of the 10269 // propagation so the only way to stop it for jQuery is to stop it for 10270 // everyone via native `stopPropagation()`. This is not a problem for 10271 // focus/blur which don't bubble, but it does also stop click on checkboxes 10272 // and radios. We accept this limitation. 10273 event.stopPropagation(); 10274 event.isImmediatePropagationStopped = returnTrue; 10275 } 10276 } 10277 }); 10278 } 10279 jQuery.removeEvent = function (elem, type, handle) { 10280 // This "if" is needed for plain objects 10281 if (elem.removeEventListener) { 10282 elem.removeEventListener(type, handle); 10283 } 10284 }; 10285 jQuery.Event = function (src, props) { 10286 // Allow instantiation without the 'new' keyword 10287 if (!(this instanceof jQuery.Event)) { 10288 return new jQuery.Event(src, props); 10289 } 10290 10291 // Event object 10292 if (src && src.type) { 10293 this.originalEvent = src; 10294 this.type = src.type; 10295 10296 // Events bubbling up the document may have been marked as prevented 10297 // by a handler lower down the tree; reflect the correct value. 10298 this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && 10299 // Support: Android <=2.3 only 10300 src.returnValue === false ? returnTrue : returnFalse; 10301 10302 // Create target properties 10303 // Support: Safari <=6 - 7 only 10304 // Target should not be a text node (trac-504, trac-13143) 10305 this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target; 10306 this.currentTarget = src.currentTarget; 10307 this.relatedTarget = src.relatedTarget; 10308 10309 // Event type 10310 } else { 10311 this.type = src; 10312 } 10313 10314 // Put explicitly provided properties onto the event object 10315 if (props) { 10316 jQuery.extend(this, props); 10317 } 10318 10319 // Create a timestamp if incoming event doesn't have one 10320 this.timeStamp = src && src.timeStamp || Date.now(); 10321 10322 // Mark it as fixed 10323 this[jQuery.expando] = true; 10324 }; 10325 10326 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 10327 // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 10328 jQuery.Event.prototype = { 10329 constructor: jQuery.Event, 10330 isDefaultPrevented: returnFalse, 10331 isPropagationStopped: returnFalse, 10332 isImmediatePropagationStopped: returnFalse, 10333 isSimulated: false, 10334 preventDefault: function () { 10335 var e = this.originalEvent; 10336 this.isDefaultPrevented = returnTrue; 10337 if (e && !this.isSimulated) { 10338 e.preventDefault(); 10339 } 10340 }, 10341 stopPropagation: function () { 10342 var e = this.originalEvent; 10343 this.isPropagationStopped = returnTrue; 10344 if (e && !this.isSimulated) { 10345 e.stopPropagation(); 10346 } 10347 }, 10348 stopImmediatePropagation: function () { 10349 var e = this.originalEvent; 10350 this.isImmediatePropagationStopped = returnTrue; 10351 if (e && !this.isSimulated) { 10352 e.stopImmediatePropagation(); 10353 } 10354 this.stopPropagation(); 10355 } 10356 }; 10357 10358 // Includes all common event props including KeyEvent and MouseEvent specific props 10359 jQuery.each({ 10360 altKey: true, 10361 bubbles: true, 10362 cancelable: true, 10363 changedTouches: true, 10364 ctrlKey: true, 10365 detail: true, 10366 eventPhase: true, 10367 metaKey: true, 10368 pageX: true, 10369 pageY: true, 10370 shiftKey: true, 10371 view: true, 10372 "char": true, 10373 code: true, 10374 charCode: true, 10375 key: true, 10376 keyCode: true, 10377 button: true, 10378 buttons: true, 10379 clientX: true, 10380 clientY: true, 10381 offsetX: true, 10382 offsetY: true, 10383 pointerId: true, 10384 pointerType: true, 10385 screenX: true, 10386 screenY: true, 10387 targetTouches: true, 10388 toElement: true, 10389 touches: true, 10390 which: true 10391 }, jQuery.event.addProp); 10392 jQuery.each({ 10393 focus: "focusin", 10394 blur: "focusout" 10395 }, function (type, delegateType) { 10396 function focusMappedHandler(nativeEvent) { 10397 if (document.documentMode) { 10398 // Support: IE 11+ 10399 // Attach a single focusin/focusout handler on the document while someone wants 10400 // focus/blur. This is because the former are synchronous in IE while the latter 10401 // are async. In other browsers, all those handlers are invoked synchronously. 10402 10403 // `handle` from private data would already wrap the event, but we need 10404 // to change the `type` here. 10405 var handle = dataPriv.get(this, "handle"), 10406 event = jQuery.event.fix(nativeEvent); 10407 event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; 10408 event.isSimulated = true; 10409 10410 // First, handle focusin/focusout 10411 handle(nativeEvent); 10412 10413 // ...then, handle focus/blur 10414 // 10415 // focus/blur don't bubble while focusin/focusout do; simulate the former by only 10416 // invoking the handler at the lower level. 10417 if (event.target === event.currentTarget) { 10418 // The setup part calls `leverageNative`, which, in turn, calls 10419 // `jQuery.event.add`, so event handle will already have been set 10420 // by this point. 10421 handle(event); 10422 } 10423 } else { 10424 // For non-IE browsers, attach a single capturing handler on the document 10425 // while someone wants focusin/focusout. 10426 jQuery.event.simulate(delegateType, nativeEvent.target, jQuery.event.fix(nativeEvent)); 10427 } 10428 } 10429 jQuery.event.special[type] = { 10430 // Utilize native event if possible so blur/focus sequence is correct 10431 setup: function () { 10432 var attaches; 10433 10434 // Claim the first handler 10435 // dataPriv.set( this, "focus", ... ) 10436 // dataPriv.set( this, "blur", ... ) 10437 leverageNative(this, type, true); 10438 if (document.documentMode) { 10439 // Support: IE 9 - 11+ 10440 // We use the same native handler for focusin & focus (and focusout & blur) 10441 // so we need to coordinate setup & teardown parts between those events. 10442 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 10443 attaches = dataPriv.get(this, delegateType); 10444 if (!attaches) { 10445 this.addEventListener(delegateType, focusMappedHandler); 10446 } 10447 dataPriv.set(this, delegateType, (attaches || 0) + 1); 10448 } else { 10449 // Return false to allow normal processing in the caller 10450 return false; 10451 } 10452 }, 10453 trigger: function () { 10454 // Force setup before trigger 10455 leverageNative(this, type); 10456 10457 // Return non-false to allow normal event-path propagation 10458 return true; 10459 }, 10460 teardown: function () { 10461 var attaches; 10462 if (document.documentMode) { 10463 attaches = dataPriv.get(this, delegateType) - 1; 10464 if (!attaches) { 10465 this.removeEventListener(delegateType, focusMappedHandler); 10466 dataPriv.remove(this, delegateType); 10467 } else { 10468 dataPriv.set(this, delegateType, attaches); 10469 } 10470 } else { 10471 // Return false to indicate standard teardown should be applied 10472 return false; 10473 } 10474 }, 10475 // Suppress native focus or blur if we're currently inside 10476 // a leveraged native-event stack 10477 _default: function (event) { 10478 return dataPriv.get(event.target, type); 10479 }, 10480 delegateType: delegateType 10481 }; 10482 10483 // Support: Firefox <=44 10484 // Firefox doesn't have focus(in | out) events 10485 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 10486 // 10487 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 10488 // focus(in | out) events fire after focus & blur events, 10489 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 10490 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 10491 // 10492 // Support: IE 9 - 11+ 10493 // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, 10494 // attach a single handler for both events in IE. 10495 jQuery.event.special[delegateType] = { 10496 setup: function () { 10497 // Handle: regular nodes (via `this.ownerDocument`), window 10498 // (via `this.document`) & document (via `this`). 10499 var doc = this.ownerDocument || this.document || this, 10500 dataHolder = document.documentMode ? this : doc, 10501 attaches = dataPriv.get(dataHolder, delegateType); 10502 10503 // Support: IE 9 - 11+ 10504 // We use the same native handler for focusin & focus (and focusout & blur) 10505 // so we need to coordinate setup & teardown parts between those events. 10506 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 10507 if (!attaches) { 10508 if (document.documentMode) { 10509 this.addEventListener(delegateType, focusMappedHandler); 10510 } else { 10511 doc.addEventListener(type, focusMappedHandler, true); 10512 } 10513 } 10514 dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1); 10515 }, 10516 teardown: function () { 10517 var doc = this.ownerDocument || this.document || this, 10518 dataHolder = document.documentMode ? this : doc, 10519 attaches = dataPriv.get(dataHolder, delegateType) - 1; 10520 if (!attaches) { 10521 if (document.documentMode) { 10522 this.removeEventListener(delegateType, focusMappedHandler); 10523 } else { 10524 doc.removeEventListener(type, focusMappedHandler, true); 10525 } 10526 dataPriv.remove(dataHolder, delegateType); 10527 } else { 10528 dataPriv.set(dataHolder, delegateType, attaches); 10529 } 10530 } 10531 }; 10532 }); 10533 10534 // Create mouseenter/leave events using mouseover/out and event-time checks 10535 // so that event delegation works in jQuery. 10536 // Do the same for pointerenter/pointerleave and pointerover/pointerout 10537 // 10538 // Support: Safari 7 only 10539 // Safari sends mouseenter too often; see: 10540 // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 10541 // for the description of the bug (it existed in older Chrome versions as well). 10542 jQuery.each({ 10543 mouseenter: "mouseover", 10544 mouseleave: "mouseout", 10545 pointerenter: "pointerover", 10546 pointerleave: "pointerout" 10547 }, function (orig, fix) { 10548 jQuery.event.special[orig] = { 10549 delegateType: fix, 10550 bindType: fix, 10551 handle: function (event) { 10552 var ret, 10553 target = this, 10554 related = event.relatedTarget, 10555 handleObj = event.handleObj; 10556 10557 // For mouseenter/leave call the handler if related is outside the target. 10558 // NB: No relatedTarget if the mouse left/entered the browser window 10559 if (!related || related !== target && !jQuery.contains(target, related)) { 10560 event.type = handleObj.origType; 10561 ret = handleObj.handler.apply(this, arguments); 10562 event.type = fix; 10563 } 10564 return ret; 10565 } 10566 }; 10567 }); 10568 jQuery.fn.extend({ 10569 on: function (types, selector, data, fn) { 10570 return on(this, types, selector, data, fn); 10571 }, 10572 one: function (types, selector, data, fn) { 10573 return on(this, types, selector, data, fn, 1); 10574 }, 10575 off: function (types, selector, fn) { 10576 var handleObj, type; 10577 if (types && types.preventDefault && types.handleObj) { 10578 // ( event ) dispatched jQuery.Event 10579 handleObj = types.handleObj; 10580 jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler); 10581 return this; 10582 } 10583 if (typeof types === "object") { 10584 // ( types-object [, selector] ) 10585 for (type in types) { 10586 this.off(type, selector, types[type]); 10587 } 10588 return this; 10589 } 10590 if (selector === false || typeof selector === "function") { 10591 // ( types [, fn] ) 10592 fn = selector; 10593 selector = undefined; 10594 } 10595 if (fn === false) { 10596 fn = returnFalse; 10597 } 10598 return this.each(function () { 10599 jQuery.event.remove(this, types, fn, selector); 10600 }); 10601 } 10602 }); 10603 var 10604 // Support: IE <=10 - 11, Edge 12 - 13 only 10605 // In IE/Edge using regex groups here causes severe slowdowns. 10606 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 10607 rnoInnerhtml = /<script|<style|<link/i, 10608 // checked="checked" or checked 10609 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 10610 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; 10611 10612 // Prefer a tbody over its parent table for containing new rows 10613 function manipulationTarget(elem, content) { 10614 if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) { 10615 return jQuery(elem).children("tbody")[0] || elem; 10616 } 10617 return elem; 10618 } 10619 10620 // Replace/restore the type attribute of script elements for safe DOM manipulation 10621 function disableScript(elem) { 10622 elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; 10623 return elem; 10624 } 10625 function restoreScript(elem) { 10626 if ((elem.type || "").slice(0, 5) === "true/") { 10627 elem.type = elem.type.slice(5); 10628 } else { 10629 elem.removeAttribute("type"); 10630 } 10631 return elem; 10632 } 10633 function cloneCopyEvent(src, dest) { 10634 var i, l, type, pdataOld, udataOld, udataCur, events; 10635 if (dest.nodeType !== 1) { 10636 return; 10637 } 10638 10639 // 1. Copy private data: events, handlers, etc. 10640 if (dataPriv.hasData(src)) { 10641 pdataOld = dataPriv.get(src); 10642 events = pdataOld.events; 10643 if (events) { 10644 dataPriv.remove(dest, "handle events"); 10645 for (type in events) { 10646 for (i = 0, l = events[type].length; i < l; i++) { 10647 jQuery.event.add(dest, type, events[type][i]); 10648 } 10649 } 10650 } 10651 } 10652 10653 // 2. Copy user data 10654 if (dataUser.hasData(src)) { 10655 udataOld = dataUser.access(src); 10656 udataCur = jQuery.extend({}, udataOld); 10657 dataUser.set(dest, udataCur); 10658 } 10659 } 10660 10661 // Fix IE bugs, see support tests 10662 function fixInput(src, dest) { 10663 var nodeName = dest.nodeName.toLowerCase(); 10664 10665 // Fails to persist the checked state of a cloned checkbox or radio button. 10666 if (nodeName === "input" && rcheckableType.test(src.type)) { 10667 dest.checked = src.checked; 10668 10669 // Fails to return the selected option to the default selected state when cloning options 10670 } else if (nodeName === "input" || nodeName === "textarea") { 10671 dest.defaultValue = src.defaultValue; 10672 } 10673 } 10674 function domManip(collection, args, callback, ignored) { 10675 // Flatten any nested arrays 10676 args = flat(args); 10677 var fragment, 10678 first, 10679 scripts, 10680 hasScripts, 10681 node, 10682 doc, 10683 i = 0, 10684 l = collection.length, 10685 iNoClone = l - 1, 10686 value = args[0], 10687 valueIsFunction = isFunction(value); 10688 10689 // We can't cloneNode fragments that contain checked, in WebKit 10690 if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) { 10691 return collection.each(function (index) { 10692 var self = collection.eq(index); 10693 if (valueIsFunction) { 10694 args[0] = value.call(this, index, self.html()); 10695 } 10696 domManip(self, args, callback, ignored); 10697 }); 10698 } 10699 if (l) { 10700 fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); 10701 first = fragment.firstChild; 10702 if (fragment.childNodes.length === 1) { 10703 fragment = first; 10704 } 10705 10706 // Require either new content or an interest in ignored elements to invoke the callback 10707 if (first || ignored) { 10708 scripts = jQuery.map(getAll(fragment, "script"), disableScript); 10709 hasScripts = scripts.length; 10710 10711 // Use the original fragment for the last item 10712 // instead of the first because it can end up 10713 // being emptied incorrectly in certain situations (trac-8070). 10714 for (; i < l; i++) { 10715 node = fragment; 10716 if (i !== iNoClone) { 10717 node = jQuery.clone(node, true, true); 10718 10719 // Keep references to cloned scripts for later restoration 10720 if (hasScripts) { 10721 // Support: Android <=4.0 only, PhantomJS 1 only 10722 // push.apply(_, arraylike) throws on ancient WebKit 10723 jQuery.merge(scripts, getAll(node, "script")); 10724 } 10725 } 10726 callback.call(collection[i], node, i); 10727 } 10728 if (hasScripts) { 10729 doc = scripts[scripts.length - 1].ownerDocument; 10730 10731 // Re-enable scripts 10732 jQuery.map(scripts, restoreScript); 10733 10734 // Evaluate executable scripts on first document insertion 10735 for (i = 0; i < hasScripts; i++) { 10736 node = scripts[i]; 10737 if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) { 10738 if (node.src && (node.type || "").toLowerCase() !== "module") { 10739 // Optional AJAX dependency, but won't run scripts if not present 10740 if (jQuery._evalUrl && !node.noModule) { 10741 jQuery._evalUrl(node.src, { 10742 nonce: node.nonce || node.getAttribute("nonce") 10743 }, doc); 10744 } 10745 } else { 10746 // Unwrap a CDATA section containing script contents. This shouldn't be 10747 // needed as in XML documents they're already not visible when 10748 // inspecting element contents and in HTML documents they have no 10749 // meaning but we're preserving that logic for backwards compatibility. 10750 // This will be removed completely in 4.0. See gh-4904. 10751 DOMEval(node.textContent.replace(rcleanScript, ""), node, doc); 10752 } 10753 } 10754 } 10755 } 10756 } 10757 } 10758 return collection; 10759 } 10760 function remove(elem, selector, keepData) { 10761 var node, 10762 nodes = selector ? jQuery.filter(selector, elem) : elem, 10763 i = 0; 10764 for (; (node = nodes[i]) != null; i++) { 10765 if (!keepData && node.nodeType === 1) { 10766 jQuery.cleanData(getAll(node)); 10767 } 10768 if (node.parentNode) { 10769 if (keepData && isAttached(node)) { 10770 setGlobalEval(getAll(node, "script")); 10771 } 10772 node.parentNode.removeChild(node); 10773 } 10774 } 10775 return elem; 10776 } 10777 jQuery.extend({ 10778 htmlPrefilter: function (html) { 10779 return html; 10780 }, 10781 clone: function (elem, dataAndEvents, deepDataAndEvents) { 10782 var i, 10783 l, 10784 srcElements, 10785 destElements, 10786 clone = elem.cloneNode(true), 10787 inPage = isAttached(elem); 10788 10789 // Fix IE cloning issues 10790 if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { 10791 // We eschew jQuery#find here for performance reasons: 10792 // https://jsperf.com/getall-vs-sizzle/2 10793 destElements = getAll(clone); 10794 srcElements = getAll(elem); 10795 for (i = 0, l = srcElements.length; i < l; i++) { 10796 fixInput(srcElements[i], destElements[i]); 10797 } 10798 } 10799 10800 // Copy the events from the original to the clone 10801 if (dataAndEvents) { 10802 if (deepDataAndEvents) { 10803 srcElements = srcElements || getAll(elem); 10804 destElements = destElements || getAll(clone); 10805 for (i = 0, l = srcElements.length; i < l; i++) { 10806 cloneCopyEvent(srcElements[i], destElements[i]); 10807 } 10808 } else { 10809 cloneCopyEvent(elem, clone); 10810 } 10811 } 10812 10813 // Preserve script evaluation history 10814 destElements = getAll(clone, "script"); 10815 if (destElements.length > 0) { 10816 setGlobalEval(destElements, !inPage && getAll(elem, "script")); 10817 } 10818 10819 // Return the cloned set 10820 return clone; 10821 }, 10822 cleanData: function (elems) { 10823 var data, 10824 elem, 10825 type, 10826 special = jQuery.event.special, 10827 i = 0; 10828 for (; (elem = elems[i]) !== undefined; i++) { 10829 if (acceptData(elem)) { 10830 if (data = elem[dataPriv.expando]) { 10831 if (data.events) { 10832 for (type in data.events) { 10833 if (special[type]) { 10834 jQuery.event.remove(elem, type); 10835 10836 // This is a shortcut to avoid jQuery.event.remove's overhead 10837 } else { 10838 jQuery.removeEvent(elem, type, data.handle); 10839 } 10840 } 10841 } 10842 10843 // Support: Chrome <=35 - 45+ 10844 // Assign undefined instead of using delete, see Data#remove 10845 elem[dataPriv.expando] = undefined; 10846 } 10847 if (elem[dataUser.expando]) { 10848 // Support: Chrome <=35 - 45+ 10849 // Assign undefined instead of using delete, see Data#remove 10850 elem[dataUser.expando] = undefined; 10851 } 10852 } 10853 } 10854 } 10855 }); 10856 jQuery.fn.extend({ 10857 detach: function (selector) { 10858 return remove(this, selector, true); 10859 }, 10860 remove: function (selector) { 10861 return remove(this, selector); 10862 }, 10863 text: function (value) { 10864 return access(this, function (value) { 10865 return value === undefined ? jQuery.text(this) : this.empty().each(function () { 10866 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 10867 this.textContent = value; 10868 } 10869 }); 10870 }, null, value, arguments.length); 10871 }, 10872 append: function () { 10873 return domManip(this, arguments, function (elem) { 10874 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 10875 var target = manipulationTarget(this, elem); 10876 target.appendChild(elem); 10877 } 10878 }); 10879 }, 10880 prepend: function () { 10881 return domManip(this, arguments, function (elem) { 10882 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 10883 var target = manipulationTarget(this, elem); 10884 target.insertBefore(elem, target.firstChild); 10885 } 10886 }); 10887 }, 10888 before: function () { 10889 return domManip(this, arguments, function (elem) { 10890 if (this.parentNode) { 10891 this.parentNode.insertBefore(elem, this); 10892 } 10893 }); 10894 }, 10895 after: function () { 10896 return domManip(this, arguments, function (elem) { 10897 if (this.parentNode) { 10898 this.parentNode.insertBefore(elem, this.nextSibling); 10899 } 10900 }); 10901 }, 10902 empty: function () { 10903 var elem, 10904 i = 0; 10905 for (; (elem = this[i]) != null; i++) { 10906 if (elem.nodeType === 1) { 10907 // Prevent memory leaks 10908 jQuery.cleanData(getAll(elem, false)); 10909 10910 // Remove any remaining nodes 10911 elem.textContent = ""; 10912 } 10913 } 10914 return this; 10915 }, 10916 clone: function (dataAndEvents, deepDataAndEvents) { 10917 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 10918 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 10919 return this.map(function () { 10920 return jQuery.clone(this, dataAndEvents, deepDataAndEvents); 10921 }); 10922 }, 10923 html: function (value) { 10924 return access(this, function (value) { 10925 var elem = this[0] || {}, 10926 i = 0, 10927 l = this.length; 10928 if (value === undefined && elem.nodeType === 1) { 10929 return elem.innerHTML; 10930 } 10931 10932 // See if we can take a shortcut and just use innerHTML 10933 if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { 10934 value = jQuery.htmlPrefilter(value); 10935 try { 10936 for (; i < l; i++) { 10937 elem = this[i] || {}; 10938 10939 // Remove element nodes and prevent memory leaks 10940 if (elem.nodeType === 1) { 10941 jQuery.cleanData(getAll(elem, false)); 10942 elem.innerHTML = value; 10943 } 10944 } 10945 elem = 0; 10946 10947 // If using innerHTML throws an exception, use the fallback method 10948 } catch (e) {} 10949 } 10950 if (elem) { 10951 this.empty().append(value); 10952 } 10953 }, null, value, arguments.length); 10954 }, 10955 replaceWith: function () { 10956 var ignored = []; 10957 10958 // Make the changes, replacing each non-ignored context element with the new content 10959 return domManip(this, arguments, function (elem) { 10960 var parent = this.parentNode; 10961 if (jQuery.inArray(this, ignored) < 0) { 10962 jQuery.cleanData(getAll(this)); 10963 if (parent) { 10964 parent.replaceChild(elem, this); 10965 } 10966 } 10967 10968 // Force callback invocation 10969 }, ignored); 10970 } 10971 }); 10972 jQuery.each({ 10973 appendTo: "append", 10974 prependTo: "prepend", 10975 insertBefore: "before", 10976 insertAfter: "after", 10977 replaceAll: "replaceWith" 10978 }, function (name, original) { 10979 jQuery.fn[name] = function (selector) { 10980 var elems, 10981 ret = [], 10982 insert = jQuery(selector), 10983 last = insert.length - 1, 10984 i = 0; 10985 for (; i <= last; i++) { 10986 elems = i === last ? this : this.clone(true); 10987 jQuery(insert[i])[original](elems); 10988 10989 // Support: Android <=4.0 only, PhantomJS 1 only 10990 // .get() because push.apply(_, arraylike) throws on ancient WebKit 10991 push.apply(ret, elems.get()); 10992 } 10993 return this.pushStack(ret); 10994 }; 10995 }); 10996 var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); 10997 var rcustomProp = /^--/; 10998 var getStyles = function (elem) { 10999 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) 11000 // IE throws on elements created in popups 11001 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 11002 var view = elem.ownerDocument.defaultView; 11003 if (!view || !view.opener) { 11004 view = window; 11005 } 11006 return view.getComputedStyle(elem); 11007 }; 11008 var swap = function (elem, options, callback) { 11009 var ret, 11010 name, 11011 old = {}; 11012 11013 // Remember the old values, and insert the new ones 11014 for (name in options) { 11015 old[name] = elem.style[name]; 11016 elem.style[name] = options[name]; 11017 } 11018 ret = callback.call(elem); 11019 11020 // Revert the old values 11021 for (name in options) { 11022 elem.style[name] = old[name]; 11023 } 11024 return ret; 11025 }; 11026 var rboxStyle = new RegExp(cssExpand.join("|"), "i"); 11027 (function () { 11028 // Executing both pixelPosition & boxSizingReliable tests require only one layout 11029 // so they're executed at the same time to save the second computation. 11030 function computeStyleTests() { 11031 // This is a singleton, we need to execute it only once 11032 if (!div) { 11033 return; 11034 } 11035 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; 11036 div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; 11037 documentElement.appendChild(container).appendChild(div); 11038 var divStyle = window.getComputedStyle(div); 11039 pixelPositionVal = divStyle.top !== "1%"; 11040 11041 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 11042 reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12; 11043 11044 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 11045 // Some styles come back with percentage values, even though they shouldn't 11046 div.style.right = "60%"; 11047 pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36; 11048 11049 // Support: IE 9 - 11 only 11050 // Detect misreporting of content dimensions for box-sizing:border-box elements 11051 boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36; 11052 11053 // Support: IE 9 only 11054 // Detect overflow:scroll screwiness (gh-3699) 11055 // Support: Chrome <=64 11056 // Don't get tricked when zoom affects offsetWidth (gh-4029) 11057 div.style.position = "absolute"; 11058 scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12; 11059 documentElement.removeChild(container); 11060 11061 // Nullify the div so it wouldn't be stored in the memory and 11062 // it will also be a sign that checks already performed 11063 div = null; 11064 } 11065 function roundPixelMeasures(measure) { 11066 return Math.round(parseFloat(measure)); 11067 } 11068 var pixelPositionVal, 11069 boxSizingReliableVal, 11070 scrollboxSizeVal, 11071 pixelBoxStylesVal, 11072 reliableTrDimensionsVal, 11073 reliableMarginLeftVal, 11074 container = document.createElement("div"), 11075 div = document.createElement("div"); 11076 11077 // Finish early in limited (non-browser) environments 11078 if (!div.style) { 11079 return; 11080 } 11081 11082 // Support: IE <=9 - 11 only 11083 // Style of cloned element affects source element cloned (trac-8908) 11084 div.style.backgroundClip = "content-box"; 11085 div.cloneNode(true).style.backgroundClip = ""; 11086 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 11087 jQuery.extend(support, { 11088 boxSizingReliable: function () { 11089 computeStyleTests(); 11090 return boxSizingReliableVal; 11091 }, 11092 pixelBoxStyles: function () { 11093 computeStyleTests(); 11094 return pixelBoxStylesVal; 11095 }, 11096 pixelPosition: function () { 11097 computeStyleTests(); 11098 return pixelPositionVal; 11099 }, 11100 reliableMarginLeft: function () { 11101 computeStyleTests(); 11102 return reliableMarginLeftVal; 11103 }, 11104 scrollboxSize: function () { 11105 computeStyleTests(); 11106 return scrollboxSizeVal; 11107 }, 11108 // Support: IE 9 - 11+, Edge 15 - 18+ 11109 // IE/Edge misreport `getComputedStyle` of table rows with width/height 11110 // set in CSS while `offset*` properties report correct values. 11111 // Behavior in IE 9 is more subtle than in newer versions & it passes 11112 // some versions of this test; make sure not to make it pass there! 11113 // 11114 // Support: Firefox 70+ 11115 // Only Firefox includes border widths 11116 // in computed dimensions. (gh-4529) 11117 reliableTrDimensions: function () { 11118 var table, tr, trChild, trStyle; 11119 if (reliableTrDimensionsVal == null) { 11120 table = document.createElement("table"); 11121 tr = document.createElement("tr"); 11122 trChild = document.createElement("div"); 11123 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 11124 tr.style.cssText = "box-sizing:content-box;border:1px solid"; 11125 11126 // Support: Chrome 86+ 11127 // Height set through cssText does not get applied. 11128 // Computed height then comes back as 0. 11129 tr.style.height = "1px"; 11130 trChild.style.height = "9px"; 11131 11132 // Support: Android 8 Chrome 86+ 11133 // In our bodyBackground.html iframe, 11134 // display for all div elements is set to "inline", 11135 // which causes a problem only in Android 8 Chrome 86. 11136 // Ensuring the div is `display: block` 11137 // gets around this issue. 11138 trChild.style.display = "block"; 11139 documentElement.appendChild(table).appendChild(tr).appendChild(trChild); 11140 trStyle = window.getComputedStyle(tr); 11141 reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight; 11142 documentElement.removeChild(table); 11143 } 11144 return reliableTrDimensionsVal; 11145 } 11146 }); 11147 })(); 11148 function curCSS(elem, name, computed) { 11149 var width, 11150 minWidth, 11151 maxWidth, 11152 ret, 11153 isCustomProp = rcustomProp.test(name), 11154 // Support: Firefox 51+ 11155 // Retrieving style before computed somehow 11156 // fixes an issue with getting wrong values 11157 // on detached elements 11158 style = elem.style; 11159 computed = computed || getStyles(elem); 11160 11161 // getPropertyValue is needed for: 11162 // .css('filter') (IE 9 only, trac-12537) 11163 // .css('--customProperty) (gh-3144) 11164 if (computed) { 11165 // Support: IE <=9 - 11+ 11166 // IE only supports `"float"` in `getPropertyValue`; in computed styles 11167 // it's only available as `"cssFloat"`. We no longer modify properties 11168 // sent to `.css()` apart from camelCasing, so we need to check both. 11169 // Normally, this would create difference in behavior: if 11170 // `getPropertyValue` returns an empty string, the value returned 11171 // by `.css()` would be `undefined`. This is usually the case for 11172 // disconnected elements. However, in IE even disconnected elements 11173 // with no styles return `"none"` for `getPropertyValue( "float" )` 11174 ret = computed.getPropertyValue(name) || computed[name]; 11175 if (isCustomProp && ret) { 11176 // Support: Firefox 105+, Chrome <=105+ 11177 // Spec requires trimming whitespace for custom properties (gh-4926). 11178 // Firefox only trims leading whitespace. Chrome just collapses 11179 // both leading & trailing whitespace to a single space. 11180 // 11181 // Fall back to `undefined` if empty string returned. 11182 // This collapses a missing definition with property defined 11183 // and set to an empty string but there's no standard API 11184 // allowing us to differentiate them without a performance penalty 11185 // and returning `undefined` aligns with older jQuery. 11186 // 11187 // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED 11188 // as whitespace while CSS does not, but this is not a problem 11189 // because CSS preprocessing replaces them with U+000A LINE FEED 11190 // (which *is* CSS whitespace) 11191 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing 11192 ret = ret.replace(rtrimCSS, "$1") || undefined; 11193 } 11194 if (ret === "" && !isAttached(elem)) { 11195 ret = jQuery.style(elem, name); 11196 } 11197 11198 // A tribute to the "awesome hack by Dean Edwards" 11199 // Android Browser returns percentage for some values, 11200 // but width seems to be reliably pixels. 11201 // This is against the CSSOM draft spec: 11202 // https://drafts.csswg.org/cssom/#resolved-values 11203 if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) { 11204 // Remember the original values 11205 width = style.width; 11206 minWidth = style.minWidth; 11207 maxWidth = style.maxWidth; 11208 11209 // Put in the new values to get a computed value out 11210 style.minWidth = style.maxWidth = style.width = ret; 11211 ret = computed.width; 11212 11213 // Revert the changed values 11214 style.width = width; 11215 style.minWidth = minWidth; 11216 style.maxWidth = maxWidth; 11217 } 11218 } 11219 return ret !== undefined ? 11220 // Support: IE <=9 - 11 only 11221 // IE returns zIndex value as an integer. 11222 ret + "" : ret; 11223 } 11224 function addGetHookIf(conditionFn, hookFn) { 11225 // Define the hook, we'll check on the first run if it's really needed. 11226 return { 11227 get: function () { 11228 if (conditionFn()) { 11229 // Hook not needed (or it's not possible to use it due 11230 // to missing dependency), remove it. 11231 delete this.get; 11232 return; 11233 } 11234 11235 // Hook needed; redefine it so that the support test is not executed again. 11236 return (this.get = hookFn).apply(this, arguments); 11237 } 11238 }; 11239 } 11240 var cssPrefixes = ["Webkit", "Moz", "ms"], 11241 emptyStyle = document.createElement("div").style, 11242 vendorProps = {}; 11243 11244 // Return a vendor-prefixed property or undefined 11245 function vendorPropName(name) { 11246 // Check for vendor prefixed names 11247 var capName = name[0].toUpperCase() + name.slice(1), 11248 i = cssPrefixes.length; 11249 while (i--) { 11250 name = cssPrefixes[i] + capName; 11251 if (name in emptyStyle) { 11252 return name; 11253 } 11254 } 11255 } 11256 11257 // Return a potentially-mapped jQuery.cssProps or vendor prefixed property 11258 function finalPropName(name) { 11259 var final = jQuery.cssProps[name] || vendorProps[name]; 11260 if (final) { 11261 return final; 11262 } 11263 if (name in emptyStyle) { 11264 return name; 11265 } 11266 return vendorProps[name] = vendorPropName(name) || name; 11267 } 11268 var 11269 // Swappable if display is none or starts with table 11270 // except "table", "table-cell", or "table-caption" 11271 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 11272 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 11273 cssShow = { 11274 position: "absolute", 11275 visibility: "hidden", 11276 display: "block" 11277 }, 11278 cssNormalTransform = { 11279 letterSpacing: "0", 11280 fontWeight: "400" 11281 }; 11282 function setPositiveNumber(_elem, value, subtract) { 11283 // Any relative (+/-) values have already been 11284 // normalized at this point 11285 var matches = rcssNum.exec(value); 11286 return matches ? 11287 // Guard against undefined "subtract", e.g., when used as in cssHooks 11288 Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value; 11289 } 11290 function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) { 11291 var i = dimension === "width" ? 1 : 0, 11292 extra = 0, 11293 delta = 0, 11294 marginDelta = 0; 11295 11296 // Adjustment may not be necessary 11297 if (box === (isBorderBox ? "border" : "content")) { 11298 return 0; 11299 } 11300 for (; i < 4; i += 2) { 11301 // Both box models exclude margin 11302 // Count margin delta separately to only add it after scroll gutter adjustment. 11303 // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). 11304 if (box === "margin") { 11305 marginDelta += jQuery.css(elem, box + cssExpand[i], true, styles); 11306 } 11307 11308 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 11309 if (!isBorderBox) { 11310 // Add padding 11311 delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles); 11312 11313 // For "border" or "margin", add border 11314 if (box !== "padding") { 11315 delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 11316 11317 // But still keep track of it otherwise 11318 } else { 11319 extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 11320 } 11321 11322 // If we get here with a border-box (content + padding + border), we're seeking "content" or 11323 // "padding" or "margin" 11324 } else { 11325 // For "content", subtract padding 11326 if (box === "content") { 11327 delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles); 11328 } 11329 11330 // For "content" or "padding", subtract border 11331 if (box !== "margin") { 11332 delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 11333 } 11334 } 11335 } 11336 11337 // Account for positive content-box scroll gutter when requested by providing computedVal 11338 if (!isBorderBox && computedVal >= 0) { 11339 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 11340 // Assuming integer scroll gutter, subtract the rest and round down 11341 delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5 11342 11343 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 11344 // Use an explicit zero to avoid NaN (gh-3964) 11345 )) || 0; 11346 } 11347 return delta + marginDelta; 11348 } 11349 function getWidthOrHeight(elem, dimension, extra) { 11350 // Start with computed style 11351 var styles = getStyles(elem), 11352 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 11353 // Fake content-box until we know it's needed to know the true value. 11354 boxSizingNeeded = !support.boxSizingReliable() || extra, 11355 isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", 11356 valueIsBorderBox = isBorderBox, 11357 val = curCSS(elem, dimension, styles), 11358 offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1); 11359 11360 // Support: Firefox <=54 11361 // Return a confounding non-pixel value or feign ignorance, as appropriate. 11362 if (rnumnonpx.test(val)) { 11363 if (!extra) { 11364 return val; 11365 } 11366 val = "auto"; 11367 } 11368 11369 // Support: IE 9 - 11 only 11370 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 11371 // In those cases, the computed value can be trusted to be border-box. 11372 if ((!support.boxSizingReliable() && isBorderBox || 11373 // Support: IE 10 - 11+, Edge 15 - 18+ 11374 // IE/Edge misreport `getComputedStyle` of table rows with width/height 11375 // set in CSS while `offset*` properties report correct values. 11376 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 11377 !support.reliableTrDimensions() && nodeName(elem, "tr") || 11378 // Fall back to offsetWidth/offsetHeight when value is "auto" 11379 // This happens for inline elements with no explicit setting (gh-3571) 11380 val === "auto" || 11381 // Support: Android <=4.1 - 4.3 only 11382 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 11383 !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") && 11384 // Make sure the element is visible & connected 11385 elem.getClientRects().length) { 11386 isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box"; 11387 11388 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 11389 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 11390 // retrieved value as a content box dimension. 11391 valueIsBorderBox = offsetProp in elem; 11392 if (valueIsBorderBox) { 11393 val = elem[offsetProp]; 11394 } 11395 } 11396 11397 // Normalize "" and auto 11398 val = parseFloat(val) || 0; 11399 11400 // Adjust for the element's box model 11401 return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles, 11402 // Provide the current computed size to request scroll gutter calculation (gh-3589) 11403 val) + "px"; 11404 } 11405 jQuery.extend({ 11406 // Add in style property hooks for overriding the default 11407 // behavior of getting and setting a style property 11408 cssHooks: { 11409 opacity: { 11410 get: function (elem, computed) { 11411 if (computed) { 11412 // We should always get a number back from opacity 11413 var ret = curCSS(elem, "opacity"); 11414 return ret === "" ? "1" : ret; 11415 } 11416 } 11417 } 11418 }, 11419 // Don't automatically add "px" to these possibly-unitless properties 11420 cssNumber: { 11421 animationIterationCount: true, 11422 aspectRatio: true, 11423 borderImageSlice: true, 11424 columnCount: true, 11425 flexGrow: true, 11426 flexShrink: true, 11427 fontWeight: true, 11428 gridArea: true, 11429 gridColumn: true, 11430 gridColumnEnd: true, 11431 gridColumnStart: true, 11432 gridRow: true, 11433 gridRowEnd: true, 11434 gridRowStart: true, 11435 lineHeight: true, 11436 opacity: true, 11437 order: true, 11438 orphans: true, 11439 scale: true, 11440 widows: true, 11441 zIndex: true, 11442 zoom: true, 11443 // SVG-related 11444 fillOpacity: true, 11445 floodOpacity: true, 11446 stopOpacity: true, 11447 strokeMiterlimit: true, 11448 strokeOpacity: true 11449 }, 11450 // Add in properties whose names you wish to fix before 11451 // setting or getting the value 11452 cssProps: {}, 11453 // Get and set the style property on a DOM Node 11454 style: function (elem, name, value, extra) { 11455 // Don't set styles on text and comment nodes 11456 if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { 11457 return; 11458 } 11459 11460 // Make sure that we're working with the right name 11461 var ret, 11462 type, 11463 hooks, 11464 origName = camelCase(name), 11465 isCustomProp = rcustomProp.test(name), 11466 style = elem.style; 11467 11468 // Make sure that we're working with the right name. We don't 11469 // want to query the value if it is a CSS custom property 11470 // since they are user-defined. 11471 if (!isCustomProp) { 11472 name = finalPropName(origName); 11473 } 11474 11475 // Gets hook for the prefixed version, then unprefixed version 11476 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; 11477 11478 // Check if we're setting a value 11479 if (value !== undefined) { 11480 type = typeof value; 11481 11482 // Convert "+=" or "-=" to relative numbers (trac-7345) 11483 if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) { 11484 value = adjustCSS(elem, name, ret); 11485 11486 // Fixes bug trac-9237 11487 type = "number"; 11488 } 11489 11490 // Make sure that null and NaN values aren't set (trac-7116) 11491 if (value == null || value !== value) { 11492 return; 11493 } 11494 11495 // If a number was passed in, add the unit (except for certain CSS properties) 11496 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 11497 // "px" to a few hardcoded values. 11498 if (type === "number" && !isCustomProp) { 11499 value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px"); 11500 } 11501 11502 // background-* props affect original clone's values 11503 if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) { 11504 style[name] = "inherit"; 11505 } 11506 11507 // If a hook was provided, use that value, otherwise just set the specified value 11508 if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) { 11509 if (isCustomProp) { 11510 style.setProperty(name, value); 11511 } else { 11512 style[name] = value; 11513 } 11514 } 11515 } else { 11516 // If a hook was provided get the non-computed value from there 11517 if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) { 11518 return ret; 11519 } 11520 11521 // Otherwise just get the value from the style object 11522 return style[name]; 11523 } 11524 }, 11525 css: function (elem, name, extra, styles) { 11526 var val, 11527 num, 11528 hooks, 11529 origName = camelCase(name), 11530 isCustomProp = rcustomProp.test(name); 11531 11532 // Make sure that we're working with the right name. We don't 11533 // want to modify the value if it is a CSS custom property 11534 // since they are user-defined. 11535 if (!isCustomProp) { 11536 name = finalPropName(origName); 11537 } 11538 11539 // Try prefixed name followed by the unprefixed name 11540 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; 11541 11542 // If a hook was provided get the computed value from there 11543 if (hooks && "get" in hooks) { 11544 val = hooks.get(elem, true, extra); 11545 } 11546 11547 // Otherwise, if a way to get the computed value exists, use that 11548 if (val === undefined) { 11549 val = curCSS(elem, name, styles); 11550 } 11551 11552 // Convert "normal" to computed value 11553 if (val === "normal" && name in cssNormalTransform) { 11554 val = cssNormalTransform[name]; 11555 } 11556 11557 // Make numeric if forced or a qualifier was provided and val looks numeric 11558 if (extra === "" || extra) { 11559 num = parseFloat(val); 11560 return extra === true || isFinite(num) ? num || 0 : val; 11561 } 11562 return val; 11563 } 11564 }); 11565 jQuery.each(["height", "width"], function (_i, dimension) { 11566 jQuery.cssHooks[dimension] = { 11567 get: function (elem, computed, extra) { 11568 if (computed) { 11569 // Certain elements can have dimension info if we invisibly show them 11570 // but it must have a current display style that would benefit 11571 return rdisplayswap.test(jQuery.css(elem, "display")) && ( 11572 // Support: Safari 8+ 11573 // Table columns in Safari have non-zero offsetWidth & zero 11574 // getBoundingClientRect().width unless display is changed. 11575 // Support: IE <=11 only 11576 // Running getBoundingClientRect on a disconnected node 11577 // in IE throws an error. 11578 !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () { 11579 return getWidthOrHeight(elem, dimension, extra); 11580 }) : getWidthOrHeight(elem, dimension, extra); 11581 } 11582 }, 11583 set: function (elem, value, extra) { 11584 var matches, 11585 styles = getStyles(elem), 11586 // Only read styles.position if the test has a chance to fail 11587 // to avoid forcing a reflow. 11588 scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", 11589 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 11590 boxSizingNeeded = scrollboxSizeBuggy || extra, 11591 isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", 11592 subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0; 11593 11594 // Account for unreliable border-box dimensions by comparing offset* to computed and 11595 // faking a content-box to get border and padding (gh-3699) 11596 if (isBorderBox && scrollboxSizeBuggy) { 11597 subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5); 11598 } 11599 11600 // Convert to pixels if value adjustment is needed 11601 if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") { 11602 elem.style[dimension] = value; 11603 value = jQuery.css(elem, dimension); 11604 } 11605 return setPositiveNumber(elem, value, subtract); 11606 } 11607 }; 11608 }); 11609 jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) { 11610 if (computed) { 11611 return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { 11612 marginLeft: 0 11613 }, function () { 11614 return elem.getBoundingClientRect().left; 11615 })) + "px"; 11616 } 11617 }); 11618 11619 // These hooks are used by animate to expand properties 11620 jQuery.each({ 11621 margin: "", 11622 padding: "", 11623 border: "Width" 11624 }, function (prefix, suffix) { 11625 jQuery.cssHooks[prefix + suffix] = { 11626 expand: function (value) { 11627 var i = 0, 11628 expanded = {}, 11629 // Assumes a single number if not a string 11630 parts = typeof value === "string" ? value.split(" ") : [value]; 11631 for (; i < 4; i++) { 11632 expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0]; 11633 } 11634 return expanded; 11635 } 11636 }; 11637 if (prefix !== "margin") { 11638 jQuery.cssHooks[prefix + suffix].set = setPositiveNumber; 11639 } 11640 }); 11641 jQuery.fn.extend({ 11642 css: function (name, value) { 11643 return access(this, function (elem, name, value) { 11644 var styles, 11645 len, 11646 map = {}, 11647 i = 0; 11648 if (Array.isArray(name)) { 11649 styles = getStyles(elem); 11650 len = name.length; 11651 for (; i < len; i++) { 11652 map[name[i]] = jQuery.css(elem, name[i], false, styles); 11653 } 11654 return map; 11655 } 11656 return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name); 11657 }, name, value, arguments.length > 1); 11658 } 11659 }); 11660 function Tween(elem, options, prop, end, easing) { 11661 return new Tween.prototype.init(elem, options, prop, end, easing); 11662 } 11663 jQuery.Tween = Tween; 11664 Tween.prototype = { 11665 constructor: Tween, 11666 init: function (elem, options, prop, end, easing, unit) { 11667 this.elem = elem; 11668 this.prop = prop; 11669 this.easing = easing || jQuery.easing._default; 11670 this.options = options; 11671 this.start = this.now = this.cur(); 11672 this.end = end; 11673 this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px"); 11674 }, 11675 cur: function () { 11676 var hooks = Tween.propHooks[this.prop]; 11677 return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this); 11678 }, 11679 run: function (percent) { 11680 var eased, 11681 hooks = Tween.propHooks[this.prop]; 11682 if (this.options.duration) { 11683 this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration); 11684 } else { 11685 this.pos = eased = percent; 11686 } 11687 this.now = (this.end - this.start) * eased + this.start; 11688 if (this.options.step) { 11689 this.options.step.call(this.elem, this.now, this); 11690 } 11691 if (hooks && hooks.set) { 11692 hooks.set(this); 11693 } else { 11694 Tween.propHooks._default.set(this); 11695 } 11696 return this; 11697 } 11698 }; 11699 Tween.prototype.init.prototype = Tween.prototype; 11700 Tween.propHooks = { 11701 _default: { 11702 get: function (tween) { 11703 var result; 11704 11705 // Use a property on the element directly when it is not a DOM element, 11706 // or when there is no matching style property that exists. 11707 if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { 11708 return tween.elem[tween.prop]; 11709 } 11710 11711 // Passing an empty string as a 3rd parameter to .css will automatically 11712 // attempt a parseFloat and fallback to a string if the parse fails. 11713 // Simple values such as "10px" are parsed to Float; 11714 // complex values such as "rotate(1rad)" are returned as-is. 11715 result = jQuery.css(tween.elem, tween.prop, ""); 11716 11717 // Empty strings, null, undefined and "auto" are converted to 0. 11718 return !result || result === "auto" ? 0 : result; 11719 }, 11720 set: function (tween) { 11721 // Use step hook for back compat. 11722 // Use cssHook if its there. 11723 // Use .style if available and use plain properties where available. 11724 if (jQuery.fx.step[tween.prop]) { 11725 jQuery.fx.step[tween.prop](tween); 11726 } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) { 11727 jQuery.style(tween.elem, tween.prop, tween.now + tween.unit); 11728 } else { 11729 tween.elem[tween.prop] = tween.now; 11730 } 11731 } 11732 } 11733 }; 11734 11735 // Support: IE <=9 only 11736 // Panic based approach to setting things on disconnected nodes 11737 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 11738 set: function (tween) { 11739 if (tween.elem.nodeType && tween.elem.parentNode) { 11740 tween.elem[tween.prop] = tween.now; 11741 } 11742 } 11743 }; 11744 jQuery.easing = { 11745 linear: function (p) { 11746 return p; 11747 }, 11748 swing: function (p) { 11749 return 0.5 - Math.cos(p * Math.PI) / 2; 11750 }, 11751 _default: "swing" 11752 }; 11753 jQuery.fx = Tween.prototype.init; 11754 11755 // Back compat <1.8 extension point 11756 jQuery.fx.step = {}; 11757 var fxNow, 11758 inProgress, 11759 rfxtypes = /^(?:toggle|show|hide)$/, 11760 rrun = /queueHooks$/; 11761 function schedule() { 11762 if (inProgress) { 11763 if (document.hidden === false && window.requestAnimationFrame) { 11764 window.requestAnimationFrame(schedule); 11765 } else { 11766 window.setTimeout(schedule, jQuery.fx.interval); 11767 } 11768 jQuery.fx.tick(); 11769 } 11770 } 11771 11772 // Animations created synchronously will run synchronously 11773 function createFxNow() { 11774 window.setTimeout(function () { 11775 fxNow = undefined; 11776 }); 11777 return fxNow = Date.now(); 11778 } 11779 11780 // Generate parameters to create a standard animation 11781 function genFx(type, includeWidth) { 11782 var which, 11783 i = 0, 11784 attrs = { 11785 height: type 11786 }; 11787 11788 // If we include width, step value is 1 to do all cssExpand values, 11789 // otherwise step value is 2 to skip over Left and Right 11790 includeWidth = includeWidth ? 1 : 0; 11791 for (; i < 4; i += 2 - includeWidth) { 11792 which = cssExpand[i]; 11793 attrs["margin" + which] = attrs["padding" + which] = type; 11794 } 11795 if (includeWidth) { 11796 attrs.opacity = attrs.width = type; 11797 } 11798 return attrs; 11799 } 11800 function createTween(value, prop, animation) { 11801 var tween, 11802 collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), 11803 index = 0, 11804 length = collection.length; 11805 for (; index < length; index++) { 11806 if (tween = collection[index].call(animation, prop, value)) { 11807 // We're done with this property 11808 return tween; 11809 } 11810 } 11811 } 11812 function defaultPrefilter(elem, props, opts) { 11813 var prop, 11814 value, 11815 toggle, 11816 hooks, 11817 oldfire, 11818 propTween, 11819 restoreDisplay, 11820 display, 11821 isBox = "width" in props || "height" in props, 11822 anim = this, 11823 orig = {}, 11824 style = elem.style, 11825 hidden = elem.nodeType && isHiddenWithinTree(elem), 11826 dataShow = dataPriv.get(elem, "fxshow"); 11827 11828 // Queue-skipping animations hijack the fx hooks 11829 if (!opts.queue) { 11830 hooks = jQuery._queueHooks(elem, "fx"); 11831 if (hooks.unqueued == null) { 11832 hooks.unqueued = 0; 11833 oldfire = hooks.empty.fire; 11834 hooks.empty.fire = function () { 11835 if (!hooks.unqueued) { 11836 oldfire(); 11837 } 11838 }; 11839 } 11840 hooks.unqueued++; 11841 anim.always(function () { 11842 // Ensure the complete handler is called before this completes 11843 anim.always(function () { 11844 hooks.unqueued--; 11845 if (!jQuery.queue(elem, "fx").length) { 11846 hooks.empty.fire(); 11847 } 11848 }); 11849 }); 11850 } 11851 11852 // Detect show/hide animations 11853 for (prop in props) { 11854 value = props[prop]; 11855 if (rfxtypes.test(value)) { 11856 delete props[prop]; 11857 toggle = toggle || value === "toggle"; 11858 if (value === (hidden ? "hide" : "show")) { 11859 // Pretend to be hidden if this is a "show" and 11860 // there is still data from a stopped show/hide 11861 if (value === "show" && dataShow && dataShow[prop] !== undefined) { 11862 hidden = true; 11863 11864 // Ignore all other no-op show/hide data 11865 } else { 11866 continue; 11867 } 11868 } 11869 orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop); 11870 } 11871 } 11872 11873 // Bail out if this is a no-op like .hide().hide() 11874 propTween = !jQuery.isEmptyObject(props); 11875 if (!propTween && jQuery.isEmptyObject(orig)) { 11876 return; 11877 } 11878 11879 // Restrict "overflow" and "display" styles during box animations 11880 if (isBox && elem.nodeType === 1) { 11881 // Support: IE <=9 - 11, Edge 12 - 15 11882 // Record all 3 overflow attributes because IE does not infer the shorthand 11883 // from identically-valued overflowX and overflowY and Edge just mirrors 11884 // the overflowX value there. 11885 opts.overflow = [style.overflow, style.overflowX, style.overflowY]; 11886 11887 // Identify a display type, preferring old show/hide data over the CSS cascade 11888 restoreDisplay = dataShow && dataShow.display; 11889 if (restoreDisplay == null) { 11890 restoreDisplay = dataPriv.get(elem, "display"); 11891 } 11892 display = jQuery.css(elem, "display"); 11893 if (display === "none") { 11894 if (restoreDisplay) { 11895 display = restoreDisplay; 11896 } else { 11897 // Get nonempty value(s) by temporarily forcing visibility 11898 showHide([elem], true); 11899 restoreDisplay = elem.style.display || restoreDisplay; 11900 display = jQuery.css(elem, "display"); 11901 showHide([elem]); 11902 } 11903 } 11904 11905 // Animate inline elements as inline-block 11906 if (display === "inline" || display === "inline-block" && restoreDisplay != null) { 11907 if (jQuery.css(elem, "float") === "none") { 11908 // Restore the original display value at the end of pure show/hide animations 11909 if (!propTween) { 11910 anim.done(function () { 11911 style.display = restoreDisplay; 11912 }); 11913 if (restoreDisplay == null) { 11914 display = style.display; 11915 restoreDisplay = display === "none" ? "" : display; 11916 } 11917 } 11918 style.display = "inline-block"; 11919 } 11920 } 11921 } 11922 if (opts.overflow) { 11923 style.overflow = "hidden"; 11924 anim.always(function () { 11925 style.overflow = opts.overflow[0]; 11926 style.overflowX = opts.overflow[1]; 11927 style.overflowY = opts.overflow[2]; 11928 }); 11929 } 11930 11931 // Implement show/hide animations 11932 propTween = false; 11933 for (prop in orig) { 11934 // General show/hide setup for this element animation 11935 if (!propTween) { 11936 if (dataShow) { 11937 if ("hidden" in dataShow) { 11938 hidden = dataShow.hidden; 11939 } 11940 } else { 11941 dataShow = dataPriv.access(elem, "fxshow", { 11942 display: restoreDisplay 11943 }); 11944 } 11945 11946 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 11947 if (toggle) { 11948 dataShow.hidden = !hidden; 11949 } 11950 11951 // Show elements before animating them 11952 if (hidden) { 11953 showHide([elem], true); 11954 } 11955 11956 /* eslint-disable no-loop-func */ 11957 11958 anim.done(function () { 11959 /* eslint-enable no-loop-func */ 11960 11961 // The final step of a "hide" animation is actually hiding the element 11962 if (!hidden) { 11963 showHide([elem]); 11964 } 11965 dataPriv.remove(elem, "fxshow"); 11966 for (prop in orig) { 11967 jQuery.style(elem, prop, orig[prop]); 11968 } 11969 }); 11970 } 11971 11972 // Per-property setup 11973 propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim); 11974 if (!(prop in dataShow)) { 11975 dataShow[prop] = propTween.start; 11976 if (hidden) { 11977 propTween.end = propTween.start; 11978 propTween.start = 0; 11979 } 11980 } 11981 } 11982 } 11983 function propFilter(props, specialEasing) { 11984 var index, name, easing, value, hooks; 11985 11986 // camelCase, specialEasing and expand cssHook pass 11987 for (index in props) { 11988 name = camelCase(index); 11989 easing = specialEasing[name]; 11990 value = props[index]; 11991 if (Array.isArray(value)) { 11992 easing = value[1]; 11993 value = props[index] = value[0]; 11994 } 11995 if (index !== name) { 11996 props[name] = value; 11997 delete props[index]; 11998 } 11999 hooks = jQuery.cssHooks[name]; 12000 if (hooks && "expand" in hooks) { 12001 value = hooks.expand(value); 12002 delete props[name]; 12003 12004 // Not quite $.extend, this won't overwrite existing keys. 12005 // Reusing 'index' because we have the correct "name" 12006 for (index in value) { 12007 if (!(index in props)) { 12008 props[index] = value[index]; 12009 specialEasing[index] = easing; 12010 } 12011 } 12012 } else { 12013 specialEasing[name] = easing; 12014 } 12015 } 12016 } 12017 function Animation(elem, properties, options) { 12018 var result, 12019 stopped, 12020 index = 0, 12021 length = Animation.prefilters.length, 12022 deferred = jQuery.Deferred().always(function () { 12023 // Don't match elem in the :animated selector 12024 delete tick.elem; 12025 }), 12026 tick = function () { 12027 if (stopped) { 12028 return false; 12029 } 12030 var currentTime = fxNow || createFxNow(), 12031 remaining = Math.max(0, animation.startTime + animation.duration - currentTime), 12032 // Support: Android 2.3 only 12033 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) 12034 temp = remaining / animation.duration || 0, 12035 percent = 1 - temp, 12036 index = 0, 12037 length = animation.tweens.length; 12038 for (; index < length; index++) { 12039 animation.tweens[index].run(percent); 12040 } 12041 deferred.notifyWith(elem, [animation, percent, remaining]); 12042 12043 // If there's more to do, yield 12044 if (percent < 1 && length) { 12045 return remaining; 12046 } 12047 12048 // If this was an empty animation, synthesize a final progress notification 12049 if (!length) { 12050 deferred.notifyWith(elem, [animation, 1, 0]); 12051 } 12052 12053 // Resolve the animation and report its conclusion 12054 deferred.resolveWith(elem, [animation]); 12055 return false; 12056 }, 12057 animation = deferred.promise({ 12058 elem: elem, 12059 props: jQuery.extend({}, properties), 12060 opts: jQuery.extend(true, { 12061 specialEasing: {}, 12062 easing: jQuery.easing._default 12063 }, options), 12064 originalProperties: properties, 12065 originalOptions: options, 12066 startTime: fxNow || createFxNow(), 12067 duration: options.duration, 12068 tweens: [], 12069 createTween: function (prop, end) { 12070 var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing); 12071 animation.tweens.push(tween); 12072 return tween; 12073 }, 12074 stop: function (gotoEnd) { 12075 var index = 0, 12076 // If we are going to the end, we want to run all the tweens 12077 // otherwise we skip this part 12078 length = gotoEnd ? animation.tweens.length : 0; 12079 if (stopped) { 12080 return this; 12081 } 12082 stopped = true; 12083 for (; index < length; index++) { 12084 animation.tweens[index].run(1); 12085 } 12086 12087 // Resolve when we played the last frame; otherwise, reject 12088 if (gotoEnd) { 12089 deferred.notifyWith(elem, [animation, 1, 0]); 12090 deferred.resolveWith(elem, [animation, gotoEnd]); 12091 } else { 12092 deferred.rejectWith(elem, [animation, gotoEnd]); 12093 } 12094 return this; 12095 } 12096 }), 12097 props = animation.props; 12098 propFilter(props, animation.opts.specialEasing); 12099 for (; index < length; index++) { 12100 result = Animation.prefilters[index].call(animation, elem, props, animation.opts); 12101 if (result) { 12102 if (isFunction(result.stop)) { 12103 jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result); 12104 } 12105 return result; 12106 } 12107 } 12108 jQuery.map(props, createTween, animation); 12109 if (isFunction(animation.opts.start)) { 12110 animation.opts.start.call(elem, animation); 12111 } 12112 12113 // Attach callbacks from options 12114 animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always); 12115 jQuery.fx.timer(jQuery.extend(tick, { 12116 elem: elem, 12117 anim: animation, 12118 queue: animation.opts.queue 12119 })); 12120 return animation; 12121 } 12122 jQuery.Animation = jQuery.extend(Animation, { 12123 tweeners: { 12124 "*": [function (prop, value) { 12125 var tween = this.createTween(prop, value); 12126 adjustCSS(tween.elem, prop, rcssNum.exec(value), tween); 12127 return tween; 12128 }] 12129 }, 12130 tweener: function (props, callback) { 12131 if (isFunction(props)) { 12132 callback = props; 12133 props = ["*"]; 12134 } else { 12135 props = props.match(rnothtmlwhite); 12136 } 12137 var prop, 12138 index = 0, 12139 length = props.length; 12140 for (; index < length; index++) { 12141 prop = props[index]; 12142 Animation.tweeners[prop] = Animation.tweeners[prop] || []; 12143 Animation.tweeners[prop].unshift(callback); 12144 } 12145 }, 12146 prefilters: [defaultPrefilter], 12147 prefilter: function (callback, prepend) { 12148 if (prepend) { 12149 Animation.prefilters.unshift(callback); 12150 } else { 12151 Animation.prefilters.push(callback); 12152 } 12153 } 12154 }); 12155 jQuery.speed = function (speed, easing, fn) { 12156 var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { 12157 complete: fn || !fn && easing || isFunction(speed) && speed, 12158 duration: speed, 12159 easing: fn && easing || easing && !isFunction(easing) && easing 12160 }; 12161 12162 // Go to the end state if fx are off 12163 if (jQuery.fx.off) { 12164 opt.duration = 0; 12165 } else { 12166 if (typeof opt.duration !== "number") { 12167 if (opt.duration in jQuery.fx.speeds) { 12168 opt.duration = jQuery.fx.speeds[opt.duration]; 12169 } else { 12170 opt.duration = jQuery.fx.speeds._default; 12171 } 12172 } 12173 } 12174 12175 // Normalize opt.queue - true/undefined/null -> "fx" 12176 if (opt.queue == null || opt.queue === true) { 12177 opt.queue = "fx"; 12178 } 12179 12180 // Queueing 12181 opt.old = opt.complete; 12182 opt.complete = function () { 12183 if (isFunction(opt.old)) { 12184 opt.old.call(this); 12185 } 12186 if (opt.queue) { 12187 jQuery.dequeue(this, opt.queue); 12188 } 12189 }; 12190 return opt; 12191 }; 12192 jQuery.fn.extend({ 12193 fadeTo: function (speed, to, easing, callback) { 12194 // Show any hidden elements after setting opacity to 0 12195 return this.filter(isHiddenWithinTree).css("opacity", 0).show() 12196 12197 // Animate to the value specified 12198 .end().animate({ 12199 opacity: to 12200 }, speed, easing, callback); 12201 }, 12202 animate: function (prop, speed, easing, callback) { 12203 var empty = jQuery.isEmptyObject(prop), 12204 optall = jQuery.speed(speed, easing, callback), 12205 doAnimation = function () { 12206 // Operate on a copy of prop so per-property easing won't be lost 12207 var anim = Animation(this, jQuery.extend({}, prop), optall); 12208 12209 // Empty animations, or finishing resolves immediately 12210 if (empty || dataPriv.get(this, "finish")) { 12211 anim.stop(true); 12212 } 12213 }; 12214 doAnimation.finish = doAnimation; 12215 return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation); 12216 }, 12217 stop: function (type, clearQueue, gotoEnd) { 12218 var stopQueue = function (hooks) { 12219 var stop = hooks.stop; 12220 delete hooks.stop; 12221 stop(gotoEnd); 12222 }; 12223 if (typeof type !== "string") { 12224 gotoEnd = clearQueue; 12225 clearQueue = type; 12226 type = undefined; 12227 } 12228 if (clearQueue) { 12229 this.queue(type || "fx", []); 12230 } 12231 return this.each(function () { 12232 var dequeue = true, 12233 index = type != null && type + "queueHooks", 12234 timers = jQuery.timers, 12235 data = dataPriv.get(this); 12236 if (index) { 12237 if (data[index] && data[index].stop) { 12238 stopQueue(data[index]); 12239 } 12240 } else { 12241 for (index in data) { 12242 if (data[index] && data[index].stop && rrun.test(index)) { 12243 stopQueue(data[index]); 12244 } 12245 } 12246 } 12247 for (index = timers.length; index--;) { 12248 if (timers[index].elem === this && (type == null || timers[index].queue === type)) { 12249 timers[index].anim.stop(gotoEnd); 12250 dequeue = false; 12251 timers.splice(index, 1); 12252 } 12253 } 12254 12255 // Start the next in the queue if the last step wasn't forced. 12256 // Timers currently will call their complete callbacks, which 12257 // will dequeue but only if they were gotoEnd. 12258 if (dequeue || !gotoEnd) { 12259 jQuery.dequeue(this, type); 12260 } 12261 }); 12262 }, 12263 finish: function (type) { 12264 if (type !== false) { 12265 type = type || "fx"; 12266 } 12267 return this.each(function () { 12268 var index, 12269 data = dataPriv.get(this), 12270 queue = data[type + "queue"], 12271 hooks = data[type + "queueHooks"], 12272 timers = jQuery.timers, 12273 length = queue ? queue.length : 0; 12274 12275 // Enable finishing flag on private data 12276 data.finish = true; 12277 12278 // Empty the queue first 12279 jQuery.queue(this, type, []); 12280 if (hooks && hooks.stop) { 12281 hooks.stop.call(this, true); 12282 } 12283 12284 // Look for any active animations, and finish them 12285 for (index = timers.length; index--;) { 12286 if (timers[index].elem === this && timers[index].queue === type) { 12287 timers[index].anim.stop(true); 12288 timers.splice(index, 1); 12289 } 12290 } 12291 12292 // Look for any animations in the old queue and finish them 12293 for (index = 0; index < length; index++) { 12294 if (queue[index] && queue[index].finish) { 12295 queue[index].finish.call(this); 12296 } 12297 } 12298 12299 // Turn off finishing flag 12300 delete data.finish; 12301 }); 12302 } 12303 }); 12304 jQuery.each(["toggle", "show", "hide"], function (_i, name) { 12305 var cssFn = jQuery.fn[name]; 12306 jQuery.fn[name] = function (speed, easing, callback) { 12307 return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback); 12308 }; 12309 }); 12310 12311 // Generate shortcuts for custom animations 12312 jQuery.each({ 12313 slideDown: genFx("show"), 12314 slideUp: genFx("hide"), 12315 slideToggle: genFx("toggle"), 12316 fadeIn: { 12317 opacity: "show" 12318 }, 12319 fadeOut: { 12320 opacity: "hide" 12321 }, 12322 fadeToggle: { 12323 opacity: "toggle" 12324 } 12325 }, function (name, props) { 12326 jQuery.fn[name] = function (speed, easing, callback) { 12327 return this.animate(props, speed, easing, callback); 12328 }; 12329 }); 12330 jQuery.timers = []; 12331 jQuery.fx.tick = function () { 12332 var timer, 12333 i = 0, 12334 timers = jQuery.timers; 12335 fxNow = Date.now(); 12336 for (; i < timers.length; i++) { 12337 timer = timers[i]; 12338 12339 // Run the timer and safely remove it when done (allowing for external removal) 12340 if (!timer() && timers[i] === timer) { 12341 timers.splice(i--, 1); 12342 } 12343 } 12344 if (!timers.length) { 12345 jQuery.fx.stop(); 12346 } 12347 fxNow = undefined; 12348 }; 12349 jQuery.fx.timer = function (timer) { 12350 jQuery.timers.push(timer); 12351 jQuery.fx.start(); 12352 }; 12353 jQuery.fx.interval = 13; 12354 jQuery.fx.start = function () { 12355 if (inProgress) { 12356 return; 12357 } 12358 inProgress = true; 12359 schedule(); 12360 }; 12361 jQuery.fx.stop = function () { 12362 inProgress = null; 12363 }; 12364 jQuery.fx.speeds = { 12365 slow: 600, 12366 fast: 200, 12367 // Default speed 12368 _default: 400 12369 }; 12370 12371 // Based off of the plugin by Clint Helfers, with permission. 12372 jQuery.fn.delay = function (time, type) { 12373 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; 12374 type = type || "fx"; 12375 return this.queue(type, function (next, hooks) { 12376 var timeout = window.setTimeout(next, time); 12377 hooks.stop = function () { 12378 window.clearTimeout(timeout); 12379 }; 12380 }); 12381 }; 12382 (function () { 12383 var input = document.createElement("input"), 12384 select = document.createElement("select"), 12385 opt = select.appendChild(document.createElement("option")); 12386 input.type = "checkbox"; 12387 12388 // Support: Android <=4.3 only 12389 // Default value for a checkbox should be "on" 12390 support.checkOn = input.value !== ""; 12391 12392 // Support: IE <=11 only 12393 // Must access selectedIndex to make default options select 12394 support.optSelected = opt.selected; 12395 12396 // Support: IE <=11 only 12397 // An input loses its value after becoming a radio 12398 input = document.createElement("input"); 12399 input.value = "t"; 12400 input.type = "radio"; 12401 support.radioValue = input.value === "t"; 12402 })(); 12403 var boolHook, 12404 attrHandle = jQuery.expr.attrHandle; 12405 jQuery.fn.extend({ 12406 attr: function (name, value) { 12407 return access(this, jQuery.attr, name, value, arguments.length > 1); 12408 }, 12409 removeAttr: function (name) { 12410 return this.each(function () { 12411 jQuery.removeAttr(this, name); 12412 }); 12413 } 12414 }); 12415 jQuery.extend({ 12416 attr: function (elem, name, value) { 12417 var ret, 12418 hooks, 12419 nType = elem.nodeType; 12420 12421 // Don't get/set attributes on text, comment and attribute nodes 12422 if (nType === 3 || nType === 8 || nType === 2) { 12423 return; 12424 } 12425 12426 // Fallback to prop when attributes are not supported 12427 if (typeof elem.getAttribute === "undefined") { 12428 return jQuery.prop(elem, name, value); 12429 } 12430 12431 // Attribute hooks are determined by the lowercase version 12432 // Grab necessary hook if one is defined 12433 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 12434 hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined); 12435 } 12436 if (value !== undefined) { 12437 if (value === null) { 12438 jQuery.removeAttr(elem, name); 12439 return; 12440 } 12441 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 12442 return ret; 12443 } 12444 elem.setAttribute(name, value + ""); 12445 return value; 12446 } 12447 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 12448 return ret; 12449 } 12450 ret = jQuery.find.attr(elem, name); 12451 12452 // Non-existent attributes return null, we normalize to undefined 12453 return ret == null ? undefined : ret; 12454 }, 12455 attrHooks: { 12456 type: { 12457 set: function (elem, value) { 12458 if (!support.radioValue && value === "radio" && nodeName(elem, "input")) { 12459 var val = elem.value; 12460 elem.setAttribute("type", value); 12461 if (val) { 12462 elem.value = val; 12463 } 12464 return value; 12465 } 12466 } 12467 } 12468 }, 12469 removeAttr: function (elem, value) { 12470 var name, 12471 i = 0, 12472 // Attribute names can contain non-HTML whitespace characters 12473 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 12474 attrNames = value && value.match(rnothtmlwhite); 12475 if (attrNames && elem.nodeType === 1) { 12476 while (name = attrNames[i++]) { 12477 elem.removeAttribute(name); 12478 } 12479 } 12480 } 12481 }); 12482 12483 // Hooks for boolean attributes 12484 boolHook = { 12485 set: function (elem, value, name) { 12486 if (value === false) { 12487 // Remove boolean attributes when set to false 12488 jQuery.removeAttr(elem, name); 12489 } else { 12490 elem.setAttribute(name, name); 12491 } 12492 return name; 12493 } 12494 }; 12495 jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (_i, name) { 12496 var getter = attrHandle[name] || jQuery.find.attr; 12497 attrHandle[name] = function (elem, name, isXML) { 12498 var ret, 12499 handle, 12500 lowercaseName = name.toLowerCase(); 12501 if (!isXML) { 12502 // Avoid an infinite loop by temporarily removing this function from the getter 12503 handle = attrHandle[lowercaseName]; 12504 attrHandle[lowercaseName] = ret; 12505 ret = getter(elem, name, isXML) != null ? lowercaseName : null; 12506 attrHandle[lowercaseName] = handle; 12507 } 12508 return ret; 12509 }; 12510 }); 12511 var rfocusable = /^(?:input|select|textarea|button)$/i, 12512 rclickable = /^(?:a|area)$/i; 12513 jQuery.fn.extend({ 12514 prop: function (name, value) { 12515 return access(this, jQuery.prop, name, value, arguments.length > 1); 12516 }, 12517 removeProp: function (name) { 12518 return this.each(function () { 12519 delete this[jQuery.propFix[name] || name]; 12520 }); 12521 } 12522 }); 12523 jQuery.extend({ 12524 prop: function (elem, name, value) { 12525 var ret, 12526 hooks, 12527 nType = elem.nodeType; 12528 12529 // Don't get/set properties on text, comment and attribute nodes 12530 if (nType === 3 || nType === 8 || nType === 2) { 12531 return; 12532 } 12533 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 12534 // Fix name and attach hooks 12535 name = jQuery.propFix[name] || name; 12536 hooks = jQuery.propHooks[name]; 12537 } 12538 if (value !== undefined) { 12539 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 12540 return ret; 12541 } 12542 return elem[name] = value; 12543 } 12544 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 12545 return ret; 12546 } 12547 return elem[name]; 12548 }, 12549 propHooks: { 12550 tabIndex: { 12551 get: function (elem) { 12552 // Support: IE <=9 - 11 only 12553 // elem.tabIndex doesn't always return the 12554 // correct value when it hasn't been explicitly set 12555 // Use proper attribute retrieval (trac-12072) 12556 var tabindex = jQuery.find.attr(elem, "tabindex"); 12557 if (tabindex) { 12558 return parseInt(tabindex, 10); 12559 } 12560 if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) { 12561 return 0; 12562 } 12563 return -1; 12564 } 12565 } 12566 }, 12567 propFix: { 12568 "for": "htmlFor", 12569 "class": "className" 12570 } 12571 }); 12572 12573 // Support: IE <=11 only 12574 // Accessing the selectedIndex property 12575 // forces the browser to respect setting selected 12576 // on the option 12577 // The getter ensures a default option is selected 12578 // when in an optgroup 12579 // eslint rule "no-unused-expressions" is disabled for this code 12580 // since it considers such accessions noop 12581 if (!support.optSelected) { 12582 jQuery.propHooks.selected = { 12583 get: function (elem) { 12584 /* eslint no-unused-expressions: "off" */ 12585 12586 var parent = elem.parentNode; 12587 if (parent && parent.parentNode) { 12588 parent.parentNode.selectedIndex; 12589 } 12590 return null; 12591 }, 12592 set: function (elem) { 12593 /* eslint no-unused-expressions: "off" */ 12594 12595 var parent = elem.parentNode; 12596 if (parent) { 12597 parent.selectedIndex; 12598 if (parent.parentNode) { 12599 parent.parentNode.selectedIndex; 12600 } 12601 } 12602 } 12603 }; 12604 } 12605 jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { 12606 jQuery.propFix[this.toLowerCase()] = this; 12607 }); 12608 12609 // Strip and collapse whitespace according to HTML spec 12610 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 12611 function stripAndCollapse(value) { 12612 var tokens = value.match(rnothtmlwhite) || []; 12613 return tokens.join(" "); 12614 } 12615 function getClass(elem) { 12616 return elem.getAttribute && elem.getAttribute("class") || ""; 12617 } 12618 function classesToArray(value) { 12619 if (Array.isArray(value)) { 12620 return value; 12621 } 12622 if (typeof value === "string") { 12623 return value.match(rnothtmlwhite) || []; 12624 } 12625 return []; 12626 } 12627 jQuery.fn.extend({ 12628 addClass: function (value) { 12629 var classNames, cur, curValue, className, i, finalValue; 12630 if (isFunction(value)) { 12631 return this.each(function (j) { 12632 jQuery(this).addClass(value.call(this, j, getClass(this))); 12633 }); 12634 } 12635 classNames = classesToArray(value); 12636 if (classNames.length) { 12637 return this.each(function () { 12638 curValue = getClass(this); 12639 cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; 12640 if (cur) { 12641 for (i = 0; i < classNames.length; i++) { 12642 className = classNames[i]; 12643 if (cur.indexOf(" " + className + " ") < 0) { 12644 cur += className + " "; 12645 } 12646 } 12647 12648 // Only assign if different to avoid unneeded rendering. 12649 finalValue = stripAndCollapse(cur); 12650 if (curValue !== finalValue) { 12651 this.setAttribute("class", finalValue); 12652 } 12653 } 12654 }); 12655 } 12656 return this; 12657 }, 12658 removeClass: function (value) { 12659 var classNames, cur, curValue, className, i, finalValue; 12660 if (isFunction(value)) { 12661 return this.each(function (j) { 12662 jQuery(this).removeClass(value.call(this, j, getClass(this))); 12663 }); 12664 } 12665 if (!arguments.length) { 12666 return this.attr("class", ""); 12667 } 12668 classNames = classesToArray(value); 12669 if (classNames.length) { 12670 return this.each(function () { 12671 curValue = getClass(this); 12672 12673 // This expression is here for better compressibility (see addClass) 12674 cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; 12675 if (cur) { 12676 for (i = 0; i < classNames.length; i++) { 12677 className = classNames[i]; 12678 12679 // Remove *all* instances 12680 while (cur.indexOf(" " + className + " ") > -1) { 12681 cur = cur.replace(" " + className + " ", " "); 12682 } 12683 } 12684 12685 // Only assign if different to avoid unneeded rendering. 12686 finalValue = stripAndCollapse(cur); 12687 if (curValue !== finalValue) { 12688 this.setAttribute("class", finalValue); 12689 } 12690 } 12691 }); 12692 } 12693 return this; 12694 }, 12695 toggleClass: function (value, stateVal) { 12696 var classNames, 12697 className, 12698 i, 12699 self, 12700 type = typeof value, 12701 isValidValue = type === "string" || Array.isArray(value); 12702 if (isFunction(value)) { 12703 return this.each(function (i) { 12704 jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal); 12705 }); 12706 } 12707 if (typeof stateVal === "boolean" && isValidValue) { 12708 return stateVal ? this.addClass(value) : this.removeClass(value); 12709 } 12710 classNames = classesToArray(value); 12711 return this.each(function () { 12712 if (isValidValue) { 12713 // Toggle individual class names 12714 self = jQuery(this); 12715 for (i = 0; i < classNames.length; i++) { 12716 className = classNames[i]; 12717 12718 // Check each className given, space separated list 12719 if (self.hasClass(className)) { 12720 self.removeClass(className); 12721 } else { 12722 self.addClass(className); 12723 } 12724 } 12725 12726 // Toggle whole class name 12727 } else if (value === undefined || type === "boolean") { 12728 className = getClass(this); 12729 if (className) { 12730 // Store className if set 12731 dataPriv.set(this, "__className__", className); 12732 } 12733 12734 // If the element has a class name or if we're passed `false`, 12735 // then remove the whole classname (if there was one, the above saved it). 12736 // Otherwise bring back whatever was previously saved (if anything), 12737 // falling back to the empty string if nothing was stored. 12738 if (this.setAttribute) { 12739 this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || ""); 12740 } 12741 } 12742 }); 12743 }, 12744 hasClass: function (selector) { 12745 var className, 12746 elem, 12747 i = 0; 12748 className = " " + selector + " "; 12749 while (elem = this[i++]) { 12750 if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) { 12751 return true; 12752 } 12753 } 12754 return false; 12755 } 12756 }); 12757 var rreturn = /\r/g; 12758 jQuery.fn.extend({ 12759 val: function (value) { 12760 var hooks, 12761 ret, 12762 valueIsFunction, 12763 elem = this[0]; 12764 if (!arguments.length) { 12765 if (elem) { 12766 hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()]; 12767 if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { 12768 return ret; 12769 } 12770 ret = elem.value; 12771 12772 // Handle most common string cases 12773 if (typeof ret === "string") { 12774 return ret.replace(rreturn, ""); 12775 } 12776 12777 // Handle cases where value is null/undef or number 12778 return ret == null ? "" : ret; 12779 } 12780 return; 12781 } 12782 valueIsFunction = isFunction(value); 12783 return this.each(function (i) { 12784 var val; 12785 if (this.nodeType !== 1) { 12786 return; 12787 } 12788 if (valueIsFunction) { 12789 val = value.call(this, i, jQuery(this).val()); 12790 } else { 12791 val = value; 12792 } 12793 12794 // Treat null/undefined as ""; convert numbers to string 12795 if (val == null) { 12796 val = ""; 12797 } else if (typeof val === "number") { 12798 val += ""; 12799 } else if (Array.isArray(val)) { 12800 val = jQuery.map(val, function (value) { 12801 return value == null ? "" : value + ""; 12802 }); 12803 } 12804 hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; 12805 12806 // If set returns undefined, fall back to normal setting 12807 if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { 12808 this.value = val; 12809 } 12810 }); 12811 } 12812 }); 12813 jQuery.extend({ 12814 valHooks: { 12815 option: { 12816 get: function (elem) { 12817 var val = jQuery.find.attr(elem, "value"); 12818 return val != null ? val : 12819 // Support: IE <=10 - 11 only 12820 // option.text throws exceptions (trac-14686, trac-14858) 12821 // Strip and collapse whitespace 12822 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 12823 stripAndCollapse(jQuery.text(elem)); 12824 } 12825 }, 12826 select: { 12827 get: function (elem) { 12828 var value, 12829 option, 12830 i, 12831 options = elem.options, 12832 index = elem.selectedIndex, 12833 one = elem.type === "select-one", 12834 values = one ? null : [], 12835 max = one ? index + 1 : options.length; 12836 if (index < 0) { 12837 i = max; 12838 } else { 12839 i = one ? index : 0; 12840 } 12841 12842 // Loop through all the selected options 12843 for (; i < max; i++) { 12844 option = options[i]; 12845 12846 // Support: IE <=9 only 12847 // IE8-9 doesn't update selected after form reset (trac-2551) 12848 if ((option.selected || i === index) && 12849 // Don't return options that are disabled or in a disabled optgroup 12850 !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) { 12851 // Get the specific value for the option 12852 value = jQuery(option).val(); 12853 12854 // We don't need an array for one selects 12855 if (one) { 12856 return value; 12857 } 12858 12859 // Multi-Selects return an array 12860 values.push(value); 12861 } 12862 } 12863 return values; 12864 }, 12865 set: function (elem, value) { 12866 var optionSet, 12867 option, 12868 options = elem.options, 12869 values = jQuery.makeArray(value), 12870 i = options.length; 12871 while (i--) { 12872 option = options[i]; 12873 12874 /* eslint-disable no-cond-assign */ 12875 12876 if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) { 12877 optionSet = true; 12878 } 12879 12880 /* eslint-enable no-cond-assign */ 12881 } 12882 12883 // Force browsers to behave consistently when non-matching value is set 12884 if (!optionSet) { 12885 elem.selectedIndex = -1; 12886 } 12887 return values; 12888 } 12889 } 12890 } 12891 }); 12892 12893 // Radios and checkboxes getter/setter 12894 jQuery.each(["radio", "checkbox"], function () { 12895 jQuery.valHooks[this] = { 12896 set: function (elem, value) { 12897 if (Array.isArray(value)) { 12898 return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1; 12899 } 12900 } 12901 }; 12902 if (!support.checkOn) { 12903 jQuery.valHooks[this].get = function (elem) { 12904 return elem.getAttribute("value") === null ? "on" : elem.value; 12905 }; 12906 } 12907 }); 12908 12909 // Return jQuery for attributes-only inclusion 12910 var location = window.location; 12911 var nonce = { 12912 guid: Date.now() 12913 }; 12914 var rquery = /\?/; 12915 12916 // Cross-browser xml parsing 12917 jQuery.parseXML = function (data) { 12918 var xml, parserErrorElem; 12919 if (!data || typeof data !== "string") { 12920 return null; 12921 } 12922 12923 // Support: IE 9 - 11 only 12924 // IE throws on parseFromString with invalid input. 12925 try { 12926 xml = new window.DOMParser().parseFromString(data, "text/xml"); 12927 } catch (e) {} 12928 parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0]; 12929 if (!xml || parserErrorElem) { 12930 jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function (el) { 12931 return el.textContent; 12932 }).join("\n") : data)); 12933 } 12934 return xml; 12935 }; 12936 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 12937 stopPropagationCallback = function (e) { 12938 e.stopPropagation(); 12939 }; 12940 jQuery.extend(jQuery.event, { 12941 trigger: function (event, data, elem, onlyHandlers) { 12942 var i, 12943 cur, 12944 tmp, 12945 bubbleType, 12946 ontype, 12947 handle, 12948 special, 12949 lastElement, 12950 eventPath = [elem || document], 12951 type = hasOwn.call(event, "type") ? event.type : event, 12952 namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; 12953 cur = lastElement = tmp = elem = elem || document; 12954 12955 // Don't do events on text and comment nodes 12956 if (elem.nodeType === 3 || elem.nodeType === 8) { 12957 return; 12958 } 12959 12960 // focus/blur morphs to focusin/out; ensure we're not firing them right now 12961 if (rfocusMorph.test(type + jQuery.event.triggered)) { 12962 return; 12963 } 12964 if (type.indexOf(".") > -1) { 12965 // Namespaced trigger; create a regexp to match event type in handle() 12966 namespaces = type.split("."); 12967 type = namespaces.shift(); 12968 namespaces.sort(); 12969 } 12970 ontype = type.indexOf(":") < 0 && "on" + type; 12971 12972 // Caller can pass in a jQuery.Event object, Object, or just an event type string 12973 event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event); 12974 12975 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 12976 event.isTrigger = onlyHandlers ? 2 : 3; 12977 event.namespace = namespaces.join("."); 12978 event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; 12979 12980 // Clean up the event in case it is being reused 12981 event.result = undefined; 12982 if (!event.target) { 12983 event.target = elem; 12984 } 12985 12986 // Clone any incoming data and prepend the event, creating the handler arg list 12987 data = data == null ? [event] : jQuery.makeArray(data, [event]); 12988 12989 // Allow special events to draw outside the lines 12990 special = jQuery.event.special[type] || {}; 12991 if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { 12992 return; 12993 } 12994 12995 // Determine event propagation path in advance, per W3C events spec (trac-9951) 12996 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) 12997 if (!onlyHandlers && !special.noBubble && !isWindow(elem)) { 12998 bubbleType = special.delegateType || type; 12999 if (!rfocusMorph.test(bubbleType + type)) { 13000 cur = cur.parentNode; 13001 } 13002 for (; cur; cur = cur.parentNode) { 13003 eventPath.push(cur); 13004 tmp = cur; 13005 } 13006 13007 // Only add window if we got to document (e.g., not plain obj or detached DOM) 13008 if (tmp === (elem.ownerDocument || document)) { 13009 eventPath.push(tmp.defaultView || tmp.parentWindow || window); 13010 } 13011 } 13012 13013 // Fire handlers on the event path 13014 i = 0; 13015 while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { 13016 lastElement = cur; 13017 event.type = i > 1 ? bubbleType : special.bindType || type; 13018 13019 // jQuery handler 13020 handle = (dataPriv.get(cur, "events") || Object.create(null))[event.type] && dataPriv.get(cur, "handle"); 13021 if (handle) { 13022 handle.apply(cur, data); 13023 } 13024 13025 // Native handler 13026 handle = ontype && cur[ontype]; 13027 if (handle && handle.apply && acceptData(cur)) { 13028 event.result = handle.apply(cur, data); 13029 if (event.result === false) { 13030 event.preventDefault(); 13031 } 13032 } 13033 } 13034 event.type = type; 13035 13036 // If nobody prevented the default action, do it now 13037 if (!onlyHandlers && !event.isDefaultPrevented()) { 13038 if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) { 13039 // Call a native DOM method on the target with the same name as the event. 13040 // Don't do default actions on window, that's where global variables be (trac-6170) 13041 if (ontype && isFunction(elem[type]) && !isWindow(elem)) { 13042 // Don't re-trigger an onFOO event when we call its FOO() method 13043 tmp = elem[ontype]; 13044 if (tmp) { 13045 elem[ontype] = null; 13046 } 13047 13048 // Prevent re-triggering of the same event, since we already bubbled it above 13049 jQuery.event.triggered = type; 13050 if (event.isPropagationStopped()) { 13051 lastElement.addEventListener(type, stopPropagationCallback); 13052 } 13053 elem[type](); 13054 if (event.isPropagationStopped()) { 13055 lastElement.removeEventListener(type, stopPropagationCallback); 13056 } 13057 jQuery.event.triggered = undefined; 13058 if (tmp) { 13059 elem[ontype] = tmp; 13060 } 13061 } 13062 } 13063 } 13064 return event.result; 13065 }, 13066 // Piggyback on a donor event to simulate a different one 13067 // Used only for `focus(in | out)` events 13068 simulate: function (type, elem, event) { 13069 var e = jQuery.extend(new jQuery.Event(), event, { 13070 type: type, 13071 isSimulated: true 13072 }); 13073 jQuery.event.trigger(e, null, elem); 13074 } 13075 }); 13076 jQuery.fn.extend({ 13077 trigger: function (type, data) { 13078 return this.each(function () { 13079 jQuery.event.trigger(type, data, this); 13080 }); 13081 }, 13082 triggerHandler: function (type, data) { 13083 var elem = this[0]; 13084 if (elem) { 13085 return jQuery.event.trigger(type, data, elem, true); 13086 } 13087 } 13088 }); 13089 var rbracket = /\[\]$/, 13090 rCRLF = /\r?\n/g, 13091 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 13092 rsubmittable = /^(?:input|select|textarea|keygen)/i; 13093 function buildParams(prefix, obj, traditional, add) { 13094 var name; 13095 if (Array.isArray(obj)) { 13096 // Serialize array item. 13097 jQuery.each(obj, function (i, v) { 13098 if (traditional || rbracket.test(prefix)) { 13099 // Treat each array item as a scalar. 13100 add(prefix, v); 13101 } else { 13102 // Item is non-scalar (array or object), encode its numeric index. 13103 buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add); 13104 } 13105 }); 13106 } else if (!traditional && toType(obj) === "object") { 13107 // Serialize object item. 13108 for (name in obj) { 13109 buildParams(prefix + "[" + name + "]", obj[name], traditional, add); 13110 } 13111 } else { 13112 // Serialize scalar item. 13113 add(prefix, obj); 13114 } 13115 } 13116 13117 // Serialize an array of form elements or a set of 13118 // key/values into a query string 13119 jQuery.param = function (a, traditional) { 13120 var prefix, 13121 s = [], 13122 add = function (key, valueOrFunction) { 13123 // If value is a function, invoke it and use its return value 13124 var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction; 13125 s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value); 13126 }; 13127 if (a == null) { 13128 return ""; 13129 } 13130 13131 // If an array was passed in, assume that it is an array of form elements. 13132 if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) { 13133 // Serialize the form elements 13134 jQuery.each(a, function () { 13135 add(this.name, this.value); 13136 }); 13137 } else { 13138 // If traditional, encode the "old" way (the way 1.3.2 or older 13139 // did it), otherwise encode params recursively. 13140 for (prefix in a) { 13141 buildParams(prefix, a[prefix], traditional, add); 13142 } 13143 } 13144 13145 // Return the resulting serialization 13146 return s.join("&"); 13147 }; 13148 jQuery.fn.extend({ 13149 serialize: function () { 13150 return jQuery.param(this.serializeArray()); 13151 }, 13152 serializeArray: function () { 13153 return this.map(function () { 13154 // Can add propHook for "elements" to filter or add form elements 13155 var elements = jQuery.prop(this, "elements"); 13156 return elements ? jQuery.makeArray(elements) : this; 13157 }).filter(function () { 13158 var type = this.type; 13159 13160 // Use .is( ":disabled" ) so that fieldset[disabled] works 13161 return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type)); 13162 }).map(function (_i, elem) { 13163 var val = jQuery(this).val(); 13164 if (val == null) { 13165 return null; 13166 } 13167 if (Array.isArray(val)) { 13168 return jQuery.map(val, function (val) { 13169 return { 13170 name: elem.name, 13171 value: val.replace(rCRLF, "\r\n") 13172 }; 13173 }); 13174 } 13175 return { 13176 name: elem.name, 13177 value: val.replace(rCRLF, "\r\n") 13178 }; 13179 }).get(); 13180 } 13181 }); 13182 var r20 = /%20/g, 13183 rhash = /#.*$/, 13184 rantiCache = /([?&])_=[^&]*/, 13185 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 13186 // trac-7653, trac-8125, trac-8152: local protocol detection 13187 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 13188 rnoContent = /^(?:GET|HEAD)$/, 13189 rprotocol = /^\/\//, 13190 /* Prefilters 13191 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 13192 * 2) These are called: 13193 * - BEFORE asking for a transport 13194 * - AFTER param serialization (s.data is a string if s.processData is true) 13195 * 3) key is the dataType 13196 * 4) the catchall symbol "*" can be used 13197 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 13198 */ 13199 prefilters = {}, 13200 /* Transports bindings 13201 * 1) key is the dataType 13202 * 2) the catchall symbol "*" can be used 13203 * 3) selection will start with transport dataType and THEN go to "*" if needed 13204 */ 13205 transports = {}, 13206 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression 13207 allTypes = "*/".concat("*"), 13208 // Anchor tag for parsing the document origin 13209 originAnchor = document.createElement("a"); 13210 originAnchor.href = location.href; 13211 13212 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 13213 function addToPrefiltersOrTransports(structure) { 13214 // dataTypeExpression is optional and defaults to "*" 13215 return function (dataTypeExpression, func) { 13216 if (typeof dataTypeExpression !== "string") { 13217 func = dataTypeExpression; 13218 dataTypeExpression = "*"; 13219 } 13220 var dataType, 13221 i = 0, 13222 dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || []; 13223 if (isFunction(func)) { 13224 // For each dataType in the dataTypeExpression 13225 while (dataType = dataTypes[i++]) { 13226 // Prepend if requested 13227 if (dataType[0] === "+") { 13228 dataType = dataType.slice(1) || "*"; 13229 (structure[dataType] = structure[dataType] || []).unshift(func); 13230 13231 // Otherwise append 13232 } else { 13233 (structure[dataType] = structure[dataType] || []).push(func); 13234 } 13235 } 13236 } 13237 }; 13238 } 13239 13240 // Base inspection function for prefilters and transports 13241 function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) { 13242 var inspected = {}, 13243 seekingTransport = structure === transports; 13244 function inspect(dataType) { 13245 var selected; 13246 inspected[dataType] = true; 13247 jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) { 13248 var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR); 13249 if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) { 13250 options.dataTypes.unshift(dataTypeOrTransport); 13251 inspect(dataTypeOrTransport); 13252 return false; 13253 } else if (seekingTransport) { 13254 return !(selected = dataTypeOrTransport); 13255 } 13256 }); 13257 return selected; 13258 } 13259 return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*"); 13260 } 13261 13262 // A special extend for ajax options 13263 // that takes "flat" options (not to be deep extended) 13264 // Fixes trac-9887 13265 function ajaxExtend(target, src) { 13266 var key, 13267 deep, 13268 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 13269 for (key in src) { 13270 if (src[key] !== undefined) { 13271 (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]; 13272 } 13273 } 13274 if (deep) { 13275 jQuery.extend(true, target, deep); 13276 } 13277 return target; 13278 } 13279 13280 /* Handles responses to an ajax request: 13281 * - finds the right dataType (mediates between content-type and expected dataType) 13282 * - returns the corresponding response 13283 */ 13284 function ajaxHandleResponses(s, jqXHR, responses) { 13285 var ct, 13286 type, 13287 finalDataType, 13288 firstDataType, 13289 contents = s.contents, 13290 dataTypes = s.dataTypes; 13291 13292 // Remove auto dataType and get content-type in the process 13293 while (dataTypes[0] === "*") { 13294 dataTypes.shift(); 13295 if (ct === undefined) { 13296 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); 13297 } 13298 } 13299 13300 // Check if we're dealing with a known content-type 13301 if (ct) { 13302 for (type in contents) { 13303 if (contents[type] && contents[type].test(ct)) { 13304 dataTypes.unshift(type); 13305 break; 13306 } 13307 } 13308 } 13309 13310 // Check to see if we have a response for the expected dataType 13311 if (dataTypes[0] in responses) { 13312 finalDataType = dataTypes[0]; 13313 } else { 13314 // Try convertible dataTypes 13315 for (type in responses) { 13316 if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { 13317 finalDataType = type; 13318 break; 13319 } 13320 if (!firstDataType) { 13321 firstDataType = type; 13322 } 13323 } 13324 13325 // Or just use first one 13326 finalDataType = finalDataType || firstDataType; 13327 } 13328 13329 // If we found a dataType 13330 // We add the dataType to the list if needed 13331 // and return the corresponding response 13332 if (finalDataType) { 13333 if (finalDataType !== dataTypes[0]) { 13334 dataTypes.unshift(finalDataType); 13335 } 13336 return responses[finalDataType]; 13337 } 13338 } 13339 13340 /* Chain conversions given the request and the original response 13341 * Also sets the responseXXX fields on the jqXHR instance 13342 */ 13343 function ajaxConvert(s, response, jqXHR, isSuccess) { 13344 var conv2, 13345 current, 13346 conv, 13347 tmp, 13348 prev, 13349 converters = {}, 13350 // Work with a copy of dataTypes in case we need to modify it for conversion 13351 dataTypes = s.dataTypes.slice(); 13352 13353 // Create converters map with lowercased keys 13354 if (dataTypes[1]) { 13355 for (conv in s.converters) { 13356 converters[conv.toLowerCase()] = s.converters[conv]; 13357 } 13358 } 13359 current = dataTypes.shift(); 13360 13361 // Convert to each sequential dataType 13362 while (current) { 13363 if (s.responseFields[current]) { 13364 jqXHR[s.responseFields[current]] = response; 13365 } 13366 13367 // Apply the dataFilter if provided 13368 if (!prev && isSuccess && s.dataFilter) { 13369 response = s.dataFilter(response, s.dataType); 13370 } 13371 prev = current; 13372 current = dataTypes.shift(); 13373 if (current) { 13374 // There's only work to do if current dataType is non-auto 13375 if (current === "*") { 13376 current = prev; 13377 13378 // Convert response if prev dataType is non-auto and differs from current 13379 } else if (prev !== "*" && prev !== current) { 13380 // Seek a direct converter 13381 conv = converters[prev + " " + current] || converters["* " + current]; 13382 13383 // If none found, seek a pair 13384 if (!conv) { 13385 for (conv2 in converters) { 13386 // If conv2 outputs current 13387 tmp = conv2.split(" "); 13388 if (tmp[1] === current) { 13389 // If prev can be converted to accepted input 13390 conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]]; 13391 if (conv) { 13392 // Condense equivalence converters 13393 if (conv === true) { 13394 conv = converters[conv2]; 13395 13396 // Otherwise, insert the intermediate dataType 13397 } else if (converters[conv2] !== true) { 13398 current = tmp[0]; 13399 dataTypes.unshift(tmp[1]); 13400 } 13401 break; 13402 } 13403 } 13404 } 13405 } 13406 13407 // Apply converter (if not an equivalence) 13408 if (conv !== true) { 13409 // Unless errors are allowed to bubble, catch and return them 13410 if (conv && s.throws) { 13411 response = conv(response); 13412 } else { 13413 try { 13414 response = conv(response); 13415 } catch (e) { 13416 return { 13417 state: "parsererror", 13418 error: conv ? e : "No conversion from " + prev + " to " + current 13419 }; 13420 } 13421 } 13422 } 13423 } 13424 } 13425 } 13426 return { 13427 state: "success", 13428 data: response 13429 }; 13430 } 13431 jQuery.extend({ 13432 // Counter for holding the number of active queries 13433 active: 0, 13434 // Last-Modified header cache for next request 13435 lastModified: {}, 13436 etag: {}, 13437 ajaxSettings: { 13438 url: location.href, 13439 type: "GET", 13440 isLocal: rlocalProtocol.test(location.protocol), 13441 global: true, 13442 processData: true, 13443 async: true, 13444 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 13445 /* 13446 timeout: 0, 13447 data: null, 13448 dataType: null, 13449 username: null, 13450 password: null, 13451 cache: null, 13452 throws: false, 13453 traditional: false, 13454 headers: {}, 13455 */ 13456 13457 accepts: { 13458 "*": allTypes, 13459 text: "text/plain", 13460 html: "text/html", 13461 xml: "application/xml, text/xml", 13462 json: "application/json, text/javascript" 13463 }, 13464 contents: { 13465 xml: /\bxml\b/, 13466 html: /\bhtml/, 13467 json: /\bjson\b/ 13468 }, 13469 responseFields: { 13470 xml: "responseXML", 13471 text: "responseText", 13472 json: "responseJSON" 13473 }, 13474 // Data converters 13475 // Keys separate source (or catchall "*") and destination types with a single space 13476 converters: { 13477 // Convert anything to text 13478 "* text": String, 13479 // Text to html (true = no transformation) 13480 "text html": true, 13481 // Evaluate text as a json expression 13482 "text json": JSON.parse, 13483 // Parse text as xml 13484 "text xml": jQuery.parseXML 13485 }, 13486 // For options that shouldn't be deep extended: 13487 // you can add your own custom options here if 13488 // and when you create one that shouldn't be 13489 // deep extended (see ajaxExtend) 13490 flatOptions: { 13491 url: true, 13492 context: true 13493 } 13494 }, 13495 // Creates a full fledged settings object into target 13496 // with both ajaxSettings and settings fields. 13497 // If target is omitted, writes into ajaxSettings. 13498 ajaxSetup: function (target, settings) { 13499 return settings ? 13500 // Building a settings object 13501 ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : 13502 // Extending ajaxSettings 13503 ajaxExtend(jQuery.ajaxSettings, target); 13504 }, 13505 ajaxPrefilter: addToPrefiltersOrTransports(prefilters), 13506 ajaxTransport: addToPrefiltersOrTransports(transports), 13507 // Main method 13508 ajax: function (url, options) { 13509 // If url is an object, simulate pre-1.5 signature 13510 if (typeof url === "object") { 13511 options = url; 13512 url = undefined; 13513 } 13514 13515 // Force options to be an object 13516 options = options || {}; 13517 var transport, 13518 // URL without anti-cache param 13519 cacheURL, 13520 // Response headers 13521 responseHeadersString, 13522 responseHeaders, 13523 // timeout handle 13524 timeoutTimer, 13525 // Url cleanup var 13526 urlAnchor, 13527 // Request state (becomes false upon send and true upon completion) 13528 completed, 13529 // To know if global events are to be dispatched 13530 fireGlobals, 13531 // Loop variable 13532 i, 13533 // uncached part of the url 13534 uncached, 13535 // Create the final options object 13536 s = jQuery.ajaxSetup({}, options), 13537 // Callbacks context 13538 callbackContext = s.context || s, 13539 // Context for global events is callbackContext if it is a DOM node or jQuery collection 13540 globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, 13541 // Deferreds 13542 deferred = jQuery.Deferred(), 13543 completeDeferred = jQuery.Callbacks("once memory"), 13544 // Status-dependent callbacks 13545 statusCode = s.statusCode || {}, 13546 // Headers (they are sent all at once) 13547 requestHeaders = {}, 13548 requestHeadersNames = {}, 13549 // Default abort message 13550 strAbort = "canceled", 13551 // Fake xhr 13552 jqXHR = { 13553 readyState: 0, 13554 // Builds headers hashtable if needed 13555 getResponseHeader: function (key) { 13556 var match; 13557 if (completed) { 13558 if (!responseHeaders) { 13559 responseHeaders = {}; 13560 while (match = rheaders.exec(responseHeadersString)) { 13561 responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]); 13562 } 13563 } 13564 match = responseHeaders[key.toLowerCase() + " "]; 13565 } 13566 return match == null ? null : match.join(", "); 13567 }, 13568 // Raw string 13569 getAllResponseHeaders: function () { 13570 return completed ? responseHeadersString : null; 13571 }, 13572 // Caches the header 13573 setRequestHeader: function (name, value) { 13574 if (completed == null) { 13575 name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name; 13576 requestHeaders[name] = value; 13577 } 13578 return this; 13579 }, 13580 // Overrides response content-type header 13581 overrideMimeType: function (type) { 13582 if (completed == null) { 13583 s.mimeType = type; 13584 } 13585 return this; 13586 }, 13587 // Status-dependent callbacks 13588 statusCode: function (map) { 13589 var code; 13590 if (map) { 13591 if (completed) { 13592 // Execute the appropriate callbacks 13593 jqXHR.always(map[jqXHR.status]); 13594 } else { 13595 // Lazy-add the new callbacks in a way that preserves old ones 13596 for (code in map) { 13597 statusCode[code] = [statusCode[code], map[code]]; 13598 } 13599 } 13600 } 13601 return this; 13602 }, 13603 // Cancel the request 13604 abort: function (statusText) { 13605 var finalText = statusText || strAbort; 13606 if (transport) { 13607 transport.abort(finalText); 13608 } 13609 done(0, finalText); 13610 return this; 13611 } 13612 }; 13613 13614 // Attach deferreds 13615 deferred.promise(jqXHR); 13616 13617 // Add protocol if not provided (prefilters might expect it) 13618 // Handle falsy url in the settings object (trac-10093: consistency with old signature) 13619 // We also use the url parameter if available 13620 s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//"); 13621 13622 // Alias method option to type as per ticket trac-12004 13623 s.type = options.method || options.type || s.method || s.type; 13624 13625 // Extract dataTypes list 13626 s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; 13627 13628 // A cross-domain request is in order when the origin doesn't match the current origin. 13629 if (s.crossDomain == null) { 13630 urlAnchor = document.createElement("a"); 13631 13632 // Support: IE <=8 - 11, Edge 12 - 15 13633 // IE throws exception on accessing the href property if url is malformed, 13634 // e.g. http://example.com:80x/ 13635 try { 13636 urlAnchor.href = s.url; 13637 13638 // Support: IE <=8 - 11 only 13639 // Anchor's host property isn't correctly set when s.url is relative 13640 urlAnchor.href = urlAnchor.href; 13641 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; 13642 } catch (e) { 13643 // If there is an error parsing the URL, assume it is crossDomain, 13644 // it can be rejected by the transport if it is invalid 13645 s.crossDomain = true; 13646 } 13647 } 13648 13649 // Convert data if not already a string 13650 if (s.data && s.processData && typeof s.data !== "string") { 13651 s.data = jQuery.param(s.data, s.traditional); 13652 } 13653 13654 // Apply prefilters 13655 inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); 13656 13657 // If request was aborted inside a prefilter, stop there 13658 if (completed) { 13659 return jqXHR; 13660 } 13661 13662 // We can fire global events as of now if asked to 13663 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) 13664 fireGlobals = jQuery.event && s.global; 13665 13666 // Watch for a new set of requests 13667 if (fireGlobals && jQuery.active++ === 0) { 13668 jQuery.event.trigger("ajaxStart"); 13669 } 13670 13671 // Uppercase the type 13672 s.type = s.type.toUpperCase(); 13673 13674 // Determine if request has content 13675 s.hasContent = !rnoContent.test(s.type); 13676 13677 // Save the URL in case we're toying with the If-Modified-Since 13678 // and/or If-None-Match header later on 13679 // Remove hash to simplify url manipulation 13680 cacheURL = s.url.replace(rhash, ""); 13681 13682 // More options handling for requests with no content 13683 if (!s.hasContent) { 13684 // Remember the hash so we can put it back 13685 uncached = s.url.slice(cacheURL.length); 13686 13687 // If data is available and should be processed, append data to url 13688 if (s.data && (s.processData || typeof s.data === "string")) { 13689 cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data; 13690 13691 // trac-9682: remove data so that it's not used in an eventual retry 13692 delete s.data; 13693 } 13694 13695 // Add or update anti-cache param if needed 13696 if (s.cache === false) { 13697 cacheURL = cacheURL.replace(rantiCache, "$1"); 13698 uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached; 13699 } 13700 13701 // Put hash and anti-cache on the URL that will be requested (gh-1732) 13702 s.url = cacheURL + uncached; 13703 13704 // Change '%20' to '+' if this is encoded form body content (gh-2658) 13705 } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) { 13706 s.data = s.data.replace(r20, "+"); 13707 } 13708 13709 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 13710 if (s.ifModified) { 13711 if (jQuery.lastModified[cacheURL]) { 13712 jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]); 13713 } 13714 if (jQuery.etag[cacheURL]) { 13715 jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]); 13716 } 13717 } 13718 13719 // Set the correct header, if data is being sent 13720 if (s.data && s.hasContent && s.contentType !== false || options.contentType) { 13721 jqXHR.setRequestHeader("Content-Type", s.contentType); 13722 } 13723 13724 // Set the Accepts header for the server, depending on the dataType 13725 jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); 13726 13727 // Check for headers option 13728 for (i in s.headers) { 13729 jqXHR.setRequestHeader(i, s.headers[i]); 13730 } 13731 13732 // Allow custom headers/mimetypes and early abort 13733 if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) { 13734 // Abort if not done already and return 13735 return jqXHR.abort(); 13736 } 13737 13738 // Aborting is no longer a cancellation 13739 strAbort = "abort"; 13740 13741 // Install callbacks on deferreds 13742 completeDeferred.add(s.complete); 13743 jqXHR.done(s.success); 13744 jqXHR.fail(s.error); 13745 13746 // Get transport 13747 transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); 13748 13749 // If no transport, we auto-abort 13750 if (!transport) { 13751 done(-1, "No Transport"); 13752 } else { 13753 jqXHR.readyState = 1; 13754 13755 // Send global event 13756 if (fireGlobals) { 13757 globalEventContext.trigger("ajaxSend", [jqXHR, s]); 13758 } 13759 13760 // If request was aborted inside ajaxSend, stop there 13761 if (completed) { 13762 return jqXHR; 13763 } 13764 13765 // Timeout 13766 if (s.async && s.timeout > 0) { 13767 timeoutTimer = window.setTimeout(function () { 13768 jqXHR.abort("timeout"); 13769 }, s.timeout); 13770 } 13771 try { 13772 completed = false; 13773 transport.send(requestHeaders, done); 13774 } catch (e) { 13775 // Rethrow post-completion exceptions 13776 if (completed) { 13777 throw e; 13778 } 13779 13780 // Propagate others as results 13781 done(-1, e); 13782 } 13783 } 13784 13785 // Callback for when everything is done 13786 function done(status, nativeStatusText, responses, headers) { 13787 var isSuccess, 13788 success, 13789 error, 13790 response, 13791 modified, 13792 statusText = nativeStatusText; 13793 13794 // Ignore repeat invocations 13795 if (completed) { 13796 return; 13797 } 13798 completed = true; 13799 13800 // Clear timeout if it exists 13801 if (timeoutTimer) { 13802 window.clearTimeout(timeoutTimer); 13803 } 13804 13805 // Dereference transport for early garbage collection 13806 // (no matter how long the jqXHR object will be used) 13807 transport = undefined; 13808 13809 // Cache response headers 13810 responseHeadersString = headers || ""; 13811 13812 // Set readyState 13813 jqXHR.readyState = status > 0 ? 4 : 0; 13814 13815 // Determine if successful 13816 isSuccess = status >= 200 && status < 300 || status === 304; 13817 13818 // Get response data 13819 if (responses) { 13820 response = ajaxHandleResponses(s, jqXHR, responses); 13821 } 13822 13823 // Use a noop converter for missing script but not if jsonp 13824 if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) { 13825 s.converters["text script"] = function () {}; 13826 } 13827 13828 // Convert no matter what (that way responseXXX fields are always set) 13829 response = ajaxConvert(s, response, jqXHR, isSuccess); 13830 13831 // If successful, handle type chaining 13832 if (isSuccess) { 13833 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 13834 if (s.ifModified) { 13835 modified = jqXHR.getResponseHeader("Last-Modified"); 13836 if (modified) { 13837 jQuery.lastModified[cacheURL] = modified; 13838 } 13839 modified = jqXHR.getResponseHeader("etag"); 13840 if (modified) { 13841 jQuery.etag[cacheURL] = modified; 13842 } 13843 } 13844 13845 // if no content 13846 if (status === 204 || s.type === "HEAD") { 13847 statusText = "nocontent"; 13848 13849 // if not modified 13850 } else if (status === 304) { 13851 statusText = "notmodified"; 13852 13853 // If we have data, let's convert it 13854 } else { 13855 statusText = response.state; 13856 success = response.data; 13857 error = response.error; 13858 isSuccess = !error; 13859 } 13860 } else { 13861 // Extract error from statusText and normalize for non-aborts 13862 error = statusText; 13863 if (status || !statusText) { 13864 statusText = "error"; 13865 if (status < 0) { 13866 status = 0; 13867 } 13868 } 13869 } 13870 13871 // Set data for the fake xhr object 13872 jqXHR.status = status; 13873 jqXHR.statusText = (nativeStatusText || statusText) + ""; 13874 13875 // Success/Error 13876 if (isSuccess) { 13877 deferred.resolveWith(callbackContext, [success, statusText, jqXHR]); 13878 } else { 13879 deferred.rejectWith(callbackContext, [jqXHR, statusText, error]); 13880 } 13881 13882 // Status-dependent callbacks 13883 jqXHR.statusCode(statusCode); 13884 statusCode = undefined; 13885 if (fireGlobals) { 13886 globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]); 13887 } 13888 13889 // Complete 13890 completeDeferred.fireWith(callbackContext, [jqXHR, statusText]); 13891 if (fireGlobals) { 13892 globalEventContext.trigger("ajaxComplete", [jqXHR, s]); 13893 13894 // Handle the global AJAX counter 13895 if (! --jQuery.active) { 13896 jQuery.event.trigger("ajaxStop"); 13897 } 13898 } 13899 } 13900 return jqXHR; 13901 }, 13902 getJSON: function (url, data, callback) { 13903 return jQuery.get(url, data, callback, "json"); 13904 }, 13905 getScript: function (url, callback) { 13906 return jQuery.get(url, undefined, callback, "script"); 13907 } 13908 }); 13909 jQuery.each(["get", "post"], function (_i, method) { 13910 jQuery[method] = function (url, data, callback, type) { 13911 // Shift arguments if data argument was omitted 13912 if (isFunction(data)) { 13913 type = type || callback; 13914 callback = data; 13915 data = undefined; 13916 } 13917 13918 // The url can be an options object (which then must have .url) 13919 return jQuery.ajax(jQuery.extend({ 13920 url: url, 13921 type: method, 13922 dataType: type, 13923 data: data, 13924 success: callback 13925 }, jQuery.isPlainObject(url) && url)); 13926 }; 13927 }); 13928 jQuery.ajaxPrefilter(function (s) { 13929 var i; 13930 for (i in s.headers) { 13931 if (i.toLowerCase() === "content-type") { 13932 s.contentType = s.headers[i] || ""; 13933 } 13934 } 13935 }); 13936 jQuery._evalUrl = function (url, options, doc) { 13937 return jQuery.ajax({ 13938 url: url, 13939 // Make this explicit, since user can override this through ajaxSetup (trac-11264) 13940 type: "GET", 13941 dataType: "script", 13942 cache: true, 13943 async: false, 13944 global: false, 13945 // Only evaluate the response if it is successful (gh-4126) 13946 // dataFilter is not invoked for failure responses, so using it instead 13947 // of the default converter is kludgy but it works. 13948 converters: { 13949 "text script": function () {} 13950 }, 13951 dataFilter: function (response) { 13952 jQuery.globalEval(response, options, doc); 13953 } 13954 }); 13955 }; 13956 jQuery.fn.extend({ 13957 wrapAll: function (html) { 13958 var wrap; 13959 if (this[0]) { 13960 if (isFunction(html)) { 13961 html = html.call(this[0]); 13962 } 13963 13964 // The elements to wrap the target around 13965 wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); 13966 if (this[0].parentNode) { 13967 wrap.insertBefore(this[0]); 13968 } 13969 wrap.map(function () { 13970 var elem = this; 13971 while (elem.firstElementChild) { 13972 elem = elem.firstElementChild; 13973 } 13974 return elem; 13975 }).append(this); 13976 } 13977 return this; 13978 }, 13979 wrapInner: function (html) { 13980 if (isFunction(html)) { 13981 return this.each(function (i) { 13982 jQuery(this).wrapInner(html.call(this, i)); 13983 }); 13984 } 13985 return this.each(function () { 13986 var self = jQuery(this), 13987 contents = self.contents(); 13988 if (contents.length) { 13989 contents.wrapAll(html); 13990 } else { 13991 self.append(html); 13992 } 13993 }); 13994 }, 13995 wrap: function (html) { 13996 var htmlIsFunction = isFunction(html); 13997 return this.each(function (i) { 13998 jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html); 13999 }); 14000 }, 14001 unwrap: function (selector) { 14002 this.parent(selector).not("body").each(function () { 14003 jQuery(this).replaceWith(this.childNodes); 14004 }); 14005 return this; 14006 } 14007 }); 14008 jQuery.expr.pseudos.hidden = function (elem) { 14009 return !jQuery.expr.pseudos.visible(elem); 14010 }; 14011 jQuery.expr.pseudos.visible = function (elem) { 14012 return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); 14013 }; 14014 jQuery.ajaxSettings.xhr = function () { 14015 try { 14016 return new window.XMLHttpRequest(); 14017 } catch (e) {} 14018 }; 14019 var xhrSuccessStatus = { 14020 // File protocol always yields status code 0, assume 200 14021 0: 200, 14022 // Support: IE <=9 only 14023 // trac-1450: sometimes IE returns 1223 when it should be 204 14024 1223: 204 14025 }, 14026 xhrSupported = jQuery.ajaxSettings.xhr(); 14027 support.cors = !!xhrSupported && "withCredentials" in xhrSupported; 14028 support.ajax = xhrSupported = !!xhrSupported; 14029 jQuery.ajaxTransport(function (options) { 14030 var callback, errorCallback; 14031 14032 // Cross domain only allowed if supported through XMLHttpRequest 14033 if (support.cors || xhrSupported && !options.crossDomain) { 14034 return { 14035 send: function (headers, complete) { 14036 var i, 14037 xhr = options.xhr(); 14038 xhr.open(options.type, options.url, options.async, options.username, options.password); 14039 14040 // Apply custom fields if provided 14041 if (options.xhrFields) { 14042 for (i in options.xhrFields) { 14043 xhr[i] = options.xhrFields[i]; 14044 } 14045 } 14046 14047 // Override mime type if needed 14048 if (options.mimeType && xhr.overrideMimeType) { 14049 xhr.overrideMimeType(options.mimeType); 14050 } 14051 14052 // X-Requested-With header 14053 // For cross-domain requests, seeing as conditions for a preflight are 14054 // akin to a jigsaw puzzle, we simply never set it to be sure. 14055 // (it can always be set on a per-request basis or even using ajaxSetup) 14056 // For same-domain requests, won't change header if already provided. 14057 if (!options.crossDomain && !headers["X-Requested-With"]) { 14058 headers["X-Requested-With"] = "XMLHttpRequest"; 14059 } 14060 14061 // Set headers 14062 for (i in headers) { 14063 xhr.setRequestHeader(i, headers[i]); 14064 } 14065 14066 // Callback 14067 callback = function (type) { 14068 return function () { 14069 if (callback) { 14070 callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; 14071 if (type === "abort") { 14072 xhr.abort(); 14073 } else if (type === "error") { 14074 // Support: IE <=9 only 14075 // On a manual native abort, IE9 throws 14076 // errors on any property access that is not readyState 14077 if (typeof xhr.status !== "number") { 14078 complete(0, "error"); 14079 } else { 14080 complete( 14081 // File: protocol always yields status 0; see trac-8605, trac-14207 14082 xhr.status, xhr.statusText); 14083 } 14084 } else { 14085 complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, 14086 // Support: IE <=9 only 14087 // IE9 has no XHR2 but throws on binary (trac-11426) 14088 // For XHR2 non-text, let the caller handle it (gh-2498) 14089 (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { 14090 binary: xhr.response 14091 } : { 14092 text: xhr.responseText 14093 }, xhr.getAllResponseHeaders()); 14094 } 14095 } 14096 }; 14097 }; 14098 14099 // Listen to events 14100 xhr.onload = callback(); 14101 errorCallback = xhr.onerror = xhr.ontimeout = callback("error"); 14102 14103 // Support: IE 9 only 14104 // Use onreadystatechange to replace onabort 14105 // to handle uncaught aborts 14106 if (xhr.onabort !== undefined) { 14107 xhr.onabort = errorCallback; 14108 } else { 14109 xhr.onreadystatechange = function () { 14110 // Check readyState before timeout as it changes 14111 if (xhr.readyState === 4) { 14112 // Allow onerror to be called first, 14113 // but that will not handle a native abort 14114 // Also, save errorCallback to a variable 14115 // as xhr.onerror cannot be accessed 14116 window.setTimeout(function () { 14117 if (callback) { 14118 errorCallback(); 14119 } 14120 }); 14121 } 14122 }; 14123 } 14124 14125 // Create the abort callback 14126 callback = callback("abort"); 14127 try { 14128 // Do send the request (this may raise an exception) 14129 xhr.send(options.hasContent && options.data || null); 14130 } catch (e) { 14131 // trac-14683: Only rethrow if this hasn't been notified as an error yet 14132 if (callback) { 14133 throw e; 14134 } 14135 } 14136 }, 14137 abort: function () { 14138 if (callback) { 14139 callback(); 14140 } 14141 } 14142 }; 14143 } 14144 }); 14145 14146 // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 14147 jQuery.ajaxPrefilter(function (s) { 14148 if (s.crossDomain) { 14149 s.contents.script = false; 14150 } 14151 }); 14152 14153 // Install script dataType 14154 jQuery.ajaxSetup({ 14155 accepts: { 14156 script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" 14157 }, 14158 contents: { 14159 script: /\b(?:java|ecma)script\b/ 14160 }, 14161 converters: { 14162 "text script": function (text) { 14163 jQuery.globalEval(text); 14164 return text; 14165 } 14166 } 14167 }); 14168 14169 // Handle cache's special case and crossDomain 14170 jQuery.ajaxPrefilter("script", function (s) { 14171 if (s.cache === undefined) { 14172 s.cache = false; 14173 } 14174 if (s.crossDomain) { 14175 s.type = "GET"; 14176 } 14177 }); 14178 14179 // Bind script tag hack transport 14180 jQuery.ajaxTransport("script", function (s) { 14181 // This transport only deals with cross domain or forced-by-attrs requests 14182 if (s.crossDomain || s.scriptAttrs) { 14183 var script, callback; 14184 return { 14185 send: function (_, complete) { 14186 script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({ 14187 charset: s.scriptCharset, 14188 src: s.url 14189 }).on("load error", callback = function (evt) { 14190 script.remove(); 14191 callback = null; 14192 if (evt) { 14193 complete(evt.type === "error" ? 404 : 200, evt.type); 14194 } 14195 }); 14196 14197 // Use native DOM manipulation to avoid our domManip AJAX trickery 14198 document.head.appendChild(script[0]); 14199 }, 14200 abort: function () { 14201 if (callback) { 14202 callback(); 14203 } 14204 } 14205 }; 14206 } 14207 }); 14208 var oldCallbacks = [], 14209 rjsonp = /(=)\?(?=&|$)|\?\?/; 14210 14211 // Default jsonp settings 14212 jQuery.ajaxSetup({ 14213 jsonp: "callback", 14214 jsonpCallback: function () { 14215 var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++; 14216 this[callback] = true; 14217 return callback; 14218 } 14219 }); 14220 14221 // Detect, normalize options and install callbacks for jsonp requests 14222 jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) { 14223 var callbackName, 14224 overwritten, 14225 responseContainer, 14226 jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data"); 14227 14228 // Handle iff the expected data type is "jsonp" or we have a parameter to set 14229 if (jsonProp || s.dataTypes[0] === "jsonp") { 14230 // Get callback name, remembering preexisting value associated with it 14231 callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback; 14232 14233 // Insert callback into url or form data 14234 if (jsonProp) { 14235 s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName); 14236 } else if (s.jsonp !== false) { 14237 s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName; 14238 } 14239 14240 // Use data converter to retrieve json after script execution 14241 s.converters["script json"] = function () { 14242 if (!responseContainer) { 14243 jQuery.error(callbackName + " was not called"); 14244 } 14245 return responseContainer[0]; 14246 }; 14247 14248 // Force json dataType 14249 s.dataTypes[0] = "json"; 14250 14251 // Install callback 14252 overwritten = window[callbackName]; 14253 window[callbackName] = function () { 14254 responseContainer = arguments; 14255 }; 14256 14257 // Clean-up function (fires after converters) 14258 jqXHR.always(function () { 14259 // If previous value didn't exist - remove it 14260 if (overwritten === undefined) { 14261 jQuery(window).removeProp(callbackName); 14262 14263 // Otherwise restore preexisting value 14264 } else { 14265 window[callbackName] = overwritten; 14266 } 14267 14268 // Save back as free 14269 if (s[callbackName]) { 14270 // Make sure that re-using the options doesn't screw things around 14271 s.jsonpCallback = originalSettings.jsonpCallback; 14272 14273 // Save the callback name for future use 14274 oldCallbacks.push(callbackName); 14275 } 14276 14277 // Call if it was a function and we have a response 14278 if (responseContainer && isFunction(overwritten)) { 14279 overwritten(responseContainer[0]); 14280 } 14281 responseContainer = overwritten = undefined; 14282 }); 14283 14284 // Delegate to script 14285 return "script"; 14286 } 14287 }); 14288 14289 // Support: Safari 8 only 14290 // In Safari 8 documents created via document.implementation.createHTMLDocument 14291 // collapse sibling forms: the second one becomes a child of the first one. 14292 // Because of that, this security measure has to be disabled in Safari 8. 14293 // https://bugs.webkit.org/show_bug.cgi?id=137337 14294 support.createHTMLDocument = function () { 14295 var body = document.implementation.createHTMLDocument("").body; 14296 body.innerHTML = "<form></form><form></form>"; 14297 return body.childNodes.length === 2; 14298 }(); 14299 14300 // Argument "data" should be string of html 14301 // context (optional): If specified, the fragment will be created in this context, 14302 // defaults to document 14303 // keepScripts (optional): If true, will include scripts passed in the html string 14304 jQuery.parseHTML = function (data, context, keepScripts) { 14305 if (typeof data !== "string") { 14306 return []; 14307 } 14308 if (typeof context === "boolean") { 14309 keepScripts = context; 14310 context = false; 14311 } 14312 var base, parsed, scripts; 14313 if (!context) { 14314 // Stop scripts or inline event handlers from being executed immediately 14315 // by using document.implementation 14316 if (support.createHTMLDocument) { 14317 context = document.implementation.createHTMLDocument(""); 14318 14319 // Set the base href for the created document 14320 // so any parsed elements with URLs 14321 // are based on the document's URL (gh-2965) 14322 base = context.createElement("base"); 14323 base.href = document.location.href; 14324 context.head.appendChild(base); 14325 } else { 14326 context = document; 14327 } 14328 } 14329 parsed = rsingleTag.exec(data); 14330 scripts = !keepScripts && []; 14331 14332 // Single tag 14333 if (parsed) { 14334 return [context.createElement(parsed[1])]; 14335 } 14336 parsed = buildFragment([data], context, scripts); 14337 if (scripts && scripts.length) { 14338 jQuery(scripts).remove(); 14339 } 14340 return jQuery.merge([], parsed.childNodes); 14341 }; 14342 14343 /** 14344 * Load a url into a page 14345 */ 14346 jQuery.fn.load = function (url, params, callback) { 14347 var selector, 14348 type, 14349 response, 14350 self = this, 14351 off = url.indexOf(" "); 14352 if (off > -1) { 14353 selector = stripAndCollapse(url.slice(off)); 14354 url = url.slice(0, off); 14355 } 14356 14357 // If it's a function 14358 if (isFunction(params)) { 14359 // We assume that it's the callback 14360 callback = params; 14361 params = undefined; 14362 14363 // Otherwise, build a param string 14364 } else if (params && typeof params === "object") { 14365 type = "POST"; 14366 } 14367 14368 // If we have elements to modify, make the request 14369 if (self.length > 0) { 14370 jQuery.ajax({ 14371 url: url, 14372 // If "type" variable is undefined, then "GET" method will be used. 14373 // Make value of this field explicit since 14374 // user can override it through ajaxSetup method 14375 type: type || "GET", 14376 dataType: "html", 14377 data: params 14378 }).done(function (responseText) { 14379 // Save response for use in complete callback 14380 response = arguments; 14381 self.html(selector ? 14382 // If a selector was specified, locate the right elements in a dummy div 14383 // Exclude scripts to avoid IE 'Permission Denied' errors 14384 jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : 14385 // Otherwise use the full result 14386 responseText); 14387 14388 // If the request succeeds, this function gets "data", "status", "jqXHR" 14389 // but they are ignored because response was set above. 14390 // If it fails, this function gets "jqXHR", "status", "error" 14391 }).always(callback && function (jqXHR, status) { 14392 self.each(function () { 14393 callback.apply(this, response || [jqXHR.responseText, status, jqXHR]); 14394 }); 14395 }); 14396 } 14397 return this; 14398 }; 14399 jQuery.expr.pseudos.animated = function (elem) { 14400 return jQuery.grep(jQuery.timers, function (fn) { 14401 return elem === fn.elem; 14402 }).length; 14403 }; 14404 jQuery.offset = { 14405 setOffset: function (elem, options, i) { 14406 var curPosition, 14407 curLeft, 14408 curCSSTop, 14409 curTop, 14410 curOffset, 14411 curCSSLeft, 14412 calculatePosition, 14413 position = jQuery.css(elem, "position"), 14414 curElem = jQuery(elem), 14415 props = {}; 14416 14417 // Set position first, in-case top/left are set even on static elem 14418 if (position === "static") { 14419 elem.style.position = "relative"; 14420 } 14421 curOffset = curElem.offset(); 14422 curCSSTop = jQuery.css(elem, "top"); 14423 curCSSLeft = jQuery.css(elem, "left"); 14424 calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1; 14425 14426 // Need to be able to calculate position if either 14427 // top or left is auto and position is either absolute or fixed 14428 if (calculatePosition) { 14429 curPosition = curElem.position(); 14430 curTop = curPosition.top; 14431 curLeft = curPosition.left; 14432 } else { 14433 curTop = parseFloat(curCSSTop) || 0; 14434 curLeft = parseFloat(curCSSLeft) || 0; 14435 } 14436 if (isFunction(options)) { 14437 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 14438 options = options.call(elem, i, jQuery.extend({}, curOffset)); 14439 } 14440 if (options.top != null) { 14441 props.top = options.top - curOffset.top + curTop; 14442 } 14443 if (options.left != null) { 14444 props.left = options.left - curOffset.left + curLeft; 14445 } 14446 if ("using" in options) { 14447 options.using.call(elem, props); 14448 } else { 14449 curElem.css(props); 14450 } 14451 } 14452 }; 14453 jQuery.fn.extend({ 14454 // offset() relates an element's border box to the document origin 14455 offset: function (options) { 14456 // Preserve chaining for setter 14457 if (arguments.length) { 14458 return options === undefined ? this : this.each(function (i) { 14459 jQuery.offset.setOffset(this, options, i); 14460 }); 14461 } 14462 var rect, 14463 win, 14464 elem = this[0]; 14465 if (!elem) { 14466 return; 14467 } 14468 14469 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 14470 // Support: IE <=11 only 14471 // Running getBoundingClientRect on a 14472 // disconnected node in IE throws an error 14473 if (!elem.getClientRects().length) { 14474 return { 14475 top: 0, 14476 left: 0 14477 }; 14478 } 14479 14480 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 14481 rect = elem.getBoundingClientRect(); 14482 win = elem.ownerDocument.defaultView; 14483 return { 14484 top: rect.top + win.pageYOffset, 14485 left: rect.left + win.pageXOffset 14486 }; 14487 }, 14488 // position() relates an element's margin box to its offset parent's padding box 14489 // This corresponds to the behavior of CSS absolute positioning 14490 position: function () { 14491 if (!this[0]) { 14492 return; 14493 } 14494 var offsetParent, 14495 offset, 14496 doc, 14497 elem = this[0], 14498 parentOffset = { 14499 top: 0, 14500 left: 0 14501 }; 14502 14503 // position:fixed elements are offset from the viewport, which itself always has zero offset 14504 if (jQuery.css(elem, "position") === "fixed") { 14505 // Assume position:fixed implies availability of getBoundingClientRect 14506 offset = elem.getBoundingClientRect(); 14507 } else { 14508 offset = this.offset(); 14509 14510 // Account for the *real* offset parent, which can be the document or its root element 14511 // when a statically positioned element is identified 14512 doc = elem.ownerDocument; 14513 offsetParent = elem.offsetParent || doc.documentElement; 14514 while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, "position") === "static") { 14515 offsetParent = offsetParent.parentNode; 14516 } 14517 if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) { 14518 // Incorporate borders into its offset, since they are outside its content origin 14519 parentOffset = jQuery(offsetParent).offset(); 14520 parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true); 14521 parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true); 14522 } 14523 } 14524 14525 // Subtract parent offsets and element margins 14526 return { 14527 top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true), 14528 left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true) 14529 }; 14530 }, 14531 // This method will return documentElement in the following cases: 14532 // 1) For the element inside the iframe without offsetParent, this method will return 14533 // documentElement of the parent window 14534 // 2) For the hidden or detached element 14535 // 3) For body or html element, i.e. in case of the html node - it will return itself 14536 // 14537 // but those exceptions were never presented as a real life use-cases 14538 // and might be considered as more preferable results. 14539 // 14540 // This logic, however, is not guaranteed and can change at any point in the future 14541 offsetParent: function () { 14542 return this.map(function () { 14543 var offsetParent = this.offsetParent; 14544 while (offsetParent && jQuery.css(offsetParent, "position") === "static") { 14545 offsetParent = offsetParent.offsetParent; 14546 } 14547 return offsetParent || documentElement; 14548 }); 14549 } 14550 }); 14551 14552 // Create scrollLeft and scrollTop methods 14553 jQuery.each({ 14554 scrollLeft: "pageXOffset", 14555 scrollTop: "pageYOffset" 14556 }, function (method, prop) { 14557 var top = "pageYOffset" === prop; 14558 jQuery.fn[method] = function (val) { 14559 return access(this, function (elem, method, val) { 14560 // Coalesce documents and windows 14561 var win; 14562 if (isWindow(elem)) { 14563 win = elem; 14564 } else if (elem.nodeType === 9) { 14565 win = elem.defaultView; 14566 } 14567 if (val === undefined) { 14568 return win ? win[prop] : elem[method]; 14569 } 14570 if (win) { 14571 win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset); 14572 } else { 14573 elem[method] = val; 14574 } 14575 }, method, val, arguments.length); 14576 }; 14577 }); 14578 14579 // Support: Safari <=7 - 9.1, Chrome <=37 - 49 14580 // Add the top/left cssHooks using jQuery.fn.position 14581 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 14582 // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 14583 // getComputedStyle returns percent when specified for top/left/bottom/right; 14584 // rather than make the css module depend on the offset module, just check for it here 14585 jQuery.each(["top", "left"], function (_i, prop) { 14586 jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) { 14587 if (computed) { 14588 computed = curCSS(elem, prop); 14589 14590 // If curCSS returns percentage, fallback to offset 14591 return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed; 14592 } 14593 }); 14594 }); 14595 14596 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 14597 jQuery.each({ 14598 Height: "height", 14599 Width: "width" 14600 }, function (name, type) { 14601 jQuery.each({ 14602 padding: "inner" + name, 14603 content: type, 14604 "": "outer" + name 14605 }, function (defaultExtra, funcName) { 14606 // Margin is only for outerHeight, outerWidth 14607 jQuery.fn[funcName] = function (margin, value) { 14608 var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), 14609 extra = defaultExtra || (margin === true || value === true ? "margin" : "border"); 14610 return access(this, function (elem, type, value) { 14611 var doc; 14612 if (isWindow(elem)) { 14613 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 14614 return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name]; 14615 } 14616 14617 // Get document width or height 14618 if (elem.nodeType === 9) { 14619 doc = elem.documentElement; 14620 14621 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 14622 // whichever is greatest 14623 return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]); 14624 } 14625 return value === undefined ? 14626 // Get width or height on the element, requesting but not forcing parseFloat 14627 jQuery.css(elem, type, extra) : 14628 // Set width or height on the element 14629 jQuery.style(elem, type, value, extra); 14630 }, type, chainable ? margin : undefined, chainable); 14631 }; 14632 }); 14633 }); 14634 jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (_i, type) { 14635 jQuery.fn[type] = function (fn) { 14636 return this.on(type, fn); 14637 }; 14638 }); 14639 jQuery.fn.extend({ 14640 bind: function (types, data, fn) { 14641 return this.on(types, null, data, fn); 14642 }, 14643 unbind: function (types, fn) { 14644 return this.off(types, null, fn); 14645 }, 14646 delegate: function (selector, types, data, fn) { 14647 return this.on(types, selector, data, fn); 14648 }, 14649 undelegate: function (selector, types, fn) { 14650 // ( namespace ) or ( selector, types [, fn] ) 14651 return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn); 14652 }, 14653 hover: function (fnOver, fnOut) { 14654 return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver); 14655 } 14656 }); 14657 jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu").split(" "), function (_i, name) { 14658 // Handle event binding 14659 jQuery.fn[name] = function (data, fn) { 14660 return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name); 14661 }; 14662 }); 14663 14664 // Support: Android <=4.0 only 14665 // Make sure we trim BOM and NBSP 14666 // Require that the "whitespace run" starts from a non-whitespace 14667 // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. 14668 var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; 14669 14670 // Bind a function to a context, optionally partially applying any 14671 // arguments. 14672 // jQuery.proxy is deprecated to promote standards (specifically Function#bind) 14673 // However, it is not slated for removal any time soon 14674 jQuery.proxy = function (fn, context) { 14675 var tmp, args, proxy; 14676 if (typeof context === "string") { 14677 tmp = fn[context]; 14678 context = fn; 14679 fn = tmp; 14680 } 14681 14682 // Quick check to determine if target is callable, in the spec 14683 // this throws a TypeError, but we will just return undefined. 14684 if (!isFunction(fn)) { 14685 return undefined; 14686 } 14687 14688 // Simulated bind 14689 args = slice.call(arguments, 2); 14690 proxy = function () { 14691 return fn.apply(context || this, args.concat(slice.call(arguments))); 14692 }; 14693 14694 // Set the guid of unique handler to the same of original handler, so it can be removed 14695 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 14696 return proxy; 14697 }; 14698 jQuery.holdReady = function (hold) { 14699 if (hold) { 14700 jQuery.readyWait++; 14701 } else { 14702 jQuery.ready(true); 14703 } 14704 }; 14705 jQuery.isArray = Array.isArray; 14706 jQuery.parseJSON = JSON.parse; 14707 jQuery.nodeName = nodeName; 14708 jQuery.isFunction = isFunction; 14709 jQuery.isWindow = isWindow; 14710 jQuery.camelCase = camelCase; 14711 jQuery.type = toType; 14712 jQuery.now = Date.now; 14713 jQuery.isNumeric = function (obj) { 14714 // As of jQuery 3.0, isNumeric is limited to 14715 // strings and numbers (primitives or objects) 14716 // that can be coerced to finite numbers (gh-2662) 14717 var type = jQuery.type(obj); 14718 return (type === "number" || type === "string") && 14719 // parseFloat NaNs numeric-cast false positives ("") 14720 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 14721 // subtraction forces infinities to NaN 14722 !isNaN(obj - parseFloat(obj)); 14723 }; 14724 jQuery.trim = function (text) { 14725 return text == null ? "" : (text + "").replace(rtrim, "$1"); 14726 }; 14727 14728 // Register as a named AMD module, since jQuery can be concatenated with other 14729 // files that may use define, but not via a proper concatenation script that 14730 // understands anonymous AMD modules. A named AMD is safest and most robust 14731 // way to register. Lowercase jquery is used because AMD module names are 14732 // derived from file names, and jQuery is normally delivered in a lowercase 14733 // file name. Do this after creating the global so that if an AMD module wants 14734 // to call noConflict to hide this version of jQuery, it will work. 14735 14736 // Note that for maximum portability, libraries that are not jQuery should 14737 // declare themselves as anonymous modules, and avoid setting a global if an 14738 // AMD loader is present. jQuery is a special case. For more information, see 14739 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 14740 14741 if (typeof define === "function" && define.amd) { 14742 define("jquery", [], function () { 14743 return jQuery; 14744 }); 14745 } 14746 var 14747 // Map over jQuery in case of overwrite 14748 _jQuery = window.jQuery, 14749 // Map over the $ in case of overwrite 14750 _$ = window.$; 14751 jQuery.noConflict = function (deep) { 14752 if (window.$ === jQuery) { 14753 window.$ = _$; 14754 } 14755 if (deep && window.jQuery === jQuery) { 14756 window.jQuery = _jQuery; 14757 } 14758 return jQuery; 14759 }; 14760 14761 // Expose jQuery and $ identifiers, even in AMD 14762 // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) 14763 // and CommonJS for browser emulators (trac-13566) 14764 if (typeof noGlobal === "undefined") { 14765 window.jQuery = window.$ = jQuery; 14766 } 14767 return jQuery; 14768}); 14769 14770/***/ }), 14771
vendor: 115,521 bytes, lines 14772-17568
14772/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js": 14773/*!**************************************************************************!*\ 14774 !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js ***! 14775 \**************************************************************************/ 14776/*! no static exports found */ 14777/***/ (function(module, exports, __webpack_require__) { 14778 14779/*** IMPORTS FROM imports-loader ***/ 14780var define = false; 14781 14782/*! 14783 * ScrollMagic v2.0.8 (2020-08-14) 14784 * The javascript library for magical scroll interactions. 14785 * (c) 2020 Jan Paepke (@janpaepke) 14786 * Project Website: http://scrollmagic.io 14787 * 14788 * @version 2.0.8 14789 * @license Dual licensed under MIT license and GPL. 14790 * @author Jan Paepke - [email protected] 14791 * 14792 * @file ScrollMagic main library. 14793 */ 14794/** 14795 * @namespace ScrollMagic 14796 */ 14797(function (root, factory) { 14798 if (typeof define === 'function' && define.amd) { 14799 // AMD. Register as an anonymous module. 14800 define(factory); 14801 } else if (true) { 14802 // CommonJS 14803 module.exports = factory(); 14804 } else {} 14805})(this, function () { 14806 "use strict"; 14807 14808 var ScrollMagic = function () { 14809 _util.log(2, '(COMPATIBILITY NOTICE) -> As of ScrollMagic 2.0.0 you need to use \'new ScrollMagic.Controller()\' to create a new controller instance. Use \'new ScrollMagic.Scene()\' to instance a scene.'); 14810 }; 14811 ScrollMagic.version = "2.0.8"; 14812 14813 // TODO: temporary workaround for chrome's scroll jitter bug 14814 if (typeof window !== 'undefined') { 14815 window.addEventListener("mousewheel", void 0); 14816 } 14817 14818 // global const 14819 var PIN_SPACER_ATTRIBUTE = "data-scrollmagic-pin-spacer"; 14820 14821 /** 14822 * The main class that is needed once per scroll container. 14823 * 14824 * @class 14825 * 14826 * @example 14827 * // basic initialization 14828 * var controller = new ScrollMagic.Controller(); 14829 * 14830 * // passing options 14831 * var controller = new ScrollMagic.Controller({container: "#myContainer", loglevel: 3}); 14832 * 14833 * @param {object} [options] - An object containing one or more options for the controller. 14834 * @param {(string|object)} [options.container=window] - A selector, DOM object that references the main container for scrolling. 14835 * @param {boolean} [options.vertical=true] - Sets the scroll mode to vertical (`true`) or horizontal (`false`) scrolling. 14836 * @param {object} [options.globalSceneOptions={}] - These options will be passed to every Scene that is added to the controller using the addScene method. For more information on Scene options see {@link ScrollMagic.Scene}. 14837 * @param {number} [options.loglevel=2] Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic. 14838 ** `0` => silent 14839 ** `1` => errors 14840 ** `2` => errors, warnings 14841 ** `3` => errors, warnings, debuginfo 14842 * @param {boolean} [options.refreshInterval=100] - Some changes don't call events by default, like changing the container size or moving a scene trigger element. 14843 This interval polls these parameters to fire the necessary events. 14844 If you don't use custom containers, trigger elements or have static layouts, where the positions of the trigger elements don't change, you can set this to 0 disable interval checking and improve performance. 14845 * 14846 */ 14847 ScrollMagic.Controller = function (options) { 14848 /* 14849 * ---------------------------------------------------------------- 14850 * settings 14851 * ---------------------------------------------------------------- 14852 */ 14853 var NAMESPACE = 'ScrollMagic.Controller', 14854 SCROLL_DIRECTION_FORWARD = 'FORWARD', 14855 SCROLL_DIRECTION_REVERSE = 'REVERSE', 14856 SCROLL_DIRECTION_PAUSED = 'PAUSED', 14857 DEFAULT_OPTIONS = CONTROLLER_OPTIONS.defaults; 14858 14859 /* 14860 * ---------------------------------------------------------------- 14861 * private vars 14862 * ---------------------------------------------------------------- 14863 */ 14864 var Controller = this, 14865 _options = _util.extend({}, DEFAULT_OPTIONS, options), 14866 _sceneObjects = [], 14867 _updateScenesOnNextCycle = false, 14868 // can be boolean (true => all scenes) or an array of scenes to be updated 14869 _scrollPos = 0, 14870 _scrollDirection = SCROLL_DIRECTION_PAUSED, 14871 _isDocument = true, 14872 _viewPortSize = 0, 14873 _enabled = true, 14874 _updateTimeout, 14875 _refreshTimeout; 14876 14877 /* 14878 * ---------------------------------------------------------------- 14879 * private functions 14880 * ---------------------------------------------------------------- 14881 */ 14882 14883 /** 14884 * Internal constructor function of the ScrollMagic Controller 14885 * @private 14886 */ 14887 var construct = function () { 14888 for (var key in _options) { 14889 if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { 14890 log(2, "WARNING: Unknown option \"" + key + "\""); 14891 delete _options[key]; 14892 } 14893 } 14894 _options.container = _util.get.elements(_options.container)[0]; 14895 // check ScrollContainer 14896 if (!_options.container) { 14897 log(1, "ERROR creating object " + NAMESPACE + ": No valid scroll container supplied"); 14898 throw NAMESPACE + " init failed."; // cancel 14899 } 14900 _isDocument = _options.container === window || _options.container === document.body || !document.body.contains(_options.container); 14901 // normalize to window 14902 if (_isDocument) { 14903 _options.container = window; 14904 } 14905 // update container size immediately 14906 _viewPortSize = getViewportSize(); 14907 // set event handlers 14908 _options.container.addEventListener("resize", onChange); 14909 _options.container.addEventListener("scroll", onChange); 14910 var ri = parseInt(_options.refreshInterval, 10); 14911 _options.refreshInterval = _util.type.Number(ri) ? ri : DEFAULT_OPTIONS.refreshInterval; 14912 scheduleRefresh(); 14913 log(3, "added new " + NAMESPACE + " controller (v" + ScrollMagic.version + ")"); 14914 }; 14915 14916 /** 14917 * Schedule the next execution of the refresh function 14918 * @private 14919 */ 14920 var scheduleRefresh = function () { 14921 if (_options.refreshInterval > 0) { 14922 _refreshTimeout = window.setTimeout(refresh, _options.refreshInterval); 14923 } 14924 }; 14925 14926 /** 14927 * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)` 14928 * @private 14929 */ 14930 var getScrollPos = function () { 14931 return _options.vertical ? _util.get.scrollTop(_options.container) : _util.get.scrollLeft(_options.container); 14932 }; 14933 14934 /** 14935 * Returns the current viewport Size (width vor horizontal, height for vertical) 14936 * @private 14937 */ 14938 var getViewportSize = function () { 14939 return _options.vertical ? _util.get.height(_options.container) : _util.get.width(_options.container); 14940 }; 14941 14942 /** 14943 * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)` 14944 * Make available publicly for pinned mousewheel workaround. 14945 * @private 14946 */ 14947 var setScrollPos = this._setScrollPos = function (pos) { 14948 if (_options.vertical) { 14949 if (_isDocument) { 14950 window.scrollTo(_util.get.scrollLeft(), pos); 14951 } else { 14952 _options.container.scrollTop = pos; 14953 } 14954 } else { 14955 if (_isDocument) { 14956 window.scrollTo(pos, _util.get.scrollTop()); 14957 } else { 14958 _options.container.scrollLeft = pos; 14959 } 14960 } 14961 }; 14962 14963 /** 14964 * Handle updates in cycles instead of on scroll (performance) 14965 * @private 14966 */ 14967 var updateScenes = function () { 14968 if (_enabled && _updateScenesOnNextCycle) { 14969 // determine scenes to update 14970 var scenesToUpdate = _util.type.Array(_updateScenesOnNextCycle) ? _updateScenesOnNextCycle : _sceneObjects.slice(0); 14971 // reset scenes 14972 _updateScenesOnNextCycle = false; 14973 var oldScrollPos = _scrollPos; 14974 // update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll) 14975 _scrollPos = Controller.scrollPos(); 14976 var deltaScroll = _scrollPos - oldScrollPos; 14977 if (deltaScroll !== 0) { 14978 // scroll position changed? 14979 _scrollDirection = deltaScroll > 0 ? SCROLL_DIRECTION_FORWARD : SCROLL_DIRECTION_REVERSE; 14980 } 14981 // reverse order of scenes if scrolling reverse 14982 if (_scrollDirection === SCROLL_DIRECTION_REVERSE) { 14983 scenesToUpdate.reverse(); 14984 } 14985 // update scenes 14986 scenesToUpdate.forEach(function (scene, index) { 14987 log(3, "updating Scene " + (index + 1) + "/" + scenesToUpdate.length + " (" + _sceneObjects.length + " total)"); 14988 scene.update(true); 14989 }); 14990 if (scenesToUpdate.length === 0 && _options.loglevel >= 3) { 14991 log(3, "updating 0 Scenes (nothing added to controller)"); 14992 } 14993 } 14994 }; 14995 14996 /** 14997 * Initializes rAF callback 14998 * @private 14999 */ 15000 var debounceUpdate = function () { 15001 _updateTimeout = _util.rAF(updateScenes); 15002 }; 15003 15004 /** 15005 * Handles Container changes 15006 * @private 15007 */ 15008 var onChange = function (e) { 15009 log(3, "event fired causing an update:", e.type); 15010 if (e.type == "resize") { 15011 // resize 15012 _viewPortSize = getViewportSize(); 15013 _scrollDirection = SCROLL_DIRECTION_PAUSED; 15014 } 15015 // schedule update 15016 if (_updateScenesOnNextCycle !== true) { 15017 _updateScenesOnNextCycle = true; 15018 debounceUpdate(); 15019 } 15020 }; 15021 var refresh = function () { 15022 if (!_isDocument) { 15023 // simulate resize event. Only works for viewport relevant param (performance) 15024 if (_viewPortSize != getViewportSize()) { 15025 var resizeEvent; 15026 try { 15027 resizeEvent = new Event('resize', { 15028 bubbles: false, 15029 cancelable: false 15030 }); 15031 } catch (e) { 15032 // stupid IE 15033 resizeEvent = document.createEvent("Event"); 15034 resizeEvent.initEvent("resize", false, false); 15035 } 15036 _options.container.dispatchEvent(resizeEvent); 15037 } 15038 } 15039 _sceneObjects.forEach(function (scene, index) { 15040 // refresh all scenes 15041 scene.refresh(); 15042 }); 15043 scheduleRefresh(); 15044 }; 15045 15046 /** 15047 * Send a debug message to the console. 15048 * provided publicly with _log for plugins 15049 * @private 15050 * 15051 * @param {number} loglevel - The loglevel required to initiate output for the message. 15052 * @param {...mixed} output - One or more variables that should be passed to the console. 15053 */ 15054 var log = this._log = function (loglevel, output) { 15055 if (_options.loglevel >= loglevel) { 15056 Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->"); 15057 _util.log.apply(window, arguments); 15058 } 15059 }; 15060 // for scenes we have getters for each option, but for the controller we don't, so we need to make it available externally for plugins 15061 this._options = _options; 15062 15063 /** 15064 * Sort scenes in ascending order of their start offset. 15065 * @private 15066 * 15067 * @param {array} ScenesArray - an array of ScrollMagic Scenes that should be sorted 15068 * @return {array} The sorted array of Scenes. 15069 */ 15070 var sortScenes = function (ScenesArray) { 15071 if (ScenesArray.length <= 1) { 15072 return ScenesArray; 15073 } else { 15074 var scenes = ScenesArray.slice(0); 15075 scenes.sort(function (a, b) { 15076 return a.scrollOffset() > b.scrollOffset() ? 1 : -1; 15077 }); 15078 return scenes; 15079 } 15080 }; 15081 15082 /** 15083 * ---------------------------------------------------------------- 15084 * public functions 15085 * ---------------------------------------------------------------- 15086 */ 15087 15088 /** 15089 * Add one ore more scene(s) to the controller. 15090 * This is the equivalent to `Scene.addTo(controller)`. 15091 * @public 15092 * @example 15093 * // with a previously defined scene 15094 * controller.addScene(scene); 15095 * 15096 * // with a newly created scene. 15097 * controller.addScene(new ScrollMagic.Scene({duration : 0})); 15098 * 15099 * // adding multiple scenes 15100 * controller.addScene([scene, scene2, new ScrollMagic.Scene({duration : 0})]); 15101 * 15102 * @param {(ScrollMagic.Scene|array)} newScene - ScrollMagic Scene or Array of Scenes to be added to the controller. 15103 * @return {Controller} Parent object for chaining. 15104 */ 15105 this.addScene = function (newScene) { 15106 if (_util.type.Array(newScene)) { 15107 newScene.forEach(function (scene, index) { 15108 Controller.addScene(scene); 15109 }); 15110 } else if (newScene instanceof ScrollMagic.Scene) { 15111 if (newScene.controller() !== Controller) { 15112 newScene.addTo(Controller); 15113 } else if (_sceneObjects.indexOf(newScene) < 0) { 15114 // new scene 15115 _sceneObjects.push(newScene); // add to array 15116 _sceneObjects = sortScenes(_sceneObjects); // sort 15117 newScene.on("shift.controller_sort", function () { 15118 // resort whenever scene moves 15119 _sceneObjects = sortScenes(_sceneObjects); 15120 }); 15121 // insert Global defaults. 15122 for (var key in _options.globalSceneOptions) { 15123 if (newScene[key]) { 15124 newScene[key].call(newScene, _options.globalSceneOptions[key]); 15125 } 15126 } 15127 log(3, "adding Scene (now " + _sceneObjects.length + " total)"); 15128 } 15129 } else { 15130 log(1, "ERROR: invalid argument supplied for '.addScene()'"); 15131 } 15132 return Controller; 15133 }; 15134 15135 /** 15136 * Remove one ore more scene(s) from the controller. 15137 * This is the equivalent to `Scene.remove()`. 15138 * @public 15139 * @example 15140 * // remove a scene from the controller 15141 * controller.removeScene(scene); 15142 * 15143 * // remove multiple scenes from the controller 15144 * controller.removeScene([scene, scene2, scene3]); 15145 * 15146 * @param {(ScrollMagic.Scene|array)} Scene - ScrollMagic Scene or Array of Scenes to be removed from the controller. 15147 * @returns {Controller} Parent object for chaining. 15148 */ 15149 this.removeScene = function (Scene) { 15150 if (_util.type.Array(Scene)) { 15151 Scene.forEach(function (scene, index) { 15152 Controller.removeScene(scene); 15153 }); 15154 } else { 15155 var index = _sceneObjects.indexOf(Scene); 15156 if (index > -1) { 15157 Scene.off("shift.controller_sort"); 15158 _sceneObjects.splice(index, 1); 15159 log(3, "removing Scene (now " + _sceneObjects.length + " left)"); 15160 Scene.remove(); 15161 } 15162 } 15163 return Controller; 15164 }; 15165 15166 /** 15167 * Update one ore more scene(s) according to the scroll position of the container. 15168 * This is the equivalent to `Scene.update()`. 15169 * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. 15170 * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress. 15171 * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._ 15172 * @public 15173 * @example 15174 * // update a specific scene on next cycle 15175 * controller.updateScene(scene); 15176 * 15177 * // update a specific scene immediately 15178 * controller.updateScene(scene, true); 15179 * 15180 * // update multiple scenes scene on next cycle 15181 * controller.updateScene([scene1, scene2, scene3]); 15182 * 15183 * @param {ScrollMagic.Scene} Scene - ScrollMagic Scene or Array of Scenes that is/are supposed to be updated. 15184 * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle. 15185 This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes). 15186 * @return {Controller} Parent object for chaining. 15187 */ 15188 this.updateScene = function (Scene, immediately) { 15189 if (_util.type.Array(Scene)) { 15190 Scene.forEach(function (scene, index) { 15191 Controller.updateScene(scene, immediately); 15192 }); 15193 } else { 15194 if (immediately) { 15195 Scene.update(true); 15196 } else if (_updateScenesOnNextCycle !== true && Scene instanceof ScrollMagic.Scene) { 15197 // if _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update 15198 // prep array for next update cycle 15199 _updateScenesOnNextCycle = _updateScenesOnNextCycle || []; 15200 if (_updateScenesOnNextCycle.indexOf(Scene) == -1) { 15201 _updateScenesOnNextCycle.push(Scene); 15202 } 15203 _updateScenesOnNextCycle = sortScenes(_updateScenesOnNextCycle); // sort 15204 debounceUpdate(); 15205 } 15206 } 15207 return Controller; 15208 }; 15209 15210 /** 15211 * Updates the controller params and calls updateScene on every scene, that is attached to the controller. 15212 * See `Controller.updateScene()` for more information about what this means. 15213 * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll. 15214 * The only application for this method is when ScrollMagic fails to detect these events. 15215 * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes. 15216 * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details. 15217 * @public 15218 * @example 15219 * // update the controller on next cycle (saves performance due to elimination of redundant updates) 15220 * controller.update(); 15221 * 15222 * // update the controller immediately 15223 * controller.update(true); 15224 * 15225 * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance) 15226 * @return {Controller} Parent object for chaining. 15227 */ 15228 this.update = function (immediately) { 15229 onChange({ 15230 type: "resize" 15231 }); // will update size and set _updateScenesOnNextCycle to true 15232 if (immediately) { 15233 updateScenes(); 15234 } 15235 return Controller; 15236 }; 15237 15238 /** 15239 * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling. 15240 * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset. 15241 * @public 15242 * 15243 * @since 1.1.0 15244 * @example 15245 * // scroll to an offset of 100 15246 * controller.scrollTo(100); 15247 * 15248 * // scroll to a DOM element 15249 * controller.scrollTo("#anchor"); 15250 * 15251 * // scroll to the beginning of a scene 15252 * var scene = new ScrollMagic.Scene({offset: 200}); 15253 * controller.scrollTo(scene); 15254 * 15255 * // define a new scroll position modification function (jQuery animate instead of jump) 15256 * controller.scrollTo(function (newScrollPos) { 15257 * $("html, body").animate({scrollTop: newScrollPos}); 15258 * }); 15259 * controller.scrollTo(100); // call as usual, but the new function will be used instead 15260 * 15261 * // define a new scroll function with an additional parameter 15262 * controller.scrollTo(function (newScrollPos, message) { 15263 * console.log(message); 15264 * $(this).animate({scrollTop: newScrollPos}); 15265 * }); 15266 * // call as usual, but supply an extra parameter to the defined custom function 15267 * controller.scrollTo(100, "my message"); 15268 * 15269 * // define a new scroll function with an additional parameter containing multiple variables 15270 * controller.scrollTo(function (newScrollPos, options) { 15271 * someGlobalVar = options.a + options.b; 15272 * $(this).animate({scrollTop: newScrollPos}); 15273 * }); 15274 * // call as usual, but supply an extra parameter containing multiple options 15275 * controller.scrollTo(100, {a: 1, b: 2}); 15276 * 15277 * // define a new scroll function with a callback supplied as an additional parameter 15278 * controller.scrollTo(function (newScrollPos, callback) { 15279 * $(this).animate({scrollTop: newScrollPos}, 400, "swing", callback); 15280 * }); 15281 * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function 15282 * controller.scrollTo(100, function() { 15283 * console.log("scroll has finished."); 15284 * }); 15285 * 15286 * @param {mixed} scrollTarget - The supplied argument can be one of these types: 15287 * 1. `number` -> The container will scroll to this new scroll offset. 15288 * 2. `string` or `object` -> Can be a selector or a DOM object. 15289 * The container will scroll to the position of this element. 15290 * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene. 15291 * 4. `function` -> This function will be used for future scroll position modifications. 15292 * This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`. 15293 * It may also optionally receive an optional additional parameter (see below) 15294 * _**NOTE:** 15295 * All other options will still work as expected, using the new function to scroll._ 15296 * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function. 15297 * @returns {Controller} Parent object for chaining. 15298 */ 15299 this.scrollTo = function (scrollTarget, additionalParameter) { 15300 if (_util.type.Number(scrollTarget)) { 15301 // excecute 15302 setScrollPos.call(_options.container, scrollTarget, additionalParameter); 15303 } else if (scrollTarget instanceof ScrollMagic.Scene) { 15304 // scroll to scene 15305 if (scrollTarget.controller() === Controller) { 15306 // check if the controller is associated with this scene 15307 Controller.scrollTo(scrollTarget.scrollOffset(), additionalParameter); 15308 } else { 15309 log(2, "scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.", scrollTarget); 15310 } 15311 } else if (_util.type.Function(scrollTarget)) { 15312 // assign new scroll function 15313 setScrollPos = scrollTarget; 15314 } else { 15315 // scroll to element 15316 var elem = _util.get.elements(scrollTarget)[0]; 15317 if (elem) { 15318 // if parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements. 15319 while (elem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { 15320 elem = elem.parentNode; 15321 } 15322 var param = _options.vertical ? "top" : "left", 15323 // which param is of interest ? 15324 containerOffset = _util.get.offset(_options.container), 15325 // container position is needed because element offset is returned in relation to document, not in relation to container. 15326 elementOffset = _util.get.offset(elem); 15327 if (!_isDocument) { 15328 // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent 15329 containerOffset[param] -= Controller.scrollPos(); 15330 } 15331 Controller.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter); 15332 } else { 15333 log(2, "scrollTo(): The supplied argument is invalid. Scroll cancelled.", scrollTarget); 15334 } 15335 } 15336 return Controller; 15337 }; 15338 15339 /** 15340 * **Get** the current scrollPosition or **Set** a new method to calculate it. 15341 * -> **GET**: 15342 * When used as a getter this function will return the current scroll position. 15343 * To get a cached value use Controller.info("scrollPos"), which will be updated in the update cycle. 15344 * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset. 15345 * 15346 * -> **SET**: 15347 * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation. 15348 * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container. 15349 * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll. 15350 * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position. 15351 * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals. 15352 * 15353 * To change the current scroll position please use `Controller.scrollTo()`. 15354 * @public 15355 * 15356 * @example 15357 * // get the current scroll Position 15358 * var scrollPos = controller.scrollPos(); 15359 * 15360 * // set a new scroll position calculation method 15361 * controller.scrollPos(function () { 15362 * return this.info("vertical") ? -mychildcontainer.y : -mychildcontainer.x 15363 * }); 15364 * 15365 * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container. 15366 * @returns {(number|Controller)} Current scroll position or parent object for chaining. 15367 */ 15368 this.scrollPos = function (scrollPosMethod) { 15369 if (!arguments.length) { 15370 // get 15371 return getScrollPos.call(Controller); 15372 } else { 15373 // set 15374 if (_util.type.Function(scrollPosMethod)) { 15375 getScrollPos = scrollPosMethod; 15376 } else { 15377 log(2, "Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'."); 15378 } 15379 } 15380 return Controller; 15381 }; 15382 15383 /** 15384 * **Get** all infos or one in particular about the controller. 15385 * @public 15386 * @example 15387 * // returns the current scroll position (number) 15388 * var scrollPos = controller.info("scrollPos"); 15389 * 15390 * // returns all infos as an object 15391 * var infos = controller.info(); 15392 * 15393 * @param {string} [about] - If passed only this info will be returned instead of an object containing all. 15394 Valid options are: 15395 ** `"size"` => the current viewport size of the container 15396 ** `"vertical"` => true if vertical scrolling, otherwise false 15397 ** `"scrollPos"` => the current scroll position 15398 ** `"scrollDirection"` => the last known direction of the scroll 15399 ** `"container"` => the container element 15400 ** `"isDocument"` => true if container element is the document. 15401 * @returns {(mixed|object)} The requested info(s). 15402 */ 15403 this.info = function (about) { 15404 var values = { 15405 size: _viewPortSize, 15406 // contains height or width (in regard to orientation); 15407 vertical: _options.vertical, 15408 scrollPos: _scrollPos, 15409 scrollDirection: _scrollDirection, 15410 container: _options.container, 15411 isDocument: _isDocument 15412 }; 15413 if (!arguments.length) { 15414 // get all as an object 15415 return values; 15416 } else if (values[about] !== undefined) { 15417 return values[about]; 15418 } else { 15419 log(1, "ERROR: option \"" + about + "\" is not available"); 15420 return; 15421 } 15422 }; 15423 15424 /** 15425 * **Get** or **Set** the current loglevel option value. 15426 * @public 15427 * 15428 * @example 15429 * // get the current value 15430 * var loglevel = controller.loglevel(); 15431 * 15432 * // set a new value 15433 * controller.loglevel(3); 15434 * 15435 * @param {number} [newLoglevel] - The new loglevel setting of the Controller. `[0-3]` 15436 * @returns {(number|Controller)} Current loglevel or parent object for chaining. 15437 */ 15438 this.loglevel = function (newLoglevel) { 15439 if (!arguments.length) { 15440 // get 15441 return _options.loglevel; 15442 } else if (_options.loglevel != newLoglevel) { 15443 // set 15444 _options.loglevel = newLoglevel; 15445 } 15446 return Controller; 15447 }; 15448 15449 /** 15450 * **Get** or **Set** the current enabled state of the controller. 15451 * This can be used to disable all Scenes connected to the controller without destroying or removing them. 15452 * @public 15453 * 15454 * @example 15455 * // get the current value 15456 * var enabled = controller.enabled(); 15457 * 15458 * // disable the controller 15459 * controller.enabled(false); 15460 * 15461 * @param {boolean} [newState] - The new enabled state of the controller `true` or `false`. 15462 * @returns {(boolean|Controller)} Current enabled state or parent object for chaining. 15463 */ 15464 this.enabled = function (newState) { 15465 if (!arguments.length) { 15466 // get 15467 return _enabled; 15468 } else if (_enabled != newState) { 15469 // set 15470 _enabled = !!newState; 15471 Controller.updateScene(_sceneObjects, true); 15472 } 15473 return Controller; 15474 }; 15475 15476 /** 15477 * Destroy the Controller, all Scenes and everything. 15478 * @public 15479 * 15480 * @example 15481 * // without resetting the scenes 15482 * controller = controller.destroy(); 15483 * 15484 * // with scene reset 15485 * controller = controller.destroy(true); 15486 * 15487 * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset. 15488 * @returns {null} Null to unset handler variables. 15489 */ 15490 this.destroy = function (resetScenes) { 15491 window.clearTimeout(_refreshTimeout); 15492 var i = _sceneObjects.length; 15493 while (i--) { 15494 _sceneObjects[i].destroy(resetScenes); 15495 } 15496 _options.container.removeEventListener("resize", onChange); 15497 _options.container.removeEventListener("scroll", onChange); 15498 _util.cAF(_updateTimeout); 15499 log(3, "destroyed " + NAMESPACE + " (reset: " + (resetScenes ? "true" : "false") + ")"); 15500 return null; 15501 }; 15502 15503 // INIT 15504 construct(); 15505 return Controller; 15506 }; 15507 15508 // store pagewide controller options 15509 var CONTROLLER_OPTIONS = { 15510 defaults: { 15511 container: window, 15512 vertical: true, 15513 globalSceneOptions: {}, 15514 loglevel: 2, 15515 refreshInterval: 100 15516 } 15517 }; 15518 /* 15519 * method used to add an option to ScrollMagic Scenes. 15520 */ 15521 ScrollMagic.Controller.addOption = function (name, defaultValue) { 15522 CONTROLLER_OPTIONS.defaults[name] = defaultValue; 15523 }; 15524 // instance extension function for plugins 15525 ScrollMagic.Controller.extend = function (extension) { 15526 var oldClass = this; 15527 ScrollMagic.Controller = function () { 15528 oldClass.apply(this, arguments); 15529 this.$super = _util.extend({}, this); // copy parent state 15530 return extension.apply(this, arguments) || this; 15531 }; 15532 _util.extend(ScrollMagic.Controller, oldClass); // copy properties 15533 ScrollMagic.Controller.prototype = oldClass.prototype; // copy prototype 15534 ScrollMagic.Controller.prototype.constructor = ScrollMagic.Controller; // restore constructor 15535 }; 15536 15537 /** 15538 * A Scene defines where the controller should react and how. 15539 * 15540 * @class 15541 * 15542 * @example 15543 * // create a standard scene and add it to a controller 15544 * new ScrollMagic.Scene() 15545 * .addTo(controller); 15546 * 15547 * // create a scene with custom options and assign a handler to it. 15548 * var scene = new ScrollMagic.Scene({ 15549 * duration: 100, 15550 * offset: 200, 15551 * triggerHook: "onEnter", 15552 * reverse: false 15553 * }); 15554 * 15555 * @param {object} [options] - Options for the Scene. The options can be updated at any time. 15556 Instead of setting the options for each scene individually you can also set them globally in the controller as the controllers `globalSceneOptions` option. The object accepts the same properties as the ones below. 15557 When a scene is added to the controller the options defined using the Scene constructor will be overwritten by those set in `globalSceneOptions`. 15558 * @param {(number|string|function)} [options.duration=0] - The duration of the scene. 15559 Please see `Scene.duration()` for details. 15560 * @param {number} [options.offset=0] - Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the start of the page, after which the scene will start. 15561 * @param {(string|object)} [options.triggerElement=null] - Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start of the page (unless an offset is set). 15562 * @param {(number|string)} [options.triggerHook="onCenter"] - Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport. 15563 Can also be defined using a string: 15564 ** `"onEnter"` => `1` 15565 ** `"onCenter"` => `0.5` 15566 ** `"onLeave"` => `0` 15567 * @param {boolean} [options.reverse=true] - Should the scene reverse, when scrolling up? 15568 * @param {number} [options.loglevel=2] - Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic. 15569 ** `0` => silent 15570 ** `1` => errors 15571 ** `2` => errors, warnings 15572 ** `3` => errors, warnings, debuginfo 15573 * 15574 */ 15575 ScrollMagic.Scene = function (options) { 15576 /* 15577 * ---------------------------------------------------------------- 15578 * settings 15579 * ---------------------------------------------------------------- 15580 */ 15581 15582 var NAMESPACE = 'ScrollMagic.Scene', 15583 SCENE_STATE_BEFORE = 'BEFORE', 15584 SCENE_STATE_DURING = 'DURING', 15585 SCENE_STATE_AFTER = 'AFTER', 15586 DEFAULT_OPTIONS = SCENE_OPTIONS.defaults; 15587 15588 /* 15589 * ---------------------------------------------------------------- 15590 * private vars 15591 * ---------------------------------------------------------------- 15592 */ 15593 15594 var Scene = this, 15595 _options = _util.extend({}, DEFAULT_OPTIONS, options), 15596 _state = SCENE_STATE_BEFORE, 15597 _progress = 0, 15598 _scrollOffset = { 15599 start: 0, 15600 end: 0 15601 }, 15602 // reflects the controllers's scroll position for the start and end of the scene respectively 15603 _triggerPos = 0, 15604 _enabled = true, 15605 _durationUpdateMethod, 15606 _controller; 15607 15608 /** 15609 * Internal constructor function of the ScrollMagic Scene 15610 * @private 15611 */ 15612 var construct = function () { 15613 for (var key in _options) { 15614 // check supplied options 15615 if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { 15616 log(2, "WARNING: Unknown option \"" + key + "\""); 15617 delete _options[key]; 15618 } 15619 } 15620 // add getters/setters for all possible options 15621 for (var optionName in DEFAULT_OPTIONS) { 15622 addSceneOption(optionName); 15623 } 15624 // validate all options 15625 validateOption(); 15626 }; 15627 15628 /* 15629 * ---------------------------------------------------------------- 15630 * Event Management 15631 * ---------------------------------------------------------------- 15632 */ 15633 15634 var _listeners = {}; 15635 /** 15636 * Scene start event. 15637 * Fires whenever the scroll position its the starting point of the scene. 15638 * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback. 15639 * 15640 * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. 15641 * 15642 * @event ScrollMagic.Scene#start 15643 * 15644 * @example 15645 * scene.on("start", function (event) { 15646 * console.log("Hit start point of scene."); 15647 * }); 15648 * 15649 * @property {object} event - The event Object passed to each callback 15650 * @property {string} event.type - The name of the event 15651 * @property {Scene} event.target - The Scene object that triggered this event 15652 * @property {number} event.progress - Reflects the current progress of the scene 15653 * @property {string} event.state - The current state of the scene `"BEFORE"` or `"DURING"` 15654 * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` 15655 */ 15656 /** 15657 * Scene end event. 15658 * Fires whenever the scroll position its the ending point of the scene. 15659 * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback. 15660 * 15661 * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. 15662 * 15663 * @event ScrollMagic.Scene#end 15664 * 15665 * @example 15666 * scene.on("end", function (event) { 15667 * console.log("Hit end point of scene."); 15668 * }); 15669 * 15670 * @property {object} event - The event Object passed to each callback 15671 * @property {string} event.type - The name of the event 15672 * @property {Scene} event.target - The Scene object that triggered this event 15673 * @property {number} event.progress - Reflects the current progress of the scene 15674 * @property {string} event.state - The current state of the scene `"DURING"` or `"AFTER"` 15675 * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` 15676 */ 15677 /** 15678 * Scene enter event. 15679 * Fires whenever the scene enters the "DURING" state. 15680 * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction. 15681 * 15682 * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. 15683 * 15684 * @event ScrollMagic.Scene#enter 15685 * 15686 * @example 15687 * scene.on("enter", function (event) { 15688 * console.log("Scene entered."); 15689 * }); 15690 * 15691 * @property {object} event - The event Object passed to each callback 15692 * @property {string} event.type - The name of the event 15693 * @property {Scene} event.target - The Scene object that triggered this event 15694 * @property {number} event.progress - Reflects the current progress of the scene 15695 * @property {string} event.state - The current state of the scene - always `"DURING"` 15696 * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` 15697 */ 15698 /** 15699 * Scene leave event. 15700 * Fires whenever the scene's state goes from "DURING" to either "BEFORE" or "AFTER". 15701 * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction. 15702 * 15703 * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. 15704 * 15705 * @event ScrollMagic.Scene#leave 15706 * 15707 * @example 15708 * scene.on("leave", function (event) { 15709 * console.log("Scene left."); 15710 * }); 15711 * 15712 * @property {object} event - The event Object passed to each callback 15713 * @property {string} event.type - The name of the event 15714 * @property {Scene} event.target - The Scene object that triggered this event 15715 * @property {number} event.progress - Reflects the current progress of the scene 15716 * @property {string} event.state - The current state of the scene `"BEFORE"` or `"AFTER"` 15717 * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` 15718 */ 15719 /** 15720 * Scene update event. 15721 * Fires whenever the scene is updated (but not necessarily changes the progress). 15722 * 15723 * @event ScrollMagic.Scene#update 15724 * 15725 * @example 15726 * scene.on("update", function (event) { 15727 * console.log("Scene updated."); 15728 * }); 15729 * 15730 * @property {object} event - The event Object passed to each callback 15731 * @property {string} event.type - The name of the event 15732 * @property {Scene} event.target - The Scene object that triggered this event 15733 * @property {number} event.startPos - The starting position of the scene (in relation to the conainer) 15734 * @property {number} event.endPos - The ending position of the scene (in relation to the conainer) 15735 * @property {number} event.scrollPos - The current scroll position of the container 15736 */ 15737 /** 15738 * Scene progress event. 15739 * Fires whenever the progress of the scene changes. 15740 * 15741 * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. 15742 * 15743 * @event ScrollMagic.Scene#progress 15744 * 15745 * @example 15746 * scene.on("progress", function (event) { 15747 * console.log("Scene progress changed to " + event.progress); 15748 * }); 15749 * 15750 * @property {object} event - The event Object passed to each callback 15751 * @property {string} event.type - The name of the event 15752 * @property {Scene} event.target - The Scene object that triggered this event 15753 * @property {number} event.progress - Reflects the current progress of the scene 15754 * @property {string} event.state - The current state of the scene `"BEFORE"`, `"DURING"` or `"AFTER"` 15755 * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` 15756 */ 15757 /** 15758 * Scene change event. 15759 * Fires whenvever a property of the scene is changed. 15760 * 15761 * @event ScrollMagic.Scene#change 15762 * 15763 * @example 15764 * scene.on("change", function (event) { 15765 * console.log("Scene Property \"" + event.what + "\" changed to " + event.newval); 15766 * }); 15767 * 15768 * @property {object} event - The event Object passed to each callback 15769 * @property {string} event.type - The name of the event 15770 * @property {Scene} event.target - The Scene object that triggered this event 15771 * @property {string} event.what - Indicates what value has been changed 15772 * @property {mixed} event.newval - The new value of the changed property 15773 */ 15774 /** 15775 * Scene shift event. 15776 * Fires whenvever the start or end **scroll offset** of the scene change. 15777 * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`. 15778 * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases). 15779 * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`. 15780 * 15781 * @event ScrollMagic.Scene#shift 15782 * @since 1.1.0 15783 * 15784 * @example 15785 * scene.on("shift", function (event) { 15786 * console.log("Scene moved, because the " + event.reason + " has changed.)"); 15787 * }); 15788 * 15789 * @property {object} event - The event Object passed to each callback 15790 * @property {string} event.type - The name of the event 15791 * @property {Scene} event.target - The Scene object that triggered this event 15792 * @property {string} event.reason - Indicates why the scene has shifted 15793 */ 15794 /** 15795 * Scene destroy event. 15796 * Fires whenvever the scene is destroyed. 15797 * This can be used to tidy up custom behaviour used in events. 15798 * 15799 * @event ScrollMagic.Scene#destroy 15800 * @since 1.1.0 15801 * 15802 * @example 15803 * scene.on("enter", function (event) { 15804 * // add custom action 15805 * $("#my-elem").left("200"); 15806 * }) 15807 * .on("destroy", function (event) { 15808 * // reset my element to start position 15809 * if (event.reset) { 15810 * $("#my-elem").left("0"); 15811 * } 15812 * }); 15813 * 15814 * @property {object} event - The event Object passed to each callback 15815 * @property {string} event.type - The name of the event 15816 * @property {Scene} event.target - The Scene object that triggered this event 15817 * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`. 15818 */ 15819 /** 15820 * Scene add event. 15821 * Fires when the scene is added to a controller. 15822 * This is mostly used by plugins to know that change might be due. 15823 * 15824 * @event ScrollMagic.Scene#add 15825 * @since 2.0.0 15826 * 15827 * @example 15828 * scene.on("add", function (event) { 15829 * console.log('Scene was added to a new controller.'); 15830 * }); 15831 * 15832 * @property {object} event - The event Object passed to each callback 15833 * @property {string} event.type - The name of the event 15834 * @property {Scene} event.target - The Scene object that triggered this event 15835 * @property {boolean} event.controller - The controller object the scene was added to. 15836 */ 15837 /** 15838 * Scene remove event. 15839 * Fires when the scene is removed from a controller. 15840 * This is mostly used by plugins to know that change might be due. 15841 * 15842 * @event ScrollMagic.Scene#remove 15843 * @since 2.0.0 15844 * 15845 * @example 15846 * scene.on("remove", function (event) { 15847 * console.log('Scene was removed from its controller.'); 15848 * }); 15849 * 15850 * @property {object} event - The event Object passed to each callback 15851 * @property {string} event.type - The name of the event 15852 * @property {Scene} event.target - The Scene object that triggered this event 15853 */ 15854 15855 /** 15856 * Add one ore more event listener. 15857 * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback. 15858 * @method ScrollMagic.Scene#on 15859 * 15860 * @example 15861 * function callback (event) { 15862 * console.log("Event fired! (" + event.type + ")"); 15863 * } 15864 * // add listeners 15865 * scene.on("change update progress start end enter leave", callback); 15866 * 15867 * @param {string} names - The name or names of the event the callback should be attached to. 15868 * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback. 15869 * @returns {Scene} Parent object for chaining. 15870 */ 15871 this.on = function (names, callback) { 15872 if (_util.type.Function(callback)) { 15873 names = names.trim().split(' '); 15874 names.forEach(function (fullname) { 15875 var nameparts = fullname.split('.'), 15876 eventname = nameparts[0], 15877 namespace = nameparts[1]; 15878 if (eventname != "*") { 15879 // disallow wildcards 15880 if (!_listeners[eventname]) { 15881 _listeners[eventname] = []; 15882 } 15883 _listeners[eventname].push({ 15884 namespace: namespace || '', 15885 callback: callback 15886 }); 15887 } 15888 }); 15889 } else { 15890 log(1, "ERROR when calling '.on()': Supplied callback for '" + names + "' is not a valid function!"); 15891 } 15892 return Scene; 15893 }; 15894 15895 /** 15896 * Remove one or more event listener. 15897 * @method ScrollMagic.Scene#off 15898 * 15899 * @example 15900 * function callback (event) { 15901 * console.log("Event fired! (" + event.type + ")"); 15902 * } 15903 * // add listeners 15904 * scene.on("change update", callback); 15905 * // remove listeners 15906 * scene.off("change update", callback); 15907 * 15908 * @param {string} names - The name or names of the event that should be removed. 15909 * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed. 15910 * @returns {Scene} Parent object for chaining. 15911 */ 15912 this.off = function (names, callback) { 15913 if (!names) { 15914 log(1, "ERROR: Invalid event name supplied."); 15915 return Scene; 15916 } 15917 names = names.trim().split(' '); 15918 names.forEach(function (fullname, key) { 15919 var nameparts = fullname.split('.'), 15920 eventname = nameparts[0], 15921 namespace = nameparts[1] || '', 15922 removeList = eventname === '*' ? Object.keys(_listeners) : [eventname]; 15923 removeList.forEach(function (remove) { 15924 var list = _listeners[remove] || [], 15925 i = list.length; 15926 while (i--) { 15927 var listener = list[i]; 15928 if (listener && (namespace === listener.namespace || namespace === '*') && (!callback || callback == listener.callback)) { 15929 list.splice(i, 1); 15930 } 15931 } 15932 if (!list.length) { 15933 delete _listeners[remove]; 15934 } 15935 }); 15936 }); 15937 return Scene; 15938 }; 15939 15940 /** 15941 * Trigger an event. 15942 * @method ScrollMagic.Scene#trigger 15943 * 15944 * @example 15945 * this.trigger("change"); 15946 * 15947 * @param {string} name - The name of the event that should be triggered. 15948 * @param {object} [vars] - An object containing info that should be passed to the callback. 15949 * @returns {Scene} Parent object for chaining. 15950 */ 15951 this.trigger = function (name, vars) { 15952 if (name) { 15953 var nameparts = name.trim().split('.'), 15954 eventname = nameparts[0], 15955 namespace = nameparts[1], 15956 listeners = _listeners[eventname]; 15957 log(3, 'event fired:', eventname, vars ? "->" : '', vars || ''); 15958 if (listeners) { 15959 listeners.forEach(function (listener, key) { 15960 if (!namespace || namespace === listener.namespace) { 15961 listener.callback.call(Scene, new ScrollMagic.Event(eventname, listener.namespace, Scene, vars)); 15962 } 15963 }); 15964 } 15965 } else { 15966 log(1, "ERROR: Invalid event name supplied."); 15967 } 15968 return Scene; 15969 }; 15970 15971 // set event listeners 15972 Scene.on("change.internal", function (e) { 15973 if (e.what !== "loglevel" && e.what !== "tweenChanges") { 15974 // no need for a scene update scene with these options... 15975 if (e.what === "triggerElement") { 15976 updateTriggerElementPosition(); 15977 } else if (e.what === "reverse") { 15978 // the only property left that may have an impact on the current scene state. Everything else is handled by the shift event. 15979 Scene.update(); 15980 } 15981 } 15982 }).on("shift.internal", function (e) { 15983 updateScrollOffset(); 15984 Scene.update(); // update scene to reflect new position 15985 }); 15986 15987 /** 15988 * Send a debug message to the console. 15989 * @private 15990 * but provided publicly with _log for plugins 15991 * 15992 * @param {number} loglevel - The loglevel required to initiate output for the message. 15993 * @param {...mixed} output - One or more variables that should be passed to the console. 15994 */ 15995 var log = this._log = function (loglevel, output) { 15996 if (_options.loglevel >= loglevel) { 15997 Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->"); 15998 _util.log.apply(window, arguments); 15999 } 16000 }; 16001 16002 /** 16003 * Add the scene to a controller. 16004 * This is the equivalent to `Controller.addScene(scene)`. 16005 * @method ScrollMagic.Scene#addTo 16006 * 16007 * @example 16008 * // add a scene to a ScrollMagic Controller 16009 * scene.addTo(controller); 16010 * 16011 * @param {ScrollMagic.Controller} controller - The controller to which the scene should be added. 16012 * @returns {Scene} Parent object for chaining. 16013 */ 16014 this.addTo = function (controller) { 16015 if (!(controller instanceof ScrollMagic.Controller)) { 16016 log(1, "ERROR: supplied argument of 'addTo()' is not a valid ScrollMagic Controller"); 16017 } else if (_controller != controller) { 16018 // new controller 16019 if (_controller) { 16020 // was associated to a different controller before, so remove it... 16021 _controller.removeScene(Scene); 16022 } 16023 _controller = controller; 16024 validateOption(); 16025 updateDuration(true); 16026 updateTriggerElementPosition(true); 16027 updateScrollOffset(); 16028 _controller.info("container").addEventListener('resize', onContainerResize); 16029 controller.addScene(Scene); 16030 Scene.trigger("add", { 16031 controller: _controller 16032 }); 16033 log(3, "added " + NAMESPACE + " to controller"); 16034 Scene.update(); 16035 } 16036 return Scene; 16037 }; 16038 16039 /** 16040 * **Get** or **Set** the current enabled state of the scene. 16041 * This can be used to disable this scene without removing or destroying it. 16042 * @method ScrollMagic.Scene#enabled 16043 * 16044 * @example 16045 * // get the current value 16046 * var enabled = scene.enabled(); 16047 * 16048 * // disable the scene 16049 * scene.enabled(false); 16050 * 16051 * @param {boolean} [newState] - The new enabled state of the scene `true` or `false`. 16052 * @returns {(boolean|Scene)} Current enabled state or parent object for chaining. 16053 */ 16054 this.enabled = function (newState) { 16055 if (!arguments.length) { 16056 // get 16057 return _enabled; 16058 } else if (_enabled != newState) { 16059 // set 16060 _enabled = !!newState; 16061 Scene.update(true); 16062 } 16063 return Scene; 16064 }; 16065 16066 /** 16067 * Remove the scene from the controller. 16068 * This is the equivalent to `Controller.removeScene(scene)`. 16069 * The scene will not be updated anymore until you readd it to a controller. 16070 * To remove the pin or the tween you need to call removeTween() or removePin() respectively. 16071 * @method ScrollMagic.Scene#remove 16072 * @example 16073 * // remove the scene from its controller 16074 * scene.remove(); 16075 * 16076 * @returns {Scene} Parent object for chaining. 16077 */ 16078 this.remove = function () { 16079 if (_controller) { 16080 _controller.info("container").removeEventListener('resize', onContainerResize); 16081 var tmpParent = _controller; 16082 _controller = undefined; 16083 tmpParent.removeScene(Scene); 16084 Scene.trigger("remove"); 16085 log(3, "removed " + NAMESPACE + " from controller"); 16086 } 16087 return Scene; 16088 }; 16089 16090 /** 16091 * Destroy the scene and everything. 16092 * @method ScrollMagic.Scene#destroy 16093 * @example 16094 * // destroy the scene without resetting the pin and tween to their initial positions 16095 * scene = scene.destroy(); 16096 * 16097 * // destroy the scene and reset the pin and tween 16098 * scene = scene.destroy(true); 16099 * 16100 * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset. 16101 * @returns {null} Null to unset handler variables. 16102 */ 16103 this.destroy = function (reset) { 16104 Scene.trigger("destroy", { 16105 reset: reset 16106 }); 16107 Scene.remove(); 16108 Scene.off("*.*"); 16109 log(3, "destroyed " + NAMESPACE + " (reset: " + (reset ? "true" : "false") + ")"); 16110 return null; 16111 }; 16112 16113 /** 16114 * Updates the Scene to reflect the current state. 16115 * This is the equivalent to `Controller.updateScene(scene, immediately)`. 16116 * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. 16117 * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress. 16118 * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last. 16119 * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._ 16120 * @method ScrollMagic.Scene#update 16121 * @example 16122 * // update the scene on next tick 16123 * scene.update(); 16124 * 16125 * // update the scene immediately 16126 * scene.update(true); 16127 * 16128 * @fires Scene.update 16129 * 16130 * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance). 16131 * @returns {Scene} Parent object for chaining. 16132 */ 16133 this.update = function (immediately) { 16134 if (_controller) { 16135 if (immediately) { 16136 if (_controller.enabled() && _enabled) { 16137 var scrollPos = _controller.info("scrollPos"), 16138 newProgress; 16139 if (_options.duration > 0) { 16140 newProgress = (scrollPos - _scrollOffset.start) / (_scrollOffset.end - _scrollOffset.start); 16141 } else { 16142 newProgress = scrollPos >= _scrollOffset.start ? 1 : 0; 16143 } 16144 Scene.trigger("update", { 16145 startPos: _scrollOffset.start, 16146 endPos: _scrollOffset.end, 16147 scrollPos: scrollPos 16148 }); 16149 Scene.progress(newProgress); 16150 } else if (_pin && _state === SCENE_STATE_DURING) { 16151 updatePinState(true); // unpin in position 16152 } 16153 } else { 16154 _controller.updateScene(Scene, false); 16155 } 16156 } 16157 return Scene; 16158 }; 16159 16160 /** 16161 * Updates dynamic scene variables like the trigger element position or the duration. 16162 * This method is automatically called in regular intervals from the controller. See {@link ScrollMagic.Controller} option `refreshInterval`. 16163 * 16164 * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement. 16165 * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient. 16166 * 16167 * @method ScrollMagic.Scene#refresh 16168 * @since 1.1.0 16169 * @example 16170 * scene = new ScrollMagic.Scene({triggerElement: "#trigger"}); 16171 * 16172 * // change the position of the trigger 16173 * $("#trigger").css("top", 500); 16174 * // immediately let the scene know of this change 16175 * scene.refresh(); 16176 * 16177 * @fires {@link Scene.shift}, if the trigger element position or the duration changed 16178 * @fires {@link Scene.change}, if the duration changed 16179 * 16180 * @returns {Scene} Parent object for chaining. 16181 */ 16182 this.refresh = function () { 16183 updateDuration(); 16184 updateTriggerElementPosition(); 16185 // update trigger element position 16186 return Scene; 16187 }; 16188 16189 /** 16190 * **Get** or **Set** the scene's progress. 16191 * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update(). 16192 * The order in which the events are fired depends on the duration of the scene: 16193 * 1. Scenes with `duration == 0`: 16194 * Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired. 16195 * When the trigger position of the scene is passed the events are always fired in this order: 16196 * `enter`, `start`, `progress` when scrolling forward 16197 * and 16198 * `progress`, `start`, `leave` when scrolling in reverse 16199 * 2. Scenes with `duration > 0`: 16200 * Scenes with a set duration have a defined start and end point. 16201 * When scrolling past the start position of the scene it will fire these events in this order: 16202 * `enter`, `start`, `progress` 16203 * When continuing to scroll and passing the end point it will fire these events: 16204 * `progress`, `end`, `leave` 16205 * When reversing through the end point these events are fired: 16206 * `enter`, `end`, `progress` 16207 * And when continuing to scroll past the start position in reverse it will fire: 16208 * `progress`, `start`, `leave` 16209 * In between start and end the `progress` event will be called constantly, whenever the progress changes. 16210 * 16211 * In short: 16212 * `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update. 16213 * `start` and `end` will always trigger at their respective position. 16214 * 16215 * Please review the event descriptions for details on the events and the event object that is passed to the callback. 16216 * 16217 * @method ScrollMagic.Scene#progress 16218 * @example 16219 * // get the current scene progress 16220 * var progress = scene.progress(); 16221 * 16222 * // set new scene progress 16223 * scene.progress(0.3); 16224 * 16225 * @fires {@link Scene.enter}, when used as setter 16226 * @fires {@link Scene.start}, when used as setter 16227 * @fires {@link Scene.progress}, when used as setter 16228 * @fires {@link Scene.end}, when used as setter 16229 * @fires {@link Scene.leave}, when used as setter 16230 * 16231 * @param {number} [progress] - The new progress value of the scene `[0-1]`. 16232 * @returns {number} `get` - Current scene progress. 16233 * @returns {Scene} `set` - Parent object for chaining. 16234 */ 16235 this.progress = function (progress) { 16236 if (!arguments.length) { 16237 // get 16238 return _progress; 16239 } else { 16240 // set 16241 var doUpdate = false, 16242 oldState = _state, 16243 scrollDirection = _controller ? _controller.info("scrollDirection") : 'PAUSED', 16244 reverseOrForward = _options.reverse || progress >= _progress; 16245 if (_options.duration === 0) { 16246 // zero duration scenes 16247 doUpdate = _progress != progress; 16248 _progress = progress < 1 && reverseOrForward ? 0 : 1; 16249 _state = _progress === 0 ? SCENE_STATE_BEFORE : SCENE_STATE_DURING; 16250 } else { 16251 // scenes with start and end 16252 if (progress < 0 && _state !== SCENE_STATE_BEFORE && reverseOrForward) { 16253 // go back to initial state 16254 _progress = 0; 16255 _state = SCENE_STATE_BEFORE; 16256 doUpdate = true; 16257 } else if (progress >= 0 && progress < 1 && reverseOrForward) { 16258 _progress = progress; 16259 _state = SCENE_STATE_DURING; 16260 doUpdate = true; 16261 } else if (progress >= 1 && _state !== SCENE_STATE_AFTER) { 16262 _progress = 1; 16263 _state = SCENE_STATE_AFTER; 16264 doUpdate = true; 16265 } else if (_state === SCENE_STATE_DURING && !reverseOrForward) { 16266 updatePinState(); // in case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well. 16267 } 16268 } 16269 if (doUpdate) { 16270 // fire events 16271 var eventVars = { 16272 progress: _progress, 16273 state: _state, 16274 scrollDirection: scrollDirection 16275 }, 16276 stateChanged = _state != oldState; 16277 var trigger = function (eventName) { 16278 // tmp helper to simplify code 16279 Scene.trigger(eventName, eventVars); 16280 }; 16281 if (stateChanged) { 16282 // enter events 16283 if (oldState !== SCENE_STATE_DURING) { 16284 trigger("enter"); 16285 trigger(oldState === SCENE_STATE_BEFORE ? "start" : "end"); 16286 } 16287 } 16288 trigger("progress"); 16289 if (stateChanged) { 16290 // leave events 16291 if (_state !== SCENE_STATE_DURING) { 16292 trigger(_state === SCENE_STATE_BEFORE ? "start" : "end"); 16293 trigger("leave"); 16294 } 16295 } 16296 } 16297 return Scene; 16298 } 16299 }; 16300 16301 /** 16302 * Update the start and end scrollOffset of the container. 16303 * The positions reflect what the controller's scroll position will be at the start and end respectively. 16304 * Is called, when: 16305 * - Scene event "change" is called with: offset, triggerHook, duration 16306 * - scroll container event "resize" is called 16307 * - the position of the triggerElement changes 16308 * - the controller changes -> addTo() 16309 * @private 16310 */ 16311 var updateScrollOffset = function () { 16312 _scrollOffset = { 16313 start: _triggerPos + _options.offset 16314 }; 16315 if (_controller && _options.triggerElement) { 16316 // take away triggerHook portion to get relative to top 16317 _scrollOffset.start -= _controller.info("size") * _options.triggerHook; 16318 } 16319 _scrollOffset.end = _scrollOffset.start + _options.duration; 16320 }; 16321 16322 /** 16323 * Updates the duration if set to a dynamic function. 16324 * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh(). 16325 * 16326 * @fires {@link Scene.change}, if the duration changed 16327 * @fires {@link Scene.shift}, if the duration changed 16328 * 16329 * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed. 16330 * @private 16331 */ 16332 var updateDuration = function (suppressEvents) { 16333 // update duration 16334 if (_durationUpdateMethod) { 16335 var varname = "duration"; 16336 if (changeOption(varname, _durationUpdateMethod.call(Scene)) && !suppressEvents) { 16337 // set 16338 Scene.trigger("change", { 16339 what: varname, 16340 newval: _options[varname] 16341 }); 16342 Scene.trigger("shift", { 16343 reason: varname 16344 }); 16345 } 16346 } 16347 }; 16348 16349 /** 16350 * Updates the position of the triggerElement, if present. 16351 * This method is called ... 16352 * - ... when the triggerElement is changed 16353 * - ... when the scene is added to a (new) controller 16354 * - ... in regular intervals from the controller through scene.refresh(). 16355 * 16356 * @fires {@link Scene.shift}, if the position changed 16357 * 16358 * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed. 16359 * @private 16360 */ 16361 var updateTriggerElementPosition = function (suppressEvents) { 16362 var elementPos = 0, 16363 telem = _options.triggerElement; 16364 if (_controller && (telem || _triggerPos > 0)) { 16365 // either an element exists or was removed and the triggerPos is still > 0 16366 if (telem) { 16367 // there currently a triggerElement set 16368 if (telem.parentNode) { 16369 // check if element is still attached to DOM 16370 var controllerInfo = _controller.info(), 16371 containerOffset = _util.get.offset(controllerInfo.container), 16372 // container position is needed because element offset is returned in relation to document, not in relation to container. 16373 param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ? 16374 16375 // if parent is spacer, use spacer position instead so correct start position is returned for pinned elements. 16376 while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { 16377 telem = telem.parentNode; 16378 } 16379 var elementOffset = _util.get.offset(telem); 16380 if (!controllerInfo.isDocument) { 16381 // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent 16382 containerOffset[param] -= _controller.scrollPos(); 16383 } 16384 elementPos = elementOffset[param] - containerOffset[param]; 16385 } else { 16386 // there was an element, but it was removed from DOM 16387 log(2, "WARNING: triggerElement was removed from DOM and will be reset to", undefined); 16388 Scene.triggerElement(undefined); // unset, so a change event is triggered 16389 } 16390 } 16391 var changed = elementPos != _triggerPos; 16392 _triggerPos = elementPos; 16393 if (changed && !suppressEvents) { 16394 Scene.trigger("shift", { 16395 reason: "triggerElementPosition" 16396 }); 16397 } 16398 } 16399 }; 16400 16401 /** 16402 * Trigger a shift event, when the container is resized and the triggerHook is > 1. 16403 * @private 16404 */ 16405 var onContainerResize = function (e) { 16406 if (_options.triggerHook > 0) { 16407 Scene.trigger("shift", { 16408 reason: "containerResize" 16409 }); 16410 } 16411 }; 16412 var _validate = _util.extend(SCENE_OPTIONS.validate, { 16413 // validation for duration handled internally for reference to private var _durationMethod 16414 duration: function (val) { 16415 if (_util.type.String(val) && val.match(/^(\.|\d)*\d+%$/)) { 16416 // percentage value 16417 var perc = parseFloat(val) / 100; 16418 val = function () { 16419 return _controller ? _controller.info("size") * perc : 0; 16420 }; 16421 } 16422 if (_util.type.Function(val)) { 16423 // function 16424 _durationUpdateMethod = val; 16425 try { 16426 val = parseFloat(_durationUpdateMethod.call(Scene)); 16427 } catch (e) { 16428 val = -1; // will cause error below 16429 } 16430 } 16431 // val has to be float 16432 val = parseFloat(val); 16433 if (!_util.type.Number(val) || val < 0) { 16434 if (_durationUpdateMethod) { 16435 _durationUpdateMethod = undefined; 16436 throw ["Invalid return value of supplied function for option \"duration\":", val]; 16437 } else { 16438 throw ["Invalid value for option \"duration\":", val]; 16439 } 16440 } 16441 return val; 16442 } 16443 }); 16444 16445 /** 16446 * Checks the validity of a specific or all options and reset to default if neccessary. 16447 * @private 16448 */ 16449 var validateOption = function (check) { 16450 check = arguments.length ? [check] : Object.keys(_validate); 16451 check.forEach(function (optionName, key) { 16452 var value; 16453 if (_validate[optionName]) { 16454 // there is a validation method for this option 16455 try { 16456 // validate value 16457 value = _validate[optionName](_options[optionName]); 16458 } catch (e) { 16459 // validation failed -> reset to default 16460 value = DEFAULT_OPTIONS[optionName]; 16461 var logMSG = _util.type.String(e) ? [e] : e; 16462 if (_util.type.Array(logMSG)) { 16463 logMSG[0] = "ERROR: " + logMSG[0]; 16464 logMSG.unshift(1); // loglevel 1 for error msg 16465 log.apply(this, logMSG); 16466 } else { 16467 log(1, "ERROR: Problem executing validation callback for option '" + optionName + "':", e.message); 16468 } 16469 } finally { 16470 _options[optionName] = value; 16471 } 16472 } 16473 }); 16474 }; 16475 16476 /** 16477 * Helper used by the setter/getters for scene options 16478 * @private 16479 */ 16480 var changeOption = function (varname, newval) { 16481 var changed = false, 16482 oldval = _options[varname]; 16483 if (_options[varname] != newval) { 16484 _options[varname] = newval; 16485 validateOption(varname); // resets to default if necessary 16486 changed = oldval != _options[varname]; 16487 } 16488 return changed; 16489 }; 16490 16491 // generate getters/setters for all options 16492 var addSceneOption = function (optionName) { 16493 if (!Scene[optionName]) { 16494 Scene[optionName] = function (newVal) { 16495 if (!arguments.length) { 16496 // get 16497 return _options[optionName]; 16498 } else { 16499 if (optionName === "duration") { 16500 // new duration is set, so any previously set function must be unset 16501 _durationUpdateMethod = undefined; 16502 } 16503 if (changeOption(optionName, newVal)) { 16504 // set 16505 Scene.trigger("change", { 16506 what: optionName, 16507 newval: _options[optionName] 16508 }); 16509 if (SCENE_OPTIONS.shifts.indexOf(optionName) > -1) { 16510 Scene.trigger("shift", { 16511 reason: optionName 16512 }); 16513 } 16514 } 16515 } 16516 return Scene; 16517 }; 16518 } 16519 }; 16520 16521 /** 16522 * **Get** or **Set** the duration option value. 16523 * 16524 * As a **setter** it accepts three types of parameters: 16525 * 1. `number`: Sets the duration of the scene to exactly this amount of pixels. 16526 * This means the scene will last for exactly this amount of pixels scrolled. Sub-Pixels are also valid. 16527 * A value of `0` means that the scene is 'open end' and no end will be triggered. Pins will never unpin and animations will play independently of scroll progress. 16528 * 2. `string`: Always updates the duration relative to parent scroll container. 16529 * For example `"100%"` will keep the duration always exactly at the inner height of the scroll container. 16530 * When scrolling vertically the width is used for reference respectively. 16531 * 3. `function`: The supplied function will be called to return the scene duration. 16532 * This is useful in setups where the duration depends on other elements who might change size. By supplying a function you can return a value instead of updating potentially multiple scene durations. 16533 * The scene can be referenced inside the callback using `this`. 16534 * _**WARNING:** This is an easy way to kill performance, as the callback will be executed every time `Scene.refresh()` is called, which happens a lot. The interval is defined by the controller (see ScrollMagic.Controller option `refreshInterval`). 16535 * It's recomended to avoid calculations within the function and use cached variables as return values. 16536 * This counts double if you use the same function for multiple scenes._ 16537 * 16538 * @method ScrollMagic.Scene#duration 16539 * @example 16540 * // get the current duration value 16541 * var duration = scene.duration(); 16542 * 16543 * // set a new duration 16544 * scene.duration(300); 16545 * 16546 * // set duration responsively to container size 16547 * scene.duration("100%"); 16548 * 16549 * // use a function to randomize the duration for some reason. 16550 * var durationValueCache; 16551 * function durationCallback () { 16552 * return durationValueCache; 16553 * } 16554 * function updateDuration () { 16555 * durationValueCache = Math.random() * 100; 16556 * } 16557 * updateDuration(); // set to initial value 16558 * scene.duration(durationCallback); // set duration callback 16559 * 16560 * @fires {@link Scene.change}, when used as setter 16561 * @fires {@link Scene.shift}, when used as setter 16562 * @param {(number|string|function)} [newDuration] - The new duration setting for the scene. 16563 * @returns {number} `get` - Current scene duration. 16564 * @returns {Scene} `set` - Parent object for chaining. 16565 */ 16566 16567 /** 16568 * **Get** or **Set** the offset option value. 16569 * @method ScrollMagic.Scene#offset 16570 * @example 16571 * // get the current offset 16572 * var offset = scene.offset(); 16573 * 16574 * // set a new offset 16575 * scene.offset(100); 16576 * 16577 * @fires {@link Scene.change}, when used as setter 16578 * @fires {@link Scene.shift}, when used as setter 16579 * @param {number} [newOffset] - The new offset of the scene. 16580 * @returns {number} `get` - Current scene offset. 16581 * @returns {Scene} `set` - Parent object for chaining. 16582 */ 16583 16584 /** 16585 * **Get** or **Set** the triggerElement option value. 16586 * Does **not** fire `Scene.shift`, because changing the trigger Element doesn't necessarily mean the start position changes. This will be determined in `Scene.refresh()`, which is automatically triggered. 16587 * @method ScrollMagic.Scene#triggerElement 16588 * @example 16589 * // get the current triggerElement 16590 * var triggerElement = scene.triggerElement(); 16591 * 16592 * // set a new triggerElement using a selector 16593 * scene.triggerElement("#trigger"); 16594 * // set a new triggerElement using a DOM object 16595 * scene.triggerElement(document.getElementById("trigger")); 16596 * 16597 * @fires {@link Scene.change}, when used as setter 16598 * @param {(string|object)} [newTriggerElement] - The new trigger element for the scene. 16599 * @returns {(string|object)} `get` - Current triggerElement. 16600 * @returns {Scene} `set` - Parent object for chaining. 16601 */ 16602 16603 /** 16604 * **Get** or **Set** the triggerHook option value. 16605 * @method ScrollMagic.Scene#triggerHook 16606 * @example 16607 * // get the current triggerHook value 16608 * var triggerHook = scene.triggerHook(); 16609 * 16610 * // set a new triggerHook using a string 16611 * scene.triggerHook("onLeave"); 16612 * // set a new triggerHook using a number 16613 * scene.triggerHook(0.7); 16614 * 16615 * @fires {@link Scene.change}, when used as setter 16616 * @fires {@link Scene.shift}, when used as setter 16617 * @param {(number|string)} [newTriggerHook] - The new triggerHook of the scene. See {@link Scene} parameter description for value options. 16618 * @returns {number} `get` - Current triggerHook (ALWAYS numerical). 16619 * @returns {Scene} `set` - Parent object for chaining. 16620 */ 16621 16622 /** 16623 * **Get** or **Set** the reverse option value. 16624 * @method ScrollMagic.Scene#reverse 16625 * @example 16626 * // get the current reverse option 16627 * var reverse = scene.reverse(); 16628 * 16629 * // set new reverse option 16630 * scene.reverse(false); 16631 * 16632 * @fires {@link Scene.change}, when used as setter 16633 * @param {boolean} [newReverse] - The new reverse setting of the scene. 16634 * @returns {boolean} `get` - Current reverse option value. 16635 * @returns {Scene} `set` - Parent object for chaining. 16636 */ 16637 16638 /** 16639 * **Get** or **Set** the loglevel option value. 16640 * @method ScrollMagic.Scene#loglevel 16641 * @example 16642 * // get the current loglevel 16643 * var loglevel = scene.loglevel(); 16644 * 16645 * // set new loglevel 16646 * scene.loglevel(3); 16647 * 16648 * @fires {@link Scene.change}, when used as setter 16649 * @param {number} [newLoglevel] - The new loglevel setting of the scene. `[0-3]` 16650 * @returns {number} `get` - Current loglevel. 16651 * @returns {Scene} `set` - Parent object for chaining. 16652 */ 16653 16654 /** 16655 * **Get** the associated controller. 16656 * @method ScrollMagic.Scene#controller 16657 * @example 16658 * // get the controller of a scene 16659 * var controller = scene.controller(); 16660 * 16661 * @returns {ScrollMagic.Controller} Parent controller or `undefined` 16662 */ 16663 this.controller = function () { 16664 return _controller; 16665 }; 16666 16667 /** 16668 * **Get** the current state. 16669 * @method ScrollMagic.Scene#state 16670 * @example 16671 * // get the current state 16672 * var state = scene.state(); 16673 * 16674 * @returns {string} `"BEFORE"`, `"DURING"` or `"AFTER"` 16675 */ 16676 this.state = function () { 16677 return _state; 16678 }; 16679 16680 /** 16681 * **Get** the current scroll offset for the start of the scene. 16682 * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `"onLeave"`). 16683 * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset. 16684 * @method ScrollMagic.Scene#scrollOffset 16685 * @example 16686 * // get the current scroll offset for the start and end of the scene. 16687 * var start = scene.scrollOffset(); 16688 * var end = scene.scrollOffset() + scene.duration(); 16689 * console.log("the scene starts at", start, "and ends at", end); 16690 * 16691 * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls. 16692 */ 16693 this.scrollOffset = function () { 16694 return _scrollOffset.start; 16695 }; 16696 16697 /** 16698 * **Get** the trigger position of the scene (including the value of the `offset` option). 16699 * @method ScrollMagic.Scene#triggerPosition 16700 * @example 16701 * // get the scene's trigger position 16702 * var triggerPosition = scene.triggerPosition(); 16703 * 16704 * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls. 16705 */ 16706 this.triggerPosition = function () { 16707 var pos = _options.offset; // the offset is the basis 16708 if (_controller) { 16709 // get the trigger position 16710 if (_options.triggerElement) { 16711 // Element as trigger 16712 pos += _triggerPos; 16713 } else { 16714 // return the height of the triggerHook to start at the beginning 16715 pos += _controller.info("size") * Scene.triggerHook(); 16716 } 16717 } 16718 return pos; 16719 }; 16720 var _pin, _pinOptions; 16721 Scene.on("shift.internal", function (e) { 16722 var durationChanged = e.reason === "duration"; 16723 if (_state === SCENE_STATE_AFTER && durationChanged || _state === SCENE_STATE_DURING && _options.duration === 0) { 16724 // if [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed]. 16725 updatePinState(); 16726 } 16727 if (durationChanged) { 16728 updatePinDimensions(); 16729 } 16730 }).on("progress.internal", function (e) { 16731 updatePinState(); 16732 }).on("add.internal", function (e) { 16733 updatePinDimensions(); 16734 }).on("destroy.internal", function (e) { 16735 Scene.removePin(e.reset); 16736 }); 16737 /** 16738 * Update the pin state. 16739 * @private 16740 */ 16741 var updatePinState = function (forceUnpin) { 16742 if (_pin && _controller) { 16743 var containerInfo = _controller.info(), 16744 pinTarget = _pinOptions.spacer.firstChild; // may be pin element or another spacer, if cascading pins 16745 16746 if (!forceUnpin && _state === SCENE_STATE_DURING) { 16747 // during scene or if duration is 0 and we are past the trigger 16748 // pinned state 16749 if (_util.css(pinTarget, "position") != "fixed") { 16750 // change state before updating pin spacer (position changes due to fixed collapsing might occur.) 16751 _util.css(pinTarget, { 16752 "position": "fixed" 16753 }); 16754 // update pin spacer 16755 updatePinDimensions(); 16756 } 16757 var fixedPos = _util.get.offset(_pinOptions.spacer, true), 16758 // get viewport position of spacer 16759 scrollDistance = _options.reverse || _options.duration === 0 ? containerInfo.scrollPos - _scrollOffset.start // quicker 16760 : Math.round(_progress * _options.duration * 10) / 10; // if no reverse and during pin the position needs to be recalculated using the progress 16761 16762 // add scrollDistance 16763 fixedPos[containerInfo.vertical ? "top" : "left"] += scrollDistance; 16764 16765 // set new values 16766 _util.css(_pinOptions.spacer.firstChild, { 16767 top: fixedPos.top, 16768 left: fixedPos.left 16769 }); 16770 } else { 16771 // unpinned state 16772 var newCSS = { 16773 position: _pinOptions.inFlow ? "relative" : "absolute", 16774 top: 0, 16775 left: 0 16776 }, 16777 change = _util.css(pinTarget, "position") != newCSS.position; 16778 if (!_pinOptions.pushFollowers) { 16779 newCSS[containerInfo.vertical ? "top" : "left"] = _options.duration * _progress; 16780 } else if (_options.duration > 0) { 16781 // only concerns scenes with duration 16782 if (_state === SCENE_STATE_AFTER && parseFloat(_util.css(_pinOptions.spacer, "padding-top")) === 0) { 16783 change = true; // if in after state but havent updated spacer yet (jumped past pin) 16784 } else if (_state === SCENE_STATE_BEFORE && parseFloat(_util.css(_pinOptions.spacer, "padding-bottom")) === 0) { 16785 // before 16786 change = true; // jumped past fixed state upward direction 16787 } 16788 } 16789 // set new values 16790 _util.css(pinTarget, newCSS); 16791 if (change) { 16792 // update pin spacer if state changed 16793 updatePinDimensions(); 16794 } 16795 } 16796 } 16797 }; 16798 16799 /** 16800 * Update the pin spacer and/or element size. 16801 * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements. 16802 * @private 16803 */ 16804 var updatePinDimensions = function () { 16805 if (_pin && _controller && _pinOptions.inFlow) { 16806 // no spacerresize, if original position is absolute 16807 var after = _state === SCENE_STATE_AFTER, 16808 before = _state === SCENE_STATE_BEFORE, 16809 during = _state === SCENE_STATE_DURING, 16810 vertical = _controller.info("vertical"), 16811 pinTarget = _pinOptions.spacer.firstChild, 16812 // usually the pined element but can also be another spacer (cascaded pins) 16813 marginCollapse = _util.isMarginCollapseType(_util.css(_pinOptions.spacer, "display")), 16814 css = {}; 16815 16816 // set new size 16817 // if relsize: spacer -> pin | else: pin -> spacer 16818 if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) { 16819 if (during) { 16820 _util.css(_pin, { 16821 "width": _util.get.width(_pinOptions.spacer) 16822 }); 16823 } else { 16824 _util.css(_pin, { 16825 "width": "100%" 16826 }); 16827 } 16828 } else { 16829 // minwidth is needed for cascaded pins. 16830 css["min-width"] = _util.get.width(vertical ? _pin : pinTarget, true, true); 16831 css.width = during ? css["min-width"] : "auto"; 16832 } 16833 if (_pinOptions.relSize.height) { 16834 if (during) { 16835 // the only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that. 16836 _util.css(_pin, { 16837 "height": _util.get.height(_pinOptions.spacer) - (_pinOptions.pushFollowers ? _options.duration : 0) 16838 }); 16839 } else { 16840 _util.css(_pin, { 16841 "height": "100%" 16842 }); 16843 } 16844 } else { 16845 // margin is only included if it's a cascaded pin to resolve an IE9 bug 16846 css["min-height"] = _util.get.height(vertical ? pinTarget : _pin, true, !marginCollapse); // needed for cascading pins 16847 css.height = during ? css["min-height"] : "auto"; 16848 } 16849 16850 // add space for duration if pushFollowers is true 16851 if (_pinOptions.pushFollowers) { 16852 css["padding" + (vertical ? "Top" : "Left")] = _options.duration * _progress; 16853 css["padding" + (vertical ? "Bottom" : "Right")] = _options.duration * (1 - _progress); 16854 } 16855 _util.css(_pinOptions.spacer, css); 16856 } 16857 }; 16858 16859 /** 16860 * Updates the Pin state (in certain scenarios) 16861 * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions. 16862 * So this function is called on resize and scroll of the document. 16863 * @private 16864 */ 16865 var updatePinInContainer = function () { 16866 if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) { 16867 updatePinState(); 16868 } 16869 }; 16870 16871 /** 16872 * Updates the Pin spacer size state (in certain scenarios) 16873 * If container is resized during pin and relatively sized the size of the pin might need to be updated... 16874 * So this function is called on resize of the container. 16875 * @private 16876 */ 16877 var updateRelativePinSpacer = function () { 16878 if (_controller && _pin && 16879 // well, duh 16880 _state === SCENE_STATE_DURING && ( 16881 // element in pinned state? 16882 // is width or height relatively sized, but not in relation to body? then we need to recalc. 16883 (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) && _util.get.width(window) != _util.get.width(_pinOptions.spacer.parentNode) || _pinOptions.relSize.height && _util.get.height(window) != _util.get.height(_pinOptions.spacer.parentNode))) { 16884 updatePinDimensions(); 16885 } 16886 }; 16887 16888 /** 16889 * Is called, when the mousewhel is used while over a pinned element inside a div container. 16890 * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container. 16891 * @private 16892 */ 16893 var onMousewheelOverPin = function (e) { 16894 if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) { 16895 // in pin state 16896 e.preventDefault(); 16897 _controller._setScrollPos(_controller.info("scrollPos") - ((e.wheelDelta || e[_controller.info("vertical") ? "wheelDeltaY" : "wheelDeltaX"]) / 3 || -e.detail * 30)); 16898 } 16899 }; 16900 16901 /** 16902 * Pin an element for the duration of the scene. 16903 * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position. 16904 * Make sure only one pin is applied to an element at the same time. 16905 * An element can be pinned multiple times, but only successively. 16906 * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._ 16907 * @method ScrollMagic.Scene#setPin 16908 * @example 16909 * // pin element and push all following elements down by the amount of the pin duration. 16910 * scene.setPin("#pin"); 16911 * 16912 * // pin element and keeping all following elements in their place. The pinned element will move past them. 16913 * scene.setPin("#pin", {pushFollowers: false}); 16914 * 16915 * @param {(string|object)} element - A Selector targeting an element or a DOM object that is supposed to be pinned. 16916 * @param {object} [settings] - settings for the pin 16917 * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be "pushed" down for the duration of the pin, if `false` the pinned element will just scroll past them. 16918 Ignored, when duration is `0`. 16919 * @param {string} [settings.spacerClass="scrollmagic-pin-spacer"] - Classname of the pin spacer element, which is used to replace the element. 16920 * 16921 * @returns {Scene} Parent object for chaining. 16922 */ 16923 this.setPin = function (element, settings) { 16924 var defaultSettings = { 16925 pushFollowers: true, 16926 spacerClass: "scrollmagic-pin-spacer" 16927 }; 16928 var pushFollowersActivelySet = settings && settings.hasOwnProperty('pushFollowers'); 16929 settings = _util.extend({}, defaultSettings, settings); 16930 16931 // validate Element 16932 element = _util.get.elements(element)[0]; 16933 if (!element) { 16934 log(1, "ERROR calling method 'setPin()': Invalid pin element supplied."); 16935 return Scene; // cancel 16936 } else if (_util.css(element, "position") === "fixed") { 16937 log(1, "ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'."); 16938 return Scene; // cancel 16939 } 16940 if (_pin) { 16941 // preexisting pin? 16942 if (_pin === element) { 16943 // same pin we already have -> do nothing 16944 return Scene; // cancel 16945 } else { 16946 // kill old pin 16947 Scene.removePin(); 16948 } 16949 } 16950 _pin = element; 16951 var parentDisplay = _pin.parentNode.style.display, 16952 boundsParams = ["top", "left", "bottom", "right", "margin", "marginLeft", "marginRight", "marginTop", "marginBottom"]; 16953 _pin.parentNode.style.display = 'none'; // hack start to force css to return stylesheet values instead of calculated px values. 16954 var inFlow = _util.css(_pin, "position") != "absolute", 16955 pinCSS = _util.css(_pin, boundsParams.concat(["display"])), 16956 sizeCSS = _util.css(_pin, ["width", "height"]); 16957 _pin.parentNode.style.display = parentDisplay; // hack end. 16958 16959 if (!inFlow && settings.pushFollowers) { 16960 log(2, "WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled."); 16961 settings.pushFollowers = false; 16962 } 16963 window.setTimeout(function () { 16964 // wait until all finished, because with responsive duration it will only be set after scene is added to controller 16965 if (_pin && _options.duration === 0 && pushFollowersActivelySet && settings.pushFollowers) { 16966 log(2, "WARNING: pushFollowers =", true, "has no effect, when scene duration is 0."); 16967 } 16968 }, 0); 16969 16970 // create spacer and insert 16971 var spacer = _pin.parentNode.insertBefore(document.createElement('div'), _pin), 16972 spacerCSS = _util.extend(pinCSS, { 16973 position: inFlow ? "relative" : "absolute", 16974 boxSizing: "content-box", 16975 mozBoxSizing: "content-box", 16976 webkitBoxSizing: "content-box" 16977 }); 16978 if (!inFlow) { 16979 // copy size if positioned absolutely, to work for bottom/right positioned elements. 16980 _util.extend(spacerCSS, _util.css(_pin, ["width", "height"])); 16981 } 16982 _util.css(spacer, spacerCSS); 16983 spacer.setAttribute(PIN_SPACER_ATTRIBUTE, ""); 16984 _util.addClass(spacer, settings.spacerClass); 16985 16986 // set the pin Options 16987 _pinOptions = { 16988 spacer: spacer, 16989 relSize: { 16990 // save if size is defined using % values. if so, handle spacer resize differently... 16991 width: sizeCSS.width.slice(-1) === "%", 16992 height: sizeCSS.height.slice(-1) === "%", 16993 autoFullWidth: sizeCSS.width === "auto" && inFlow && _util.isMarginCollapseType(pinCSS.display) 16994 }, 16995 pushFollowers: settings.pushFollowers, 16996 inFlow: inFlow // stores if the element takes up space in the document flow 16997 }; 16998 if (!_pin.___origStyle) { 16999 _pin.___origStyle = {}; 17000 var pinInlineCSS = _pin.style, 17001 copyStyles = boundsParams.concat(["width", "height", "position", "boxSizing", "mozBoxSizing", "webkitBoxSizing"]); 17002 copyStyles.forEach(function (val) { 17003 _pin.___origStyle[val] = pinInlineCSS[val] || ""; 17004 }); 17005 } 17006 17007 // if relative size, transfer it to spacer and make pin calculate it... 17008 if (_pinOptions.relSize.width) { 17009 _util.css(spacer, { 17010 width: sizeCSS.width 17011 }); 17012 } 17013 if (_pinOptions.relSize.height) { 17014 _util.css(spacer, { 17015 height: sizeCSS.height 17016 }); 17017 } 17018 17019 // now place the pin element inside the spacer 17020 spacer.appendChild(_pin); 17021 // and set new css 17022 _util.css(_pin, { 17023 position: inFlow ? "relative" : "absolute", 17024 margin: "auto", 17025 top: "auto", 17026 left: "auto", 17027 bottom: "auto", 17028 right: "auto" 17029 }); 17030 if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) { 17031 _util.css(_pin, { 17032 boxSizing: "border-box", 17033 mozBoxSizing: "border-box", 17034 webkitBoxSizing: "border-box" 17035 }); 17036 } 17037 17038 // add listener to document to update pin position in case controller is not the document. 17039 window.addEventListener('scroll', updatePinInContainer); 17040 window.addEventListener('resize', updatePinInContainer); 17041 window.addEventListener('resize', updateRelativePinSpacer); 17042 // add mousewheel listener to catch scrolls over fixed elements 17043 _pin.addEventListener("mousewheel", onMousewheelOverPin); 17044 _pin.addEventListener("DOMMouseScroll", onMousewheelOverPin); 17045 log(3, "added pin"); 17046 17047 // finally update the pin to init 17048 updatePinState(); 17049 return Scene; 17050 }; 17051 17052 /** 17053 * Remove the pin from the scene. 17054 * @method ScrollMagic.Scene#removePin 17055 * @example 17056 * // remove the pin from the scene without resetting it (the spacer is not removed) 17057 * scene.removePin(); 17058 * 17059 * // remove the pin from the scene and reset the pin element to its initial position (spacer is removed) 17060 * scene.removePin(true); 17061 * 17062 * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset. 17063 * @returns {Scene} Parent object for chaining. 17064 */ 17065 this.removePin = function (reset) { 17066 if (_pin) { 17067 if (_state === SCENE_STATE_DURING) { 17068 updatePinState(true); // force unpin at position 17069 } 17070 if (reset || !_controller) { 17071 // if there's no controller no progress was made anyway... 17072 var pinTarget = _pinOptions.spacer.firstChild; // usually the pin element, but may be another spacer (cascaded pins)... 17073 if (pinTarget.hasAttribute(PIN_SPACER_ATTRIBUTE)) { 17074 // copy margins to child spacer 17075 var style = _pinOptions.spacer.style, 17076 values = ["margin", "marginLeft", "marginRight", "marginTop", "marginBottom"], 17077 margins = {}; 17078 values.forEach(function (val) { 17079 margins[val] = style[val] || ""; 17080 }); 17081 _util.css(pinTarget, margins); 17082 } 17083 _pinOptions.spacer.parentNode.insertBefore(pinTarget, _pinOptions.spacer); 17084 _pinOptions.spacer.parentNode.removeChild(_pinOptions.spacer); 17085 if (!_pin.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { 17086 // if it's the last pin for this element -> restore inline styles 17087 // TODO: only correctly set for first pin (when cascading) - how to fix? 17088 _util.css(_pin, _pin.___origStyle); 17089 delete _pin.___origStyle; 17090 } 17091 } 17092 window.removeEventListener('scroll', updatePinInContainer); 17093 window.removeEventListener('resize', updatePinInContainer); 17094 window.removeEventListener('resize', updateRelativePinSpacer); 17095 _pin.removeEventListener("mousewheel", onMousewheelOverPin); 17096 _pin.removeEventListener("DOMMouseScroll", onMousewheelOverPin); 17097 _pin = undefined; 17098 log(3, "removed pin (reset: " + (reset ? "true" : "false") + ")"); 17099 } 17100 return Scene; 17101 }; 17102 var _cssClasses, 17103 _cssClassElems = []; 17104 Scene.on("destroy.internal", function (e) { 17105 Scene.removeClassToggle(e.reset); 17106 }); 17107 /** 17108 * Define a css class modification while the scene is active. 17109 * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over. 17110 * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position. 17111 * @method ScrollMagic.Scene#setClassToggle 17112 * @example 17113 * // add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene 17114 * scene.setClassToggle("#my-elem", "myclass"); 17115 * 17116 * // add multiple classes to multiple elements defined by the selector '.classChange' 17117 * scene.setClassToggle(".classChange", "class1 class2 class3"); 17118 * 17119 * @param {(string|object)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified. 17120 * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene. 17121 * 17122 * @returns {Scene} Parent object for chaining. 17123 */ 17124 this.setClassToggle = function (element, classes) { 17125 var elems = _util.get.elements(element); 17126 if (elems.length === 0 || !_util.type.String(classes)) { 17127 log(1, "ERROR calling method 'setClassToggle()': Invalid " + (elems.length === 0 ? "element" : "classes") + " supplied."); 17128 return Scene; 17129 } 17130 if (_cssClassElems.length > 0) { 17131 // remove old ones 17132 Scene.removeClassToggle(); 17133 } 17134 _cssClasses = classes; 17135 _cssClassElems = elems; 17136 Scene.on("enter.internal_class leave.internal_class", function (e) { 17137 var toggle = e.type === "enter" ? _util.addClass : _util.removeClass; 17138 _cssClassElems.forEach(function (elem, key) { 17139 toggle(elem, _cssClasses); 17140 }); 17141 }); 17142 return Scene; 17143 }; 17144 17145 /** 17146 * Remove the class binding from the scene. 17147 * @method ScrollMagic.Scene#removeClassToggle 17148 * @example 17149 * // remove class binding from the scene without reset 17150 * scene.removeClassToggle(); 17151 * 17152 * // remove class binding and remove the changes it caused 17153 * scene.removeClassToggle(true); 17154 * 17155 * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed. 17156 * @returns {Scene} Parent object for chaining. 17157 */ 17158 this.removeClassToggle = function (reset) { 17159 if (reset) { 17160 _cssClassElems.forEach(function (elem, key) { 17161 _util.removeClass(elem, _cssClasses); 17162 }); 17163 } 17164 Scene.off("start.internal_class end.internal_class"); 17165 _cssClasses = undefined; 17166 _cssClassElems = []; 17167 return Scene; 17168 }; 17169 17170 // INIT 17171 construct(); 17172 return Scene; 17173 }; 17174 17175 // store pagewide scene options 17176 var SCENE_OPTIONS = { 17177 defaults: { 17178 duration: 0, 17179 offset: 0, 17180 triggerElement: undefined, 17181 triggerHook: 0.5, 17182 reverse: true, 17183 loglevel: 2 17184 }, 17185 validate: { 17186 offset: function (val) { 17187 val = parseFloat(val); 17188 if (!_util.type.Number(val)) { 17189 throw ["Invalid value for option \"offset\":", val]; 17190 } 17191 return val; 17192 }, 17193 triggerElement: function (val) { 17194 val = val || undefined; 17195 if (val) { 17196 var elem = _util.get.elements(val)[0]; 17197 if (elem && elem.parentNode) { 17198 val = elem; 17199 } else { 17200 throw ["Element defined in option \"triggerElement\" was not found:", val]; 17201 } 17202 } 17203 return val; 17204 }, 17205 triggerHook: function (val) { 17206 var translate = { 17207 "onCenter": 0.5, 17208 "onEnter": 1, 17209 "onLeave": 0 17210 }; 17211 if (_util.type.Number(val)) { 17212 val = Math.max(0, Math.min(parseFloat(val), 1)); // make sure its betweeen 0 and 1 17213 } else if (val in translate) { 17214 val = translate[val]; 17215 } else { 17216 throw ["Invalid value for option \"triggerHook\": ", val]; 17217 } 17218 return val; 17219 }, 17220 reverse: function (val) { 17221 return !!val; // force boolean 17222 }, 17223 loglevel: function (val) { 17224 val = parseInt(val); 17225 if (!_util.type.Number(val) || val < 0 || val > 3) { 17226 throw ["Invalid value for option \"loglevel\":", val]; 17227 } 17228 return val; 17229 } 17230 }, 17231 // holder for validation methods. duration validation is handled in 'getters-setters.js' 17232 shifts: ["duration", "offset", "triggerHook"] // list of options that trigger a `shift` event 17233 }; 17234 /* 17235 * method used to add an option to ScrollMagic Scenes. 17236 * TODO: DOC (private for dev) 17237 */ 17238 ScrollMagic.Scene.addOption = function (name, defaultValue, validationCallback, shifts) { 17239 if (!(name in SCENE_OPTIONS.defaults)) { 17240 SCENE_OPTIONS.defaults[name] = defaultValue; 17241 SCENE_OPTIONS.validate[name] = validationCallback; 17242 if (shifts) { 17243 SCENE_OPTIONS.shifts.push(name); 17244 } 17245 } else { 17246 ScrollMagic._util.log(1, "[static] ScrollMagic.Scene -> Cannot add Scene option '" + name + "', because it already exists."); 17247 } 17248 }; 17249 // instance extension function for plugins 17250 // TODO: DOC (private for dev) 17251 ScrollMagic.Scene.extend = function (extension) { 17252 var oldClass = this; 17253 ScrollMagic.Scene = function () { 17254 oldClass.apply(this, arguments); 17255 this.$super = _util.extend({}, this); // copy parent state 17256 return extension.apply(this, arguments) || this; 17257 }; 17258 _util.extend(ScrollMagic.Scene, oldClass); // copy properties 17259 ScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype 17260 ScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor 17261 }; 17262 17263 /** 17264 * TODO: DOCS (private for dev) 17265 * @class 17266 * @private 17267 */ 17268 17269 ScrollMagic.Event = function (type, namespace, target, vars) { 17270 vars = vars || {}; 17271 for (var key in vars) { 17272 this[key] = vars[key]; 17273 } 17274 this.type = type; 17275 this.target = this.currentTarget = target; 17276 this.namespace = namespace || ''; 17277 this.timeStamp = this.timestamp = Date.now(); 17278 return this; 17279 }; 17280 17281 /* 17282 * TODO: DOCS (private for dev) 17283 */ 17284 17285 var _util = ScrollMagic._util = function (window) { 17286 var U = {}, 17287 i; 17288 17289 /** 17290 * ------------------------------ 17291 * internal helpers 17292 * ------------------------------ 17293 */ 17294 17295 // parse float and fall back to 0. 17296 var floatval = function (number) { 17297 return parseFloat(number) || 0; 17298 }; 17299 // get current style IE safe (otherwise IE would return calculated values for 'auto') 17300 var _getComputedStyle = function (elem) { 17301 return elem.currentStyle ? elem.currentStyle : window.getComputedStyle(elem); 17302 }; 17303 17304 // get element dimension (width or height) 17305 var _dimension = function (which, elem, outer, includeMargin) { 17306 elem = elem === document ? window : elem; 17307 if (elem === window) { 17308 includeMargin = false; 17309 } else if (!_type.DomElement(elem)) { 17310 return 0; 17311 } 17312 which = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase(); 17313 var dimension = (outer ? elem['offset' + which] || elem['outer' + which] : elem['client' + which] || elem['inner' + which]) || 0; 17314 if (outer && includeMargin) { 17315 var style = _getComputedStyle(elem); 17316 dimension += which === 'Height' ? floatval(style.marginTop) + floatval(style.marginBottom) : floatval(style.marginLeft) + floatval(style.marginRight); 17317 } 17318 return dimension; 17319 }; 17320 // converts 'margin-top' into 'marginTop' 17321 var _camelCase = function (str) { 17322 return str.replace(/^[^a-z]+([a-z])/g, '$1').replace(/-([a-z])/g, function (g) { 17323 return g[1].toUpperCase(); 17324 }); 17325 }; 17326 17327 /** 17328 * ------------------------------ 17329 * external helpers 17330 * ------------------------------ 17331 */ 17332 17333 // extend obj – same as jQuery.extend({}, objA, objB) 17334 U.extend = function (obj) { 17335 obj = obj || {}; 17336 for (i = 1; i < arguments.length; i++) { 17337 if (!arguments[i]) { 17338 continue; 17339 } 17340 for (var key in arguments[i]) { 17341 if (arguments[i].hasOwnProperty(key)) { 17342 obj[key] = arguments[i][key]; 17343 } 17344 } 17345 } 17346 return obj; 17347 }; 17348 17349 // check if a css display type results in margin-collapse or not 17350 U.isMarginCollapseType = function (str) { 17351 return ["block", "flex", "list-item", "table", "-webkit-box"].indexOf(str) > -1; 17352 }; 17353 17354 // implementation of requestAnimationFrame 17355 // based on https://gist.github.com/paulirish/1579671 17356 var lastTime = 0, 17357 vendors = ['ms', 'moz', 'webkit', 'o']; 17358 var _requestAnimationFrame = window.requestAnimationFrame; 17359 var _cancelAnimationFrame = window.cancelAnimationFrame; 17360 // try vendor prefixes if the above doesn't work 17361 for (i = 0; !_requestAnimationFrame && i < vendors.length; ++i) { 17362 _requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame']; 17363 _cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame']; 17364 } 17365 17366 // fallbacks 17367 if (!_requestAnimationFrame) { 17368 _requestAnimationFrame = function (callback) { 17369 var currTime = new Date().getTime(), 17370 timeToCall = Math.max(0, 16 - (currTime - lastTime)), 17371 id = window.setTimeout(function () { 17372 callback(currTime + timeToCall); 17373 }, timeToCall); 17374 lastTime = currTime + timeToCall; 17375 return id; 17376 }; 17377 } 17378 if (!_cancelAnimationFrame) { 17379 _cancelAnimationFrame = function (id) { 17380 window.clearTimeout(id); 17381 }; 17382 } 17383 U.rAF = _requestAnimationFrame.bind(window); 17384 U.cAF = _cancelAnimationFrame.bind(window); 17385 var loglevels = ["error", "warn", "log"], 17386 console = window.console || {}; 17387 console.log = console.log || function () {}; // no console log, well - do nothing then... 17388 // make sure methods for all levels exist. 17389 for (i = 0; i < loglevels.length; i++) { 17390 var method = loglevels[i]; 17391 if (!console[method]) { 17392 console[method] = console.log; // prefer .log over nothing 17393 } 17394 } 17395 U.log = function (loglevel) { 17396 if (loglevel > loglevels.length || loglevel <= 0) loglevel = loglevels.length; 17397 var now = new Date(), 17398 time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2) + ":" + ("0" + now.getSeconds()).slice(-2) + ":" + ("00" + now.getMilliseconds()).slice(-3), 17399 method = loglevels[loglevel - 1], 17400 args = Array.prototype.splice.call(arguments, 1), 17401 func = Function.prototype.bind.call(console[method], console); 17402 args.unshift(time); 17403 func.apply(console, args); 17404 }; 17405 17406 /** 17407 * ------------------------------ 17408 * type testing 17409 * ------------------------------ 17410 */ 17411 17412 var _type = U.type = function (v) { 17413 return Object.prototype.toString.call(v).replace(/^\[object (.+)\]$/, "$1").toLowerCase(); 17414 }; 17415 _type.String = function (v) { 17416 return _type(v) === 'string'; 17417 }; 17418 _type.Function = function (v) { 17419 return _type(v) === 'function'; 17420 }; 17421 _type.Array = function (v) { 17422 return Array.isArray(v); 17423 }; 17424 _type.Number = function (v) { 17425 return !_type.Array(v) && v - parseFloat(v) + 1 >= 0; 17426 }; 17427 _type.DomElement = function (o) { 17428 return typeof HTMLElement === "object" || typeof HTMLElement === "function" ? o instanceof HTMLElement || o instanceof SVGElement : 17429 //DOM2 17430 o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"; 17431 }; 17432 17433 /** 17434 * ------------------------------ 17435 * DOM Element info 17436 * ------------------------------ 17437 */ 17438 // always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors 17439 var _get = U.get = {}; 17440 _get.elements = function (selector) { 17441 var arr = []; 17442 if (_type.String(selector)) { 17443 try { 17444 selector = document.querySelectorAll(selector); 17445 } catch (e) { 17446 // invalid selector 17447 return arr; 17448 } 17449 } 17450 if (_type(selector) === 'nodelist' || _type.Array(selector) || selector instanceof NodeList) { 17451 for (var i = 0, ref = arr.length = selector.length; i < ref; i++) { 17452 // list of elements 17453 var elem = selector[i]; 17454 arr[i] = _type.DomElement(elem) ? elem : _get.elements(elem); // if not an element, try to resolve recursively 17455 } 17456 } else if (_type.DomElement(selector) || selector === document || selector === window) { 17457 arr = [selector]; // only the element 17458 } 17459 return arr; 17460 }; 17461 // get scroll top value 17462 _get.scrollTop = function (elem) { 17463 return elem && typeof elem.scrollTop === 'number' ? elem.scrollTop : window.pageYOffset || 0; 17464 }; 17465 // get scroll left value 17466 _get.scrollLeft = function (elem) { 17467 return elem && typeof elem.scrollLeft === 'number' ? elem.scrollLeft : window.pageXOffset || 0; 17468 }; 17469 // get element height 17470 _get.width = function (elem, outer, includeMargin) { 17471 return _dimension('width', elem, outer, includeMargin); 17472 }; 17473 // get element width 17474 _get.height = function (elem, outer, includeMargin) { 17475 return _dimension('height', elem, outer, includeMargin); 17476 }; 17477 17478 // get element position (optionally relative to viewport) 17479 _get.offset = function (elem, relativeToViewport) { 17480 var offset = { 17481 top: 0, 17482 left: 0 17483 }; 17484 if (elem && elem.getBoundingClientRect) { 17485 // check if available 17486 var rect = elem.getBoundingClientRect(); 17487 offset.top = rect.top; 17488 offset.left = rect.left; 17489 if (!relativeToViewport) { 17490 // clientRect is by default relative to viewport... 17491 offset.top += _get.scrollTop(); 17492 offset.left += _get.scrollLeft(); 17493 } 17494 } 17495 return offset; 17496 }; 17497 17498 /** 17499 * ------------------------------ 17500 * DOM Element manipulation 17501 * ------------------------------ 17502 */ 17503 17504 U.addClass = function (elem, classname) { 17505 if (classname) { 17506 if (elem.classList) elem.classList.add(classname);else elem.className += ' ' + classname; 17507 } 17508 }; 17509 U.removeClass = function (elem, classname) { 17510 if (classname) { 17511 if (elem.classList) elem.classList.remove(classname);else elem.className = elem.className.replace(new RegExp('(^|\\b)' + classname.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); 17512 } 17513 }; 17514 // if options is string -> returns css value 17515 // if options is array -> returns object with css value pairs 17516 // if options is object -> set new css values 17517 U.css = function (elem, options) { 17518 if (_type.String(options)) { 17519 return _getComputedStyle(elem)[_camelCase(options)]; 17520 } else if (_type.Array(options)) { 17521 var obj = {}, 17522 style = _getComputedStyle(elem); 17523 options.forEach(function (option, key) { 17524 obj[option] = style[_camelCase(option)]; 17525 }); 17526 return obj; 17527 } else { 17528 for (var option in options) { 17529 var val = options[option]; 17530 if (val == parseFloat(val)) { 17531 // assume pixel for seemingly numerical values 17532 val += 'px'; 17533 } 17534 elem.style[_camelCase(option)] = val; 17535 } 17536 } 17537 }; 17538 return U; 17539 }(window || {}); 17540 ScrollMagic.Scene.prototype.addIndicators = function () { 17541 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling addIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js'); 17542 return this; 17543 }; 17544 ScrollMagic.Scene.prototype.removeIndicators = function () { 17545 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js'); 17546 return this; 17547 }; 17548 ScrollMagic.Scene.prototype.setTween = function () { 17549 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js'); 17550 return this; 17551 }; 17552 ScrollMagic.Scene.prototype.removeTween = function () { 17553 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js'); 17554 return this; 17555 }; 17556 ScrollMagic.Scene.prototype.setVelocity = function () { 17557 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js'); 17558 return this; 17559 }; 17560 ScrollMagic.Scene.prototype.removeVelocity = function () { 17561 ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js'); 17562 return this; 17563 }; 17564 return ScrollMagic; 17565}); 17566 17567/***/ }), 17568
vendor: 25,752 bytes, lines 17569-18233
17569/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js": 17570/*!******************************************************************************************!*\ 17571 !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js ***! 17572 \******************************************************************************************/ 17573/*! no static exports found */ 17574/***/ (function(module, exports, __webpack_require__) { 17575 17576/*** IMPORTS FROM imports-loader ***/ 17577var define = false; 17578 17579/*! 17580 * ScrollMagic v2.0.8 (2020-08-14) 17581 * The javascript library for magical scroll interactions. 17582 * (c) 2020 Jan Paepke (@janpaepke) 17583 * Project Website: http://scrollmagic.io 17584 * 17585 * @version 2.0.8 17586 * @license Dual licensed under MIT license and GPL. 17587 * @author Jan Paepke - [email protected] 17588 * 17589 * @file Debug Extension for ScrollMagic. 17590 */ 17591/** 17592 * This plugin was formerly known as the ScrollMagic debug extension. 17593 * 17594 * It enables you to add visual indicators to your page, to be able to see exactly when a scene is triggered. 17595 * 17596 * To have access to this extension, please include `plugins/debug.addIndicators.js`. 17597 * @mixin debug.addIndicators 17598 */ 17599(function (root, factory) { 17600 if (typeof define === 'function' && define.amd) { 17601 // AMD. Register as an anonymous module. 17602 define(['ScrollMagic'], factory); 17603 } else if (true) { 17604 // CommonJS 17605 factory(__webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js")); 17606 } else {} 17607})(this, function (ScrollMagic) { 17608 "use strict"; 17609 17610 var NAMESPACE = "debug.addIndicators"; 17611 var console = window.console || {}, 17612 err = Function.prototype.bind.call(console.error || console.log || function () {}, console); 17613 if (!ScrollMagic) { 17614 err("(" + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs."); 17615 } 17616 17617 // plugin settings 17618 var FONT_SIZE = "0.85em", 17619 ZINDEX = "9999", 17620 EDGE_OFFSET = 15; // minimum edge distance, added to indentation 17621 17622 // overall vars 17623 var _util = ScrollMagic._util, 17624 _autoindex = 0; 17625 ScrollMagic.Scene.extend(function () { 17626 var Scene = this, 17627 _indicator; 17628 var log = function () { 17629 if (Scene._log) { 17630 // not available, when main source minified 17631 Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->"); 17632 Scene._log.apply(this, arguments); 17633 } 17634 }; 17635 17636 /** 17637 * Add visual indicators for a ScrollMagic.Scene. 17638 * @memberof! debug.addIndicators# 17639 * 17640 * @example 17641 * // add basic indicators 17642 * scene.addIndicators() 17643 * 17644 * // passing options 17645 * scene.addIndicators({name: "pin scene", colorEnd: "#FFFFFF"}); 17646 * 17647 * @param {object} [options] - An object containing one or more options for the indicators. 17648 * @param {(string|object)} [options.parent] - A selector, DOM Object or a jQuery object that the indicators should be added to. 17649 If undefined, the controller's container will be used. 17650 * @param {number} [options.name=""] - This string will be displayed at the start and end indicators of the scene for identification purposes. If no name is supplied an automatic index will be used. 17651 * @param {number} [options.indent=0] - Additional position offset for the indicators (useful, when having multiple scenes starting at the same position). 17652 * @param {string} [options.colorStart=green] - CSS color definition for the start indicator. 17653 * @param {string} [options.colorEnd=red] - CSS color definition for the end indicator. 17654 * @param {string} [options.colorTrigger=blue] - CSS color definition for the trigger indicator. 17655 */ 17656 Scene.addIndicators = function (options) { 17657 if (!_indicator) { 17658 var DEFAULT_OPTIONS = { 17659 name: "", 17660 indent: 0, 17661 parent: undefined, 17662 colorStart: "green", 17663 colorEnd: "red", 17664 colorTrigger: "blue" 17665 }; 17666 options = _util.extend({}, DEFAULT_OPTIONS, options); 17667 _autoindex++; 17668 _indicator = new Indicator(Scene, options); 17669 Scene.on("add.plugin_addIndicators", _indicator.add); 17670 Scene.on("remove.plugin_addIndicators", _indicator.remove); 17671 Scene.on("destroy.plugin_addIndicators", Scene.removeIndicators); 17672 17673 // it the scene already has a controller we can start right away. 17674 if (Scene.controller()) { 17675 _indicator.add(); 17676 } 17677 } 17678 return Scene; 17679 }; 17680 17681 /** 17682 * Removes visual indicators from a ScrollMagic.Scene. 17683 * @memberof! debug.addIndicators# 17684 * 17685 * @example 17686 * // remove previously added indicators 17687 * scene.removeIndicators() 17688 * 17689 */ 17690 Scene.removeIndicators = function () { 17691 if (_indicator) { 17692 _indicator.remove(); 17693 this.off("*.plugin_addIndicators"); 17694 _indicator = undefined; 17695 } 17696 return Scene; 17697 }; 17698 }); 17699 17700 /* 17701 * ---------------------------------------------------------------- 17702 * Extension for controller to store and update related indicators 17703 * ---------------------------------------------------------------- 17704 */ 17705 // add option to globally auto-add indicators to scenes 17706 /** 17707 * Every ScrollMagic.Controller instance now accepts an additional option. 17708 * See {@link ScrollMagic.Controller} for a complete list of the standard options. 17709 * @memberof! debug.addIndicators# 17710 * @method new ScrollMagic.Controller(options) 17711 * @example 17712 * // make a controller and add indicators to all scenes attached 17713 * var controller = new ScrollMagic.Controller({addIndicators: true}); 17714 * // this scene will automatically have indicators added to it 17715 * new ScrollMagic.Scene() 17716 * .addTo(controller); 17717 * 17718 * @param {object} [options] - Options for the Controller. 17719 * @param {boolean} [options.addIndicators=false] - If set to `true` every scene that is added to the controller will automatically get indicators added to it. 17720 */ 17721 ScrollMagic.Controller.addOption("addIndicators", false); 17722 // extend Controller 17723 ScrollMagic.Controller.extend(function () { 17724 var Controller = this, 17725 _info = Controller.info(), 17726 _container = _info.container, 17727 _isDocument = _info.isDocument, 17728 _vertical = _info.vertical, 17729 _indicators = { 17730 // container for all indicators and methods 17731 groups: [] 17732 }; 17733 var log = function () { 17734 if (Controller._log) { 17735 // not available, when main source minified 17736 Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->"); 17737 Controller._log.apply(this, arguments); 17738 } 17739 }; 17740 if (Controller._indicators) { 17741 log(2, "WARNING: Scene already has a property '_indicators', which will be overwritten by plugin."); 17742 } 17743 17744 // add indicators container 17745 this._indicators = _indicators; 17746 /* 17747 needed updates: 17748 +++++++++++++++ 17749 start/end position on scene shift (handled in Indicator class) 17750 trigger parameters on triggerHook value change (handled in Indicator class) 17751 bounds position on container scroll or resize (to keep alignment to bottom/right) 17752 trigger position on container resize, window resize (if container isn't document) and window scroll (if container isn't document) 17753 */ 17754 17755 // event handler for when associated bounds markers need to be repositioned 17756 var handleBoundsPositionChange = function () { 17757 _indicators.updateBoundsPositions(); 17758 }; 17759 17760 // event handler for when associated trigger groups need to be repositioned 17761 var handleTriggerPositionChange = function () { 17762 _indicators.updateTriggerGroupPositions(); 17763 }; 17764 _container.addEventListener("resize", handleTriggerPositionChange); 17765 if (!_isDocument) { 17766 window.addEventListener("resize", handleTriggerPositionChange); 17767 window.addEventListener("scroll", handleTriggerPositionChange); 17768 } 17769 // update all related bounds containers 17770 _container.addEventListener("resize", handleBoundsPositionChange); 17771 _container.addEventListener("scroll", handleBoundsPositionChange); 17772 17773 // updates the position of the bounds container to aligned to the right for vertical containers and to the bottom for horizontal 17774 this._indicators.updateBoundsPositions = function (specificIndicator) { 17775 var 17776 // constant for all bounds 17777 groups = specificIndicator ? [_util.extend({}, specificIndicator.triggerGroup, { 17778 members: [specificIndicator] 17779 })] : 17780 // create a group with only one element 17781 _indicators.groups, 17782 // use all 17783 g = groups.length, 17784 css = {}, 17785 paramPos = _vertical ? "left" : "top", 17786 paramDimension = _vertical ? "width" : "height", 17787 edge = _vertical ? _util.get.scrollLeft(_container) + _util.get.width(_container) - EDGE_OFFSET : _util.get.scrollTop(_container) + _util.get.height(_container) - EDGE_OFFSET, 17788 b, 17789 triggerSize, 17790 group; 17791 while (g--) { 17792 // group loop 17793 group = groups[g]; 17794 b = group.members.length; 17795 triggerSize = _util.get[paramDimension](group.element.firstChild); 17796 while (b--) { 17797 // indicators loop 17798 css[paramPos] = edge - triggerSize; 17799 _util.css(group.members[b].bounds, css); 17800 } 17801 } 17802 }; 17803 17804 // updates the positions of all trigger groups attached to a controller or a specific one, if provided 17805 this._indicators.updateTriggerGroupPositions = function (specificGroup) { 17806 var 17807 // constant vars 17808 groups = specificGroup ? [specificGroup] : _indicators.groups, 17809 i = groups.length, 17810 container = _isDocument ? document.body : _container, 17811 containerOffset = _isDocument ? { 17812 top: 0, 17813 left: 0 17814 } : _util.get.offset(container, true), 17815 edge = _vertical ? _util.get.width(_container) - EDGE_OFFSET : _util.get.height(_container) - EDGE_OFFSET, 17816 paramDimension = _vertical ? "width" : "height", 17817 paramTransform = _vertical ? "Y" : "X"; 17818 var 17819 // changing vars 17820 group, elem, pos, elemSize, transform; 17821 while (i--) { 17822 group = groups[i]; 17823 elem = group.element; 17824 pos = group.triggerHook * Controller.info("size"); 17825 elemSize = _util.get[paramDimension](elem.firstChild.firstChild); 17826 transform = pos > elemSize ? "translate" + paramTransform + "(-100%)" : ""; 17827 _util.css(elem, { 17828 top: containerOffset.top + (_vertical ? pos : edge - group.members[0].options.indent), 17829 left: containerOffset.left + (_vertical ? edge - group.members[0].options.indent : pos) 17830 }); 17831 _util.css(elem.firstChild.firstChild, { 17832 "-ms-transform": transform, 17833 "-webkit-transform": transform, 17834 "transform": transform 17835 }); 17836 } 17837 }; 17838 17839 // updates the label for the group to contain the name, if it only has one member 17840 this._indicators.updateTriggerGroupLabel = function (group) { 17841 var text = "trigger" + (group.members.length > 1 ? "" : " " + group.members[0].options.name), 17842 elem = group.element.firstChild.firstChild, 17843 doUpdate = elem.textContent !== text; 17844 if (doUpdate) { 17845 elem.textContent = text; 17846 if (_vertical) { 17847 // bounds position is dependent on text length, so update 17848 _indicators.updateBoundsPositions(); 17849 } 17850 } 17851 }; 17852 17853 // add indicators if global option is set 17854 this.addScene = function (newScene) { 17855 if (this._options.addIndicators && newScene instanceof ScrollMagic.Scene && newScene.controller() === Controller) { 17856 newScene.addIndicators(); 17857 } 17858 // call original destroy method 17859 this.$super.addScene.apply(this, arguments); 17860 }; 17861 17862 // remove all previously set listeners on destroy 17863 this.destroy = function () { 17864 _container.removeEventListener("resize", handleTriggerPositionChange); 17865 if (!_isDocument) { 17866 window.removeEventListener("resize", handleTriggerPositionChange); 17867 window.removeEventListener("scroll", handleTriggerPositionChange); 17868 } 17869 _container.removeEventListener("resize", handleBoundsPositionChange); 17870 _container.removeEventListener("scroll", handleBoundsPositionChange); 17871 // call original destroy method 17872 this.$super.destroy.apply(this, arguments); 17873 }; 17874 return Controller; 17875 }); 17876 17877 /* 17878 * ---------------------------------------------------------------- 17879 * Internal class for the construction of Indicators 17880 * ---------------------------------------------------------------- 17881 */ 17882 var Indicator = function (Scene, options) { 17883 var Indicator = this, 17884 _elemBounds = TPL.bounds(), 17885 _elemStart = TPL.start(options.colorStart), 17886 _elemEnd = TPL.end(options.colorEnd), 17887 _boundsContainer = options.parent && _util.get.elements(options.parent)[0], 17888 _vertical, 17889 _ctrl; 17890 var log = function () { 17891 if (Scene._log) { 17892 // not available, when main source minified 17893 Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->"); 17894 Scene._log.apply(this, arguments); 17895 } 17896 }; 17897 options.name = options.name || _autoindex; 17898 17899 // prepare bounds elements 17900 _elemStart.firstChild.textContent += " " + options.name; 17901 _elemEnd.textContent += " " + options.name; 17902 _elemBounds.appendChild(_elemStart); 17903 _elemBounds.appendChild(_elemEnd); 17904 17905 // set public variables 17906 Indicator.options = options; 17907 Indicator.bounds = _elemBounds; 17908 // will be set later 17909 Indicator.triggerGroup = undefined; 17910 17911 // add indicators to DOM 17912 this.add = function () { 17913 _ctrl = Scene.controller(); 17914 _vertical = _ctrl.info("vertical"); 17915 var isDocument = _ctrl.info("isDocument"); 17916 if (!_boundsContainer) { 17917 // no parent supplied or doesnt exist 17918 _boundsContainer = isDocument ? document.body : _ctrl.info("container"); // check if window/document (then use body) 17919 } 17920 if (!isDocument && _util.css(_boundsContainer, "position") === 'static') { 17921 // position mode needed for correct positioning of indicators 17922 _util.css(_boundsContainer, { 17923 position: "relative" 17924 }); 17925 } 17926 17927 // add listeners for updates 17928 Scene.on("change.plugin_addIndicators", handleTriggerParamsChange); 17929 Scene.on("shift.plugin_addIndicators", handleBoundsParamsChange); 17930 17931 // updates trigger & bounds (will add elements if needed) 17932 updateTriggerGroup(); 17933 updateBounds(); 17934 setTimeout(function () { 17935 // do after all execution is finished otherwise sometimes size calculations are off 17936 _ctrl._indicators.updateBoundsPositions(Indicator); 17937 }, 0); 17938 log(3, "added indicators"); 17939 }; 17940 17941 // remove indicators from DOM 17942 this.remove = function () { 17943 if (Indicator.triggerGroup) { 17944 // if not set there's nothing to remove 17945 Scene.off("change.plugin_addIndicators", handleTriggerParamsChange); 17946 Scene.off("shift.plugin_addIndicators", handleBoundsParamsChange); 17947 if (Indicator.triggerGroup.members.length > 1) { 17948 // just remove from memberlist of old group 17949 var group = Indicator.triggerGroup; 17950 group.members.splice(group.members.indexOf(Indicator), 1); 17951 _ctrl._indicators.updateTriggerGroupLabel(group); 17952 _ctrl._indicators.updateTriggerGroupPositions(group); 17953 Indicator.triggerGroup = undefined; 17954 } else { 17955 // remove complete group 17956 removeTriggerGroup(); 17957 } 17958 removeBounds(); 17959 log(3, "removed indicators"); 17960 } 17961 }; 17962 17963 /* 17964 * ---------------------------------------------------------------- 17965 * internal Event Handlers 17966 * ---------------------------------------------------------------- 17967 */ 17968 17969 // event handler for when bounds params change 17970 var handleBoundsParamsChange = function () { 17971 updateBounds(); 17972 }; 17973 17974 // event handler for when trigger params change 17975 var handleTriggerParamsChange = function (e) { 17976 if (e.what === "triggerHook") { 17977 updateTriggerGroup(); 17978 } 17979 }; 17980 17981 /* 17982 * ---------------------------------------------------------------- 17983 * Bounds (start / stop) management 17984 * ---------------------------------------------------------------- 17985 */ 17986 17987 // adds an new bounds elements to the array and to the DOM 17988 var addBounds = function () { 17989 var v = _ctrl.info("vertical"); 17990 // apply stuff we didn't know before... 17991 _util.css(_elemStart.firstChild, { 17992 "border-bottom-width": v ? 1 : 0, 17993 "border-right-width": v ? 0 : 1, 17994 "bottom": v ? -1 : options.indent, 17995 "right": v ? options.indent : -1, 17996 "padding": v ? "0 8px" : "2px 4px" 17997 }); 17998 _util.css(_elemEnd, { 17999 "border-top-width": v ? 1 : 0, 18000 "border-left-width": v ? 0 : 1, 18001 "top": v ? "100%" : "", 18002 "right": v ? options.indent : "", 18003 "bottom": v ? "" : options.indent, 18004 "left": v ? "" : "100%", 18005 "padding": v ? "0 8px" : "2px 4px" 18006 }); 18007 // append 18008 _boundsContainer.appendChild(_elemBounds); 18009 }; 18010 18011 // remove bounds from list and DOM 18012 var removeBounds = function () { 18013 _elemBounds.parentNode.removeChild(_elemBounds); 18014 }; 18015 18016 // update the start and end positions of the scene 18017 var updateBounds = function () { 18018 if (_elemBounds.parentNode !== _boundsContainer) { 18019 addBounds(); // Add Bounds elements (start/end) 18020 } 18021 var css = {}; 18022 css[_vertical ? "top" : "left"] = Scene.triggerPosition(); 18023 css[_vertical ? "height" : "width"] = Scene.duration(); 18024 _util.css(_elemBounds, css); 18025 _util.css(_elemEnd, { 18026 display: Scene.duration() > 0 ? "" : "none" 18027 }); 18028 }; 18029 18030 /* 18031 * ---------------------------------------------------------------- 18032 * trigger and trigger group management 18033 * ---------------------------------------------------------------- 18034 */ 18035 18036 // adds an new trigger group to the array and to the DOM 18037 var addTriggerGroup = function () { 18038 var triggerElem = TPL.trigger(options.colorTrigger); // new trigger element 18039 var css = {}; 18040 css[_vertical ? "right" : "bottom"] = 0; 18041 css[_vertical ? "border-top-width" : "border-left-width"] = 1; 18042 _util.css(triggerElem.firstChild, css); 18043 _util.css(triggerElem.firstChild.firstChild, { 18044 padding: _vertical ? "0 8px 3px 8px" : "3px 4px" 18045 }); 18046 document.body.appendChild(triggerElem); // directly add to body 18047 var newGroup = { 18048 triggerHook: Scene.triggerHook(), 18049 element: triggerElem, 18050 members: [Indicator] 18051 }; 18052 _ctrl._indicators.groups.push(newGroup); 18053 Indicator.triggerGroup = newGroup; 18054 // update right away 18055 _ctrl._indicators.updateTriggerGroupLabel(newGroup); 18056 _ctrl._indicators.updateTriggerGroupPositions(newGroup); 18057 }; 18058 var removeTriggerGroup = function () { 18059 _ctrl._indicators.groups.splice(_ctrl._indicators.groups.indexOf(Indicator.triggerGroup), 1); 18060 Indicator.triggerGroup.element.parentNode.removeChild(Indicator.triggerGroup.element); 18061 Indicator.triggerGroup = undefined; 18062 }; 18063 18064 // updates the trigger group -> either join existing or add new one 18065 /* 18066 * Logic: 18067 * 1 if a trigger group exist, check if it's in sync with Scene settings – if so, nothing else needs to happen 18068 * 2 try to find an existing one that matches Scene parameters 18069 * 2.1 If a match is found check if already assigned to an existing group 18070 * If so: 18071 * A: it was the last member of existing group -> kill whole group 18072 * B: the existing group has other members -> just remove from member list 18073 * 2.2 Assign to matching group 18074 * 3 if no new match could be found, check if assigned to existing group 18075 * A: yes, and it's the only member -> just update parameters and positions and keep using this group 18076 * B: yes but there are other members -> remove from member list and create a new one 18077 * C: no, so create a new one 18078 */ 18079 var updateTriggerGroup = function () { 18080 var triggerHook = Scene.triggerHook(), 18081 closeEnough = 0.0001; 18082 18083 // Have a group, check if it still matches 18084 if (Indicator.triggerGroup) { 18085 if (Math.abs(Indicator.triggerGroup.triggerHook - triggerHook) < closeEnough) { 18086 // _util.log(0, "trigger", options.name, "->", "no need to change, still in sync"); 18087 return; // all good 18088 } 18089 } 18090 // Don't have a group, check if a matching one exists 18091 // _util.log(0, "trigger", options.name, "->", "out of sync!"); 18092 var groups = _ctrl._indicators.groups, 18093 group, 18094 i = groups.length; 18095 while (i--) { 18096 group = groups[i]; 18097 if (Math.abs(group.triggerHook - triggerHook) < closeEnough) { 18098 // found a match! 18099 // _util.log(0, "trigger", options.name, "->", "found match"); 18100 if (Indicator.triggerGroup) { 18101 // do I have an old group that is out of sync? 18102 if (Indicator.triggerGroup.members.length === 1) { 18103 // is it the only remaining group? 18104 // _util.log(0, "trigger", options.name, "->", "kill"); 18105 // was the last member, remove the whole group 18106 removeTriggerGroup(); 18107 } else { 18108 Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1); // just remove from memberlist of old group 18109 _ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup); 18110 _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup); 18111 // _util.log(0, "trigger", options.name, "->", "removing from previous member list"); 18112 } 18113 } 18114 // join new group 18115 group.members.push(Indicator); 18116 Indicator.triggerGroup = group; 18117 _ctrl._indicators.updateTriggerGroupLabel(group); 18118 return; 18119 } 18120 } 18121 18122 // at this point I am obviously out of sync and don't match any other group 18123 if (Indicator.triggerGroup) { 18124 if (Indicator.triggerGroup.members.length === 1) { 18125 // _util.log(0, "trigger", options.name, "->", "updating existing"); 18126 // out of sync but i'm the only member => just change and update 18127 Indicator.triggerGroup.triggerHook = triggerHook; 18128 _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup); 18129 return; 18130 } else { 18131 // _util.log(0, "trigger", options.name, "->", "removing from previous member list"); 18132 Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1); // just remove from memberlist of old group 18133 _ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup); 18134 _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup); 18135 Indicator.triggerGroup = undefined; // need a brand new group... 18136 } 18137 } 18138 // _util.log(0, "trigger", options.name, "->", "add a new one"); 18139 // did not find any match, make new trigger group 18140 addTriggerGroup(); 18141 }; 18142 }; 18143 18144 /* 18145 * ---------------------------------------------------------------- 18146 * Templates for the indicators 18147 * ---------------------------------------------------------------- 18148 */ 18149 var TPL = { 18150 start: function (color) { 18151 // inner element (for bottom offset -1, while keeping top position 0) 18152 var inner = document.createElement("div"); 18153 inner.textContent = "start"; 18154 _util.css(inner, { 18155 position: "absolute", 18156 overflow: "visible", 18157 "border-width": 0, 18158 "border-style": "solid", 18159 color: color, 18160 "border-color": color 18161 }); 18162 var e = document.createElement('div'); 18163 // wrapper 18164 _util.css(e, { 18165 position: "absolute", 18166 overflow: "visible", 18167 width: 0, 18168 height: 0 18169 }); 18170 e.appendChild(inner); 18171 return e; 18172 }, 18173 end: function (color) { 18174 var e = document.createElement('div'); 18175 e.textContent = "end"; 18176 _util.css(e, { 18177 position: "absolute", 18178 overflow: "visible", 18179 "border-width": 0, 18180 "border-style": "solid", 18181 color: color, 18182 "border-color": color 18183 }); 18184 return e; 18185 }, 18186 bounds: function () { 18187 var e = document.createElement('div'); 18188 _util.css(e, { 18189 position: "absolute", 18190 overflow: "visible", 18191 "white-space": "nowrap", 18192 "pointer-events": "none", 18193 "font-size": FONT_SIZE 18194 }); 18195 e.style.zIndex = ZINDEX; 18196 return e; 18197 }, 18198 trigger: function (color) { 18199 // inner to be above or below line but keep position 18200 var inner = document.createElement('div'); 18201 inner.textContent = "trigger"; 18202 _util.css(inner, { 18203 position: "relative" 18204 }); 18205 // inner wrapper for right: 0 and main element has no size 18206 var w = document.createElement('div'); 18207 _util.css(w, { 18208 position: "absolute", 18209 overflow: "visible", 18210 "border-width": 0, 18211 "border-style": "solid", 18212 color: color, 18213 "border-color": color 18214 }); 18215 w.appendChild(inner); 18216 // wrapper 18217 var e = document.createElement('div'); 18218 _util.css(e, { 18219 position: "fixed", 18220 overflow: "visible", 18221 "white-space": "nowrap", 18222 "pointer-events": "none", 18223 "font-size": FONT_SIZE 18224 }); 18225 e.style.zIndex = ZINDEX; 18226 e.appendChild(w); 18227 return e; 18228 } 18229 }; 18230}); 18231 18232/***/ }), 18233
vendor: 3,339 bytes, lines 18234-18309
18234/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js": 18235/*!*****************************************************************************************!*\ 18236 !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js ***! 18237 \*****************************************************************************************/ 18238/*! no static exports found */ 18239/***/ (function(module, exports, __webpack_require__) { 18240 18241/*** IMPORTS FROM imports-loader ***/ 18242var define = false; 18243 18244/*! 18245 * ScrollMagic v2.0.8 (2020-08-14) 18246 * The javascript library for magical scroll interactions. 18247 * (c) 2020 Jan Paepke (@janpaepke) 18248 * Project Website: http://scrollmagic.io 18249 * 18250 * @version 2.0.8 18251 * @license Dual licensed under MIT license and GPL. 18252 * @author Jan Paepke - [email protected] 18253 * 18254 * @file ScrollMagic jQuery plugin. 18255 * 18256 * requires: jQuery >=1.11 18257 */ 18258/** 18259 * This plugin is meant to be used in conjunction with jQuery. 18260 * It enables ScrollMagic to make use of jQuery's advanced selector engine (sizzle) for all elements supplied to ScrollMagic objects, like scroll containers or trigger elements. 18261 * ScrollMagic also accepts jQuery elements for all methods that expect references to DOM elements. Please note, that in most cases the first element of the matched set will be used. 18262 * 18263 * Additionally it provides the ScrollMagic object within the jQuery namespace, so it can be accessed using `$.ScrollMagic`. 18264 * 18265 * In contrast to most other plugins it does not offer new API additions for ScrollMagic. 18266 * 18267 * To have access to this extension, please include `plugins/jquery.ScrollMagic.js`. 18268 * @example 18269 * // create a new scene making use of jQuery's advanced selector engine 18270 * var scene = new $.ScrollMagic.Scene({ 18271 * triggerElement: "#parent div.trigger[attr='thisone']:not(.notthisone)" 18272 * }); 18273 * @requires {@link http://jquery.com/|jQuery >=1.11} 18274 * @mixin framework.jQuery 18275 */ 18276(function (root, factory) { 18277 if (typeof define === 'function' && define.amd) { 18278 // AMD. Register as an anonymous module. 18279 define(['ScrollMagic', 'jquery'], factory); 18280 } else if (true) { 18281 // CommonJS 18282 factory(__webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")); 18283 } else {} 18284})(this, function (ScrollMagic, $) { 18285 "use strict"; 18286 18287 var NAMESPACE = "jquery.ScrollMagic"; 18288 var console = window.console || {}, 18289 err = Function.prototype.bind.call(console.error || console.log || function () {}, console); 18290 if (!ScrollMagic) { 18291 err("(" + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs."); 18292 } 18293 if (!$) { 18294 err("(" + NAMESPACE + ") -> ERROR: jQuery could not be found. Please make sure it's loaded before ScrollMagic or use an asynchronous loader like requirejs."); 18295 } 18296 ScrollMagic._util.get.elements = function (selector) { 18297 return $(selector).toArray(); 18298 }; 18299 ScrollMagic._util.addClass = function (elem, classname) { 18300 $(elem).addClass(classname); 18301 }; 18302 ScrollMagic._util.removeClass = function (elem, classname) { 18303 $(elem).removeClass(classname); 18304 }; 18305 $.ScrollMagic = ScrollMagic; 18306}); 18307 18308/***/ }), 18309
vendor: 351 bytes, lines 18310-18320
18310/***/ "./node_modules/swiper/css/swiper.min.css": 18311/*!************************************************!*\ 18312 !*** ./node_modules/swiper/css/swiper.min.css ***! 18313 \************************************************/ 18314/*! no static exports found */ 18315/***/ (function(module, exports, __webpack_require__) { 18316 18317// extracted by mini-css-extract-plugin 18318 18319/***/ }), 18320
vendor: 197,040 bytes, lines 18321-22350
18321/***/ "./node_modules/swiper/js/swiper.min.js": 18322/*!**********************************************!*\ 18323 !*** ./node_modules/swiper/js/swiper.min.js ***! 18324 \**********************************************/ 18325/*! no static exports found */ 18326/***/ (function(module, exports, __webpack_require__) { 18327 18328/*** IMPORTS FROM imports-loader ***/ 18329var define = false; 18330 18331/** 18332 * Swiper 5.4.5 18333 * Most modern mobile touch slider and framework with hardware accelerated transitions 18334 * http://swiperjs.com 18335 * 18336 * Copyright 2014-2020 Vladimir Kharlampidi 18337 * 18338 * Released under the MIT License 18339 * 18340 * Released on: June 16, 2020 18341 */ 18342 18343!function (e, t) { 18344 true ? module.exports = t() : undefined; 18345}(this, function () { 18346 "use strict"; 18347 18348 function e(e) { 18349 return null !== e && "object" == typeof e && "constructor" in e && e.constructor === Object; 18350 } 18351 function t(i, s) { 18352 void 0 === i && (i = {}), void 0 === s && (s = {}), Object.keys(s).forEach(function (a) { 18353 void 0 === i[a] ? i[a] = s[a] : e(s[a]) && e(i[a]) && Object.keys(s[a]).length > 0 && t(i[a], s[a]); 18354 }); 18355 } 18356 var i = "undefined" != typeof document ? document : {}, 18357 s = { 18358 body: {}, 18359 addEventListener: function () {}, 18360 removeEventListener: function () {}, 18361 activeElement: { 18362 blur: function () {}, 18363 nodeName: "" 18364 }, 18365 querySelector: function () { 18366 return null; 18367 }, 18368 querySelectorAll: function () { 18369 return []; 18370 }, 18371 getElementById: function () { 18372 return null; 18373 }, 18374 createEvent: function () { 18375 return { 18376 initEvent: function () {} 18377 }; 18378 }, 18379 createElement: function () { 18380 return { 18381 children: [], 18382 childNodes: [], 18383 style: {}, 18384 setAttribute: function () {}, 18385 getElementsByTagName: function () { 18386 return []; 18387 } 18388 }; 18389 }, 18390 createElementNS: function () { 18391 return {}; 18392 }, 18393 importNode: function () { 18394 return null; 18395 }, 18396 location: { 18397 hash: "", 18398 host: "", 18399 hostname: "", 18400 href: "", 18401 origin: "", 18402 pathname: "", 18403 protocol: "", 18404 search: "" 18405 } 18406 }; 18407 t(i, s); 18408 var a = "undefined" != typeof window ? window : {}; 18409 t(a, { 18410 document: s, 18411 navigator: { 18412 userAgent: "" 18413 }, 18414 location: { 18415 hash: "", 18416 host: "", 18417 hostname: "", 18418 href: "", 18419 origin: "", 18420 pathname: "", 18421 protocol: "", 18422 search: "" 18423 }, 18424 history: { 18425 replaceState: function () {}, 18426 pushState: function () {}, 18427 go: function () {}, 18428 back: function () {} 18429 }, 18430 CustomEvent: function () { 18431 return this; 18432 }, 18433 addEventListener: function () {}, 18434 removeEventListener: function () {}, 18435 getComputedStyle: function () { 18436 return { 18437 getPropertyValue: function () { 18438 return ""; 18439 } 18440 }; 18441 }, 18442 Image: function () {}, 18443 Date: function () {}, 18444 screen: {}, 18445 setTimeout: function () {}, 18446 clearTimeout: function () {}, 18447 matchMedia: function () { 18448 return {}; 18449 } 18450 }); 18451 var r = function (e) { 18452 for (var t = 0; t < e.length; t += 1) this[t] = e[t]; 18453 return this.length = e.length, this; 18454 }; 18455 function n(e, t) { 18456 var s = [], 18457 n = 0; 18458 if (e && !t && e instanceof r) return e; 18459 if (e) if ("string" == typeof e) { 18460 var o, 18461 l, 18462 d = e.trim(); 18463 if (d.indexOf("<") >= 0 && d.indexOf(">") >= 0) { 18464 var h = "div"; 18465 for (0 === d.indexOf("<li") && (h = "ul"), 0 === d.indexOf("<tr") && (h = "tbody"), 0 !== d.indexOf("<td") && 0 !== d.indexOf("<th") || (h = "tr"), 0 === d.indexOf("<tbody") && (h = "table"), 0 === d.indexOf("<option") && (h = "select"), (l = i.createElement(h)).innerHTML = d, n = 0; n < l.childNodes.length; n += 1) s.push(l.childNodes[n]); 18466 } else for (o = t || "#" !== e[0] || e.match(/[ .<>:~]/) ? (t || i).querySelectorAll(e.trim()) : [i.getElementById(e.trim().split("#")[1])], n = 0; n < o.length; n += 1) o[n] && s.push(o[n]); 18467 } else if (e.nodeType || e === a || e === i) s.push(e);else if (e.length > 0 && e[0].nodeType) for (n = 0; n < e.length; n += 1) s.push(e[n]); 18468 return new r(s); 18469 } 18470 function o(e) { 18471 for (var t = [], i = 0; i < e.length; i += 1) -1 === t.indexOf(e[i]) && t.push(e[i]); 18472 return t; 18473 } 18474 n.fn = r.prototype, n.Class = r, n.Dom7 = r; 18475 var l = { 18476 addClass: function (e) { 18477 if (void 0 === e) return this; 18478 for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.add(t[i]); 18479 return this; 18480 }, 18481 removeClass: function (e) { 18482 for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.remove(t[i]); 18483 return this; 18484 }, 18485 hasClass: function (e) { 18486 return !!this[0] && this[0].classList.contains(e); 18487 }, 18488 toggleClass: function (e) { 18489 for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.toggle(t[i]); 18490 return this; 18491 }, 18492 attr: function (e, t) { 18493 var i = arguments; 18494 if (1 === arguments.length && "string" == typeof e) return this[0] ? this[0].getAttribute(e) : void 0; 18495 for (var s = 0; s < this.length; s += 1) if (2 === i.length) this[s].setAttribute(e, t);else for (var a in e) this[s][a] = e[a], this[s].setAttribute(a, e[a]); 18496 return this; 18497 }, 18498 removeAttr: function (e) { 18499 for (var t = 0; t < this.length; t += 1) this[t].removeAttribute(e); 18500 return this; 18501 }, 18502 data: function (e, t) { 18503 var i; 18504 if (void 0 !== t) { 18505 for (var s = 0; s < this.length; s += 1) (i = this[s]).dom7ElementDataStorage || (i.dom7ElementDataStorage = {}), i.dom7ElementDataStorage[e] = t; 18506 return this; 18507 } 18508 if (i = this[0]) { 18509 if (i.dom7ElementDataStorage && e in i.dom7ElementDataStorage) return i.dom7ElementDataStorage[e]; 18510 var a = i.getAttribute("data-" + e); 18511 return a || void 0; 18512 } 18513 }, 18514 transform: function (e) { 18515 for (var t = 0; t < this.length; t += 1) { 18516 var i = this[t].style; 18517 i.webkitTransform = e, i.transform = e; 18518 } 18519 return this; 18520 }, 18521 transition: function (e) { 18522 "string" != typeof e && (e += "ms"); 18523 for (var t = 0; t < this.length; t += 1) { 18524 var i = this[t].style; 18525 i.webkitTransitionDuration = e, i.transitionDuration = e; 18526 } 18527 return this; 18528 }, 18529 on: function () { 18530 for (var e, t = [], i = arguments.length; i--;) t[i] = arguments[i]; 18531 var s = t[0], 18532 a = t[1], 18533 r = t[2], 18534 o = t[3]; 18535 function l(e) { 18536 var t = e.target; 18537 if (t) { 18538 var i = e.target.dom7EventData || []; 18539 if (i.indexOf(e) < 0 && i.unshift(e), n(t).is(a)) r.apply(t, i);else for (var s = n(t).parents(), o = 0; o < s.length; o += 1) n(s[o]).is(a) && r.apply(s[o], i); 18540 } 18541 } 18542 function d(e) { 18543 var t = e && e.target && e.target.dom7EventData || []; 18544 t.indexOf(e) < 0 && t.unshift(e), r.apply(this, t); 18545 } 18546 "function" == typeof t[1] && (s = (e = t)[0], r = e[1], o = e[2], a = void 0), o || (o = !1); 18547 for (var h, p = s.split(" "), c = 0; c < this.length; c += 1) { 18548 var u = this[c]; 18549 if (a) for (h = 0; h < p.length; h += 1) { 18550 var v = p[h]; 18551 u.dom7LiveListeners || (u.dom7LiveListeners = {}), u.dom7LiveListeners[v] || (u.dom7LiveListeners[v] = []), u.dom7LiveListeners[v].push({ 18552 listener: r, 18553 proxyListener: l 18554 }), u.addEventListener(v, l, o); 18555 } else for (h = 0; h < p.length; h += 1) { 18556 var f = p[h]; 18557 u.dom7Listeners || (u.dom7Listeners = {}), u.dom7Listeners[f] || (u.dom7Listeners[f] = []), u.dom7Listeners[f].push({ 18558 listener: r, 18559 proxyListener: d 18560 }), u.addEventListener(f, d, o); 18561 } 18562 } 18563 return this; 18564 }, 18565 off: function () { 18566 for (var e, t = [], i = arguments.length; i--;) t[i] = arguments[i]; 18567 var s = t[0], 18568 a = t[1], 18569 r = t[2], 18570 n = t[3]; 18571 "function" == typeof t[1] && (s = (e = t)[0], r = e[1], n = e[2], a = void 0), n || (n = !1); 18572 for (var o = s.split(" "), l = 0; l < o.length; l += 1) for (var d = o[l], h = 0; h < this.length; h += 1) { 18573 var p = this[h], 18574 c = void 0; 18575 if (!a && p.dom7Listeners ? c = p.dom7Listeners[d] : a && p.dom7LiveListeners && (c = p.dom7LiveListeners[d]), c && c.length) for (var u = c.length - 1; u >= 0; u -= 1) { 18576 var v = c[u]; 18577 r && v.listener === r || r && v.listener && v.listener.dom7proxy && v.listener.dom7proxy === r ? (p.removeEventListener(d, v.proxyListener, n), c.splice(u, 1)) : r || (p.removeEventListener(d, v.proxyListener, n), c.splice(u, 1)); 18578 } 18579 } 18580 return this; 18581 }, 18582 trigger: function () { 18583 for (var e = [], t = arguments.length; t--;) e[t] = arguments[t]; 18584 for (var s = e[0].split(" "), r = e[1], n = 0; n < s.length; n += 1) for (var o = s[n], l = 0; l < this.length; l += 1) { 18585 var d = this[l], 18586 h = void 0; 18587 try { 18588 h = new a.CustomEvent(o, { 18589 detail: r, 18590 bubbles: !0, 18591 cancelable: !0 18592 }); 18593 } catch (e) { 18594 (h = i.createEvent("Event")).initEvent(o, !0, !0), h.detail = r; 18595 } 18596 d.dom7EventData = e.filter(function (e, t) { 18597 return t > 0; 18598 }), d.dispatchEvent(h), d.dom7EventData = [], delete d.dom7EventData; 18599 } 18600 return this; 18601 }, 18602 transitionEnd: function (e) { 18603 var t, 18604 i = ["webkitTransitionEnd", "transitionend"], 18605 s = this; 18606 function a(r) { 18607 if (r.target === this) for (e.call(this, r), t = 0; t < i.length; t += 1) s.off(i[t], a); 18608 } 18609 if (e) for (t = 0; t < i.length; t += 1) s.on(i[t], a); 18610 return this; 18611 }, 18612 outerWidth: function (e) { 18613 if (this.length > 0) { 18614 if (e) { 18615 var t = this.styles(); 18616 return this[0].offsetWidth + parseFloat(t.getPropertyValue("margin-right")) + parseFloat(t.getPropertyValue("margin-left")); 18617 } 18618 return this[0].offsetWidth; 18619 } 18620 return null; 18621 }, 18622 outerHeight: function (e) { 18623 if (this.length > 0) { 18624 if (e) { 18625 var t = this.styles(); 18626 return this[0].offsetHeight + parseFloat(t.getPropertyValue("margin-top")) + parseFloat(t.getPropertyValue("margin-bottom")); 18627 } 18628 return this[0].offsetHeight; 18629 } 18630 return null; 18631 }, 18632 offset: function () { 18633 if (this.length > 0) { 18634 var e = this[0], 18635 t = e.getBoundingClientRect(), 18636 s = i.body, 18637 r = e.clientTop || s.clientTop || 0, 18638 n = e.clientLeft || s.clientLeft || 0, 18639 o = e === a ? a.scrollY : e.scrollTop, 18640 l = e === a ? a.scrollX : e.scrollLeft; 18641 return { 18642 top: t.top + o - r, 18643 left: t.left + l - n 18644 }; 18645 } 18646 return null; 18647 }, 18648 css: function (e, t) { 18649 var i; 18650 if (1 === arguments.length) { 18651 if ("string" != typeof e) { 18652 for (i = 0; i < this.length; i += 1) for (var s in e) this[i].style[s] = e[s]; 18653 return this; 18654 } 18655 if (this[0]) return a.getComputedStyle(this[0], null).getPropertyValue(e); 18656 } 18657 if (2 === arguments.length && "string" == typeof e) { 18658 for (i = 0; i < this.length; i += 1) this[i].style[e] = t; 18659 return this; 18660 } 18661 return this; 18662 }, 18663 each: function (e) { 18664 if (!e) return this; 18665 for (var t = 0; t < this.length; t += 1) if (!1 === e.call(this[t], t, this[t])) return this; 18666 return this; 18667 }, 18668 html: function (e) { 18669 if (void 0 === e) return this[0] ? this[0].innerHTML : void 0; 18670 for (var t = 0; t < this.length; t += 1) this[t].innerHTML = e; 18671 return this; 18672 }, 18673 text: function (e) { 18674 if (void 0 === e) return this[0] ? this[0].textContent.trim() : null; 18675 for (var t = 0; t < this.length; t += 1) this[t].textContent = e; 18676 return this; 18677 }, 18678 is: function (e) { 18679 var t, 18680 s, 18681 o = this[0]; 18682 if (!o || void 0 === e) return !1; 18683 if ("string" == typeof e) { 18684 if (o.matches) return o.matches(e); 18685 if (o.webkitMatchesSelector) return o.webkitMatchesSelector(e); 18686 if (o.msMatchesSelector) return o.msMatchesSelector(e); 18687 for (t = n(e), s = 0; s < t.length; s += 1) if (t[s] === o) return !0; 18688 return !1; 18689 } 18690 if (e === i) return o === i; 18691 if (e === a) return o === a; 18692 if (e.nodeType || e instanceof r) { 18693 for (t = e.nodeType ? [e] : e, s = 0; s < t.length; s += 1) if (t[s] === o) return !0; 18694 return !1; 18695 } 18696 return !1; 18697 }, 18698 index: function () { 18699 var e, 18700 t = this[0]; 18701 if (t) { 18702 for (e = 0; null !== (t = t.previousSibling);) 1 === t.nodeType && (e += 1); 18703 return e; 18704 } 18705 }, 18706 eq: function (e) { 18707 if (void 0 === e) return this; 18708 var t, 18709 i = this.length; 18710 return new r(e > i - 1 ? [] : e < 0 ? (t = i + e) < 0 ? [] : [this[t]] : [this[e]]); 18711 }, 18712 append: function () { 18713 for (var e, t = [], s = arguments.length; s--;) t[s] = arguments[s]; 18714 for (var a = 0; a < t.length; a += 1) { 18715 e = t[a]; 18716 for (var n = 0; n < this.length; n += 1) if ("string" == typeof e) { 18717 var o = i.createElement("div"); 18718 for (o.innerHTML = e; o.firstChild;) this[n].appendChild(o.firstChild); 18719 } else if (e instanceof r) for (var l = 0; l < e.length; l += 1) this[n].appendChild(e[l]);else this[n].appendChild(e); 18720 } 18721 return this; 18722 }, 18723 prepend: function (e) { 18724 var t, s; 18725 for (t = 0; t < this.length; t += 1) if ("string" == typeof e) { 18726 var a = i.createElement("div"); 18727 for (a.innerHTML = e, s = a.childNodes.length - 1; s >= 0; s -= 1) this[t].insertBefore(a.childNodes[s], this[t].childNodes[0]); 18728 } else if (e instanceof r) for (s = 0; s < e.length; s += 1) this[t].insertBefore(e[s], this[t].childNodes[0]);else this[t].insertBefore(e, this[t].childNodes[0]); 18729 return this; 18730 }, 18731 next: function (e) { 18732 return this.length > 0 ? e ? this[0].nextElementSibling && n(this[0].nextElementSibling).is(e) ? new r([this[0].nextElementSibling]) : new r([]) : this[0].nextElementSibling ? new r([this[0].nextElementSibling]) : new r([]) : new r([]); 18733 }, 18734 nextAll: function (e) { 18735 var t = [], 18736 i = this[0]; 18737 if (!i) return new r([]); 18738 for (; i.nextElementSibling;) { 18739 var s = i.nextElementSibling; 18740 e ? n(s).is(e) && t.push(s) : t.push(s), i = s; 18741 } 18742 return new r(t); 18743 }, 18744 prev: function (e) { 18745 if (this.length > 0) { 18746 var t = this[0]; 18747 return e ? t.previousElementSibling && n(t.previousElementSibling).is(e) ? new r([t.previousElementSibling]) : new r([]) : t.previousElementSibling ? new r([t.previousElementSibling]) : new r([]); 18748 } 18749 return new r([]); 18750 }, 18751 prevAll: function (e) { 18752 var t = [], 18753 i = this[0]; 18754 if (!i) return new r([]); 18755 for (; i.previousElementSibling;) { 18756 var s = i.previousElementSibling; 18757 e ? n(s).is(e) && t.push(s) : t.push(s), i = s; 18758 } 18759 return new r(t); 18760 }, 18761 parent: function (e) { 18762 for (var t = [], i = 0; i < this.length; i += 1) null !== this[i].parentNode && (e ? n(this[i].parentNode).is(e) && t.push(this[i].parentNode) : t.push(this[i].parentNode)); 18763 return n(o(t)); 18764 }, 18765 parents: function (e) { 18766 for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].parentNode; s;) e ? n(s).is(e) && t.push(s) : t.push(s), s = s.parentNode; 18767 return n(o(t)); 18768 }, 18769 closest: function (e) { 18770 var t = this; 18771 return void 0 === e ? new r([]) : (t.is(e) || (t = t.parents(e).eq(0)), t); 18772 }, 18773 find: function (e) { 18774 for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].querySelectorAll(e), a = 0; a < s.length; a += 1) t.push(s[a]); 18775 return new r(t); 18776 }, 18777 children: function (e) { 18778 for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].childNodes, a = 0; a < s.length; a += 1) e ? 1 === s[a].nodeType && n(s[a]).is(e) && t.push(s[a]) : 1 === s[a].nodeType && t.push(s[a]); 18779 return new r(o(t)); 18780 }, 18781 filter: function (e) { 18782 for (var t = [], i = 0; i < this.length; i += 1) e.call(this[i], i, this[i]) && t.push(this[i]); 18783 return new r(t); 18784 }, 18785 remove: function () { 18786 for (var e = 0; e < this.length; e += 1) this[e].parentNode && this[e].parentNode.removeChild(this[e]); 18787 return this; 18788 }, 18789 add: function () { 18790 for (var e = [], t = arguments.length; t--;) e[t] = arguments[t]; 18791 var i, 18792 s, 18793 a = this; 18794 for (i = 0; i < e.length; i += 1) { 18795 var r = n(e[i]); 18796 for (s = 0; s < r.length; s += 1) a[a.length] = r[s], a.length += 1; 18797 } 18798 return a; 18799 }, 18800 styles: function () { 18801 return this[0] ? a.getComputedStyle(this[0], null) : {}; 18802 } 18803 }; 18804 Object.keys(l).forEach(function (e) { 18805 n.fn[e] = n.fn[e] || l[e]; 18806 }); 18807 var d = { 18808 deleteProps: function (e) { 18809 var t = e; 18810 Object.keys(t).forEach(function (e) { 18811 try { 18812 t[e] = null; 18813 } catch (e) {} 18814 try { 18815 delete t[e]; 18816 } catch (e) {} 18817 }); 18818 }, 18819 nextTick: function (e, t) { 18820 return void 0 === t && (t = 0), setTimeout(e, t); 18821 }, 18822 now: function () { 18823 return Date.now(); 18824 }, 18825 getTranslate: function (e, t) { 18826 var i, s, r; 18827 void 0 === t && (t = "x"); 18828 var n = a.getComputedStyle(e, null); 18829 return a.WebKitCSSMatrix ? ((s = n.transform || n.webkitTransform).split(",").length > 6 && (s = s.split(", ").map(function (e) { 18830 return e.replace(",", "."); 18831 }).join(", ")), r = new a.WebKitCSSMatrix("none" === s ? "" : s)) : i = (r = n.MozTransform || n.OTransform || n.MsTransform || n.msTransform || n.transform || n.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,")).toString().split(","), "x" === t && (s = a.WebKitCSSMatrix ? r.m41 : 16 === i.length ? parseFloat(i[12]) : parseFloat(i[4])), "y" === t && (s = a.WebKitCSSMatrix ? r.m42 : 16 === i.length ? parseFloat(i[13]) : parseFloat(i[5])), s || 0; 18832 }, 18833 parseUrlQuery: function (e) { 18834 var t, 18835 i, 18836 s, 18837 r, 18838 n = {}, 18839 o = e || a.location.href; 18840 if ("string" == typeof o && o.length) for (r = (i = (o = o.indexOf("?") > -1 ? o.replace(/\S*\?/, "") : "").split("&").filter(function (e) { 18841 return "" !== e; 18842 })).length, t = 0; t < r; t += 1) s = i[t].replace(/#\S+/g, "").split("="), n[decodeURIComponent(s[0])] = void 0 === s[1] ? void 0 : decodeURIComponent(s[1]) || ""; 18843 return n; 18844 }, 18845 isObject: function (e) { 18846 return "object" == typeof e && null !== e && e.constructor && e.constructor === Object; 18847 }, 18848 extend: function () { 18849 for (var e = [], t = arguments.length; t--;) e[t] = arguments[t]; 18850 for (var i = Object(e[0]), s = 1; s < e.length; s += 1) { 18851 var a = e[s]; 18852 if (null != a) for (var r = Object.keys(Object(a)), n = 0, o = r.length; n < o; n += 1) { 18853 var l = r[n], 18854 h = Object.getOwnPropertyDescriptor(a, l); 18855 void 0 !== h && h.enumerable && (d.isObject(i[l]) && d.isObject(a[l]) ? d.extend(i[l], a[l]) : !d.isObject(i[l]) && d.isObject(a[l]) ? (i[l] = {}, d.extend(i[l], a[l])) : i[l] = a[l]); 18856 } 18857 } 18858 return i; 18859 } 18860 }, 18861 h = { 18862 touch: !!("ontouchstart" in a || a.DocumentTouch && i instanceof a.DocumentTouch), 18863 pointerEvents: !!a.PointerEvent && "maxTouchPoints" in a.navigator && a.navigator.maxTouchPoints >= 0, 18864 observer: "MutationObserver" in a || "WebkitMutationObserver" in a, 18865 passiveListener: function () { 18866 var e = !1; 18867 try { 18868 var t = Object.defineProperty({}, "passive", { 18869 get: function () { 18870 e = !0; 18871 } 18872 }); 18873 a.addEventListener("testPassiveListener", null, t); 18874 } catch (e) {} 18875 return e; 18876 }(), 18877 gestures: "ongesturestart" in a 18878 }, 18879 p = function (e) { 18880 void 0 === e && (e = {}); 18881 var t = this; 18882 t.params = e, t.eventsListeners = {}, t.params && t.params.on && Object.keys(t.params.on).forEach(function (e) { 18883 t.on(e, t.params.on[e]); 18884 }); 18885 }, 18886 c = { 18887 components: { 18888 configurable: !0 18889 } 18890 }; 18891 p.prototype.on = function (e, t, i) { 18892 var s = this; 18893 if ("function" != typeof t) return s; 18894 var a = i ? "unshift" : "push"; 18895 return e.split(" ").forEach(function (e) { 18896 s.eventsListeners[e] || (s.eventsListeners[e] = []), s.eventsListeners[e][a](t); 18897 }), s; 18898 }, p.prototype.once = function (e, t, i) { 18899 var s = this; 18900 if ("function" != typeof t) return s; 18901 function a() { 18902 for (var i = [], r = arguments.length; r--;) i[r] = arguments[r]; 18903 s.off(e, a), a.f7proxy && delete a.f7proxy, t.apply(s, i); 18904 } 18905 return a.f7proxy = t, s.on(e, a, i); 18906 }, p.prototype.off = function (e, t) { 18907 var i = this; 18908 return i.eventsListeners ? (e.split(" ").forEach(function (e) { 18909 void 0 === t ? i.eventsListeners[e] = [] : i.eventsListeners[e] && i.eventsListeners[e].length && i.eventsListeners[e].forEach(function (s, a) { 18910 (s === t || s.f7proxy && s.f7proxy === t) && i.eventsListeners[e].splice(a, 1); 18911 }); 18912 }), i) : i; 18913 }, p.prototype.emit = function () { 18914 for (var e = [], t = arguments.length; t--;) e[t] = arguments[t]; 18915 var i, 18916 s, 18917 a, 18918 r = this; 18919 if (!r.eventsListeners) return r; 18920 "string" == typeof e[0] || Array.isArray(e[0]) ? (i = e[0], s = e.slice(1, e.length), a = r) : (i = e[0].events, s = e[0].data, a = e[0].context || r); 18921 var n = Array.isArray(i) ? i : i.split(" "); 18922 return n.forEach(function (e) { 18923 if (r.eventsListeners && r.eventsListeners[e]) { 18924 var t = []; 18925 r.eventsListeners[e].forEach(function (e) { 18926 t.push(e); 18927 }), t.forEach(function (e) { 18928 e.apply(a, s); 18929 }); 18930 } 18931 }), r; 18932 }, p.prototype.useModulesParams = function (e) { 18933 var t = this; 18934 t.modules && Object.keys(t.modules).forEach(function (i) { 18935 var s = t.modules[i]; 18936 s.params && d.extend(e, s.params); 18937 }); 18938 }, p.prototype.useModules = function (e) { 18939 void 0 === e && (e = {}); 18940 var t = this; 18941 t.modules && Object.keys(t.modules).forEach(function (i) { 18942 var s = t.modules[i], 18943 a = e[i] || {}; 18944 s.instance && Object.keys(s.instance).forEach(function (e) { 18945 var i = s.instance[e]; 18946 t[e] = "function" == typeof i ? i.bind(t) : i; 18947 }), s.on && t.on && Object.keys(s.on).forEach(function (e) { 18948 t.on(e, s.on[e]); 18949 }), s.create && s.create.bind(t)(a); 18950 }); 18951 }, c.components.set = function (e) { 18952 this.use && this.use(e); 18953 }, p.installModule = function (e) { 18954 for (var t = [], i = arguments.length - 1; i-- > 0;) t[i] = arguments[i + 1]; 18955 var s = this; 18956 s.prototype.modules || (s.prototype.modules = {}); 18957 var a = e.name || Object.keys(s.prototype.modules).length + "_" + d.now(); 18958 return s.prototype.modules[a] = e, e.proto && Object.keys(e.proto).forEach(function (t) { 18959 s.prototype[t] = e.proto[t]; 18960 }), e.static && Object.keys(e.static).forEach(function (t) { 18961 s[t] = e.static[t]; 18962 }), e.install && e.install.apply(s, t), s; 18963 }, p.use = function (e) { 18964 for (var t = [], i = arguments.length - 1; i-- > 0;) t[i] = arguments[i + 1]; 18965 var s = this; 18966 return Array.isArray(e) ? (e.forEach(function (e) { 18967 return s.installModule(e); 18968 }), s) : s.installModule.apply(s, [e].concat(t)); 18969 }, Object.defineProperties(p, c); 18970 var u = { 18971 updateSize: function () { 18972 var e, 18973 t, 18974 i = this.$el; 18975 e = void 0 !== this.params.width ? this.params.width : i[0].clientWidth, t = void 0 !== this.params.height ? this.params.height : i[0].clientHeight, 0 === e && this.isHorizontal() || 0 === t && this.isVertical() || (e = e - parseInt(i.css("padding-left"), 10) - parseInt(i.css("padding-right"), 10), t = t - parseInt(i.css("padding-top"), 10) - parseInt(i.css("padding-bottom"), 10), d.extend(this, { 18976 width: e, 18977 height: t, 18978 size: this.isHorizontal() ? e : t 18979 })); 18980 }, 18981 updateSlides: function () { 18982 var e = this.params, 18983 t = this.$wrapperEl, 18984 i = this.size, 18985 s = this.rtlTranslate, 18986 r = this.wrongRTL, 18987 n = this.virtual && e.virtual.enabled, 18988 o = n ? this.virtual.slides.length : this.slides.length, 18989 l = t.children("." + this.params.slideClass), 18990 h = n ? this.virtual.slides.length : l.length, 18991 p = [], 18992 c = [], 18993 u = []; 18994 function v(t) { 18995 return !e.cssMode || t !== l.length - 1; 18996 } 18997 var f = e.slidesOffsetBefore; 18998 "function" == typeof f && (f = e.slidesOffsetBefore.call(this)); 18999 var m = e.slidesOffsetAfter; 19000 "function" == typeof m && (m = e.slidesOffsetAfter.call(this)); 19001 var g = this.snapGrid.length, 19002 b = this.snapGrid.length, 19003 w = e.spaceBetween, 19004 y = -f, 19005 x = 0, 19006 E = 0; 19007 if (void 0 !== i) { 19008 var T, S; 19009 "string" == typeof w && w.indexOf("%") >= 0 && (w = parseFloat(w.replace("%", "")) / 100 * i), this.virtualSize = -w, s ? l.css({ 19010 marginLeft: "", 19011 marginTop: "" 19012 }) : l.css({ 19013 marginRight: "", 19014 marginBottom: "" 19015 }), e.slidesPerColumn > 1 && (T = Math.floor(h / e.slidesPerColumn) === h / this.params.slidesPerColumn ? h : Math.ceil(h / e.slidesPerColumn) * e.slidesPerColumn, "auto" !== e.slidesPerView && "row" === e.slidesPerColumnFill && (T = Math.max(T, e.slidesPerView * e.slidesPerColumn))); 19016 for (var C, M = e.slidesPerColumn, P = T / M, z = Math.floor(h / e.slidesPerColumn), k = 0; k < h; k += 1) { 19017 S = 0; 19018 var $ = l.eq(k); 19019 if (e.slidesPerColumn > 1) { 19020 var L = void 0, 19021 I = void 0, 19022 D = void 0; 19023 if ("row" === e.slidesPerColumnFill && e.slidesPerGroup > 1) { 19024 var O = Math.floor(k / (e.slidesPerGroup * e.slidesPerColumn)), 19025 A = k - e.slidesPerColumn * e.slidesPerGroup * O, 19026 G = 0 === O ? e.slidesPerGroup : Math.min(Math.ceil((h - O * M * e.slidesPerGroup) / M), e.slidesPerGroup); 19027 L = (I = A - (D = Math.floor(A / G)) * G + O * e.slidesPerGroup) + D * T / M, $.css({ 19028 "-webkit-box-ordinal-group": L, 19029 "-moz-box-ordinal-group": L, 19030 "-ms-flex-order": L, 19031 "-webkit-order": L, 19032 order: L 19033 }); 19034 } else "column" === e.slidesPerColumnFill ? (D = k - (I = Math.floor(k / M)) * M, (I > z || I === z && D === M - 1) && (D += 1) >= M && (D = 0, I += 1)) : I = k - (D = Math.floor(k / P)) * P; 19035 $.css("margin-" + (this.isHorizontal() ? "top" : "left"), 0 !== D && e.spaceBetween && e.spaceBetween + "px"); 19036 } 19037 if ("none" !== $.css("display")) { 19038 if ("auto" === e.slidesPerView) { 19039 var H = a.getComputedStyle($[0], null), 19040 B = $[0].style.transform, 19041 N = $[0].style.webkitTransform; 19042 if (B && ($[0].style.transform = "none"), N && ($[0].style.webkitTransform = "none"), e.roundLengths) S = this.isHorizontal() ? $.outerWidth(!0) : $.outerHeight(!0);else if (this.isHorizontal()) { 19043 var X = parseFloat(H.getPropertyValue("width")), 19044 V = parseFloat(H.getPropertyValue("padding-left")), 19045 Y = parseFloat(H.getPropertyValue("padding-right")), 19046 F = parseFloat(H.getPropertyValue("margin-left")), 19047 W = parseFloat(H.getPropertyValue("margin-right")), 19048 R = H.getPropertyValue("box-sizing"); 19049 S = R && "border-box" === R ? X + F + W : X + V + Y + F + W; 19050 } else { 19051 var q = parseFloat(H.getPropertyValue("height")), 19052 j = parseFloat(H.getPropertyValue("padding-top")), 19053 K = parseFloat(H.getPropertyValue("padding-bottom")), 19054 U = parseFloat(H.getPropertyValue("margin-top")), 19055 _ = parseFloat(H.getPropertyValue("margin-bottom")), 19056 Z = H.getPropertyValue("box-sizing"); 19057 S = Z && "border-box" === Z ? q + U + _ : q + j + K + U + _; 19058 } 19059 B && ($[0].style.transform = B), N && ($[0].style.webkitTransform = N), e.roundLengths && (S = Math.floor(S)); 19060 } else S = (i - (e.slidesPerView - 1) * w) / e.slidesPerView, e.roundLengths && (S = Math.floor(S)), l[k] && (this.isHorizontal() ? l[k].style.width = S + "px" : l[k].style.height = S + "px"); 19061 l[k] && (l[k].swiperSlideSize = S), u.push(S), e.centeredSlides ? (y = y + S / 2 + x / 2 + w, 0 === x && 0 !== k && (y = y - i / 2 - w), 0 === k && (y = y - i / 2 - w), Math.abs(y) < .001 && (y = 0), e.roundLengths && (y = Math.floor(y)), E % e.slidesPerGroup == 0 && p.push(y), c.push(y)) : (e.roundLengths && (y = Math.floor(y)), (E - Math.min(this.params.slidesPerGroupSkip, E)) % this.params.slidesPerGroup == 0 && p.push(y), c.push(y), y = y + S + w), this.virtualSize += S + w, x = S, E += 1; 19062 } 19063 } 19064 if (this.virtualSize = Math.max(this.virtualSize, i) + m, s && r && ("slide" === e.effect || "coverflow" === e.effect) && t.css({ 19065 width: this.virtualSize + e.spaceBetween + "px" 19066 }), e.setWrapperSize && (this.isHorizontal() ? t.css({ 19067 width: this.virtualSize + e.spaceBetween + "px" 19068 }) : t.css({ 19069 height: this.virtualSize + e.spaceBetween + "px" 19070 })), e.slidesPerColumn > 1 && (this.virtualSize = (S + e.spaceBetween) * T, this.virtualSize = Math.ceil(this.virtualSize / e.slidesPerColumn) - e.spaceBetween, this.isHorizontal() ? t.css({ 19071 width: this.virtualSize + e.spaceBetween + "px" 19072 }) : t.css({ 19073 height: this.virtualSize + e.spaceBetween + "px" 19074 }), e.centeredSlides)) { 19075 C = []; 19076 for (var Q = 0; Q < p.length; Q += 1) { 19077 var J = p[Q]; 19078 e.roundLengths && (J = Math.floor(J)), p[Q] < this.virtualSize + p[0] && C.push(J); 19079 } 19080 p = C; 19081 } 19082 if (!e.centeredSlides) { 19083 C = []; 19084 for (var ee = 0; ee < p.length; ee += 1) { 19085 var te = p[ee]; 19086 e.roundLengths && (te = Math.floor(te)), p[ee] <= this.virtualSize - i && C.push(te); 19087 } 19088 p = C, Math.floor(this.virtualSize - i) - Math.floor(p[p.length - 1]) > 1 && p.push(this.virtualSize - i); 19089 } 19090 if (0 === p.length && (p = [0]), 0 !== e.spaceBetween && (this.isHorizontal() ? s ? l.filter(v).css({ 19091 marginLeft: w + "px" 19092 }) : l.filter(v).css({ 19093 marginRight: w + "px" 19094 }) : l.filter(v).css({ 19095 marginBottom: w + "px" 19096 })), e.centeredSlides && e.centeredSlidesBounds) { 19097 var ie = 0; 19098 u.forEach(function (t) { 19099 ie += t + (e.spaceBetween ? e.spaceBetween : 0); 19100 }); 19101 var se = (ie -= e.spaceBetween) - i; 19102 p = p.map(function (e) { 19103 return e < 0 ? -f : e > se ? se + m : e; 19104 }); 19105 } 19106 if (e.centerInsufficientSlides) { 19107 var ae = 0; 19108 if (u.forEach(function (t) { 19109 ae += t + (e.spaceBetween ? e.spaceBetween : 0); 19110 }), (ae -= e.spaceBetween) < i) { 19111 var re = (i - ae) / 2; 19112 p.forEach(function (e, t) { 19113 p[t] = e - re; 19114 }), c.forEach(function (e, t) { 19115 c[t] = e + re; 19116 }); 19117 } 19118 } 19119 d.extend(this, { 19120 slides: l, 19121 snapGrid: p, 19122 slidesGrid: c, 19123 slidesSizesGrid: u 19124 }), h !== o && this.emit("slidesLengthChange"), p.length !== g && (this.params.watchOverflow && this.checkOverflow(), this.emit("snapGridLengthChange")), c.length !== b && this.emit("slidesGridLengthChange"), (e.watchSlidesProgress || e.watchSlidesVisibility) && this.updateSlidesOffset(); 19125 } 19126 }, 19127 updateAutoHeight: function (e) { 19128 var t, 19129 i = [], 19130 s = 0; 19131 if ("number" == typeof e ? this.setTransition(e) : !0 === e && this.setTransition(this.params.speed), "auto" !== this.params.slidesPerView && this.params.slidesPerView > 1) { 19132 if (this.params.centeredSlides) this.visibleSlides.each(function (e, t) { 19133 i.push(t); 19134 });else for (t = 0; t < Math.ceil(this.params.slidesPerView); t += 1) { 19135 var a = this.activeIndex + t; 19136 if (a > this.slides.length) break; 19137 i.push(this.slides.eq(a)[0]); 19138 } 19139 } else i.push(this.slides.eq(this.activeIndex)[0]); 19140 for (t = 0; t < i.length; t += 1) if (void 0 !== i[t]) { 19141 var r = i[t].offsetHeight; 19142 s = r > s ? r : s; 19143 } 19144 s && this.$wrapperEl.css("height", s + "px"); 19145 }, 19146 updateSlidesOffset: function () { 19147 for (var e = this.slides, t = 0; t < e.length; t += 1) e[t].swiperSlideOffset = this.isHorizontal() ? e[t].offsetLeft : e[t].offsetTop; 19148 }, 19149 updateSlidesProgress: function (e) { 19150 void 0 === e && (e = this && this.translate || 0); 19151 var t = this.params, 19152 i = this.slides, 19153 s = this.rtlTranslate; 19154 if (0 !== i.length) { 19155 void 0 === i[0].swiperSlideOffset && this.updateSlidesOffset(); 19156 var a = -e; 19157 s && (a = e), i.removeClass(t.slideVisibleClass), this.visibleSlidesIndexes = [], this.visibleSlides = []; 19158 for (var r = 0; r < i.length; r += 1) { 19159 var o = i[r], 19160 l = (a + (t.centeredSlides ? this.minTranslate() : 0) - o.swiperSlideOffset) / (o.swiperSlideSize + t.spaceBetween); 19161 if (t.watchSlidesVisibility || t.centeredSlides && t.autoHeight) { 19162 var d = -(a - o.swiperSlideOffset), 19163 h = d + this.slidesSizesGrid[r]; 19164 (d >= 0 && d < this.size - 1 || h > 1 && h <= this.size || d <= 0 && h >= this.size) && (this.visibleSlides.push(o), this.visibleSlidesIndexes.push(r), i.eq(r).addClass(t.slideVisibleClass)); 19165 } 19166 o.progress = s ? -l : l; 19167 } 19168 this.visibleSlides = n(this.visibleSlides); 19169 } 19170 }, 19171 updateProgress: function (e) { 19172 if (void 0 === e) { 19173 var t = this.rtlTranslate ? -1 : 1; 19174 e = this && this.translate && this.translate * t || 0; 19175 } 19176 var i = this.params, 19177 s = this.maxTranslate() - this.minTranslate(), 19178 a = this.progress, 19179 r = this.isBeginning, 19180 n = this.isEnd, 19181 o = r, 19182 l = n; 19183 0 === s ? (a = 0, r = !0, n = !0) : (r = (a = (e - this.minTranslate()) / s) <= 0, n = a >= 1), d.extend(this, { 19184 progress: a, 19185 isBeginning: r, 19186 isEnd: n 19187 }), (i.watchSlidesProgress || i.watchSlidesVisibility || i.centeredSlides && i.autoHeight) && this.updateSlidesProgress(e), r && !o && this.emit("reachBeginning toEdge"), n && !l && this.emit("reachEnd toEdge"), (o && !r || l && !n) && this.emit("fromEdge"), this.emit("progress", a); 19188 }, 19189 updateSlidesClasses: function () { 19190 var e, 19191 t = this.slides, 19192 i = this.params, 19193 s = this.$wrapperEl, 19194 a = this.activeIndex, 19195 r = this.realIndex, 19196 n = this.virtual && i.virtual.enabled; 19197 t.removeClass(i.slideActiveClass + " " + i.slideNextClass + " " + i.slidePrevClass + " " + i.slideDuplicateActiveClass + " " + i.slideDuplicateNextClass + " " + i.slideDuplicatePrevClass), (e = n ? this.$wrapperEl.find("." + i.slideClass + '[data-swiper-slide-index="' + a + '"]') : t.eq(a)).addClass(i.slideActiveClass), i.loop && (e.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + r + '"]').addClass(i.slideDuplicateActiveClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + r + '"]').addClass(i.slideDuplicateActiveClass)); 19198 var o = e.nextAll("." + i.slideClass).eq(0).addClass(i.slideNextClass); 19199 i.loop && 0 === o.length && (o = t.eq(0)).addClass(i.slideNextClass); 19200 var l = e.prevAll("." + i.slideClass).eq(0).addClass(i.slidePrevClass); 19201 i.loop && 0 === l.length && (l = t.eq(-1)).addClass(i.slidePrevClass), i.loop && (o.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + o.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicateNextClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + o.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicateNextClass), l.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + l.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicatePrevClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + l.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicatePrevClass)); 19202 }, 19203 updateActiveIndex: function (e) { 19204 var t, 19205 i = this.rtlTranslate ? this.translate : -this.translate, 19206 s = this.slidesGrid, 19207 a = this.snapGrid, 19208 r = this.params, 19209 n = this.activeIndex, 19210 o = this.realIndex, 19211 l = this.snapIndex, 19212 h = e; 19213 if (void 0 === h) { 19214 for (var p = 0; p < s.length; p += 1) void 0 !== s[p + 1] ? i >= s[p] && i < s[p + 1] - (s[p + 1] - s[p]) / 2 ? h = p : i >= s[p] && i < s[p + 1] && (h = p + 1) : i >= s[p] && (h = p); 19215 r.normalizeSlideIndex && (h < 0 || void 0 === h) && (h = 0); 19216 } 19217 if (a.indexOf(i) >= 0) t = a.indexOf(i);else { 19218 var c = Math.min(r.slidesPerGroupSkip, h); 19219 t = c + Math.floor((h - c) / r.slidesPerGroup); 19220 } 19221 if (t >= a.length && (t = a.length - 1), h !== n) { 19222 var u = parseInt(this.slides.eq(h).attr("data-swiper-slide-index") || h, 10); 19223 d.extend(this, { 19224 snapIndex: t, 19225 realIndex: u, 19226 previousIndex: n, 19227 activeIndex: h 19228 }), this.emit("activeIndexChange"), this.emit("snapIndexChange"), o !== u && this.emit("realIndexChange"), (this.initialized || this.params.runCallbacksOnInit) && this.emit("slideChange"); 19229 } else t !== l && (this.snapIndex = t, this.emit("snapIndexChange")); 19230 }, 19231 updateClickedSlide: function (e) { 19232 var t = this.params, 19233 i = n(e.target).closest("." + t.slideClass)[0], 19234 s = !1; 19235 if (i) for (var a = 0; a < this.slides.length; a += 1) this.slides[a] === i && (s = !0); 19236 if (!i || !s) return this.clickedSlide = void 0, void (this.clickedIndex = void 0); 19237 this.clickedSlide = i, this.virtual && this.params.virtual.enabled ? this.clickedIndex = parseInt(n(i).attr("data-swiper-slide-index"), 10) : this.clickedIndex = n(i).index(), t.slideToClickedSlide && void 0 !== this.clickedIndex && this.clickedIndex !== this.activeIndex && this.slideToClickedSlide(); 19238 } 19239 }; 19240 var v = { 19241 getTranslate: function (e) { 19242 void 0 === e && (e = this.isHorizontal() ? "x" : "y"); 19243 var t = this.params, 19244 i = this.rtlTranslate, 19245 s = this.translate, 19246 a = this.$wrapperEl; 19247 if (t.virtualTranslate) return i ? -s : s; 19248 if (t.cssMode) return s; 19249 var r = d.getTranslate(a[0], e); 19250 return i && (r = -r), r || 0; 19251 }, 19252 setTranslate: function (e, t) { 19253 var i = this.rtlTranslate, 19254 s = this.params, 19255 a = this.$wrapperEl, 19256 r = this.wrapperEl, 19257 n = this.progress, 19258 o = 0, 19259 l = 0; 19260 this.isHorizontal() ? o = i ? -e : e : l = e, s.roundLengths && (o = Math.floor(o), l = Math.floor(l)), s.cssMode ? r[this.isHorizontal() ? "scrollLeft" : "scrollTop"] = this.isHorizontal() ? -o : -l : s.virtualTranslate || a.transform("translate3d(" + o + "px, " + l + "px, 0px)"), this.previousTranslate = this.translate, this.translate = this.isHorizontal() ? o : l; 19261 var d = this.maxTranslate() - this.minTranslate(); 19262 (0 === d ? 0 : (e - this.minTranslate()) / d) !== n && this.updateProgress(e), this.emit("setTranslate", this.translate, t); 19263 }, 19264 minTranslate: function () { 19265 return -this.snapGrid[0]; 19266 }, 19267 maxTranslate: function () { 19268 return -this.snapGrid[this.snapGrid.length - 1]; 19269 }, 19270 translateTo: function (e, t, i, s, a) { 19271 var r; 19272 void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0), void 0 === s && (s = !0); 19273 var n = this, 19274 o = n.params, 19275 l = n.wrapperEl; 19276 if (n.animating && o.preventInteractionOnTransition) return !1; 19277 var d, 19278 h = n.minTranslate(), 19279 p = n.maxTranslate(); 19280 if (d = s && e > h ? h : s && e < p ? p : e, n.updateProgress(d), o.cssMode) { 19281 var c = n.isHorizontal(); 19282 return 0 === t ? l[c ? "scrollLeft" : "scrollTop"] = -d : l.scrollTo ? l.scrollTo(((r = {})[c ? "left" : "top"] = -d, r.behavior = "smooth", r)) : l[c ? "scrollLeft" : "scrollTop"] = -d, !0; 19283 } 19284 return 0 === t ? (n.setTransition(0), n.setTranslate(d), i && (n.emit("beforeTransitionStart", t, a), n.emit("transitionEnd"))) : (n.setTransition(t), n.setTranslate(d), i && (n.emit("beforeTransitionStart", t, a), n.emit("transitionStart")), n.animating || (n.animating = !0, n.onTranslateToWrapperTransitionEnd || (n.onTranslateToWrapperTransitionEnd = function (e) { 19285 n && !n.destroyed && e.target === this && (n.$wrapperEl[0].removeEventListener("transitionend", n.onTranslateToWrapperTransitionEnd), n.$wrapperEl[0].removeEventListener("webkitTransitionEnd", n.onTranslateToWrapperTransitionEnd), n.onTranslateToWrapperTransitionEnd = null, delete n.onTranslateToWrapperTransitionEnd, i && n.emit("transitionEnd")); 19286 }), n.$wrapperEl[0].addEventListener("transitionend", n.onTranslateToWrapperTransitionEnd), n.$wrapperEl[0].addEventListener("webkitTransitionEnd", n.onTranslateToWrapperTransitionEnd))), !0; 19287 } 19288 }; 19289 var f = { 19290 setTransition: function (e, t) { 19291 this.params.cssMode || this.$wrapperEl.transition(e), this.emit("setTransition", e, t); 19292 }, 19293 transitionStart: function (e, t) { 19294 void 0 === e && (e = !0); 19295 var i = this.activeIndex, 19296 s = this.params, 19297 a = this.previousIndex; 19298 if (!s.cssMode) { 19299 s.autoHeight && this.updateAutoHeight(); 19300 var r = t; 19301 if (r || (r = i > a ? "next" : i < a ? "prev" : "reset"), this.emit("transitionStart"), e && i !== a) { 19302 if ("reset" === r) return void this.emit("slideResetTransitionStart"); 19303 this.emit("slideChangeTransitionStart"), "next" === r ? this.emit("slideNextTransitionStart") : this.emit("slidePrevTransitionStart"); 19304 } 19305 } 19306 }, 19307 transitionEnd: function (e, t) { 19308 void 0 === e && (e = !0); 19309 var i = this.activeIndex, 19310 s = this.previousIndex, 19311 a = this.params; 19312 if (this.animating = !1, !a.cssMode) { 19313 this.setTransition(0); 19314 var r = t; 19315 if (r || (r = i > s ? "next" : i < s ? "prev" : "reset"), this.emit("transitionEnd"), e && i !== s) { 19316 if ("reset" === r) return void this.emit("slideResetTransitionEnd"); 19317 this.emit("slideChangeTransitionEnd"), "next" === r ? this.emit("slideNextTransitionEnd") : this.emit("slidePrevTransitionEnd"); 19318 } 19319 } 19320 } 19321 }; 19322 var m = { 19323 slideTo: function (e, t, i, s) { 19324 var a; 19325 void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0); 19326 var r = this, 19327 n = e; 19328 n < 0 && (n = 0); 19329 var o = r.params, 19330 l = r.snapGrid, 19331 d = r.slidesGrid, 19332 h = r.previousIndex, 19333 p = r.activeIndex, 19334 c = r.rtlTranslate, 19335 u = r.wrapperEl; 19336 if (r.animating && o.preventInteractionOnTransition) return !1; 19337 var v = Math.min(r.params.slidesPerGroupSkip, n), 19338 f = v + Math.floor((n - v) / r.params.slidesPerGroup); 19339 f >= l.length && (f = l.length - 1), (p || o.initialSlide || 0) === (h || 0) && i && r.emit("beforeSlideChangeStart"); 19340 var m, 19341 g = -l[f]; 19342 if (r.updateProgress(g), o.normalizeSlideIndex) for (var b = 0; b < d.length; b += 1) -Math.floor(100 * g) >= Math.floor(100 * d[b]) && (n = b); 19343 if (r.initialized && n !== p) { 19344 if (!r.allowSlideNext && g < r.translate && g < r.minTranslate()) return !1; 19345 if (!r.allowSlidePrev && g > r.translate && g > r.maxTranslate() && (p || 0) !== n) return !1; 19346 } 19347 if (m = n > p ? "next" : n < p ? "prev" : "reset", c && -g === r.translate || !c && g === r.translate) return r.updateActiveIndex(n), o.autoHeight && r.updateAutoHeight(), r.updateSlidesClasses(), "slide" !== o.effect && r.setTranslate(g), "reset" !== m && (r.transitionStart(i, m), r.transitionEnd(i, m)), !1; 19348 if (o.cssMode) { 19349 var w = r.isHorizontal(), 19350 y = -g; 19351 return c && (y = u.scrollWidth - u.offsetWidth - y), 0 === t ? u[w ? "scrollLeft" : "scrollTop"] = y : u.scrollTo ? u.scrollTo(((a = {})[w ? "left" : "top"] = y, a.behavior = "smooth", a)) : u[w ? "scrollLeft" : "scrollTop"] = y, !0; 19352 } 19353 return 0 === t ? (r.setTransition(0), r.setTranslate(g), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, s), r.transitionStart(i, m), r.transitionEnd(i, m)) : (r.setTransition(t), r.setTranslate(g), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, s), r.transitionStart(i, m), r.animating || (r.animating = !0, r.onSlideToWrapperTransitionEnd || (r.onSlideToWrapperTransitionEnd = function (e) { 19354 r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd), r.onSlideToWrapperTransitionEnd = null, delete r.onSlideToWrapperTransitionEnd, r.transitionEnd(i, m)); 19355 }), r.$wrapperEl[0].addEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd))), !0; 19356 }, 19357 slideToLoop: function (e, t, i, s) { 19358 void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0); 19359 var a = e; 19360 return this.params.loop && (a += this.loopedSlides), this.slideTo(a, t, i, s); 19361 }, 19362 slideNext: function (e, t, i) { 19363 void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); 19364 var s = this.params, 19365 a = this.animating, 19366 r = this.activeIndex < s.slidesPerGroupSkip ? 1 : s.slidesPerGroup; 19367 if (s.loop) { 19368 if (a) return !1; 19369 this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft; 19370 } 19371 return this.slideTo(this.activeIndex + r, e, t, i); 19372 }, 19373 slidePrev: function (e, t, i) { 19374 void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); 19375 var s = this.params, 19376 a = this.animating, 19377 r = this.snapGrid, 19378 n = this.slidesGrid, 19379 o = this.rtlTranslate; 19380 if (s.loop) { 19381 if (a) return !1; 19382 this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft; 19383 } 19384 function l(e) { 19385 return e < 0 ? -Math.floor(Math.abs(e)) : Math.floor(e); 19386 } 19387 var d, 19388 h = l(o ? this.translate : -this.translate), 19389 p = r.map(function (e) { 19390 return l(e); 19391 }), 19392 c = (n.map(function (e) { 19393 return l(e); 19394 }), r[p.indexOf(h)], r[p.indexOf(h) - 1]); 19395 return void 0 === c && s.cssMode && r.forEach(function (e) { 19396 !c && h >= e && (c = e); 19397 }), void 0 !== c && (d = n.indexOf(c)) < 0 && (d = this.activeIndex - 1), this.slideTo(d, e, t, i); 19398 }, 19399 slideReset: function (e, t, i) { 19400 return void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), this.slideTo(this.activeIndex, e, t, i); 19401 }, 19402 slideToClosest: function (e, t, i, s) { 19403 void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), void 0 === s && (s = .5); 19404 var a = this.activeIndex, 19405 r = Math.min(this.params.slidesPerGroupSkip, a), 19406 n = r + Math.floor((a - r) / this.params.slidesPerGroup), 19407 o = this.rtlTranslate ? this.translate : -this.translate; 19408 if (o >= this.snapGrid[n]) { 19409 var l = this.snapGrid[n]; 19410 o - l > (this.snapGrid[n + 1] - l) * s && (a += this.params.slidesPerGroup); 19411 } else { 19412 var d = this.snapGrid[n - 1]; 19413 o - d <= (this.snapGrid[n] - d) * s && (a -= this.params.slidesPerGroup); 19414 } 19415 return a = Math.max(a, 0), a = Math.min(a, this.slidesGrid.length - 1), this.slideTo(a, e, t, i); 19416 }, 19417 slideToClickedSlide: function () { 19418 var e, 19419 t = this, 19420 i = t.params, 19421 s = t.$wrapperEl, 19422 a = "auto" === i.slidesPerView ? t.slidesPerViewDynamic() : i.slidesPerView, 19423 r = t.clickedIndex; 19424 if (i.loop) { 19425 if (t.animating) return; 19426 e = parseInt(n(t.clickedSlide).attr("data-swiper-slide-index"), 10), i.centeredSlides ? r < t.loopedSlides - a / 2 || r > t.slides.length - t.loopedSlides + a / 2 ? (t.loopFix(), r = s.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]:not(.' + i.slideDuplicateClass + ")").eq(0).index(), d.nextTick(function () { 19427 t.slideTo(r); 19428 })) : t.slideTo(r) : r > t.slides.length - a ? (t.loopFix(), r = s.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]:not(.' + i.slideDuplicateClass + ")").eq(0).index(), d.nextTick(function () { 19429 t.slideTo(r); 19430 })) : t.slideTo(r); 19431 } else t.slideTo(r); 19432 } 19433 }; 19434 var g = { 19435 loopCreate: function () { 19436 var e = this, 19437 t = e.params, 19438 s = e.$wrapperEl; 19439 s.children("." + t.slideClass + "." + t.slideDuplicateClass).remove(); 19440 var a = s.children("." + t.slideClass); 19441 if (t.loopFillGroupWithBlank) { 19442 var r = t.slidesPerGroup - a.length % t.slidesPerGroup; 19443 if (r !== t.slidesPerGroup) { 19444 for (var o = 0; o < r; o += 1) { 19445 var l = n(i.createElement("div")).addClass(t.slideClass + " " + t.slideBlankClass); 19446 s.append(l); 19447 } 19448 a = s.children("." + t.slideClass); 19449 } 19450 } 19451 "auto" !== t.slidesPerView || t.loopedSlides || (t.loopedSlides = a.length), e.loopedSlides = Math.ceil(parseFloat(t.loopedSlides || t.slidesPerView, 10)), e.loopedSlides += t.loopAdditionalSlides, e.loopedSlides > a.length && (e.loopedSlides = a.length); 19452 var d = [], 19453 h = []; 19454 a.each(function (t, i) { 19455 var s = n(i); 19456 t < e.loopedSlides && h.push(i), t < a.length && t >= a.length - e.loopedSlides && d.push(i), s.attr("data-swiper-slide-index", t); 19457 }); 19458 for (var p = 0; p < h.length; p += 1) s.append(n(h[p].cloneNode(!0)).addClass(t.slideDuplicateClass)); 19459 for (var c = d.length - 1; c >= 0; c -= 1) s.prepend(n(d[c].cloneNode(!0)).addClass(t.slideDuplicateClass)); 19460 }, 19461 loopFix: function () { 19462 this.emit("beforeLoopFix"); 19463 var e, 19464 t = this.activeIndex, 19465 i = this.slides, 19466 s = this.loopedSlides, 19467 a = this.allowSlidePrev, 19468 r = this.allowSlideNext, 19469 n = this.snapGrid, 19470 o = this.rtlTranslate; 19471 this.allowSlidePrev = !0, this.allowSlideNext = !0; 19472 var l = -n[t] - this.getTranslate(); 19473 if (t < s) e = i.length - 3 * s + t, e += s, this.slideTo(e, 0, !1, !0) && 0 !== l && this.setTranslate((o ? -this.translate : this.translate) - l);else if (t >= i.length - s) { 19474 e = -i.length + t + s, e += s, this.slideTo(e, 0, !1, !0) && 0 !== l && this.setTranslate((o ? -this.translate : this.translate) - l); 19475 } 19476 this.allowSlidePrev = a, this.allowSlideNext = r, this.emit("loopFix"); 19477 }, 19478 loopDestroy: function () { 19479 var e = this.$wrapperEl, 19480 t = this.params, 19481 i = this.slides; 19482 e.children("." + t.slideClass + "." + t.slideDuplicateClass + ",." + t.slideClass + "." + t.slideBlankClass).remove(), i.removeAttr("data-swiper-slide-index"); 19483 } 19484 }; 19485 var b = { 19486 setGrabCursor: function (e) { 19487 if (!(h.touch || !this.params.simulateTouch || this.params.watchOverflow && this.isLocked || this.params.cssMode)) { 19488 var t = this.el; 19489 t.style.cursor = "move", t.style.cursor = e ? "-webkit-grabbing" : "-webkit-grab", t.style.cursor = e ? "-moz-grabbin" : "-moz-grab", t.style.cursor = e ? "grabbing" : "grab"; 19490 } 19491 }, 19492 unsetGrabCursor: function () { 19493 h.touch || this.params.watchOverflow && this.isLocked || this.params.cssMode || (this.el.style.cursor = ""); 19494 } 19495 }; 19496 var w, 19497 y, 19498 x, 19499 E, 19500 T, 19501 S, 19502 C, 19503 M, 19504 P, 19505 z, 19506 k, 19507 $, 19508 L, 19509 I, 19510 D, 19511 O = { 19512 appendSlide: function (e) { 19513 var t = this.$wrapperEl, 19514 i = this.params; 19515 if (i.loop && this.loopDestroy(), "object" == typeof e && "length" in e) for (var s = 0; s < e.length; s += 1) e[s] && t.append(e[s]);else t.append(e); 19516 i.loop && this.loopCreate(), i.observer && h.observer || this.update(); 19517 }, 19518 prependSlide: function (e) { 19519 var t = this.params, 19520 i = this.$wrapperEl, 19521 s = this.activeIndex; 19522 t.loop && this.loopDestroy(); 19523 var a = s + 1; 19524 if ("object" == typeof e && "length" in e) { 19525 for (var r = 0; r < e.length; r += 1) e[r] && i.prepend(e[r]); 19526 a = s + e.length; 19527 } else i.prepend(e); 19528 t.loop && this.loopCreate(), t.observer && h.observer || this.update(), this.slideTo(a, 0, !1); 19529 }, 19530 addSlide: function (e, t) { 19531 var i = this.$wrapperEl, 19532 s = this.params, 19533 a = this.activeIndex; 19534 s.loop && (a -= this.loopedSlides, this.loopDestroy(), this.slides = i.children("." + s.slideClass)); 19535 var r = this.slides.length; 19536 if (e <= 0) this.prependSlide(t);else if (e >= r) this.appendSlide(t);else { 19537 for (var n = a > e ? a + 1 : a, o = [], l = r - 1; l >= e; l -= 1) { 19538 var d = this.slides.eq(l); 19539 d.remove(), o.unshift(d); 19540 } 19541 if ("object" == typeof t && "length" in t) { 19542 for (var p = 0; p < t.length; p += 1) t[p] && i.append(t[p]); 19543 n = a > e ? a + t.length : a; 19544 } else i.append(t); 19545 for (var c = 0; c < o.length; c += 1) i.append(o[c]); 19546 s.loop && this.loopCreate(), s.observer && h.observer || this.update(), s.loop ? this.slideTo(n + this.loopedSlides, 0, !1) : this.slideTo(n, 0, !1); 19547 } 19548 }, 19549 removeSlide: function (e) { 19550 var t = this.params, 19551 i = this.$wrapperEl, 19552 s = this.activeIndex; 19553 t.loop && (s -= this.loopedSlides, this.loopDestroy(), this.slides = i.children("." + t.slideClass)); 19554 var a, 19555 r = s; 19556 if ("object" == typeof e && "length" in e) { 19557 for (var n = 0; n < e.length; n += 1) a = e[n], this.slides[a] && this.slides.eq(a).remove(), a < r && (r -= 1); 19558 r = Math.max(r, 0); 19559 } else a = e, this.slides[a] && this.slides.eq(a).remove(), a < r && (r -= 1), r = Math.max(r, 0); 19560 t.loop && this.loopCreate(), t.observer && h.observer || this.update(), t.loop ? this.slideTo(r + this.loopedSlides, 0, !1) : this.slideTo(r, 0, !1); 19561 }, 19562 removeAllSlides: function () { 19563 for (var e = [], t = 0; t < this.slides.length; t += 1) e.push(t); 19564 this.removeSlide(e); 19565 } 19566 }, 19567 A = (w = a.navigator.platform, y = a.navigator.userAgent, x = { 19568 ios: !1, 19569 android: !1, 19570 androidChrome: !1, 19571 desktop: !1, 19572 iphone: !1, 19573 ipod: !1, 19574 ipad: !1, 19575 edge: !1, 19576 ie: !1, 19577 firefox: !1, 19578 macos: !1, 19579 windows: !1, 19580 cordova: !(!a.cordova && !a.phonegap), 19581 phonegap: !(!a.cordova && !a.phonegap), 19582 electron: !1 19583 }, E = a.screen.width, T = a.screen.height, S = y.match(/(Android);?[\s\/]+([\d.]+)?/), C = y.match(/(iPad).*OS\s([\d_]+)/), M = y.match(/(iPod)(.*OS\s([\d_]+))?/), P = !C && y.match(/(iPhone\sOS|iOS)\s([\d_]+)/), z = y.indexOf("MSIE ") >= 0 || y.indexOf("Trident/") >= 0, k = y.indexOf("Edge/") >= 0, $ = y.indexOf("Gecko/") >= 0 && y.indexOf("Firefox/") >= 0, L = "Win32" === w, I = y.toLowerCase().indexOf("electron") >= 0, D = "MacIntel" === w, !C && D && h.touch && (1024 === E && 1366 === T || 834 === E && 1194 === T || 834 === E && 1112 === T || 768 === E && 1024 === T) && (C = y.match(/(Version)\/([\d.]+)/), D = !1), x.ie = z, x.edge = k, x.firefox = $, S && !L && (x.os = "android", x.osVersion = S[2], x.android = !0, x.androidChrome = y.toLowerCase().indexOf("chrome") >= 0), (C || P || M) && (x.os = "ios", x.ios = !0), P && !M && (x.osVersion = P[2].replace(/_/g, "."), x.iphone = !0), C && (x.osVersion = C[2].replace(/_/g, "."), x.ipad = !0), M && (x.osVersion = M[3] ? M[3].replace(/_/g, ".") : null, x.ipod = !0), x.ios && x.osVersion && y.indexOf("Version/") >= 0 && "10" === x.osVersion.split(".")[0] && (x.osVersion = y.toLowerCase().split("version/")[1].split(" ")[0]), x.webView = !(!(P || C || M) || !y.match(/.*AppleWebKit(?!.*Safari)/i) && !a.navigator.standalone) || a.matchMedia && a.matchMedia("(display-mode: standalone)").matches, x.webview = x.webView, x.standalone = x.webView, x.desktop = !(x.ios || x.android) || I, x.desktop && (x.electron = I, x.macos = D, x.windows = L, x.macos && (x.os = "macos"), x.windows && (x.os = "windows")), x.pixelRatio = a.devicePixelRatio || 1, x); 19584 function G(e) { 19585 var t = this.touchEventsData, 19586 s = this.params, 19587 r = this.touches; 19588 if (!this.animating || !s.preventInteractionOnTransition) { 19589 var o = e; 19590 o.originalEvent && (o = o.originalEvent); 19591 var l = n(o.target); 19592 if (("wrapper" !== s.touchEventsTarget || l.closest(this.wrapperEl).length) && (t.isTouchEvent = "touchstart" === o.type, (t.isTouchEvent || !("which" in o) || 3 !== o.which) && !(!t.isTouchEvent && "button" in o && o.button > 0 || t.isTouched && t.isMoved))) if (s.noSwiping && l.closest(s.noSwipingSelector ? s.noSwipingSelector : "." + s.noSwipingClass)[0]) this.allowClick = !0;else if (!s.swipeHandler || l.closest(s.swipeHandler)[0]) { 19593 r.currentX = "touchstart" === o.type ? o.targetTouches[0].pageX : o.pageX, r.currentY = "touchstart" === o.type ? o.targetTouches[0].pageY : o.pageY; 19594 var h = r.currentX, 19595 p = r.currentY, 19596 c = s.edgeSwipeDetection || s.iOSEdgeSwipeDetection, 19597 u = s.edgeSwipeThreshold || s.iOSEdgeSwipeThreshold; 19598 if (!c || !(h <= u || h >= a.screen.width - u)) { 19599 if (d.extend(t, { 19600 isTouched: !0, 19601 isMoved: !1, 19602 allowTouchCallbacks: !0, 19603 isScrolling: void 0, 19604 startMoving: void 0 19605 }), r.startX = h, r.startY = p, t.touchStartTime = d.now(), this.allowClick = !0, this.updateSize(), this.swipeDirection = void 0, s.threshold > 0 && (t.allowThresholdMove = !1), "touchstart" !== o.type) { 19606 var v = !0; 19607 l.is(t.formElements) && (v = !1), i.activeElement && n(i.activeElement).is(t.formElements) && i.activeElement !== l[0] && i.activeElement.blur(); 19608 var f = v && this.allowTouchMove && s.touchStartPreventDefault; 19609 (s.touchStartForcePreventDefault || f) && o.preventDefault(); 19610 } 19611 this.emit("touchStart", o); 19612 } 19613 } 19614 } 19615 } 19616 function H(e) { 19617 var t = this.touchEventsData, 19618 s = this.params, 19619 a = this.touches, 19620 r = this.rtlTranslate, 19621 o = e; 19622 if (o.originalEvent && (o = o.originalEvent), t.isTouched) { 19623 if (!t.isTouchEvent || "touchmove" === o.type) { 19624 var l = "touchmove" === o.type && o.targetTouches && (o.targetTouches[0] || o.changedTouches[0]), 19625 h = "touchmove" === o.type ? l.pageX : o.pageX, 19626 p = "touchmove" === o.type ? l.pageY : o.pageY; 19627 if (o.preventedByNestedSwiper) return a.startX = h, void (a.startY = p); 19628 if (!this.allowTouchMove) return this.allowClick = !1, void (t.isTouched && (d.extend(a, { 19629 startX: h, 19630 startY: p, 19631 currentX: h, 19632 currentY: p 19633 }), t.touchStartTime = d.now())); 19634 if (t.isTouchEvent && s.touchReleaseOnEdges && !s.loop) if (this.isVertical()) { 19635 if (p < a.startY && this.translate <= this.maxTranslate() || p > a.startY && this.translate >= this.minTranslate()) return t.isTouched = !1, void (t.isMoved = !1); 19636 } else if (h < a.startX && this.translate <= this.maxTranslate() || h > a.startX && this.translate >= this.minTranslate()) return; 19637 if (t.isTouchEvent && i.activeElement && o.target === i.activeElement && n(o.target).is(t.formElements)) return t.isMoved = !0, void (this.allowClick = !1); 19638 if (t.allowTouchCallbacks && this.emit("touchMove", o), !(o.targetTouches && o.targetTouches.length > 1)) { 19639 a.currentX = h, a.currentY = p; 19640 var c = a.currentX - a.startX, 19641 u = a.currentY - a.startY; 19642 if (!(this.params.threshold && Math.sqrt(Math.pow(c, 2) + Math.pow(u, 2)) < this.params.threshold)) { 19643 var v; 19644 if (void 0 === t.isScrolling) this.isHorizontal() && a.currentY === a.startY || this.isVertical() && a.currentX === a.startX ? t.isScrolling = !1 : c * c + u * u >= 25 && (v = 180 * Math.atan2(Math.abs(u), Math.abs(c)) / Math.PI, t.isScrolling = this.isHorizontal() ? v > s.touchAngle : 90 - v > s.touchAngle); 19645 if (t.isScrolling && this.emit("touchMoveOpposite", o), void 0 === t.startMoving && (a.currentX === a.startX && a.currentY === a.startY || (t.startMoving = !0)), t.isScrolling) t.isTouched = !1;else if (t.startMoving) { 19646 this.allowClick = !1, !s.cssMode && o.cancelable && o.preventDefault(), s.touchMoveStopPropagation && !s.nested && o.stopPropagation(), t.isMoved || (s.loop && this.loopFix(), t.startTranslate = this.getTranslate(), this.setTransition(0), this.animating && this.$wrapperEl.trigger("webkitTransitionEnd transitionend"), t.allowMomentumBounce = !1, !s.grabCursor || !0 !== this.allowSlideNext && !0 !== this.allowSlidePrev || this.setGrabCursor(!0), this.emit("sliderFirstMove", o)), this.emit("sliderMove", o), t.isMoved = !0; 19647 var f = this.isHorizontal() ? c : u; 19648 a.diff = f, f *= s.touchRatio, r && (f = -f), this.swipeDirection = f > 0 ? "prev" : "next", t.currentTranslate = f + t.startTranslate; 19649 var m = !0, 19650 g = s.resistanceRatio; 19651 if (s.touchReleaseOnEdges && (g = 0), f > 0 && t.currentTranslate > this.minTranslate() ? (m = !1, s.resistance && (t.currentTranslate = this.minTranslate() - 1 + Math.pow(-this.minTranslate() + t.startTranslate + f, g))) : f < 0 && t.currentTranslate < this.maxTranslate() && (m = !1, s.resistance && (t.currentTranslate = this.maxTranslate() + 1 - Math.pow(this.maxTranslate() - t.startTranslate - f, g))), m && (o.preventedByNestedSwiper = !0), !this.allowSlideNext && "next" === this.swipeDirection && t.currentTranslate < t.startTranslate && (t.currentTranslate = t.startTranslate), !this.allowSlidePrev && "prev" === this.swipeDirection && t.currentTranslate > t.startTranslate && (t.currentTranslate = t.startTranslate), s.threshold > 0) { 19652 if (!(Math.abs(f) > s.threshold || t.allowThresholdMove)) return void (t.currentTranslate = t.startTranslate); 19653 if (!t.allowThresholdMove) return t.allowThresholdMove = !0, a.startX = a.currentX, a.startY = a.currentY, t.currentTranslate = t.startTranslate, void (a.diff = this.isHorizontal() ? a.currentX - a.startX : a.currentY - a.startY); 19654 } 19655 s.followFinger && !s.cssMode && ((s.freeMode || s.watchSlidesProgress || s.watchSlidesVisibility) && (this.updateActiveIndex(), this.updateSlidesClasses()), s.freeMode && (0 === t.velocities.length && t.velocities.push({ 19656 position: a[this.isHorizontal() ? "startX" : "startY"], 19657 time: t.touchStartTime 19658 }), t.velocities.push({ 19659 position: a[this.isHorizontal() ? "currentX" : "currentY"], 19660 time: d.now() 19661 })), this.updateProgress(t.currentTranslate), this.setTranslate(t.currentTranslate)); 19662 } 19663 } 19664 } 19665 } 19666 } else t.startMoving && t.isScrolling && this.emit("touchMoveOpposite", o); 19667 } 19668 function B(e) { 19669 var t = this, 19670 i = t.touchEventsData, 19671 s = t.params, 19672 a = t.touches, 19673 r = t.rtlTranslate, 19674 n = t.$wrapperEl, 19675 o = t.slidesGrid, 19676 l = t.snapGrid, 19677 h = e; 19678 if (h.originalEvent && (h = h.originalEvent), i.allowTouchCallbacks && t.emit("touchEnd", h), i.allowTouchCallbacks = !1, !i.isTouched) return i.isMoved && s.grabCursor && t.setGrabCursor(!1), i.isMoved = !1, void (i.startMoving = !1); 19679 s.grabCursor && i.isMoved && i.isTouched && (!0 === t.allowSlideNext || !0 === t.allowSlidePrev) && t.setGrabCursor(!1); 19680 var p, 19681 c = d.now(), 19682 u = c - i.touchStartTime; 19683 if (t.allowClick && (t.updateClickedSlide(h), t.emit("tap click", h), u < 300 && c - i.lastClickTime < 300 && t.emit("doubleTap doubleClick", h)), i.lastClickTime = d.now(), d.nextTick(function () { 19684 t.destroyed || (t.allowClick = !0); 19685 }), !i.isTouched || !i.isMoved || !t.swipeDirection || 0 === a.diff || i.currentTranslate === i.startTranslate) return i.isTouched = !1, i.isMoved = !1, void (i.startMoving = !1); 19686 if (i.isTouched = !1, i.isMoved = !1, i.startMoving = !1, p = s.followFinger ? r ? t.translate : -t.translate : -i.currentTranslate, !s.cssMode) if (s.freeMode) { 19687 if (p < -t.minTranslate()) return void t.slideTo(t.activeIndex); 19688 if (p > -t.maxTranslate()) return void (t.slides.length < l.length ? t.slideTo(l.length - 1) : t.slideTo(t.slides.length - 1)); 19689 if (s.freeModeMomentum) { 19690 if (i.velocities.length > 1) { 19691 var v = i.velocities.pop(), 19692 f = i.velocities.pop(), 19693 m = v.position - f.position, 19694 g = v.time - f.time; 19695 t.velocity = m / g, t.velocity /= 2, Math.abs(t.velocity) < s.freeModeMinimumVelocity && (t.velocity = 0), (g > 150 || d.now() - v.time > 300) && (t.velocity = 0); 19696 } else t.velocity = 0; 19697 t.velocity *= s.freeModeMomentumVelocityRatio, i.velocities.length = 0; 19698 var b = 1e3 * s.freeModeMomentumRatio, 19699 w = t.velocity * b, 19700 y = t.translate + w; 19701 r && (y = -y); 19702 var x, 19703 E, 19704 T = !1, 19705 S = 20 * Math.abs(t.velocity) * s.freeModeMomentumBounceRatio; 19706 if (y < t.maxTranslate()) s.freeModeMomentumBounce ? (y + t.maxTranslate() < -S && (y = t.maxTranslate() - S), x = t.maxTranslate(), T = !0, i.allowMomentumBounce = !0) : y = t.maxTranslate(), s.loop && s.centeredSlides && (E = !0);else if (y > t.minTranslate()) s.freeModeMomentumBounce ? (y - t.minTranslate() > S && (y = t.minTranslate() + S), x = t.minTranslate(), T = !0, i.allowMomentumBounce = !0) : y = t.minTranslate(), s.loop && s.centeredSlides && (E = !0);else if (s.freeModeSticky) { 19707 for (var C, M = 0; M < l.length; M += 1) if (l[M] > -y) { 19708 C = M; 19709 break; 19710 } 19711 y = -(y = Math.abs(l[C] - y) < Math.abs(l[C - 1] - y) || "next" === t.swipeDirection ? l[C] : l[C - 1]); 19712 } 19713 if (E && t.once("transitionEnd", function () { 19714 t.loopFix(); 19715 }), 0 !== t.velocity) { 19716 if (b = r ? Math.abs((-y - t.translate) / t.velocity) : Math.abs((y - t.translate) / t.velocity), s.freeModeSticky) { 19717 var P = Math.abs((r ? -y : y) - t.translate), 19718 z = t.slidesSizesGrid[t.activeIndex]; 19719 b = P < z ? s.speed : P < 2 * z ? 1.5 * s.speed : 2.5 * s.speed; 19720 } 19721 } else if (s.freeModeSticky) return void t.slideToClosest(); 19722 s.freeModeMomentumBounce && T ? (t.updateProgress(x), t.setTransition(b), t.setTranslate(y), t.transitionStart(!0, t.swipeDirection), t.animating = !0, n.transitionEnd(function () { 19723 t && !t.destroyed && i.allowMomentumBounce && (t.emit("momentumBounce"), t.setTransition(s.speed), setTimeout(function () { 19724 t.setTranslate(x), n.transitionEnd(function () { 19725 t && !t.destroyed && t.transitionEnd(); 19726 }); 19727 }, 0)); 19728 })) : t.velocity ? (t.updateProgress(y), t.setTransition(b), t.setTranslate(y), t.transitionStart(!0, t.swipeDirection), t.animating || (t.animating = !0, n.transitionEnd(function () { 19729 t && !t.destroyed && t.transitionEnd(); 19730 }))) : t.updateProgress(y), t.updateActiveIndex(), t.updateSlidesClasses(); 19731 } else if (s.freeModeSticky) return void t.slideToClosest(); 19732 (!s.freeModeMomentum || u >= s.longSwipesMs) && (t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses()); 19733 } else { 19734 for (var k = 0, $ = t.slidesSizesGrid[0], L = 0; L < o.length; L += L < s.slidesPerGroupSkip ? 1 : s.slidesPerGroup) { 19735 var I = L < s.slidesPerGroupSkip - 1 ? 1 : s.slidesPerGroup; 19736 void 0 !== o[L + I] ? p >= o[L] && p < o[L + I] && (k = L, $ = o[L + I] - o[L]) : p >= o[L] && (k = L, $ = o[o.length - 1] - o[o.length - 2]); 19737 } 19738 var D = (p - o[k]) / $, 19739 O = k < s.slidesPerGroupSkip - 1 ? 1 : s.slidesPerGroup; 19740 if (u > s.longSwipesMs) { 19741 if (!s.longSwipes) return void t.slideTo(t.activeIndex); 19742 "next" === t.swipeDirection && (D >= s.longSwipesRatio ? t.slideTo(k + O) : t.slideTo(k)), "prev" === t.swipeDirection && (D > 1 - s.longSwipesRatio ? t.slideTo(k + O) : t.slideTo(k)); 19743 } else { 19744 if (!s.shortSwipes) return void t.slideTo(t.activeIndex); 19745 t.navigation && (h.target === t.navigation.nextEl || h.target === t.navigation.prevEl) ? h.target === t.navigation.nextEl ? t.slideTo(k + O) : t.slideTo(k) : ("next" === t.swipeDirection && t.slideTo(k + O), "prev" === t.swipeDirection && t.slideTo(k)); 19746 } 19747 } 19748 } 19749 function N() { 19750 var e = this.params, 19751 t = this.el; 19752 if (!t || 0 !== t.offsetWidth) { 19753 e.breakpoints && this.setBreakpoint(); 19754 var i = this.allowSlideNext, 19755 s = this.allowSlidePrev, 19756 a = this.snapGrid; 19757 this.allowSlideNext = !0, this.allowSlidePrev = !0, this.updateSize(), this.updateSlides(), this.updateSlidesClasses(), ("auto" === e.slidesPerView || e.slidesPerView > 1) && this.isEnd && !this.isBeginning && !this.params.centeredSlides ? this.slideTo(this.slides.length - 1, 0, !1, !0) : this.slideTo(this.activeIndex, 0, !1, !0), this.autoplay && this.autoplay.running && this.autoplay.paused && this.autoplay.run(), this.allowSlidePrev = s, this.allowSlideNext = i, this.params.watchOverflow && a !== this.snapGrid && this.checkOverflow(); 19758 } 19759 } 19760 function X(e) { 19761 this.allowClick || (this.params.preventClicks && e.preventDefault(), this.params.preventClicksPropagation && this.animating && (e.stopPropagation(), e.stopImmediatePropagation())); 19762 } 19763 function V() { 19764 var e = this.wrapperEl, 19765 t = this.rtlTranslate; 19766 this.previousTranslate = this.translate, this.isHorizontal() ? this.translate = t ? e.scrollWidth - e.offsetWidth - e.scrollLeft : -e.scrollLeft : this.translate = -e.scrollTop, -0 === this.translate && (this.translate = 0), this.updateActiveIndex(), this.updateSlidesClasses(); 19767 var i = this.maxTranslate() - this.minTranslate(); 19768 (0 === i ? 0 : (this.translate - this.minTranslate()) / i) !== this.progress && this.updateProgress(t ? -this.translate : this.translate), this.emit("setTranslate", this.translate, !1); 19769 } 19770 var Y = !1; 19771 function F() {} 19772 var W = { 19773 init: !0, 19774 direction: "horizontal", 19775 touchEventsTarget: "container", 19776 initialSlide: 0, 19777 speed: 300, 19778 cssMode: !1, 19779 updateOnWindowResize: !0, 19780 preventInteractionOnTransition: !1, 19781 edgeSwipeDetection: !1, 19782 edgeSwipeThreshold: 20, 19783 freeMode: !1, 19784 freeModeMomentum: !0, 19785 freeModeMomentumRatio: 1, 19786 freeModeMomentumBounce: !0, 19787 freeModeMomentumBounceRatio: 1, 19788 freeModeMomentumVelocityRatio: 1, 19789 freeModeSticky: !1, 19790 freeModeMinimumVelocity: .02, 19791 autoHeight: !1, 19792 setWrapperSize: !1, 19793 virtualTranslate: !1, 19794 effect: "slide", 19795 breakpoints: void 0, 19796 spaceBetween: 0, 19797 slidesPerView: 1, 19798 slidesPerColumn: 1, 19799 slidesPerColumnFill: "column", 19800 slidesPerGroup: 1, 19801 slidesPerGroupSkip: 0, 19802 centeredSlides: !1, 19803 centeredSlidesBounds: !1, 19804 slidesOffsetBefore: 0, 19805 slidesOffsetAfter: 0, 19806 normalizeSlideIndex: !0, 19807 centerInsufficientSlides: !1, 19808 watchOverflow: !1, 19809 roundLengths: !1, 19810 touchRatio: 1, 19811 touchAngle: 45, 19812 simulateTouch: !0, 19813 shortSwipes: !0, 19814 longSwipes: !0, 19815 longSwipesRatio: .5, 19816 longSwipesMs: 300, 19817 followFinger: !0, 19818 allowTouchMove: !0, 19819 threshold: 0, 19820 touchMoveStopPropagation: !1, 19821 touchStartPreventDefault: !0, 19822 touchStartForcePreventDefault: !1, 19823 touchReleaseOnEdges: !1, 19824 uniqueNavElements: !0, 19825 resistance: !0, 19826 resistanceRatio: .85, 19827 watchSlidesProgress: !1, 19828 watchSlidesVisibility: !1, 19829 grabCursor: !1, 19830 preventClicks: !0, 19831 preventClicksPropagation: !0, 19832 slideToClickedSlide: !1, 19833 preloadImages: !0, 19834 updateOnImagesReady: !0, 19835 loop: !1, 19836 loopAdditionalSlides: 0, 19837 loopedSlides: null, 19838 loopFillGroupWithBlank: !1, 19839 allowSlidePrev: !0, 19840 allowSlideNext: !0, 19841 swipeHandler: null, 19842 noSwiping: !0, 19843 noSwipingClass: "swiper-no-swiping", 19844 noSwipingSelector: null, 19845 passiveListeners: !0, 19846 containerModifierClass: "swiper-container-", 19847 slideClass: "swiper-slide", 19848 slideBlankClass: "swiper-slide-invisible-blank", 19849 slideActiveClass: "swiper-slide-active", 19850 slideDuplicateActiveClass: "swiper-slide-duplicate-active", 19851 slideVisibleClass: "swiper-slide-visible", 19852 slideDuplicateClass: "swiper-slide-duplicate", 19853 slideNextClass: "swiper-slide-next", 19854 slideDuplicateNextClass: "swiper-slide-duplicate-next", 19855 slidePrevClass: "swiper-slide-prev", 19856 slideDuplicatePrevClass: "swiper-slide-duplicate-prev", 19857 wrapperClass: "swiper-wrapper", 19858 runCallbacksOnInit: !0 19859 }, 19860 R = { 19861 update: u, 19862 translate: v, 19863 transition: f, 19864 slide: m, 19865 loop: g, 19866 grabCursor: b, 19867 manipulation: O, 19868 events: { 19869 attachEvents: function () { 19870 var e = this.params, 19871 t = this.touchEvents, 19872 s = this.el, 19873 a = this.wrapperEl; 19874 this.onTouchStart = G.bind(this), this.onTouchMove = H.bind(this), this.onTouchEnd = B.bind(this), e.cssMode && (this.onScroll = V.bind(this)), this.onClick = X.bind(this); 19875 var r = !!e.nested; 19876 if (!h.touch && h.pointerEvents) s.addEventListener(t.start, this.onTouchStart, !1), i.addEventListener(t.move, this.onTouchMove, r), i.addEventListener(t.end, this.onTouchEnd, !1);else { 19877 if (h.touch) { 19878 var n = !("touchstart" !== t.start || !h.passiveListener || !e.passiveListeners) && { 19879 passive: !0, 19880 capture: !1 19881 }; 19882 s.addEventListener(t.start, this.onTouchStart, n), s.addEventListener(t.move, this.onTouchMove, h.passiveListener ? { 19883 passive: !1, 19884 capture: r 19885 } : r), s.addEventListener(t.end, this.onTouchEnd, n), t.cancel && s.addEventListener(t.cancel, this.onTouchEnd, n), Y || (i.addEventListener("touchstart", F), Y = !0); 19886 } 19887 (e.simulateTouch && !A.ios && !A.android || e.simulateTouch && !h.touch && A.ios) && (s.addEventListener("mousedown", this.onTouchStart, !1), i.addEventListener("mousemove", this.onTouchMove, r), i.addEventListener("mouseup", this.onTouchEnd, !1)); 19888 } 19889 (e.preventClicks || e.preventClicksPropagation) && s.addEventListener("click", this.onClick, !0), e.cssMode && a.addEventListener("scroll", this.onScroll), e.updateOnWindowResize ? this.on(A.ios || A.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", N, !0) : this.on("observerUpdate", N, !0); 19890 }, 19891 detachEvents: function () { 19892 var e = this.params, 19893 t = this.touchEvents, 19894 s = this.el, 19895 a = this.wrapperEl, 19896 r = !!e.nested; 19897 if (!h.touch && h.pointerEvents) s.removeEventListener(t.start, this.onTouchStart, !1), i.removeEventListener(t.move, this.onTouchMove, r), i.removeEventListener(t.end, this.onTouchEnd, !1);else { 19898 if (h.touch) { 19899 var n = !("onTouchStart" !== t.start || !h.passiveListener || !e.passiveListeners) && { 19900 passive: !0, 19901 capture: !1 19902 }; 19903 s.removeEventListener(t.start, this.onTouchStart, n), s.removeEventListener(t.move, this.onTouchMove, r), s.removeEventListener(t.end, this.onTouchEnd, n), t.cancel && s.removeEventListener(t.cancel, this.onTouchEnd, n); 19904 } 19905 (e.simulateTouch && !A.ios && !A.android || e.simulateTouch && !h.touch && A.ios) && (s.removeEventListener("mousedown", this.onTouchStart, !1), i.removeEventListener("mousemove", this.onTouchMove, r), i.removeEventListener("mouseup", this.onTouchEnd, !1)); 19906 } 19907 (e.preventClicks || e.preventClicksPropagation) && s.removeEventListener("click", this.onClick, !0), e.cssMode && a.removeEventListener("scroll", this.onScroll), this.off(A.ios || A.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", N); 19908 } 19909 }, 19910 breakpoints: { 19911 setBreakpoint: function () { 19912 var e = this.activeIndex, 19913 t = this.initialized, 19914 i = this.loopedSlides; 19915 void 0 === i && (i = 0); 19916 var s = this.params, 19917 a = this.$el, 19918 r = s.breakpoints; 19919 if (r && (!r || 0 !== Object.keys(r).length)) { 19920 var n = this.getBreakpoint(r); 19921 if (n && this.currentBreakpoint !== n) { 19922 var o = n in r ? r[n] : void 0; 19923 o && ["slidesPerView", "spaceBetween", "slidesPerGroup", "slidesPerGroupSkip", "slidesPerColumn"].forEach(function (e) { 19924 var t = o[e]; 19925 void 0 !== t && (o[e] = "slidesPerView" !== e || "AUTO" !== t && "auto" !== t ? "slidesPerView" === e ? parseFloat(t) : parseInt(t, 10) : "auto"); 19926 }); 19927 var l = o || this.originalParams, 19928 h = s.slidesPerColumn > 1, 19929 p = l.slidesPerColumn > 1; 19930 h && !p ? a.removeClass(s.containerModifierClass + "multirow " + s.containerModifierClass + "multirow-column") : !h && p && (a.addClass(s.containerModifierClass + "multirow"), "column" === l.slidesPerColumnFill && a.addClass(s.containerModifierClass + "multirow-column")); 19931 var c = l.direction && l.direction !== s.direction, 19932 u = s.loop && (l.slidesPerView !== s.slidesPerView || c); 19933 c && t && this.changeDirection(), d.extend(this.params, l), d.extend(this, { 19934 allowTouchMove: this.params.allowTouchMove, 19935 allowSlideNext: this.params.allowSlideNext, 19936 allowSlidePrev: this.params.allowSlidePrev 19937 }), this.currentBreakpoint = n, u && t && (this.loopDestroy(), this.loopCreate(), this.updateSlides(), this.slideTo(e - i + this.loopedSlides, 0, !1)), this.emit("breakpoint", l); 19938 } 19939 } 19940 }, 19941 getBreakpoint: function (e) { 19942 if (e) { 19943 var t = !1, 19944 i = Object.keys(e).map(function (e) { 19945 if ("string" == typeof e && 0 === e.indexOf("@")) { 19946 var t = parseFloat(e.substr(1)); 19947 return { 19948 value: a.innerHeight * t, 19949 point: e 19950 }; 19951 } 19952 return { 19953 value: e, 19954 point: e 19955 }; 19956 }); 19957 i.sort(function (e, t) { 19958 return parseInt(e.value, 10) - parseInt(t.value, 10); 19959 }); 19960 for (var s = 0; s < i.length; s += 1) { 19961 var r = i[s], 19962 n = r.point; 19963 r.value <= a.innerWidth && (t = n); 19964 } 19965 return t || "max"; 19966 } 19967 } 19968 }, 19969 checkOverflow: { 19970 checkOverflow: function () { 19971 var e = this.params, 19972 t = this.isLocked, 19973 i = this.slides.length > 0 && e.slidesOffsetBefore + e.spaceBetween * (this.slides.length - 1) + this.slides[0].offsetWidth * this.slides.length; 19974 e.slidesOffsetBefore && e.slidesOffsetAfter && i ? this.isLocked = i <= this.size : this.isLocked = 1 === this.snapGrid.length, this.allowSlideNext = !this.isLocked, this.allowSlidePrev = !this.isLocked, t !== this.isLocked && this.emit(this.isLocked ? "lock" : "unlock"), t && t !== this.isLocked && (this.isEnd = !1, this.navigation && this.navigation.update()); 19975 } 19976 }, 19977 classes: { 19978 addClasses: function () { 19979 var e = this.classNames, 19980 t = this.params, 19981 i = this.rtl, 19982 s = this.$el, 19983 a = []; 19984 a.push("initialized"), a.push(t.direction), t.freeMode && a.push("free-mode"), t.autoHeight && a.push("autoheight"), i && a.push("rtl"), t.slidesPerColumn > 1 && (a.push("multirow"), "column" === t.slidesPerColumnFill && a.push("multirow-column")), A.android && a.push("android"), A.ios && a.push("ios"), t.cssMode && a.push("css-mode"), a.forEach(function (i) { 19985 e.push(t.containerModifierClass + i); 19986 }), s.addClass(e.join(" ")); 19987 }, 19988 removeClasses: function () { 19989 var e = this.$el, 19990 t = this.classNames; 19991 e.removeClass(t.join(" ")); 19992 } 19993 }, 19994 images: { 19995 loadImage: function (e, t, i, s, r, o) { 19996 var l; 19997 function d() { 19998 o && o(); 19999 } 20000 n(e).parent("picture")[0] || e.complete && r ? d() : t ? ((l = new a.Image()).onload = d, l.onerror = d, s && (l.sizes = s), i && (l.srcset = i), t && (l.src = t)) : d(); 20001 }, 20002 preloadImages: function () { 20003 var e = this; 20004 function t() { 20005 null != e && e && !e.destroyed && (void 0 !== e.imagesLoaded && (e.imagesLoaded += 1), e.imagesLoaded === e.imagesToLoad.length && (e.params.updateOnImagesReady && e.update(), e.emit("imagesReady"))); 20006 } 20007 e.imagesToLoad = e.$el.find("img"); 20008 for (var i = 0; i < e.imagesToLoad.length; i += 1) { 20009 var s = e.imagesToLoad[i]; 20010 e.loadImage(s, s.currentSrc || s.getAttribute("src"), s.srcset || s.getAttribute("srcset"), s.sizes || s.getAttribute("sizes"), !0, t); 20011 } 20012 } 20013 } 20014 }, 20015 q = {}, 20016 j = function (e) { 20017 function t() { 20018 for (var i, s, a, r = [], o = arguments.length; o--;) r[o] = arguments[o]; 20019 1 === r.length && r[0].constructor && r[0].constructor === Object ? a = r[0] : (s = (i = r)[0], a = i[1]), a || (a = {}), a = d.extend({}, a), s && !a.el && (a.el = s), e.call(this, a), Object.keys(R).forEach(function (e) { 20020 Object.keys(R[e]).forEach(function (i) { 20021 t.prototype[i] || (t.prototype[i] = R[e][i]); 20022 }); 20023 }); 20024 var l = this; 20025 void 0 === l.modules && (l.modules = {}), Object.keys(l.modules).forEach(function (e) { 20026 var t = l.modules[e]; 20027 if (t.params) { 20028 var i = Object.keys(t.params)[0], 20029 s = t.params[i]; 20030 if ("object" != typeof s || null === s) return; 20031 if (!(i in a) || !("enabled" in s)) return; 20032 !0 === a[i] && (a[i] = { 20033 enabled: !0 20034 }), "object" != typeof a[i] || "enabled" in a[i] || (a[i].enabled = !0), a[i] || (a[i] = { 20035 enabled: !1 20036 }); 20037 } 20038 }); 20039 var p = d.extend({}, W); 20040 l.useModulesParams(p), l.params = d.extend({}, p, q, a), l.originalParams = d.extend({}, l.params), l.passedParams = d.extend({}, a), l.$ = n; 20041 var c = n(l.params.el); 20042 if (s = c[0]) { 20043 if (c.length > 1) { 20044 var u = []; 20045 return c.each(function (e, i) { 20046 var s = d.extend({}, a, { 20047 el: i 20048 }); 20049 u.push(new t(s)); 20050 }), u; 20051 } 20052 var v, f, m; 20053 return s.swiper = l, c.data("swiper", l), s && s.shadowRoot && s.shadowRoot.querySelector ? (v = n(s.shadowRoot.querySelector("." + l.params.wrapperClass))).children = function (e) { 20054 return c.children(e); 20055 } : v = c.children("." + l.params.wrapperClass), d.extend(l, { 20056 $el: c, 20057 el: s, 20058 $wrapperEl: v, 20059 wrapperEl: v[0], 20060 classNames: [], 20061 slides: n(), 20062 slidesGrid: [], 20063 snapGrid: [], 20064 slidesSizesGrid: [], 20065 isHorizontal: function () { 20066 return "horizontal" === l.params.direction; 20067 }, 20068 isVertical: function () { 20069 return "vertical" === l.params.direction; 20070 }, 20071 rtl: "rtl" === s.dir.toLowerCase() || "rtl" === c.css("direction"), 20072 rtlTranslate: "horizontal" === l.params.direction && ("rtl" === s.dir.toLowerCase() || "rtl" === c.css("direction")), 20073 wrongRTL: "-webkit-box" === v.css("display"), 20074 activeIndex: 0, 20075 realIndex: 0, 20076 isBeginning: !0, 20077 isEnd: !1, 20078 translate: 0, 20079 previousTranslate: 0, 20080 progress: 0, 20081 velocity: 0, 20082 animating: !1, 20083 allowSlideNext: l.params.allowSlideNext, 20084 allowSlidePrev: l.params.allowSlidePrev, 20085 touchEvents: (f = ["touchstart", "touchmove", "touchend", "touchcancel"], m = ["mousedown", "mousemove", "mouseup"], h.pointerEvents && (m = ["pointerdown", "pointermove", "pointerup"]), l.touchEventsTouch = { 20086 start: f[0], 20087 move: f[1], 20088 end: f[2], 20089 cancel: f[3] 20090 }, l.touchEventsDesktop = { 20091 start: m[0], 20092 move: m[1], 20093 end: m[2] 20094 }, h.touch || !l.params.simulateTouch ? l.touchEventsTouch : l.touchEventsDesktop), 20095 touchEventsData: { 20096 isTouched: void 0, 20097 isMoved: void 0, 20098 allowTouchCallbacks: void 0, 20099 touchStartTime: void 0, 20100 isScrolling: void 0, 20101 currentTranslate: void 0, 20102 startTranslate: void 0, 20103 allowThresholdMove: void 0, 20104 formElements: "input, select, option, textarea, button, video, label", 20105 lastClickTime: d.now(), 20106 clickTimeout: void 0, 20107 velocities: [], 20108 allowMomentumBounce: void 0, 20109 isTouchEvent: void 0, 20110 startMoving: void 0 20111 }, 20112 allowClick: !0, 20113 allowTouchMove: l.params.allowTouchMove, 20114 touches: { 20115 startX: 0, 20116 startY: 0, 20117 currentX: 0, 20118 currentY: 0, 20119 diff: 0 20120 }, 20121 imagesToLoad: [], 20122 imagesLoaded: 0 20123 }), l.useModules(), l.params.init && l.init(), l; 20124 } 20125 } 20126 e && (t.__proto__ = e), t.prototype = Object.create(e && e.prototype), t.prototype.constructor = t; 20127 var i = { 20128 extendedDefaults: { 20129 configurable: !0 20130 }, 20131 defaults: { 20132 configurable: !0 20133 }, 20134 Class: { 20135 configurable: !0 20136 }, 20137 $: { 20138 configurable: !0 20139 } 20140 }; 20141 return t.prototype.slidesPerViewDynamic = function () { 20142 var e = this.params, 20143 t = this.slides, 20144 i = this.slidesGrid, 20145 s = this.size, 20146 a = this.activeIndex, 20147 r = 1; 20148 if (e.centeredSlides) { 20149 for (var n, o = t[a].swiperSlideSize, l = a + 1; l < t.length; l += 1) t[l] && !n && (r += 1, (o += t[l].swiperSlideSize) > s && (n = !0)); 20150 for (var d = a - 1; d >= 0; d -= 1) t[d] && !n && (r += 1, (o += t[d].swiperSlideSize) > s && (n = !0)); 20151 } else for (var h = a + 1; h < t.length; h += 1) i[h] - i[a] < s && (r += 1); 20152 return r; 20153 }, t.prototype.update = function () { 20154 var e = this; 20155 if (e && !e.destroyed) { 20156 var t = e.snapGrid, 20157 i = e.params; 20158 i.breakpoints && e.setBreakpoint(), e.updateSize(), e.updateSlides(), e.updateProgress(), e.updateSlidesClasses(), e.params.freeMode ? (s(), e.params.autoHeight && e.updateAutoHeight()) : (("auto" === e.params.slidesPerView || e.params.slidesPerView > 1) && e.isEnd && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0)) || s(), i.watchOverflow && t !== e.snapGrid && e.checkOverflow(), e.emit("update"); 20159 } 20160 function s() { 20161 var t = e.rtlTranslate ? -1 * e.translate : e.translate, 20162 i = Math.min(Math.max(t, e.maxTranslate()), e.minTranslate()); 20163 e.setTranslate(i), e.updateActiveIndex(), e.updateSlidesClasses(); 20164 } 20165 }, t.prototype.changeDirection = function (e, t) { 20166 void 0 === t && (t = !0); 20167 var i = this.params.direction; 20168 return e || (e = "horizontal" === i ? "vertical" : "horizontal"), e === i || "horizontal" !== e && "vertical" !== e || (this.$el.removeClass("" + this.params.containerModifierClass + i).addClass("" + this.params.containerModifierClass + e), this.params.direction = e, this.slides.each(function (t, i) { 20169 "vertical" === e ? i.style.width = "" : i.style.height = ""; 20170 }), this.emit("changeDirection"), t && this.update()), this; 20171 }, t.prototype.init = function () { 20172 this.initialized || (this.emit("beforeInit"), this.params.breakpoints && this.setBreakpoint(), this.addClasses(), this.params.loop && this.loopCreate(), this.updateSize(), this.updateSlides(), this.params.watchOverflow && this.checkOverflow(), this.params.grabCursor && this.setGrabCursor(), this.params.preloadImages && this.preloadImages(), this.params.loop ? this.slideTo(this.params.initialSlide + this.loopedSlides, 0, this.params.runCallbacksOnInit) : this.slideTo(this.params.initialSlide, 0, this.params.runCallbacksOnInit), this.attachEvents(), this.initialized = !0, this.emit("init")); 20173 }, t.prototype.destroy = function (e, t) { 20174 void 0 === e && (e = !0), void 0 === t && (t = !0); 20175 var i = this, 20176 s = i.params, 20177 a = i.$el, 20178 r = i.$wrapperEl, 20179 n = i.slides; 20180 return void 0 === i.params || i.destroyed || (i.emit("beforeDestroy"), i.initialized = !1, i.detachEvents(), s.loop && i.loopDestroy(), t && (i.removeClasses(), a.removeAttr("style"), r.removeAttr("style"), n && n.length && n.removeClass([s.slideVisibleClass, s.slideActiveClass, s.slideNextClass, s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")), i.emit("destroy"), Object.keys(i.eventsListeners).forEach(function (e) { 20181 i.off(e); 20182 }), !1 !== e && (i.$el[0].swiper = null, i.$el.data("swiper", null), d.deleteProps(i)), i.destroyed = !0), null; 20183 }, t.extendDefaults = function (e) { 20184 d.extend(q, e); 20185 }, i.extendedDefaults.get = function () { 20186 return q; 20187 }, i.defaults.get = function () { 20188 return W; 20189 }, i.Class.get = function () { 20190 return e; 20191 }, i.$.get = function () { 20192 return n; 20193 }, Object.defineProperties(t, i), t; 20194 }(p), 20195 K = { 20196 name: "device", 20197 proto: { 20198 device: A 20199 }, 20200 static: { 20201 device: A 20202 } 20203 }, 20204 U = { 20205 name: "support", 20206 proto: { 20207 support: h 20208 }, 20209 static: { 20210 support: h 20211 } 20212 }, 20213 _ = { 20214 isEdge: !!a.navigator.userAgent.match(/Edge/g), 20215 isSafari: function () { 20216 var e = a.navigator.userAgent.toLowerCase(); 20217 return e.indexOf("safari") >= 0 && e.indexOf("chrome") < 0 && e.indexOf("android") < 0; 20218 }(), 20219 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(a.navigator.userAgent) 20220 }, 20221 Z = { 20222 name: "browser", 20223 proto: { 20224 browser: _ 20225 }, 20226 static: { 20227 browser: _ 20228 } 20229 }, 20230 Q = { 20231 name: "resize", 20232 create: function () { 20233 var e = this; 20234 d.extend(e, { 20235 resize: { 20236 resizeHandler: function () { 20237 e && !e.destroyed && e.initialized && (e.emit("beforeResize"), e.emit("resize")); 20238 }, 20239 orientationChangeHandler: function () { 20240 e && !e.destroyed && e.initialized && e.emit("orientationchange"); 20241 } 20242 } 20243 }); 20244 }, 20245 on: { 20246 init: function () { 20247 a.addEventListener("resize", this.resize.resizeHandler), a.addEventListener("orientationchange", this.resize.orientationChangeHandler); 20248 }, 20249 destroy: function () { 20250 a.removeEventListener("resize", this.resize.resizeHandler), a.removeEventListener("orientationchange", this.resize.orientationChangeHandler); 20251 } 20252 } 20253 }, 20254 J = { 20255 func: a.MutationObserver || a.WebkitMutationObserver, 20256 attach: function (e, t) { 20257 void 0 === t && (t = {}); 20258 var i = this, 20259 s = new (0, J.func)(function (e) { 20260 if (1 !== e.length) { 20261 var t = function () { 20262 i.emit("observerUpdate", e[0]); 20263 }; 20264 a.requestAnimationFrame ? a.requestAnimationFrame(t) : a.setTimeout(t, 0); 20265 } else i.emit("observerUpdate", e[0]); 20266 }); 20267 s.observe(e, { 20268 attributes: void 0 === t.attributes || t.attributes, 20269 childList: void 0 === t.childList || t.childList, 20270 characterData: void 0 === t.characterData || t.characterData 20271 }), i.observer.observers.push(s); 20272 }, 20273 init: function () { 20274 if (h.observer && this.params.observer) { 20275 if (this.params.observeParents) for (var e = this.$el.parents(), t = 0; t < e.length; t += 1) this.observer.attach(e[t]); 20276 this.observer.attach(this.$el[0], { 20277 childList: this.params.observeSlideChildren 20278 }), this.observer.attach(this.$wrapperEl[0], { 20279 attributes: !1 20280 }); 20281 } 20282 }, 20283 destroy: function () { 20284 this.observer.observers.forEach(function (e) { 20285 e.disconnect(); 20286 }), this.observer.observers = []; 20287 } 20288 }, 20289 ee = { 20290 name: "observer", 20291 params: { 20292 observer: !1, 20293 observeParents: !1, 20294 observeSlideChildren: !1 20295 }, 20296 create: function () { 20297 d.extend(this, { 20298 observer: { 20299 init: J.init.bind(this), 20300 attach: J.attach.bind(this), 20301 destroy: J.destroy.bind(this), 20302 observers: [] 20303 } 20304 }); 20305 }, 20306 on: { 20307 init: function () { 20308 this.observer.init(); 20309 }, 20310 destroy: function () { 20311 this.observer.destroy(); 20312 } 20313 } 20314 }, 20315 te = { 20316 update: function (e) { 20317 var t = this, 20318 i = t.params, 20319 s = i.slidesPerView, 20320 a = i.slidesPerGroup, 20321 r = i.centeredSlides, 20322 n = t.params.virtual, 20323 o = n.addSlidesBefore, 20324 l = n.addSlidesAfter, 20325 h = t.virtual, 20326 p = h.from, 20327 c = h.to, 20328 u = h.slides, 20329 v = h.slidesGrid, 20330 f = h.renderSlide, 20331 m = h.offset; 20332 t.updateActiveIndex(); 20333 var g, 20334 b, 20335 w, 20336 y = t.activeIndex || 0; 20337 g = t.rtlTranslate ? "right" : t.isHorizontal() ? "left" : "top", r ? (b = Math.floor(s / 2) + a + o, w = Math.floor(s / 2) + a + l) : (b = s + (a - 1) + o, w = a + l); 20338 var x = Math.max((y || 0) - w, 0), 20339 E = Math.min((y || 0) + b, u.length - 1), 20340 T = (t.slidesGrid[x] || 0) - (t.slidesGrid[0] || 0); 20341 function S() { 20342 t.updateSlides(), t.updateProgress(), t.updateSlidesClasses(), t.lazy && t.params.lazy.enabled && t.lazy.load(); 20343 } 20344 if (d.extend(t.virtual, { 20345 from: x, 20346 to: E, 20347 offset: T, 20348 slidesGrid: t.slidesGrid 20349 }), p === x && c === E && !e) return t.slidesGrid !== v && T !== m && t.slides.css(g, T + "px"), void t.updateProgress(); 20350 if (t.params.virtual.renderExternal) return t.params.virtual.renderExternal.call(t, { 20351 offset: T, 20352 from: x, 20353 to: E, 20354 slides: function () { 20355 for (var e = [], t = x; t <= E; t += 1) e.push(u[t]); 20356 return e; 20357 }() 20358 }), void S(); 20359 var C = [], 20360 M = []; 20361 if (e) t.$wrapperEl.find("." + t.params.slideClass).remove();else for (var P = p; P <= c; P += 1) (P < x || P > E) && t.$wrapperEl.find("." + t.params.slideClass + '[data-swiper-slide-index="' + P + '"]').remove(); 20362 for (var z = 0; z < u.length; z += 1) z >= x && z <= E && (void 0 === c || e ? M.push(z) : (z > c && M.push(z), z < p && C.push(z))); 20363 M.forEach(function (e) { 20364 t.$wrapperEl.append(f(u[e], e)); 20365 }), C.sort(function (e, t) { 20366 return t - e; 20367 }).forEach(function (e) { 20368 t.$wrapperEl.prepend(f(u[e], e)); 20369 }), t.$wrapperEl.children(".swiper-slide").css(g, T + "px"), S(); 20370 }, 20371 renderSlide: function (e, t) { 20372 var i = this.params.virtual; 20373 if (i.cache && this.virtual.cache[t]) return this.virtual.cache[t]; 20374 var s = i.renderSlide ? n(i.renderSlide.call(this, e, t)) : n('<div class="' + this.params.slideClass + '" data-swiper-slide-index="' + t + '">' + e + "</div>"); 20375 return s.attr("data-swiper-slide-index") || s.attr("data-swiper-slide-index", t), i.cache && (this.virtual.cache[t] = s), s; 20376 }, 20377 appendSlide: function (e) { 20378 if ("object" == typeof e && "length" in e) for (var t = 0; t < e.length; t += 1) e[t] && this.virtual.slides.push(e[t]);else this.virtual.slides.push(e); 20379 this.virtual.update(!0); 20380 }, 20381 prependSlide: function (e) { 20382 var t = this.activeIndex, 20383 i = t + 1, 20384 s = 1; 20385 if (Array.isArray(e)) { 20386 for (var a = 0; a < e.length; a += 1) e[a] && this.virtual.slides.unshift(e[a]); 20387 i = t + e.length, s = e.length; 20388 } else this.virtual.slides.unshift(e); 20389 if (this.params.virtual.cache) { 20390 var r = this.virtual.cache, 20391 n = {}; 20392 Object.keys(r).forEach(function (e) { 20393 var t = r[e], 20394 i = t.attr("data-swiper-slide-index"); 20395 i && t.attr("data-swiper-slide-index", parseInt(i, 10) + 1), n[parseInt(e, 10) + s] = t; 20396 }), this.virtual.cache = n; 20397 } 20398 this.virtual.update(!0), this.slideTo(i, 0); 20399 }, 20400 removeSlide: function (e) { 20401 if (null != e) { 20402 var t = this.activeIndex; 20403 if (Array.isArray(e)) for (var i = e.length - 1; i >= 0; i -= 1) this.virtual.slides.splice(e[i], 1), this.params.virtual.cache && delete this.virtual.cache[e[i]], e[i] < t && (t -= 1), t = Math.max(t, 0);else this.virtual.slides.splice(e, 1), this.params.virtual.cache && delete this.virtual.cache[e], e < t && (t -= 1), t = Math.max(t, 0); 20404 this.virtual.update(!0), this.slideTo(t, 0); 20405 } 20406 }, 20407 removeAllSlides: function () { 20408 this.virtual.slides = [], this.params.virtual.cache && (this.virtual.cache = {}), this.virtual.update(!0), this.slideTo(0, 0); 20409 } 20410 }, 20411 ie = { 20412 name: "virtual", 20413 params: { 20414 virtual: { 20415 enabled: !1, 20416 slides: [], 20417 cache: !0, 20418 renderSlide: null, 20419 renderExternal: null, 20420 addSlidesBefore: 0, 20421 addSlidesAfter: 0 20422 } 20423 }, 20424 create: function () { 20425 d.extend(this, { 20426 virtual: { 20427 update: te.update.bind(this), 20428 appendSlide: te.appendSlide.bind(this), 20429 prependSlide: te.prependSlide.bind(this), 20430 removeSlide: te.removeSlide.bind(this), 20431 removeAllSlides: te.removeAllSlides.bind(this), 20432 renderSlide: te.renderSlide.bind(this), 20433 slides: this.params.virtual.slides, 20434 cache: {} 20435 } 20436 }); 20437 }, 20438 on: { 20439 beforeInit: function () { 20440 if (this.params.virtual.enabled) { 20441 this.classNames.push(this.params.containerModifierClass + "virtual"); 20442 var e = { 20443 watchSlidesProgress: !0 20444 }; 20445 d.extend(this.params, e), d.extend(this.originalParams, e), this.params.initialSlide || this.virtual.update(); 20446 } 20447 }, 20448 setTranslate: function () { 20449 this.params.virtual.enabled && this.virtual.update(); 20450 } 20451 } 20452 }, 20453 se = { 20454 handle: function (e) { 20455 var t = this.rtlTranslate, 20456 s = e; 20457 s.originalEvent && (s = s.originalEvent); 20458 var r = s.keyCode || s.charCode, 20459 n = this.params.keyboard.pageUpDown, 20460 o = n && 33 === r, 20461 l = n && 34 === r, 20462 d = 37 === r, 20463 h = 39 === r, 20464 p = 38 === r, 20465 c = 40 === r; 20466 if (!this.allowSlideNext && (this.isHorizontal() && h || this.isVertical() && c || l)) return !1; 20467 if (!this.allowSlidePrev && (this.isHorizontal() && d || this.isVertical() && p || o)) return !1; 20468 if (!(s.shiftKey || s.altKey || s.ctrlKey || s.metaKey || i.activeElement && i.activeElement.nodeName && ("input" === i.activeElement.nodeName.toLowerCase() || "textarea" === i.activeElement.nodeName.toLowerCase()))) { 20469 if (this.params.keyboard.onlyInViewport && (o || l || d || h || p || c)) { 20470 var u = !1; 20471 if (this.$el.parents("." + this.params.slideClass).length > 0 && 0 === this.$el.parents("." + this.params.slideActiveClass).length) return; 20472 var v = a.innerWidth, 20473 f = a.innerHeight, 20474 m = this.$el.offset(); 20475 t && (m.left -= this.$el[0].scrollLeft); 20476 for (var g = [[m.left, m.top], [m.left + this.width, m.top], [m.left, m.top + this.height], [m.left + this.width, m.top + this.height]], b = 0; b < g.length; b += 1) { 20477 var w = g[b]; 20478 w[0] >= 0 && w[0] <= v && w[1] >= 0 && w[1] <= f && (u = !0); 20479 } 20480 if (!u) return; 20481 } 20482 this.isHorizontal() ? ((o || l || d || h) && (s.preventDefault ? s.preventDefault() : s.returnValue = !1), ((l || h) && !t || (o || d) && t) && this.slideNext(), ((o || d) && !t || (l || h) && t) && this.slidePrev()) : ((o || l || p || c) && (s.preventDefault ? s.preventDefault() : s.returnValue = !1), (l || c) && this.slideNext(), (o || p) && this.slidePrev()), this.emit("keyPress", r); 20483 } 20484 }, 20485 enable: function () { 20486 this.keyboard.enabled || (n(i).on("keydown", this.keyboard.handle), this.keyboard.enabled = !0); 20487 }, 20488 disable: function () { 20489 this.keyboard.enabled && (n(i).off("keydown", this.keyboard.handle), this.keyboard.enabled = !1); 20490 } 20491 }, 20492 ae = { 20493 name: "keyboard", 20494 params: { 20495 keyboard: { 20496 enabled: !1, 20497 onlyInViewport: !0, 20498 pageUpDown: !0 20499 } 20500 }, 20501 create: function () { 20502 d.extend(this, { 20503 keyboard: { 20504 enabled: !1, 20505 enable: se.enable.bind(this), 20506 disable: se.disable.bind(this), 20507 handle: se.handle.bind(this) 20508 } 20509 }); 20510 }, 20511 on: { 20512 init: function () { 20513 this.params.keyboard.enabled && this.keyboard.enable(); 20514 }, 20515 destroy: function () { 20516 this.keyboard.enabled && this.keyboard.disable(); 20517 } 20518 } 20519 }; 20520 var re = { 20521 lastScrollTime: d.now(), 20522 lastEventBeforeSnap: void 0, 20523 recentWheelEvents: [], 20524 event: function () { 20525 return a.navigator.userAgent.indexOf("firefox") > -1 ? "DOMMouseScroll" : function () { 20526 var e = "onwheel" in i; 20527 if (!e) { 20528 var t = i.createElement("div"); 20529 t.setAttribute("onwheel", "return;"), e = "function" == typeof t.onwheel; 20530 } 20531 return !e && i.implementation && i.implementation.hasFeature && !0 !== i.implementation.hasFeature("", "") && (e = i.implementation.hasFeature("Events.wheel", "3.0")), e; 20532 }() ? "wheel" : "mousewheel"; 20533 }, 20534 normalize: function (e) { 20535 var t = 0, 20536 i = 0, 20537 s = 0, 20538 a = 0; 20539 return "detail" in e && (i = e.detail), "wheelDelta" in e && (i = -e.wheelDelta / 120), "wheelDeltaY" in e && (i = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = i, i = 0), s = 10 * t, a = 10 * i, "deltaY" in e && (a = e.deltaY), "deltaX" in e && (s = e.deltaX), e.shiftKey && !s && (s = a, a = 0), (s || a) && e.deltaMode && (1 === e.deltaMode ? (s *= 40, a *= 40) : (s *= 800, a *= 800)), s && !t && (t = s < 1 ? -1 : 1), a && !i && (i = a < 1 ? -1 : 1), { 20540 spinX: t, 20541 spinY: i, 20542 pixelX: s, 20543 pixelY: a 20544 }; 20545 }, 20546 handleMouseEnter: function () { 20547 this.mouseEntered = !0; 20548 }, 20549 handleMouseLeave: function () { 20550 this.mouseEntered = !1; 20551 }, 20552 handle: function (e) { 20553 var t = e, 20554 i = this, 20555 s = i.params.mousewheel; 20556 i.params.cssMode && t.preventDefault(); 20557 var a = i.$el; 20558 if ("container" !== i.params.mousewheel.eventsTarged && (a = n(i.params.mousewheel.eventsTarged)), !i.mouseEntered && !a[0].contains(t.target) && !s.releaseOnEdges) return !0; 20559 t.originalEvent && (t = t.originalEvent); 20560 var r = 0, 20561 o = i.rtlTranslate ? -1 : 1, 20562 l = re.normalize(t); 20563 if (s.forceToAxis) { 20564 if (i.isHorizontal()) { 20565 if (!(Math.abs(l.pixelX) > Math.abs(l.pixelY))) return !0; 20566 r = -l.pixelX * o; 20567 } else { 20568 if (!(Math.abs(l.pixelY) > Math.abs(l.pixelX))) return !0; 20569 r = -l.pixelY; 20570 } 20571 } else r = Math.abs(l.pixelX) > Math.abs(l.pixelY) ? -l.pixelX * o : -l.pixelY; 20572 if (0 === r) return !0; 20573 if (s.invert && (r = -r), i.params.freeMode) { 20574 var h = { 20575 time: d.now(), 20576 delta: Math.abs(r), 20577 direction: Math.sign(r) 20578 }, 20579 p = i.mousewheel.lastEventBeforeSnap, 20580 c = p && h.time < p.time + 500 && h.delta <= p.delta && h.direction === p.direction; 20581 if (!c) { 20582 i.mousewheel.lastEventBeforeSnap = void 0, i.params.loop && i.loopFix(); 20583 var u = i.getTranslate() + r * s.sensitivity, 20584 v = i.isBeginning, 20585 f = i.isEnd; 20586 if (u >= i.minTranslate() && (u = i.minTranslate()), u <= i.maxTranslate() && (u = i.maxTranslate()), i.setTransition(0), i.setTranslate(u), i.updateProgress(), i.updateActiveIndex(), i.updateSlidesClasses(), (!v && i.isBeginning || !f && i.isEnd) && i.updateSlidesClasses(), i.params.freeModeSticky) { 20587 clearTimeout(i.mousewheel.timeout), i.mousewheel.timeout = void 0; 20588 var m = i.mousewheel.recentWheelEvents; 20589 m.length >= 15 && m.shift(); 20590 var g = m.length ? m[m.length - 1] : void 0, 20591 b = m[0]; 20592 if (m.push(h), g && (h.delta > g.delta || h.direction !== g.direction)) m.splice(0);else if (m.length >= 15 && h.time - b.time < 500 && b.delta - h.delta >= 1 && h.delta <= 6) { 20593 var w = r > 0 ? .8 : .2; 20594 i.mousewheel.lastEventBeforeSnap = h, m.splice(0), i.mousewheel.timeout = d.nextTick(function () { 20595 i.slideToClosest(i.params.speed, !0, void 0, w); 20596 }, 0); 20597 } 20598 i.mousewheel.timeout || (i.mousewheel.timeout = d.nextTick(function () { 20599 i.mousewheel.lastEventBeforeSnap = h, m.splice(0), i.slideToClosest(i.params.speed, !0, void 0, .5); 20600 }, 500)); 20601 } 20602 if (c || i.emit("scroll", t), i.params.autoplay && i.params.autoplayDisableOnInteraction && i.autoplay.stop(), u === i.minTranslate() || u === i.maxTranslate()) return !0; 20603 } 20604 } else { 20605 var y = { 20606 time: d.now(), 20607 delta: Math.abs(r), 20608 direction: Math.sign(r), 20609 raw: e 20610 }, 20611 x = i.mousewheel.recentWheelEvents; 20612 x.length >= 2 && x.shift(); 20613 var E = x.length ? x[x.length - 1] : void 0; 20614 if (x.push(y), E ? (y.direction !== E.direction || y.delta > E.delta || y.time > E.time + 150) && i.mousewheel.animateSlider(y) : i.mousewheel.animateSlider(y), i.mousewheel.releaseScroll(y)) return !0; 20615 } 20616 return t.preventDefault ? t.preventDefault() : t.returnValue = !1, !1; 20617 }, 20618 animateSlider: function (e) { 20619 return e.delta >= 6 && d.now() - this.mousewheel.lastScrollTime < 60 || (e.direction < 0 ? this.isEnd && !this.params.loop || this.animating || (this.slideNext(), this.emit("scroll", e.raw)) : this.isBeginning && !this.params.loop || this.animating || (this.slidePrev(), this.emit("scroll", e.raw)), this.mousewheel.lastScrollTime = new a.Date().getTime(), !1); 20620 }, 20621 releaseScroll: function (e) { 20622 var t = this.params.mousewheel; 20623 if (e.direction < 0) { 20624 if (this.isEnd && !this.params.loop && t.releaseOnEdges) return !0; 20625 } else if (this.isBeginning && !this.params.loop && t.releaseOnEdges) return !0; 20626 return !1; 20627 }, 20628 enable: function () { 20629 var e = re.event(); 20630 if (this.params.cssMode) return this.wrapperEl.removeEventListener(e, this.mousewheel.handle), !0; 20631 if (!e) return !1; 20632 if (this.mousewheel.enabled) return !1; 20633 var t = this.$el; 20634 return "container" !== this.params.mousewheel.eventsTarged && (t = n(this.params.mousewheel.eventsTarged)), t.on("mouseenter", this.mousewheel.handleMouseEnter), t.on("mouseleave", this.mousewheel.handleMouseLeave), t.on(e, this.mousewheel.handle), this.mousewheel.enabled = !0, !0; 20635 }, 20636 disable: function () { 20637 var e = re.event(); 20638 if (this.params.cssMode) return this.wrapperEl.addEventListener(e, this.mousewheel.handle), !0; 20639 if (!e) return !1; 20640 if (!this.mousewheel.enabled) return !1; 20641 var t = this.$el; 20642 return "container" !== this.params.mousewheel.eventsTarged && (t = n(this.params.mousewheel.eventsTarged)), t.off(e, this.mousewheel.handle), this.mousewheel.enabled = !1, !0; 20643 } 20644 }, 20645 ne = { 20646 update: function () { 20647 var e = this.params.navigation; 20648 if (!this.params.loop) { 20649 var t = this.navigation, 20650 i = t.$nextEl, 20651 s = t.$prevEl; 20652 s && s.length > 0 && (this.isBeginning ? s.addClass(e.disabledClass) : s.removeClass(e.disabledClass), s[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](e.lockClass)), i && i.length > 0 && (this.isEnd ? i.addClass(e.disabledClass) : i.removeClass(e.disabledClass), i[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](e.lockClass)); 20653 } 20654 }, 20655 onPrevClick: function (e) { 20656 e.preventDefault(), this.isBeginning && !this.params.loop || this.slidePrev(); 20657 }, 20658 onNextClick: function (e) { 20659 e.preventDefault(), this.isEnd && !this.params.loop || this.slideNext(); 20660 }, 20661 init: function () { 20662 var e, 20663 t, 20664 i = this.params.navigation; 20665 (i.nextEl || i.prevEl) && (i.nextEl && (e = n(i.nextEl), this.params.uniqueNavElements && "string" == typeof i.nextEl && e.length > 1 && 1 === this.$el.find(i.nextEl).length && (e = this.$el.find(i.nextEl))), i.prevEl && (t = n(i.prevEl), this.params.uniqueNavElements && "string" == typeof i.prevEl && t.length > 1 && 1 === this.$el.find(i.prevEl).length && (t = this.$el.find(i.prevEl))), e && e.length > 0 && e.on("click", this.navigation.onNextClick), t && t.length > 0 && t.on("click", this.navigation.onPrevClick), d.extend(this.navigation, { 20666 $nextEl: e, 20667 nextEl: e && e[0], 20668 $prevEl: t, 20669 prevEl: t && t[0] 20670 })); 20671 }, 20672 destroy: function () { 20673 var e = this.navigation, 20674 t = e.$nextEl, 20675 i = e.$prevEl; 20676 t && t.length && (t.off("click", this.navigation.onNextClick), t.removeClass(this.params.navigation.disabledClass)), i && i.length && (i.off("click", this.navigation.onPrevClick), i.removeClass(this.params.navigation.disabledClass)); 20677 } 20678 }, 20679 oe = { 20680 update: function () { 20681 var e = this.rtl, 20682 t = this.params.pagination; 20683 if (t.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) { 20684 var i, 20685 s = this.virtual && this.params.virtual.enabled ? this.virtual.slides.length : this.slides.length, 20686 a = this.pagination.$el, 20687 r = this.params.loop ? Math.ceil((s - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length; 20688 if (this.params.loop ? ((i = Math.ceil((this.activeIndex - this.loopedSlides) / this.params.slidesPerGroup)) > s - 1 - 2 * this.loopedSlides && (i -= s - 2 * this.loopedSlides), i > r - 1 && (i -= r), i < 0 && "bullets" !== this.params.paginationType && (i = r + i)) : i = void 0 !== this.snapIndex ? this.snapIndex : this.activeIndex || 0, "bullets" === t.type && this.pagination.bullets && this.pagination.bullets.length > 0) { 20689 var o, 20690 l, 20691 d, 20692 h = this.pagination.bullets; 20693 if (t.dynamicBullets && (this.pagination.bulletSize = h.eq(0)[this.isHorizontal() ? "outerWidth" : "outerHeight"](!0), a.css(this.isHorizontal() ? "width" : "height", this.pagination.bulletSize * (t.dynamicMainBullets + 4) + "px"), t.dynamicMainBullets > 1 && void 0 !== this.previousIndex && (this.pagination.dynamicBulletIndex += i - this.previousIndex, this.pagination.dynamicBulletIndex > t.dynamicMainBullets - 1 ? this.pagination.dynamicBulletIndex = t.dynamicMainBullets - 1 : this.pagination.dynamicBulletIndex < 0 && (this.pagination.dynamicBulletIndex = 0)), o = i - this.pagination.dynamicBulletIndex, d = ((l = o + (Math.min(h.length, t.dynamicMainBullets) - 1)) + o) / 2), h.removeClass(t.bulletActiveClass + " " + t.bulletActiveClass + "-next " + t.bulletActiveClass + "-next-next " + t.bulletActiveClass + "-prev " + t.bulletActiveClass + "-prev-prev " + t.bulletActiveClass + "-main"), a.length > 1) h.each(function (e, s) { 20694 var a = n(s), 20695 r = a.index(); 20696 r === i && a.addClass(t.bulletActiveClass), t.dynamicBullets && (r >= o && r <= l && a.addClass(t.bulletActiveClass + "-main"), r === o && a.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), r === l && a.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next")); 20697 });else { 20698 var p = h.eq(i), 20699 c = p.index(); 20700 if (p.addClass(t.bulletActiveClass), t.dynamicBullets) { 20701 for (var u = h.eq(o), v = h.eq(l), f = o; f <= l; f += 1) h.eq(f).addClass(t.bulletActiveClass + "-main"); 20702 if (this.params.loop) { 20703 if (c >= h.length - t.dynamicMainBullets) { 20704 for (var m = t.dynamicMainBullets; m >= 0; m -= 1) h.eq(h.length - m).addClass(t.bulletActiveClass + "-main"); 20705 h.eq(h.length - t.dynamicMainBullets - 1).addClass(t.bulletActiveClass + "-prev"); 20706 } else u.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), v.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next"); 20707 } else u.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), v.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next"); 20708 } 20709 } 20710 if (t.dynamicBullets) { 20711 var g = Math.min(h.length, t.dynamicMainBullets + 4), 20712 b = (this.pagination.bulletSize * g - this.pagination.bulletSize) / 2 - d * this.pagination.bulletSize, 20713 w = e ? "right" : "left"; 20714 h.css(this.isHorizontal() ? w : "top", b + "px"); 20715 } 20716 } 20717 if ("fraction" === t.type && (a.find("." + t.currentClass).text(t.formatFractionCurrent(i + 1)), a.find("." + t.totalClass).text(t.formatFractionTotal(r))), "progressbar" === t.type) { 20718 var y; 20719 y = t.progressbarOpposite ? this.isHorizontal() ? "vertical" : "horizontal" : this.isHorizontal() ? "horizontal" : "vertical"; 20720 var x = (i + 1) / r, 20721 E = 1, 20722 T = 1; 20723 "horizontal" === y ? E = x : T = x, a.find("." + t.progressbarFillClass).transform("translate3d(0,0,0) scaleX(" + E + ") scaleY(" + T + ")").transition(this.params.speed); 20724 } 20725 "custom" === t.type && t.renderCustom ? (a.html(t.renderCustom(this, i + 1, r)), this.emit("paginationRender", this, a[0])) : this.emit("paginationUpdate", this, a[0]), a[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](t.lockClass); 20726 } 20727 }, 20728 render: function () { 20729 var e = this.params.pagination; 20730 if (e.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) { 20731 var t = this.virtual && this.params.virtual.enabled ? this.virtual.slides.length : this.slides.length, 20732 i = this.pagination.$el, 20733 s = ""; 20734 if ("bullets" === e.type) { 20735 for (var a = this.params.loop ? Math.ceil((t - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length, r = 0; r < a; r += 1) e.renderBullet ? s += e.renderBullet.call(this, r, e.bulletClass) : s += "<" + e.bulletElement + ' class="' + e.bulletClass + '"></' + e.bulletElement + ">"; 20736 i.html(s), this.pagination.bullets = i.find("." + e.bulletClass); 20737 } 20738 "fraction" === e.type && (s = e.renderFraction ? e.renderFraction.call(this, e.currentClass, e.totalClass) : '<span class="' + e.currentClass + '"></span> / <span class="' + e.totalClass + '"></span>', i.html(s)), "progressbar" === e.type && (s = e.renderProgressbar ? e.renderProgressbar.call(this, e.progressbarFillClass) : '<span class="' + e.progressbarFillClass + '"></span>', i.html(s)), "custom" !== e.type && this.emit("paginationRender", this.pagination.$el[0]); 20739 } 20740 }, 20741 init: function () { 20742 var e = this, 20743 t = e.params.pagination; 20744 if (t.el) { 20745 var i = n(t.el); 20746 0 !== i.length && (e.params.uniqueNavElements && "string" == typeof t.el && i.length > 1 && (i = e.$el.find(t.el)), "bullets" === t.type && t.clickable && i.addClass(t.clickableClass), i.addClass(t.modifierClass + t.type), "bullets" === t.type && t.dynamicBullets && (i.addClass("" + t.modifierClass + t.type + "-dynamic"), e.pagination.dynamicBulletIndex = 0, t.dynamicMainBullets < 1 && (t.dynamicMainBullets = 1)), "progressbar" === t.type && t.progressbarOpposite && i.addClass(t.progressbarOppositeClass), t.clickable && i.on("click", "." + t.bulletClass, function (t) { 20747 t.preventDefault(); 20748 var i = n(this).index() * e.params.slidesPerGroup; 20749 e.params.loop && (i += e.loopedSlides), e.slideTo(i); 20750 }), d.extend(e.pagination, { 20751 $el: i, 20752 el: i[0] 20753 })); 20754 } 20755 }, 20756 destroy: function () { 20757 var e = this.params.pagination; 20758 if (e.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) { 20759 var t = this.pagination.$el; 20760 t.removeClass(e.hiddenClass), t.removeClass(e.modifierClass + e.type), this.pagination.bullets && this.pagination.bullets.removeClass(e.bulletActiveClass), e.clickable && t.off("click", "." + e.bulletClass); 20761 } 20762 } 20763 }, 20764 le = { 20765 setTranslate: function () { 20766 if (this.params.scrollbar.el && this.scrollbar.el) { 20767 var e = this.scrollbar, 20768 t = this.rtlTranslate, 20769 i = this.progress, 20770 s = e.dragSize, 20771 a = e.trackSize, 20772 r = e.$dragEl, 20773 n = e.$el, 20774 o = this.params.scrollbar, 20775 l = s, 20776 d = (a - s) * i; 20777 t ? (d = -d) > 0 ? (l = s - d, d = 0) : -d + s > a && (l = a + d) : d < 0 ? (l = s + d, d = 0) : d + s > a && (l = a - d), this.isHorizontal() ? (r.transform("translate3d(" + d + "px, 0, 0)"), r[0].style.width = l + "px") : (r.transform("translate3d(0px, " + d + "px, 0)"), r[0].style.height = l + "px"), o.hide && (clearTimeout(this.scrollbar.timeout), n[0].style.opacity = 1, this.scrollbar.timeout = setTimeout(function () { 20778 n[0].style.opacity = 0, n.transition(400); 20779 }, 1e3)); 20780 } 20781 }, 20782 setTransition: function (e) { 20783 this.params.scrollbar.el && this.scrollbar.el && this.scrollbar.$dragEl.transition(e); 20784 }, 20785 updateSize: function () { 20786 if (this.params.scrollbar.el && this.scrollbar.el) { 20787 var e = this.scrollbar, 20788 t = e.$dragEl, 20789 i = e.$el; 20790 t[0].style.width = "", t[0].style.height = ""; 20791 var s, 20792 a = this.isHorizontal() ? i[0].offsetWidth : i[0].offsetHeight, 20793 r = this.size / this.virtualSize, 20794 n = r * (a / this.size); 20795 s = "auto" === this.params.scrollbar.dragSize ? a * r : parseInt(this.params.scrollbar.dragSize, 10), this.isHorizontal() ? t[0].style.width = s + "px" : t[0].style.height = s + "px", i[0].style.display = r >= 1 ? "none" : "", this.params.scrollbar.hide && (i[0].style.opacity = 0), d.extend(e, { 20796 trackSize: a, 20797 divider: r, 20798 moveDivider: n, 20799 dragSize: s 20800 }), e.$el[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](this.params.scrollbar.lockClass); 20801 } 20802 }, 20803 getPointerPosition: function (e) { 20804 return this.isHorizontal() ? "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientX : e.clientX : "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientY : e.clientY; 20805 }, 20806 setDragPosition: function (e) { 20807 var t, 20808 i = this.scrollbar, 20809 s = this.rtlTranslate, 20810 a = i.$el, 20811 r = i.dragSize, 20812 n = i.trackSize, 20813 o = i.dragStartPos; 20814 t = (i.getPointerPosition(e) - a.offset()[this.isHorizontal() ? "left" : "top"] - (null !== o ? o : r / 2)) / (n - r), t = Math.max(Math.min(t, 1), 0), s && (t = 1 - t); 20815 var l = this.minTranslate() + (this.maxTranslate() - this.minTranslate()) * t; 20816 this.updateProgress(l), this.setTranslate(l), this.updateActiveIndex(), this.updateSlidesClasses(); 20817 }, 20818 onDragStart: function (e) { 20819 var t = this.params.scrollbar, 20820 i = this.scrollbar, 20821 s = this.$wrapperEl, 20822 a = i.$el, 20823 r = i.$dragEl; 20824 this.scrollbar.isTouched = !0, this.scrollbar.dragStartPos = e.target === r[0] || e.target === r ? i.getPointerPosition(e) - e.target.getBoundingClientRect()[this.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), s.transition(100), r.transition(100), i.setDragPosition(e), clearTimeout(this.scrollbar.dragTimeout), a.transition(0), t.hide && a.css("opacity", 1), this.params.cssMode && this.$wrapperEl.css("scroll-snap-type", "none"), this.emit("scrollbarDragStart", e); 20825 }, 20826 onDragMove: function (e) { 20827 var t = this.scrollbar, 20828 i = this.$wrapperEl, 20829 s = t.$el, 20830 a = t.$dragEl; 20831 this.scrollbar.isTouched && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, t.setDragPosition(e), i.transition(0), s.transition(0), a.transition(0), this.emit("scrollbarDragMove", e)); 20832 }, 20833 onDragEnd: function (e) { 20834 var t = this.params.scrollbar, 20835 i = this.scrollbar, 20836 s = this.$wrapperEl, 20837 a = i.$el; 20838 this.scrollbar.isTouched && (this.scrollbar.isTouched = !1, this.params.cssMode && (this.$wrapperEl.css("scroll-snap-type", ""), s.transition("")), t.hide && (clearTimeout(this.scrollbar.dragTimeout), this.scrollbar.dragTimeout = d.nextTick(function () { 20839 a.css("opacity", 0), a.transition(400); 20840 }, 1e3)), this.emit("scrollbarDragEnd", e), t.snapOnRelease && this.slideToClosest()); 20841 }, 20842 enableDraggable: function () { 20843 if (this.params.scrollbar.el) { 20844 var e = this.scrollbar, 20845 t = this.touchEventsTouch, 20846 s = this.touchEventsDesktop, 20847 a = this.params, 20848 r = e.$el[0], 20849 n = !(!h.passiveListener || !a.passiveListeners) && { 20850 passive: !1, 20851 capture: !1 20852 }, 20853 o = !(!h.passiveListener || !a.passiveListeners) && { 20854 passive: !0, 20855 capture: !1 20856 }; 20857 h.touch ? (r.addEventListener(t.start, this.scrollbar.onDragStart, n), r.addEventListener(t.move, this.scrollbar.onDragMove, n), r.addEventListener(t.end, this.scrollbar.onDragEnd, o)) : (r.addEventListener(s.start, this.scrollbar.onDragStart, n), i.addEventListener(s.move, this.scrollbar.onDragMove, n), i.addEventListener(s.end, this.scrollbar.onDragEnd, o)); 20858 } 20859 }, 20860 disableDraggable: function () { 20861 if (this.params.scrollbar.el) { 20862 var e = this.scrollbar, 20863 t = this.touchEventsTouch, 20864 s = this.touchEventsDesktop, 20865 a = this.params, 20866 r = e.$el[0], 20867 n = !(!h.passiveListener || !a.passiveListeners) && { 20868 passive: !1, 20869 capture: !1 20870 }, 20871 o = !(!h.passiveListener || !a.passiveListeners) && { 20872 passive: !0, 20873 capture: !1 20874 }; 20875 h.touch ? (r.removeEventListener(t.start, this.scrollbar.onDragStart, n), r.removeEventListener(t.move, this.scrollbar.onDragMove, n), r.removeEventListener(t.end, this.scrollbar.onDragEnd, o)) : (r.removeEventListener(s.start, this.scrollbar.onDragStart, n), i.removeEventListener(s.move, this.scrollbar.onDragMove, n), i.removeEventListener(s.end, this.scrollbar.onDragEnd, o)); 20876 } 20877 }, 20878 init: function () { 20879 if (this.params.scrollbar.el) { 20880 var e = this.scrollbar, 20881 t = this.$el, 20882 i = this.params.scrollbar, 20883 s = n(i.el); 20884 this.params.uniqueNavElements && "string" == typeof i.el && s.length > 1 && 1 === t.find(i.el).length && (s = t.find(i.el)); 20885 var a = s.find("." + this.params.scrollbar.dragClass); 20886 0 === a.length && (a = n('<div class="' + this.params.scrollbar.dragClass + '"></div>'), s.append(a)), d.extend(e, { 20887 $el: s, 20888 el: s[0], 20889 $dragEl: a, 20890 dragEl: a[0] 20891 }), i.draggable && e.enableDraggable(); 20892 } 20893 }, 20894 destroy: function () { 20895 this.scrollbar.disableDraggable(); 20896 } 20897 }, 20898 de = { 20899 setTransform: function (e, t) { 20900 var i = this.rtl, 20901 s = n(e), 20902 a = i ? -1 : 1, 20903 r = s.attr("data-swiper-parallax") || "0", 20904 o = s.attr("data-swiper-parallax-x"), 20905 l = s.attr("data-swiper-parallax-y"), 20906 d = s.attr("data-swiper-parallax-scale"), 20907 h = s.attr("data-swiper-parallax-opacity"); 20908 if (o || l ? (o = o || "0", l = l || "0") : this.isHorizontal() ? (o = r, l = "0") : (l = r, o = "0"), o = o.indexOf("%") >= 0 ? parseInt(o, 10) * t * a + "%" : o * t * a + "px", l = l.indexOf("%") >= 0 ? parseInt(l, 10) * t + "%" : l * t + "px", null != h) { 20909 var p = h - (h - 1) * (1 - Math.abs(t)); 20910 s[0].style.opacity = p; 20911 } 20912 if (null == d) s.transform("translate3d(" + o + ", " + l + ", 0px)");else { 20913 var c = d - (d - 1) * (1 - Math.abs(t)); 20914 s.transform("translate3d(" + o + ", " + l + ", 0px) scale(" + c + ")"); 20915 } 20916 }, 20917 setTranslate: function () { 20918 var e = this, 20919 t = e.$el, 20920 i = e.slides, 20921 s = e.progress, 20922 a = e.snapGrid; 20923 t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) { 20924 e.parallax.setTransform(i, s); 20925 }), i.each(function (t, i) { 20926 var r = i.progress; 20927 e.params.slidesPerGroup > 1 && "auto" !== e.params.slidesPerView && (r += Math.ceil(t / 2) - s * (a.length - 1)), r = Math.min(Math.max(r, -1), 1), n(i).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) { 20928 e.parallax.setTransform(i, r); 20929 }); 20930 }); 20931 }, 20932 setTransition: function (e) { 20933 void 0 === e && (e = this.params.speed); 20934 this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) { 20935 var s = n(i), 20936 a = parseInt(s.attr("data-swiper-parallax-duration"), 10) || e; 20937 0 === e && (a = 0), s.transition(a); 20938 }); 20939 } 20940 }, 20941 he = { 20942 getDistanceBetweenTouches: function (e) { 20943 if (e.targetTouches.length < 2) return 1; 20944 var t = e.targetTouches[0].pageX, 20945 i = e.targetTouches[0].pageY, 20946 s = e.targetTouches[1].pageX, 20947 a = e.targetTouches[1].pageY; 20948 return Math.sqrt(Math.pow(s - t, 2) + Math.pow(a - i, 2)); 20949 }, 20950 onGestureStart: function (e) { 20951 var t = this.params.zoom, 20952 i = this.zoom, 20953 s = i.gesture; 20954 if (i.fakeGestureTouched = !1, i.fakeGestureMoved = !1, !h.gestures) { 20955 if ("touchstart" !== e.type || "touchstart" === e.type && e.targetTouches.length < 2) return; 20956 i.fakeGestureTouched = !0, s.scaleStart = he.getDistanceBetweenTouches(e); 20957 } 20958 s.$slideEl && s.$slideEl.length || (s.$slideEl = n(e.target).closest("." + this.params.slideClass), 0 === s.$slideEl.length && (s.$slideEl = this.slides.eq(this.activeIndex)), s.$imageEl = s.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), s.$imageWrapEl = s.$imageEl.parent("." + t.containerClass), s.maxRatio = s.$imageWrapEl.attr("data-swiper-zoom") || t.maxRatio, 0 !== s.$imageWrapEl.length) ? (s.$imageEl && s.$imageEl.transition(0), this.zoom.isScaling = !0) : s.$imageEl = void 0; 20959 }, 20960 onGestureChange: function (e) { 20961 var t = this.params.zoom, 20962 i = this.zoom, 20963 s = i.gesture; 20964 if (!h.gestures) { 20965 if ("touchmove" !== e.type || "touchmove" === e.type && e.targetTouches.length < 2) return; 20966 i.fakeGestureMoved = !0, s.scaleMove = he.getDistanceBetweenTouches(e); 20967 } 20968 s.$imageEl && 0 !== s.$imageEl.length && (i.scale = h.gestures ? e.scale * i.currentScale : s.scaleMove / s.scaleStart * i.currentScale, i.scale > s.maxRatio && (i.scale = s.maxRatio - 1 + Math.pow(i.scale - s.maxRatio + 1, .5)), i.scale < t.minRatio && (i.scale = t.minRatio + 1 - Math.pow(t.minRatio - i.scale + 1, .5)), s.$imageEl.transform("translate3d(0,0,0) scale(" + i.scale + ")")); 20969 }, 20970 onGestureEnd: function (e) { 20971 var t = this.params.zoom, 20972 i = this.zoom, 20973 s = i.gesture; 20974 if (!h.gestures) { 20975 if (!i.fakeGestureTouched || !i.fakeGestureMoved) return; 20976 if ("touchend" !== e.type || "touchend" === e.type && e.changedTouches.length < 2 && !A.android) return; 20977 i.fakeGestureTouched = !1, i.fakeGestureMoved = !1; 20978 } 20979 s.$imageEl && 0 !== s.$imageEl.length && (i.scale = Math.max(Math.min(i.scale, s.maxRatio), t.minRatio), s.$imageEl.transition(this.params.speed).transform("translate3d(0,0,0) scale(" + i.scale + ")"), i.currentScale = i.scale, i.isScaling = !1, 1 === i.scale && (s.$slideEl = void 0)); 20980 }, 20981 onTouchStart: function (e) { 20982 var t = this.zoom, 20983 i = t.gesture, 20984 s = t.image; 20985 i.$imageEl && 0 !== i.$imageEl.length && (s.isTouched || (A.android && e.cancelable && e.preventDefault(), s.isTouched = !0, s.touchesStart.x = "touchstart" === e.type ? e.targetTouches[0].pageX : e.pageX, s.touchesStart.y = "touchstart" === e.type ? e.targetTouches[0].pageY : e.pageY)); 20986 }, 20987 onTouchMove: function (e) { 20988 var t = this.zoom, 20989 i = t.gesture, 20990 s = t.image, 20991 a = t.velocity; 20992 if (i.$imageEl && 0 !== i.$imageEl.length && (this.allowClick = !1, s.isTouched && i.$slideEl)) { 20993 s.isMoved || (s.width = i.$imageEl[0].offsetWidth, s.height = i.$imageEl[0].offsetHeight, s.startX = d.getTranslate(i.$imageWrapEl[0], "x") || 0, s.startY = d.getTranslate(i.$imageWrapEl[0], "y") || 0, i.slideWidth = i.$slideEl[0].offsetWidth, i.slideHeight = i.$slideEl[0].offsetHeight, i.$imageWrapEl.transition(0), this.rtl && (s.startX = -s.startX, s.startY = -s.startY)); 20994 var r = s.width * t.scale, 20995 n = s.height * t.scale; 20996 if (!(r < i.slideWidth && n < i.slideHeight)) { 20997 if (s.minX = Math.min(i.slideWidth / 2 - r / 2, 0), s.maxX = -s.minX, s.minY = Math.min(i.slideHeight / 2 - n / 2, 0), s.maxY = -s.minY, s.touchesCurrent.x = "touchmove" === e.type ? e.targetTouches[0].pageX : e.pageX, s.touchesCurrent.y = "touchmove" === e.type ? e.targetTouches[0].pageY : e.pageY, !s.isMoved && !t.isScaling) { 20998 if (this.isHorizontal() && (Math.floor(s.minX) === Math.floor(s.startX) && s.touchesCurrent.x < s.touchesStart.x || Math.floor(s.maxX) === Math.floor(s.startX) && s.touchesCurrent.x > s.touchesStart.x)) return void (s.isTouched = !1); 20999 if (!this.isHorizontal() && (Math.floor(s.minY) === Math.floor(s.startY) && s.touchesCurrent.y < s.touchesStart.y || Math.floor(s.maxY) === Math.floor(s.startY) && s.touchesCurrent.y > s.touchesStart.y)) return void (s.isTouched = !1); 21000 } 21001 e.cancelable && e.preventDefault(), e.stopPropagation(), s.isMoved = !0, s.currentX = s.touchesCurrent.x - s.touchesStart.x + s.startX, s.currentY = s.touchesCurrent.y - s.touchesStart.y + s.startY, s.currentX < s.minX && (s.currentX = s.minX + 1 - Math.pow(s.minX - s.currentX + 1, .8)), s.currentX > s.maxX && (s.currentX = s.maxX - 1 + Math.pow(s.currentX - s.maxX + 1, .8)), s.currentY < s.minY && (s.currentY = s.minY + 1 - Math.pow(s.minY - s.currentY + 1, .8)), s.currentY > s.maxY && (s.currentY = s.maxY - 1 + Math.pow(s.currentY - s.maxY + 1, .8)), a.prevPositionX || (a.prevPositionX = s.touchesCurrent.x), a.prevPositionY || (a.prevPositionY = s.touchesCurrent.y), a.prevTime || (a.prevTime = Date.now()), a.x = (s.touchesCurrent.x - a.prevPositionX) / (Date.now() - a.prevTime) / 2, a.y = (s.touchesCurrent.y - a.prevPositionY) / (Date.now() - a.prevTime) / 2, Math.abs(s.touchesCurrent.x - a.prevPositionX) < 2 && (a.x = 0), Math.abs(s.touchesCurrent.y - a.prevPositionY) < 2 && (a.y = 0), a.prevPositionX = s.touchesCurrent.x, a.prevPositionY = s.touchesCurrent.y, a.prevTime = Date.now(), i.$imageWrapEl.transform("translate3d(" + s.currentX + "px, " + s.currentY + "px,0)"); 21002 } 21003 } 21004 }, 21005 onTouchEnd: function () { 21006 var e = this.zoom, 21007 t = e.gesture, 21008 i = e.image, 21009 s = e.velocity; 21010 if (t.$imageEl && 0 !== t.$imageEl.length) { 21011 if (!i.isTouched || !i.isMoved) return i.isTouched = !1, void (i.isMoved = !1); 21012 i.isTouched = !1, i.isMoved = !1; 21013 var a = 300, 21014 r = 300, 21015 n = s.x * a, 21016 o = i.currentX + n, 21017 l = s.y * r, 21018 d = i.currentY + l; 21019 0 !== s.x && (a = Math.abs((o - i.currentX) / s.x)), 0 !== s.y && (r = Math.abs((d - i.currentY) / s.y)); 21020 var h = Math.max(a, r); 21021 i.currentX = o, i.currentY = d; 21022 var p = i.width * e.scale, 21023 c = i.height * e.scale; 21024 i.minX = Math.min(t.slideWidth / 2 - p / 2, 0), i.maxX = -i.minX, i.minY = Math.min(t.slideHeight / 2 - c / 2, 0), i.maxY = -i.minY, i.currentX = Math.max(Math.min(i.currentX, i.maxX), i.minX), i.currentY = Math.max(Math.min(i.currentY, i.maxY), i.minY), t.$imageWrapEl.transition(h).transform("translate3d(" + i.currentX + "px, " + i.currentY + "px,0)"); 21025 } 21026 }, 21027 onTransitionEnd: function () { 21028 var e = this.zoom, 21029 t = e.gesture; 21030 t.$slideEl && this.previousIndex !== this.activeIndex && (t.$imageEl && t.$imageEl.transform("translate3d(0,0,0) scale(1)"), t.$imageWrapEl && t.$imageWrapEl.transform("translate3d(0,0,0)"), e.scale = 1, e.currentScale = 1, t.$slideEl = void 0, t.$imageEl = void 0, t.$imageWrapEl = void 0); 21031 }, 21032 toggle: function (e) { 21033 var t = this.zoom; 21034 t.scale && 1 !== t.scale ? t.out() : t.in(e); 21035 }, 21036 in: function (e) { 21037 var t, 21038 i, 21039 s, 21040 a, 21041 r, 21042 n, 21043 o, 21044 l, 21045 d, 21046 h, 21047 p, 21048 c, 21049 u, 21050 v, 21051 f, 21052 m, 21053 g = this.zoom, 21054 b = this.params.zoom, 21055 w = g.gesture, 21056 y = g.image; 21057 (w.$slideEl || (this.params.virtual && this.params.virtual.enabled && this.virtual ? w.$slideEl = this.$wrapperEl.children("." + this.params.slideActiveClass) : w.$slideEl = this.slides.eq(this.activeIndex), w.$imageEl = w.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), w.$imageWrapEl = w.$imageEl.parent("." + b.containerClass)), w.$imageEl && 0 !== w.$imageEl.length) && (w.$slideEl.addClass("" + b.zoomedSlideClass), void 0 === y.touchesStart.x && e ? (t = "touchend" === e.type ? e.changedTouches[0].pageX : e.pageX, i = "touchend" === e.type ? e.changedTouches[0].pageY : e.pageY) : (t = y.touchesStart.x, i = y.touchesStart.y), g.scale = w.$imageWrapEl.attr("data-swiper-zoom") || b.maxRatio, g.currentScale = w.$imageWrapEl.attr("data-swiper-zoom") || b.maxRatio, e ? (f = w.$slideEl[0].offsetWidth, m = w.$slideEl[0].offsetHeight, s = w.$slideEl.offset().left + f / 2 - t, a = w.$slideEl.offset().top + m / 2 - i, o = w.$imageEl[0].offsetWidth, l = w.$imageEl[0].offsetHeight, d = o * g.scale, h = l * g.scale, u = -(p = Math.min(f / 2 - d / 2, 0)), v = -(c = Math.min(m / 2 - h / 2, 0)), (r = s * g.scale) < p && (r = p), r > u && (r = u), (n = a * g.scale) < c && (n = c), n > v && (n = v)) : (r = 0, n = 0), w.$imageWrapEl.transition(300).transform("translate3d(" + r + "px, " + n + "px,0)"), w.$imageEl.transition(300).transform("translate3d(0,0,0) scale(" + g.scale + ")")); 21058 }, 21059 out: function () { 21060 var e = this.zoom, 21061 t = this.params.zoom, 21062 i = e.gesture; 21063 i.$slideEl || (this.params.virtual && this.params.virtual.enabled && this.virtual ? i.$slideEl = this.$wrapperEl.children("." + this.params.slideActiveClass) : i.$slideEl = this.slides.eq(this.activeIndex), i.$imageEl = i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), i.$imageWrapEl = i.$imageEl.parent("." + t.containerClass)), i.$imageEl && 0 !== i.$imageEl.length && (e.scale = 1, e.currentScale = 1, i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"), i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"), i.$slideEl.removeClass("" + t.zoomedSlideClass), i.$slideEl = void 0); 21064 }, 21065 enable: function () { 21066 var e = this.zoom; 21067 if (!e.enabled) { 21068 e.enabled = !0; 21069 var t = !("touchstart" !== this.touchEvents.start || !h.passiveListener || !this.params.passiveListeners) && { 21070 passive: !0, 21071 capture: !1 21072 }, 21073 i = !h.passiveListener || { 21074 passive: !1, 21075 capture: !0 21076 }, 21077 s = "." + this.params.slideClass; 21078 h.gestures ? (this.$wrapperEl.on("gesturestart", s, e.onGestureStart, t), this.$wrapperEl.on("gesturechange", s, e.onGestureChange, t), this.$wrapperEl.on("gestureend", s, e.onGestureEnd, t)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.on(this.touchEvents.start, s, e.onGestureStart, t), this.$wrapperEl.on(this.touchEvents.move, s, e.onGestureChange, i), this.$wrapperEl.on(this.touchEvents.end, s, e.onGestureEnd, t), this.touchEvents.cancel && this.$wrapperEl.on(this.touchEvents.cancel, s, e.onGestureEnd, t)), this.$wrapperEl.on(this.touchEvents.move, "." + this.params.zoom.containerClass, e.onTouchMove, i); 21079 } 21080 }, 21081 disable: function () { 21082 var e = this.zoom; 21083 if (e.enabled) { 21084 this.zoom.enabled = !1; 21085 var t = !("touchstart" !== this.touchEvents.start || !h.passiveListener || !this.params.passiveListeners) && { 21086 passive: !0, 21087 capture: !1 21088 }, 21089 i = !h.passiveListener || { 21090 passive: !1, 21091 capture: !0 21092 }, 21093 s = "." + this.params.slideClass; 21094 h.gestures ? (this.$wrapperEl.off("gesturestart", s, e.onGestureStart, t), this.$wrapperEl.off("gesturechange", s, e.onGestureChange, t), this.$wrapperEl.off("gestureend", s, e.onGestureEnd, t)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.off(this.touchEvents.start, s, e.onGestureStart, t), this.$wrapperEl.off(this.touchEvents.move, s, e.onGestureChange, i), this.$wrapperEl.off(this.touchEvents.end, s, e.onGestureEnd, t), this.touchEvents.cancel && this.$wrapperEl.off(this.touchEvents.cancel, s, e.onGestureEnd, t)), this.$wrapperEl.off(this.touchEvents.move, "." + this.params.zoom.containerClass, e.onTouchMove, i); 21095 } 21096 } 21097 }, 21098 pe = { 21099 loadInSlide: function (e, t) { 21100 void 0 === t && (t = !0); 21101 var i = this, 21102 s = i.params.lazy; 21103 if (void 0 !== e && 0 !== i.slides.length) { 21104 var a = i.virtual && i.params.virtual.enabled ? i.$wrapperEl.children("." + i.params.slideClass + '[data-swiper-slide-index="' + e + '"]') : i.slides.eq(e), 21105 r = a.find("." + s.elementClass + ":not(." + s.loadedClass + "):not(." + s.loadingClass + ")"); 21106 !a.hasClass(s.elementClass) || a.hasClass(s.loadedClass) || a.hasClass(s.loadingClass) || (r = r.add(a[0])), 0 !== r.length && r.each(function (e, r) { 21107 var o = n(r); 21108 o.addClass(s.loadingClass); 21109 var l = o.attr("data-background"), 21110 d = o.attr("data-src"), 21111 h = o.attr("data-srcset"), 21112 p = o.attr("data-sizes"), 21113 c = o.parent("picture"); 21114 i.loadImage(o[0], d || l, h, p, !1, function () { 21115 if (null != i && i && (!i || i.params) && !i.destroyed) { 21116 if (l ? (o.css("background-image", 'url("' + l + '")'), o.removeAttr("data-background")) : (h && (o.attr("srcset", h), o.removeAttr("data-srcset")), p && (o.attr("sizes", p), o.removeAttr("data-sizes")), c.length && c.children("source").each(function (e, t) { 21117 var i = n(t); 21118 i.attr("data-srcset") && (i.attr("srcset", i.attr("data-srcset")), i.removeAttr("data-srcset")); 21119 }), d && (o.attr("src", d), o.removeAttr("data-src"))), o.addClass(s.loadedClass).removeClass(s.loadingClass), a.find("." + s.preloaderClass).remove(), i.params.loop && t) { 21120 var e = a.attr("data-swiper-slide-index"); 21121 if (a.hasClass(i.params.slideDuplicateClass)) { 21122 var r = i.$wrapperEl.children('[data-swiper-slide-index="' + e + '"]:not(.' + i.params.slideDuplicateClass + ")"); 21123 i.lazy.loadInSlide(r.index(), !1); 21124 } else { 21125 var u = i.$wrapperEl.children("." + i.params.slideDuplicateClass + '[data-swiper-slide-index="' + e + '"]'); 21126 i.lazy.loadInSlide(u.index(), !1); 21127 } 21128 } 21129 i.emit("lazyImageReady", a[0], o[0]), i.params.autoHeight && i.updateAutoHeight(); 21130 } 21131 }), i.emit("lazyImageLoad", a[0], o[0]); 21132 }); 21133 } 21134 }, 21135 load: function () { 21136 var e = this, 21137 t = e.$wrapperEl, 21138 i = e.params, 21139 s = e.slides, 21140 a = e.activeIndex, 21141 r = e.virtual && i.virtual.enabled, 21142 o = i.lazy, 21143 l = i.slidesPerView; 21144 function d(e) { 21145 if (r) { 21146 if (t.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]').length) return !0; 21147 } else if (s[e]) return !0; 21148 return !1; 21149 } 21150 function h(e) { 21151 return r ? n(e).attr("data-swiper-slide-index") : n(e).index(); 21152 } 21153 if ("auto" === l && (l = 0), e.lazy.initialImageLoaded || (e.lazy.initialImageLoaded = !0), e.params.watchSlidesVisibility) t.children("." + i.slideVisibleClass).each(function (t, i) { 21154 var s = r ? n(i).attr("data-swiper-slide-index") : n(i).index(); 21155 e.lazy.loadInSlide(s); 21156 });else if (l > 1) for (var p = a; p < a + l; p += 1) d(p) && e.lazy.loadInSlide(p);else e.lazy.loadInSlide(a); 21157 if (o.loadPrevNext) if (l > 1 || o.loadPrevNextAmount && o.loadPrevNextAmount > 1) { 21158 for (var c = o.loadPrevNextAmount, u = l, v = Math.min(a + u + Math.max(c, u), s.length), f = Math.max(a - Math.max(u, c), 0), m = a + l; m < v; m += 1) d(m) && e.lazy.loadInSlide(m); 21159 for (var g = f; g < a; g += 1) d(g) && e.lazy.loadInSlide(g); 21160 } else { 21161 var b = t.children("." + i.slideNextClass); 21162 b.length > 0 && e.lazy.loadInSlide(h(b)); 21163 var w = t.children("." + i.slidePrevClass); 21164 w.length > 0 && e.lazy.loadInSlide(h(w)); 21165 } 21166 } 21167 }, 21168 ce = { 21169 LinearSpline: function (e, t) { 21170 var i, 21171 s, 21172 a, 21173 r, 21174 n, 21175 o = function (e, t) { 21176 for (s = -1, i = e.length; i - s > 1;) e[a = i + s >> 1] <= t ? s = a : i = a; 21177 return i; 21178 }; 21179 return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) { 21180 return e ? (n = o(this.x, e), r = n - 1, (e - this.x[r]) * (this.y[n] - this.y[r]) / (this.x[n] - this.x[r]) + this.y[r]) : 0; 21181 }, this; 21182 }, 21183 getInterpolateFunction: function (e) { 21184 this.controller.spline || (this.controller.spline = this.params.loop ? new ce.LinearSpline(this.slidesGrid, e.slidesGrid) : new ce.LinearSpline(this.snapGrid, e.snapGrid)); 21185 }, 21186 setTranslate: function (e, t) { 21187 var i, 21188 s, 21189 a = this, 21190 r = a.controller.control; 21191 function n(e) { 21192 var t = a.rtlTranslate ? -a.translate : a.translate; 21193 "slide" === a.params.controller.by && (a.controller.getInterpolateFunction(e), s = -a.controller.spline.interpolate(-t)), s && "container" !== a.params.controller.by || (i = (e.maxTranslate() - e.minTranslate()) / (a.maxTranslate() - a.minTranslate()), s = (t - a.minTranslate()) * i + e.minTranslate()), a.params.controller.inverse && (s = e.maxTranslate() - s), e.updateProgress(s), e.setTranslate(s, a), e.updateActiveIndex(), e.updateSlidesClasses(); 21194 } 21195 if (Array.isArray(r)) for (var o = 0; o < r.length; o += 1) r[o] !== t && r[o] instanceof j && n(r[o]);else r instanceof j && t !== r && n(r); 21196 }, 21197 setTransition: function (e, t) { 21198 var i, 21199 s = this, 21200 a = s.controller.control; 21201 function r(t) { 21202 t.setTransition(e, s), 0 !== e && (t.transitionStart(), t.params.autoHeight && d.nextTick(function () { 21203 t.updateAutoHeight(); 21204 }), t.$wrapperEl.transitionEnd(function () { 21205 a && (t.params.loop && "slide" === s.params.controller.by && t.loopFix(), t.transitionEnd()); 21206 })); 21207 } 21208 if (Array.isArray(a)) for (i = 0; i < a.length; i += 1) a[i] !== t && a[i] instanceof j && r(a[i]);else a instanceof j && t !== a && r(a); 21209 } 21210 }, 21211 ue = { 21212 makeElFocusable: function (e) { 21213 return e.attr("tabIndex", "0"), e; 21214 }, 21215 makeElNotFocusable: function (e) { 21216 return e.attr("tabIndex", "-1"), e; 21217 }, 21218 addElRole: function (e, t) { 21219 return e.attr("role", t), e; 21220 }, 21221 addElLabel: function (e, t) { 21222 return e.attr("aria-label", t), e; 21223 }, 21224 disableEl: function (e) { 21225 return e.attr("aria-disabled", !0), e; 21226 }, 21227 enableEl: function (e) { 21228 return e.attr("aria-disabled", !1), e; 21229 }, 21230 onEnterKey: function (e) { 21231 var t = this.params.a11y; 21232 if (13 === e.keyCode) { 21233 var i = n(e.target); 21234 this.navigation && this.navigation.$nextEl && i.is(this.navigation.$nextEl) && (this.isEnd && !this.params.loop || this.slideNext(), this.isEnd ? this.a11y.notify(t.lastSlideMessage) : this.a11y.notify(t.nextSlideMessage)), this.navigation && this.navigation.$prevEl && i.is(this.navigation.$prevEl) && (this.isBeginning && !this.params.loop || this.slidePrev(), this.isBeginning ? this.a11y.notify(t.firstSlideMessage) : this.a11y.notify(t.prevSlideMessage)), this.pagination && i.is("." + this.params.pagination.bulletClass) && i[0].click(); 21235 } 21236 }, 21237 notify: function (e) { 21238 var t = this.a11y.liveRegion; 21239 0 !== t.length && (t.html(""), t.html(e)); 21240 }, 21241 updateNavigation: function () { 21242 if (!this.params.loop && this.navigation) { 21243 var e = this.navigation, 21244 t = e.$nextEl, 21245 i = e.$prevEl; 21246 i && i.length > 0 && (this.isBeginning ? (this.a11y.disableEl(i), this.a11y.makeElNotFocusable(i)) : (this.a11y.enableEl(i), this.a11y.makeElFocusable(i))), t && t.length > 0 && (this.isEnd ? (this.a11y.disableEl(t), this.a11y.makeElNotFocusable(t)) : (this.a11y.enableEl(t), this.a11y.makeElFocusable(t))); 21247 } 21248 }, 21249 updatePagination: function () { 21250 var e = this, 21251 t = e.params.a11y; 21252 e.pagination && e.params.pagination.clickable && e.pagination.bullets && e.pagination.bullets.length && e.pagination.bullets.each(function (i, s) { 21253 var a = n(s); 21254 e.a11y.makeElFocusable(a), e.a11y.addElRole(a, "button"), e.a11y.addElLabel(a, t.paginationBulletMessage.replace(/\{\{index\}\}/, a.index() + 1)); 21255 }); 21256 }, 21257 init: function () { 21258 this.$el.append(this.a11y.liveRegion); 21259 var e, 21260 t, 21261 i = this.params.a11y; 21262 this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && (this.a11y.makeElFocusable(e), this.a11y.addElRole(e, "button"), this.a11y.addElLabel(e, i.nextSlideMessage), e.on("keydown", this.a11y.onEnterKey)), t && (this.a11y.makeElFocusable(t), this.a11y.addElRole(t, "button"), this.a11y.addElLabel(t, i.prevSlideMessage), t.on("keydown", this.a11y.onEnterKey)), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.on("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey); 21263 }, 21264 destroy: function () { 21265 var e, t; 21266 this.a11y.liveRegion && this.a11y.liveRegion.length > 0 && this.a11y.liveRegion.remove(), this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && e.off("keydown", this.a11y.onEnterKey), t && t.off("keydown", this.a11y.onEnterKey), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.off("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey); 21267 } 21268 }, 21269 ve = { 21270 init: function () { 21271 if (this.params.history) { 21272 if (!a.history || !a.history.pushState) return this.params.history.enabled = !1, void (this.params.hashNavigation.enabled = !0); 21273 var e = this.history; 21274 e.initialized = !0, e.paths = ve.getPathValues(), (e.paths.key || e.paths.value) && (e.scrollToSlide(0, e.paths.value, this.params.runCallbacksOnInit), this.params.history.replaceState || a.addEventListener("popstate", this.history.setHistoryPopState)); 21275 } 21276 }, 21277 destroy: function () { 21278 this.params.history.replaceState || a.removeEventListener("popstate", this.history.setHistoryPopState); 21279 }, 21280 setHistoryPopState: function () { 21281 this.history.paths = ve.getPathValues(), this.history.scrollToSlide(this.params.speed, this.history.paths.value, !1); 21282 }, 21283 getPathValues: function () { 21284 var e = a.location.pathname.slice(1).split("/").filter(function (e) { 21285 return "" !== e; 21286 }), 21287 t = e.length; 21288 return { 21289 key: e[t - 2], 21290 value: e[t - 1] 21291 }; 21292 }, 21293 setHistory: function (e, t) { 21294 if (this.history.initialized && this.params.history.enabled) { 21295 var i = this.slides.eq(t), 21296 s = ve.slugify(i.attr("data-history")); 21297 a.location.pathname.includes(e) || (s = e + "/" + s); 21298 var r = a.history.state; 21299 r && r.value === s || (this.params.history.replaceState ? a.history.replaceState({ 21300 value: s 21301 }, null, s) : a.history.pushState({ 21302 value: s 21303 }, null, s)); 21304 } 21305 }, 21306 slugify: function (e) { 21307 return e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, ""); 21308 }, 21309 scrollToSlide: function (e, t, i) { 21310 if (t) for (var s = 0, a = this.slides.length; s < a; s += 1) { 21311 var r = this.slides.eq(s); 21312 if (ve.slugify(r.attr("data-history")) === t && !r.hasClass(this.params.slideDuplicateClass)) { 21313 var n = r.index(); 21314 this.slideTo(n, e, i); 21315 } 21316 } else this.slideTo(0, e, i); 21317 } 21318 }, 21319 fe = { 21320 onHashCange: function () { 21321 this.emit("hashChange"); 21322 var e = i.location.hash.replace("#", ""); 21323 if (e !== this.slides.eq(this.activeIndex).attr("data-hash")) { 21324 var t = this.$wrapperEl.children("." + this.params.slideClass + '[data-hash="' + e + '"]').index(); 21325 if (void 0 === t) return; 21326 this.slideTo(t); 21327 } 21328 }, 21329 setHash: function () { 21330 if (this.hashNavigation.initialized && this.params.hashNavigation.enabled) if (this.params.hashNavigation.replaceState && a.history && a.history.replaceState) a.history.replaceState(null, null, "#" + this.slides.eq(this.activeIndex).attr("data-hash") || false), this.emit("hashSet");else { 21331 var e = this.slides.eq(this.activeIndex), 21332 t = e.attr("data-hash") || e.attr("data-history"); 21333 i.location.hash = t || "", this.emit("hashSet"); 21334 } 21335 }, 21336 init: function () { 21337 if (!(!this.params.hashNavigation.enabled || this.params.history && this.params.history.enabled)) { 21338 this.hashNavigation.initialized = !0; 21339 var e = i.location.hash.replace("#", ""); 21340 if (e) for (var t = 0, s = this.slides.length; t < s; t += 1) { 21341 var r = this.slides.eq(t); 21342 if ((r.attr("data-hash") || r.attr("data-history")) === e && !r.hasClass(this.params.slideDuplicateClass)) { 21343 var o = r.index(); 21344 this.slideTo(o, 0, this.params.runCallbacksOnInit, !0); 21345 } 21346 } 21347 this.params.hashNavigation.watchState && n(a).on("hashchange", this.hashNavigation.onHashCange); 21348 } 21349 }, 21350 destroy: function () { 21351 this.params.hashNavigation.watchState && n(a).off("hashchange", this.hashNavigation.onHashCange); 21352 } 21353 }, 21354 me = { 21355 run: function () { 21356 var e = this, 21357 t = e.slides.eq(e.activeIndex), 21358 i = e.params.autoplay.delay; 21359 t.attr("data-swiper-autoplay") && (i = t.attr("data-swiper-autoplay") || e.params.autoplay.delay), clearTimeout(e.autoplay.timeout), e.autoplay.timeout = d.nextTick(function () { 21360 e.params.autoplay.reverseDirection ? e.params.loop ? (e.loopFix(), e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.isBeginning ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(e.slides.length - 1, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.params.loop ? (e.loopFix(), e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")) : e.isEnd ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(0, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")), e.params.cssMode && e.autoplay.running && e.autoplay.run(); 21361 }, i); 21362 }, 21363 start: function () { 21364 return void 0 === this.autoplay.timeout && !this.autoplay.running && (this.autoplay.running = !0, this.emit("autoplayStart"), this.autoplay.run(), !0); 21365 }, 21366 stop: function () { 21367 return !!this.autoplay.running && void 0 !== this.autoplay.timeout && (this.autoplay.timeout && (clearTimeout(this.autoplay.timeout), this.autoplay.timeout = void 0), this.autoplay.running = !1, this.emit("autoplayStop"), !0); 21368 }, 21369 pause: function (e) { 21370 this.autoplay.running && (this.autoplay.paused || (this.autoplay.timeout && clearTimeout(this.autoplay.timeout), this.autoplay.paused = !0, 0 !== e && this.params.autoplay.waitForTransition ? (this.$wrapperEl[0].addEventListener("transitionend", this.autoplay.onTransitionEnd), this.$wrapperEl[0].addEventListener("webkitTransitionEnd", this.autoplay.onTransitionEnd)) : (this.autoplay.paused = !1, this.autoplay.run()))); 21371 } 21372 }, 21373 ge = { 21374 setTranslate: function () { 21375 for (var e = this.slides, t = 0; t < e.length; t += 1) { 21376 var i = this.slides.eq(t), 21377 s = -i[0].swiperSlideOffset; 21378 this.params.virtualTranslate || (s -= this.translate); 21379 var a = 0; 21380 this.isHorizontal() || (a = s, s = 0); 21381 var r = this.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(i[0].progress), 0) : 1 + Math.min(Math.max(i[0].progress, -1), 0); 21382 i.css({ 21383 opacity: r 21384 }).transform("translate3d(" + s + "px, " + a + "px, 0px)"); 21385 } 21386 }, 21387 setTransition: function (e) { 21388 var t = this, 21389 i = t.slides, 21390 s = t.$wrapperEl; 21391 if (i.transition(e), t.params.virtualTranslate && 0 !== e) { 21392 var a = !1; 21393 i.transitionEnd(function () { 21394 if (!a && t && !t.destroyed) { 21395 a = !0, t.animating = !1; 21396 for (var e = ["webkitTransitionEnd", "transitionend"], i = 0; i < e.length; i += 1) s.trigger(e[i]); 21397 } 21398 }); 21399 } 21400 } 21401 }, 21402 be = { 21403 setTranslate: function () { 21404 var e, 21405 t = this.$el, 21406 i = this.$wrapperEl, 21407 s = this.slides, 21408 a = this.width, 21409 r = this.height, 21410 o = this.rtlTranslate, 21411 l = this.size, 21412 d = this.params.cubeEffect, 21413 h = this.isHorizontal(), 21414 p = this.virtual && this.params.virtual.enabled, 21415 c = 0; 21416 d.shadow && (h ? (0 === (e = i.find(".swiper-cube-shadow")).length && (e = n('<div class="swiper-cube-shadow"></div>'), i.append(e)), e.css({ 21417 height: a + "px" 21418 })) : 0 === (e = t.find(".swiper-cube-shadow")).length && (e = n('<div class="swiper-cube-shadow"></div>'), t.append(e))); 21419 for (var u = 0; u < s.length; u += 1) { 21420 var v = s.eq(u), 21421 f = u; 21422 p && (f = parseInt(v.attr("data-swiper-slide-index"), 10)); 21423 var m = 90 * f, 21424 g = Math.floor(m / 360); 21425 o && (m = -m, g = Math.floor(-m / 360)); 21426 var b = Math.max(Math.min(v[0].progress, 1), -1), 21427 w = 0, 21428 y = 0, 21429 x = 0; 21430 f % 4 == 0 ? (w = 4 * -g * l, x = 0) : (f - 1) % 4 == 0 ? (w = 0, x = 4 * -g * l) : (f - 2) % 4 == 0 ? (w = l + 4 * g * l, x = l) : (f - 3) % 4 == 0 && (w = -l, x = 3 * l + 4 * l * g), o && (w = -w), h || (y = w, w = 0); 21431 var E = "rotateX(" + (h ? 0 : -m) + "deg) rotateY(" + (h ? m : 0) + "deg) translate3d(" + w + "px, " + y + "px, " + x + "px)"; 21432 if (b <= 1 && b > -1 && (c = 90 * f + 90 * b, o && (c = 90 * -f - 90 * b)), v.transform(E), d.slideShadows) { 21433 var T = h ? v.find(".swiper-slide-shadow-left") : v.find(".swiper-slide-shadow-top"), 21434 S = h ? v.find(".swiper-slide-shadow-right") : v.find(".swiper-slide-shadow-bottom"); 21435 0 === T.length && (T = n('<div class="swiper-slide-shadow-' + (h ? "left" : "top") + '"></div>'), v.append(T)), 0 === S.length && (S = n('<div class="swiper-slide-shadow-' + (h ? "right" : "bottom") + '"></div>'), v.append(S)), T.length && (T[0].style.opacity = Math.max(-b, 0)), S.length && (S[0].style.opacity = Math.max(b, 0)); 21436 } 21437 } 21438 if (i.css({ 21439 "-webkit-transform-origin": "50% 50% -" + l / 2 + "px", 21440 "-moz-transform-origin": "50% 50% -" + l / 2 + "px", 21441 "-ms-transform-origin": "50% 50% -" + l / 2 + "px", 21442 "transform-origin": "50% 50% -" + l / 2 + "px" 21443 }), d.shadow) if (h) e.transform("translate3d(0px, " + (a / 2 + d.shadowOffset) + "px, " + -a / 2 + "px) rotateX(90deg) rotateZ(0deg) scale(" + d.shadowScale + ")");else { 21444 var C = Math.abs(c) - 90 * Math.floor(Math.abs(c) / 90), 21445 M = 1.5 - (Math.sin(2 * C * Math.PI / 360) / 2 + Math.cos(2 * C * Math.PI / 360) / 2), 21446 P = d.shadowScale, 21447 z = d.shadowScale / M, 21448 k = d.shadowOffset; 21449 e.transform("scale3d(" + P + ", 1, " + z + ") translate3d(0px, " + (r / 2 + k) + "px, " + -r / 2 / z + "px) rotateX(-90deg)"); 21450 } 21451 var $ = _.isSafari || _.isWebView ? -l / 2 : 0; 21452 i.transform("translate3d(0px,0," + $ + "px) rotateX(" + (this.isHorizontal() ? 0 : c) + "deg) rotateY(" + (this.isHorizontal() ? -c : 0) + "deg)"); 21453 }, 21454 setTransition: function (e) { 21455 var t = this.$el; 21456 this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), this.params.cubeEffect.shadow && !this.isHorizontal() && t.find(".swiper-cube-shadow").transition(e); 21457 } 21458 }, 21459 we = { 21460 setTranslate: function () { 21461 for (var e = this.slides, t = this.rtlTranslate, i = 0; i < e.length; i += 1) { 21462 var s = e.eq(i), 21463 a = s[0].progress; 21464 this.params.flipEffect.limitRotation && (a = Math.max(Math.min(s[0].progress, 1), -1)); 21465 var r = -180 * a, 21466 o = 0, 21467 l = -s[0].swiperSlideOffset, 21468 d = 0; 21469 if (this.isHorizontal() ? t && (r = -r) : (d = l, l = 0, o = -r, r = 0), s[0].style.zIndex = -Math.abs(Math.round(a)) + e.length, this.params.flipEffect.slideShadows) { 21470 var h = this.isHorizontal() ? s.find(".swiper-slide-shadow-left") : s.find(".swiper-slide-shadow-top"), 21471 p = this.isHorizontal() ? s.find(".swiper-slide-shadow-right") : s.find(".swiper-slide-shadow-bottom"); 21472 0 === h.length && (h = n('<div class="swiper-slide-shadow-' + (this.isHorizontal() ? "left" : "top") + '"></div>'), s.append(h)), 0 === p.length && (p = n('<div class="swiper-slide-shadow-' + (this.isHorizontal() ? "right" : "bottom") + '"></div>'), s.append(p)), h.length && (h[0].style.opacity = Math.max(-a, 0)), p.length && (p[0].style.opacity = Math.max(a, 0)); 21473 } 21474 s.transform("translate3d(" + l + "px, " + d + "px, 0px) rotateX(" + o + "deg) rotateY(" + r + "deg)"); 21475 } 21476 }, 21477 setTransition: function (e) { 21478 var t = this, 21479 i = t.slides, 21480 s = t.activeIndex, 21481 a = t.$wrapperEl; 21482 if (i.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), t.params.virtualTranslate && 0 !== e) { 21483 var r = !1; 21484 i.eq(s).transitionEnd(function () { 21485 if (!r && t && !t.destroyed) { 21486 r = !0, t.animating = !1; 21487 for (var e = ["webkitTransitionEnd", "transitionend"], i = 0; i < e.length; i += 1) a.trigger(e[i]); 21488 } 21489 }); 21490 } 21491 } 21492 }, 21493 ye = { 21494 setTranslate: function () { 21495 for (var e = this.width, t = this.height, i = this.slides, s = this.$wrapperEl, a = this.slidesSizesGrid, r = this.params.coverflowEffect, o = this.isHorizontal(), l = this.translate, d = o ? e / 2 - l : t / 2 - l, p = o ? r.rotate : -r.rotate, c = r.depth, u = 0, v = i.length; u < v; u += 1) { 21496 var f = i.eq(u), 21497 m = a[u], 21498 g = (d - f[0].swiperSlideOffset - m / 2) / m * r.modifier, 21499 b = o ? p * g : 0, 21500 w = o ? 0 : p * g, 21501 y = -c * Math.abs(g), 21502 x = r.stretch; 21503 "string" == typeof x && -1 !== x.indexOf("%") && (x = parseFloat(r.stretch) / 100 * m); 21504 var E = o ? 0 : x * g, 21505 T = o ? x * g : 0, 21506 S = 1 - (1 - r.scale) * Math.abs(g); 21507 Math.abs(T) < .001 && (T = 0), Math.abs(E) < .001 && (E = 0), Math.abs(y) < .001 && (y = 0), Math.abs(b) < .001 && (b = 0), Math.abs(w) < .001 && (w = 0), Math.abs(S) < .001 && (S = 0); 21508 var C = "translate3d(" + T + "px," + E + "px," + y + "px) rotateX(" + w + "deg) rotateY(" + b + "deg) scale(" + S + ")"; 21509 if (f.transform(C), f[0].style.zIndex = 1 - Math.abs(Math.round(g)), r.slideShadows) { 21510 var M = o ? f.find(".swiper-slide-shadow-left") : f.find(".swiper-slide-shadow-top"), 21511 P = o ? f.find(".swiper-slide-shadow-right") : f.find(".swiper-slide-shadow-bottom"); 21512 0 === M.length && (M = n('<div class="swiper-slide-shadow-' + (o ? "left" : "top") + '"></div>'), f.append(M)), 0 === P.length && (P = n('<div class="swiper-slide-shadow-' + (o ? "right" : "bottom") + '"></div>'), f.append(P)), M.length && (M[0].style.opacity = g > 0 ? g : 0), P.length && (P[0].style.opacity = -g > 0 ? -g : 0); 21513 } 21514 } 21515 (h.pointerEvents || h.prefixedPointerEvents) && (s[0].style.perspectiveOrigin = d + "px 50%"); 21516 }, 21517 setTransition: function (e) { 21518 this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e); 21519 } 21520 }, 21521 xe = { 21522 init: function () { 21523 var e = this.params.thumbs, 21524 t = this.constructor; 21525 e.swiper instanceof t ? (this.thumbs.swiper = e.swiper, d.extend(this.thumbs.swiper.originalParams, { 21526 watchSlidesProgress: !0, 21527 slideToClickedSlide: !1 21528 }), d.extend(this.thumbs.swiper.params, { 21529 watchSlidesProgress: !0, 21530 slideToClickedSlide: !1 21531 })) : d.isObject(e.swiper) && (this.thumbs.swiper = new t(d.extend({}, e.swiper, { 21532 watchSlidesVisibility: !0, 21533 watchSlidesProgress: !0, 21534 slideToClickedSlide: !1 21535 })), this.thumbs.swiperCreated = !0), this.thumbs.swiper.$el.addClass(this.params.thumbs.thumbsContainerClass), this.thumbs.swiper.on("tap", this.thumbs.onThumbClick); 21536 }, 21537 onThumbClick: function () { 21538 var e = this.thumbs.swiper; 21539 if (e) { 21540 var t = e.clickedIndex, 21541 i = e.clickedSlide; 21542 if (!(i && n(i).hasClass(this.params.thumbs.slideThumbActiveClass) || null == t)) { 21543 var s; 21544 if (s = e.params.loop ? parseInt(n(e.clickedSlide).attr("data-swiper-slide-index"), 10) : t, this.params.loop) { 21545 var a = this.activeIndex; 21546 this.slides.eq(a).hasClass(this.params.slideDuplicateClass) && (this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft, a = this.activeIndex); 21547 var r = this.slides.eq(a).prevAll('[data-swiper-slide-index="' + s + '"]').eq(0).index(), 21548 o = this.slides.eq(a).nextAll('[data-swiper-slide-index="' + s + '"]').eq(0).index(); 21549 s = void 0 === r ? o : void 0 === o ? r : o - a < a - r ? o : r; 21550 } 21551 this.slideTo(s); 21552 } 21553 } 21554 }, 21555 update: function (e) { 21556 var t = this.thumbs.swiper; 21557 if (t) { 21558 var i = "auto" === t.params.slidesPerView ? t.slidesPerViewDynamic() : t.params.slidesPerView, 21559 s = this.params.thumbs.autoScrollOffset, 21560 a = s && !t.params.loop; 21561 if (this.realIndex !== t.realIndex || a) { 21562 var r, 21563 n, 21564 o = t.activeIndex; 21565 if (t.params.loop) { 21566 t.slides.eq(o).hasClass(t.params.slideDuplicateClass) && (t.loopFix(), t._clientLeft = t.$wrapperEl[0].clientLeft, o = t.activeIndex); 21567 var l = t.slides.eq(o).prevAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index(), 21568 d = t.slides.eq(o).nextAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index(); 21569 r = void 0 === l ? d : void 0 === d ? l : d - o == o - l ? o : d - o < o - l ? d : l, n = this.activeIndex > this.previousIndex ? "next" : "prev"; 21570 } else n = (r = this.realIndex) > this.previousIndex ? "next" : "prev"; 21571 a && (r += "next" === n ? s : -1 * s), t.visibleSlidesIndexes && t.visibleSlidesIndexes.indexOf(r) < 0 && (t.params.centeredSlides ? r = r > o ? r - Math.floor(i / 2) + 1 : r + Math.floor(i / 2) - 1 : r > o && (r = r - i + 1), t.slideTo(r, e ? 0 : void 0)); 21572 } 21573 var h = 1, 21574 p = this.params.thumbs.slideThumbActiveClass; 21575 if (this.params.slidesPerView > 1 && !this.params.centeredSlides && (h = this.params.slidesPerView), this.params.thumbs.multipleActiveThumbs || (h = 1), h = Math.floor(h), t.slides.removeClass(p), t.params.loop || t.params.virtual && t.params.virtual.enabled) for (var c = 0; c < h; c += 1) t.$wrapperEl.children('[data-swiper-slide-index="' + (this.realIndex + c) + '"]').addClass(p);else for (var u = 0; u < h; u += 1) t.slides.eq(this.realIndex + u).addClass(p); 21576 } 21577 } 21578 }, 21579 Ee = [K, U, Z, Q, ee, ie, ae, { 21580 name: "mousewheel", 21581 params: { 21582 mousewheel: { 21583 enabled: !1, 21584 releaseOnEdges: !1, 21585 invert: !1, 21586 forceToAxis: !1, 21587 sensitivity: 1, 21588 eventsTarged: "container" 21589 } 21590 }, 21591 create: function () { 21592 d.extend(this, { 21593 mousewheel: { 21594 enabled: !1, 21595 enable: re.enable.bind(this), 21596 disable: re.disable.bind(this), 21597 handle: re.handle.bind(this), 21598 handleMouseEnter: re.handleMouseEnter.bind(this), 21599 handleMouseLeave: re.handleMouseLeave.bind(this), 21600 animateSlider: re.animateSlider.bind(this), 21601 releaseScroll: re.releaseScroll.bind(this), 21602 lastScrollTime: d.now(), 21603 lastEventBeforeSnap: void 0, 21604 recentWheelEvents: [] 21605 } 21606 }); 21607 }, 21608 on: { 21609 init: function () { 21610 !this.params.mousewheel.enabled && this.params.cssMode && this.mousewheel.disable(), this.params.mousewheel.enabled && this.mousewheel.enable(); 21611 }, 21612 destroy: function () { 21613 this.params.cssMode && this.mousewheel.enable(), this.mousewheel.enabled && this.mousewheel.disable(); 21614 } 21615 } 21616 }, { 21617 name: "navigation", 21618 params: { 21619 navigation: { 21620 nextEl: null, 21621 prevEl: null, 21622 hideOnClick: !1, 21623 disabledClass: "swiper-button-disabled", 21624 hiddenClass: "swiper-button-hidden", 21625 lockClass: "swiper-button-lock" 21626 } 21627 }, 21628 create: function () { 21629 d.extend(this, { 21630 navigation: { 21631 init: ne.init.bind(this), 21632 update: ne.update.bind(this), 21633 destroy: ne.destroy.bind(this), 21634 onNextClick: ne.onNextClick.bind(this), 21635 onPrevClick: ne.onPrevClick.bind(this) 21636 } 21637 }); 21638 }, 21639 on: { 21640 init: function () { 21641 this.navigation.init(), this.navigation.update(); 21642 }, 21643 toEdge: function () { 21644 this.navigation.update(); 21645 }, 21646 fromEdge: function () { 21647 this.navigation.update(); 21648 }, 21649 destroy: function () { 21650 this.navigation.destroy(); 21651 }, 21652 click: function (e) { 21653 var t, 21654 i = this.navigation, 21655 s = i.$nextEl, 21656 a = i.$prevEl; 21657 !this.params.navigation.hideOnClick || n(e.target).is(a) || n(e.target).is(s) || (s ? t = s.hasClass(this.params.navigation.hiddenClass) : a && (t = a.hasClass(this.params.navigation.hiddenClass)), !0 === t ? this.emit("navigationShow", this) : this.emit("navigationHide", this), s && s.toggleClass(this.params.navigation.hiddenClass), a && a.toggleClass(this.params.navigation.hiddenClass)); 21658 } 21659 } 21660 }, { 21661 name: "pagination", 21662 params: { 21663 pagination: { 21664 el: null, 21665 bulletElement: "span", 21666 clickable: !1, 21667 hideOnClick: !1, 21668 renderBullet: null, 21669 renderProgressbar: null, 21670 renderFraction: null, 21671 renderCustom: null, 21672 progressbarOpposite: !1, 21673 type: "bullets", 21674 dynamicBullets: !1, 21675 dynamicMainBullets: 1, 21676 formatFractionCurrent: function (e) { 21677 return e; 21678 }, 21679 formatFractionTotal: function (e) { 21680 return e; 21681 }, 21682 bulletClass: "swiper-pagination-bullet", 21683 bulletActiveClass: "swiper-pagination-bullet-active", 21684 modifierClass: "swiper-pagination-", 21685 currentClass: "swiper-pagination-current", 21686 totalClass: "swiper-pagination-total", 21687 hiddenClass: "swiper-pagination-hidden", 21688 progressbarFillClass: "swiper-pagination-progressbar-fill", 21689 progressbarOppositeClass: "swiper-pagination-progressbar-opposite", 21690 clickableClass: "swiper-pagination-clickable", 21691 lockClass: "swiper-pagination-lock" 21692 } 21693 }, 21694 create: function () { 21695 d.extend(this, { 21696 pagination: { 21697 init: oe.init.bind(this), 21698 render: oe.render.bind(this), 21699 update: oe.update.bind(this), 21700 destroy: oe.destroy.bind(this), 21701 dynamicBulletIndex: 0 21702 } 21703 }); 21704 }, 21705 on: { 21706 init: function () { 21707 this.pagination.init(), this.pagination.render(), this.pagination.update(); 21708 }, 21709 activeIndexChange: function () { 21710 (this.params.loop || void 0 === this.snapIndex) && this.pagination.update(); 21711 }, 21712 snapIndexChange: function () { 21713 this.params.loop || this.pagination.update(); 21714 }, 21715 slidesLengthChange: function () { 21716 this.params.loop && (this.pagination.render(), this.pagination.update()); 21717 }, 21718 snapGridLengthChange: function () { 21719 this.params.loop || (this.pagination.render(), this.pagination.update()); 21720 }, 21721 destroy: function () { 21722 this.pagination.destroy(); 21723 }, 21724 click: function (e) { 21725 this.params.pagination.el && this.params.pagination.hideOnClick && this.pagination.$el.length > 0 && !n(e.target).hasClass(this.params.pagination.bulletClass) && (!0 === this.pagination.$el.hasClass(this.params.pagination.hiddenClass) ? this.emit("paginationShow", this) : this.emit("paginationHide", this), this.pagination.$el.toggleClass(this.params.pagination.hiddenClass)); 21726 } 21727 } 21728 }, { 21729 name: "scrollbar", 21730 params: { 21731 scrollbar: { 21732 el: null, 21733 dragSize: "auto", 21734 hide: !1, 21735 draggable: !1, 21736 snapOnRelease: !0, 21737 lockClass: "swiper-scrollbar-lock", 21738 dragClass: "swiper-scrollbar-drag" 21739 } 21740 }, 21741 create: function () { 21742 d.extend(this, { 21743 scrollbar: { 21744 init: le.init.bind(this), 21745 destroy: le.destroy.bind(this), 21746 updateSize: le.updateSize.bind(this), 21747 setTranslate: le.setTranslate.bind(this), 21748 setTransition: le.setTransition.bind(this), 21749 enableDraggable: le.enableDraggable.bind(this), 21750 disableDraggable: le.disableDraggable.bind(this), 21751 setDragPosition: le.setDragPosition.bind(this), 21752 getPointerPosition: le.getPointerPosition.bind(this), 21753 onDragStart: le.onDragStart.bind(this), 21754 onDragMove: le.onDragMove.bind(this), 21755 onDragEnd: le.onDragEnd.bind(this), 21756 isTouched: !1, 21757 timeout: null, 21758 dragTimeout: null 21759 } 21760 }); 21761 }, 21762 on: { 21763 init: function () { 21764 this.scrollbar.init(), this.scrollbar.updateSize(), this.scrollbar.setTranslate(); 21765 }, 21766 update: function () { 21767 this.scrollbar.updateSize(); 21768 }, 21769 resize: function () { 21770 this.scrollbar.updateSize(); 21771 }, 21772 observerUpdate: function () { 21773 this.scrollbar.updateSize(); 21774 }, 21775 setTranslate: function () { 21776 this.scrollbar.setTranslate(); 21777 }, 21778 setTransition: function (e) { 21779 this.scrollbar.setTransition(e); 21780 }, 21781 destroy: function () { 21782 this.scrollbar.destroy(); 21783 } 21784 } 21785 }, { 21786 name: "parallax", 21787 params: { 21788 parallax: { 21789 enabled: !1 21790 } 21791 }, 21792 create: function () { 21793 d.extend(this, { 21794 parallax: { 21795 setTransform: de.setTransform.bind(this), 21796 setTranslate: de.setTranslate.bind(this), 21797 setTransition: de.setTransition.bind(this) 21798 } 21799 }); 21800 }, 21801 on: { 21802 beforeInit: function () { 21803 this.params.parallax.enabled && (this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0); 21804 }, 21805 init: function () { 21806 this.params.parallax.enabled && this.parallax.setTranslate(); 21807 }, 21808 setTranslate: function () { 21809 this.params.parallax.enabled && this.parallax.setTranslate(); 21810 }, 21811 setTransition: function (e) { 21812 this.params.parallax.enabled && this.parallax.setTransition(e); 21813 } 21814 } 21815 }, { 21816 name: "zoom", 21817 params: { 21818 zoom: { 21819 enabled: !1, 21820 maxRatio: 3, 21821 minRatio: 1, 21822 toggle: !0, 21823 containerClass: "swiper-zoom-container", 21824 zoomedSlideClass: "swiper-slide-zoomed" 21825 } 21826 }, 21827 create: function () { 21828 var e = this, 21829 t = { 21830 enabled: !1, 21831 scale: 1, 21832 currentScale: 1, 21833 isScaling: !1, 21834 gesture: { 21835 $slideEl: void 0, 21836 slideWidth: void 0, 21837 slideHeight: void 0, 21838 $imageEl: void 0, 21839 $imageWrapEl: void 0, 21840 maxRatio: 3 21841 }, 21842 image: { 21843 isTouched: void 0, 21844 isMoved: void 0, 21845 currentX: void 0, 21846 currentY: void 0, 21847 minX: void 0, 21848 minY: void 0, 21849 maxX: void 0, 21850 maxY: void 0, 21851 width: void 0, 21852 height: void 0, 21853 startX: void 0, 21854 startY: void 0, 21855 touchesStart: {}, 21856 touchesCurrent: {} 21857 }, 21858 velocity: { 21859 x: void 0, 21860 y: void 0, 21861 prevPositionX: void 0, 21862 prevPositionY: void 0, 21863 prevTime: void 0 21864 } 21865 }; 21866 "onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out".split(" ").forEach(function (i) { 21867 t[i] = he[i].bind(e); 21868 }), d.extend(e, { 21869 zoom: t 21870 }); 21871 var i = 1; 21872 Object.defineProperty(e.zoom, "scale", { 21873 get: function () { 21874 return i; 21875 }, 21876 set: function (t) { 21877 if (i !== t) { 21878 var s = e.zoom.gesture.$imageEl ? e.zoom.gesture.$imageEl[0] : void 0, 21879 a = e.zoom.gesture.$slideEl ? e.zoom.gesture.$slideEl[0] : void 0; 21880 e.emit("zoomChange", t, s, a); 21881 } 21882 i = t; 21883 } 21884 }); 21885 }, 21886 on: { 21887 init: function () { 21888 this.params.zoom.enabled && this.zoom.enable(); 21889 }, 21890 destroy: function () { 21891 this.zoom.disable(); 21892 }, 21893 touchStart: function (e) { 21894 this.zoom.enabled && this.zoom.onTouchStart(e); 21895 }, 21896 touchEnd: function (e) { 21897 this.zoom.enabled && this.zoom.onTouchEnd(e); 21898 }, 21899 doubleTap: function (e) { 21900 this.params.zoom.enabled && this.zoom.enabled && this.params.zoom.toggle && this.zoom.toggle(e); 21901 }, 21902 transitionEnd: function () { 21903 this.zoom.enabled && this.params.zoom.enabled && this.zoom.onTransitionEnd(); 21904 }, 21905 slideChange: function () { 21906 this.zoom.enabled && this.params.zoom.enabled && this.params.cssMode && this.zoom.onTransitionEnd(); 21907 } 21908 } 21909 }, { 21910 name: "lazy", 21911 params: { 21912 lazy: { 21913 enabled: !1, 21914 loadPrevNext: !1, 21915 loadPrevNextAmount: 1, 21916 loadOnTransitionStart: !1, 21917 elementClass: "swiper-lazy", 21918 loadingClass: "swiper-lazy-loading", 21919 loadedClass: "swiper-lazy-loaded", 21920 preloaderClass: "swiper-lazy-preloader" 21921 } 21922 }, 21923 create: function () { 21924 d.extend(this, { 21925 lazy: { 21926 initialImageLoaded: !1, 21927 load: pe.load.bind(this), 21928 loadInSlide: pe.loadInSlide.bind(this) 21929 } 21930 }); 21931 }, 21932 on: { 21933 beforeInit: function () { 21934 this.params.lazy.enabled && this.params.preloadImages && (this.params.preloadImages = !1); 21935 }, 21936 init: function () { 21937 this.params.lazy.enabled && !this.params.loop && 0 === this.params.initialSlide && this.lazy.load(); 21938 }, 21939 scroll: function () { 21940 this.params.freeMode && !this.params.freeModeSticky && this.lazy.load(); 21941 }, 21942 resize: function () { 21943 this.params.lazy.enabled && this.lazy.load(); 21944 }, 21945 scrollbarDragMove: function () { 21946 this.params.lazy.enabled && this.lazy.load(); 21947 }, 21948 transitionStart: function () { 21949 this.params.lazy.enabled && (this.params.lazy.loadOnTransitionStart || !this.params.lazy.loadOnTransitionStart && !this.lazy.initialImageLoaded) && this.lazy.load(); 21950 }, 21951 transitionEnd: function () { 21952 this.params.lazy.enabled && !this.params.lazy.loadOnTransitionStart && this.lazy.load(); 21953 }, 21954 slideChange: function () { 21955 this.params.lazy.enabled && this.params.cssMode && this.lazy.load(); 21956 } 21957 } 21958 }, { 21959 name: "controller", 21960 params: { 21961 controller: { 21962 control: void 0, 21963 inverse: !1, 21964 by: "slide" 21965 } 21966 }, 21967 create: function () { 21968 d.extend(this, { 21969 controller: { 21970 control: this.params.controller.control, 21971 getInterpolateFunction: ce.getInterpolateFunction.bind(this), 21972 setTranslate: ce.setTranslate.bind(this), 21973 setTransition: ce.setTransition.bind(this) 21974 } 21975 }); 21976 }, 21977 on: { 21978 update: function () { 21979 this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline); 21980 }, 21981 resize: function () { 21982 this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline); 21983 }, 21984 observerUpdate: function () { 21985 this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline); 21986 }, 21987 setTranslate: function (e, t) { 21988 this.controller.control && this.controller.setTranslate(e, t); 21989 }, 21990 setTransition: function (e, t) { 21991 this.controller.control && this.controller.setTransition(e, t); 21992 } 21993 } 21994 }, { 21995 name: "a11y", 21996 params: { 21997 a11y: { 21998 enabled: !0, 21999 notificationClass: "swiper-notification", 22000 prevSlideMessage: "Previous slide", 22001 nextSlideMessage: "Next slide", 22002 firstSlideMessage: "This is the first slide", 22003 lastSlideMessage: "This is the last slide", 22004 paginationBulletMessage: "Go to slide {{index}}" 22005 } 22006 }, 22007 create: function () { 22008 var e = this; 22009 d.extend(e, { 22010 a11y: { 22011 liveRegion: n('<span class="' + e.params.a11y.notificationClass + '" aria-live="assertive" aria-atomic="true"></span>') 22012 } 22013 }), Object.keys(ue).forEach(function (t) { 22014 e.a11y[t] = ue[t].bind(e); 22015 }); 22016 }, 22017 on: { 22018 init: function () { 22019 this.params.a11y.enabled && (this.a11y.init(), this.a11y.updateNavigation()); 22020 }, 22021 toEdge: function () { 22022 this.params.a11y.enabled && this.a11y.updateNavigation(); 22023 }, 22024 fromEdge: function () { 22025 this.params.a11y.enabled && this.a11y.updateNavigation(); 22026 }, 22027 paginationUpdate: function () { 22028 this.params.a11y.enabled && this.a11y.updatePagination(); 22029 }, 22030 destroy: function () { 22031 this.params.a11y.enabled && this.a11y.destroy(); 22032 } 22033 } 22034 }, { 22035 name: "history", 22036 params: { 22037 history: { 22038 enabled: !1, 22039 replaceState: !1, 22040 key: "slides" 22041 } 22042 }, 22043 create: function () { 22044 d.extend(this, { 22045 history: { 22046 init: ve.init.bind(this), 22047 setHistory: ve.setHistory.bind(this), 22048 setHistoryPopState: ve.setHistoryPopState.bind(this), 22049 scrollToSlide: ve.scrollToSlide.bind(this), 22050 destroy: ve.destroy.bind(this) 22051 } 22052 }); 22053 }, 22054 on: { 22055 init: function () { 22056 this.params.history.enabled && this.history.init(); 22057 }, 22058 destroy: function () { 22059 this.params.history.enabled && this.history.destroy(); 22060 }, 22061 transitionEnd: function () { 22062 this.history.initialized && this.history.setHistory(this.params.history.key, this.activeIndex); 22063 }, 22064 slideChange: function () { 22065 this.history.initialized && this.params.cssMode && this.history.setHistory(this.params.history.key, this.activeIndex); 22066 } 22067 } 22068 }, { 22069 name: "hash-navigation", 22070 params: { 22071 hashNavigation: { 22072 enabled: !1, 22073 replaceState: !1, 22074 watchState: !1 22075 } 22076 }, 22077 create: function () { 22078 d.extend(this, { 22079 hashNavigation: { 22080 initialized: !1, 22081 init: fe.init.bind(this), 22082 destroy: fe.destroy.bind(this), 22083 setHash: fe.setHash.bind(this), 22084 onHashCange: fe.onHashCange.bind(this) 22085 } 22086 }); 22087 }, 22088 on: { 22089 init: function () { 22090 this.params.hashNavigation.enabled && this.hashNavigation.init(); 22091 }, 22092 destroy: function () { 22093 this.params.hashNavigation.enabled && this.hashNavigation.destroy(); 22094 }, 22095 transitionEnd: function () { 22096 this.hashNavigation.initialized && this.hashNavigation.setHash(); 22097 }, 22098 slideChange: function () { 22099 this.hashNavigation.initialized && this.params.cssMode && this.hashNavigation.setHash(); 22100 } 22101 } 22102 }, { 22103 name: "autoplay", 22104 params: { 22105 autoplay: { 22106 enabled: !1, 22107 delay: 3e3, 22108 waitForTransition: !0, 22109 disableOnInteraction: !0, 22110 stopOnLastSlide: !1, 22111 reverseDirection: !1 22112 } 22113 }, 22114 create: function () { 22115 var e = this; 22116 d.extend(e, { 22117 autoplay: { 22118 running: !1, 22119 paused: !1, 22120 run: me.run.bind(e), 22121 start: me.start.bind(e), 22122 stop: me.stop.bind(e), 22123 pause: me.pause.bind(e), 22124 onVisibilityChange: function () { 22125 "hidden" === document.visibilityState && e.autoplay.running && e.autoplay.pause(), "visible" === document.visibilityState && e.autoplay.paused && (e.autoplay.run(), e.autoplay.paused = !1); 22126 }, 22127 onTransitionEnd: function (t) { 22128 e && !e.destroyed && e.$wrapperEl && t.target === this && (e.$wrapperEl[0].removeEventListener("transitionend", e.autoplay.onTransitionEnd), e.$wrapperEl[0].removeEventListener("webkitTransitionEnd", e.autoplay.onTransitionEnd), e.autoplay.paused = !1, e.autoplay.running ? e.autoplay.run() : e.autoplay.stop()); 22129 } 22130 } 22131 }); 22132 }, 22133 on: { 22134 init: function () { 22135 this.params.autoplay.enabled && (this.autoplay.start(), document.addEventListener("visibilitychange", this.autoplay.onVisibilityChange)); 22136 }, 22137 beforeTransitionStart: function (e, t) { 22138 this.autoplay.running && (t || !this.params.autoplay.disableOnInteraction ? this.autoplay.pause(e) : this.autoplay.stop()); 22139 }, 22140 sliderFirstMove: function () { 22141 this.autoplay.running && (this.params.autoplay.disableOnInteraction ? this.autoplay.stop() : this.autoplay.pause()); 22142 }, 22143 touchEnd: function () { 22144 this.params.cssMode && this.autoplay.paused && !this.params.autoplay.disableOnInteraction && this.autoplay.run(); 22145 }, 22146 destroy: function () { 22147 this.autoplay.running && this.autoplay.stop(), document.removeEventListener("visibilitychange", this.autoplay.onVisibilityChange); 22148 } 22149 } 22150 }, { 22151 name: "effect-fade", 22152 params: { 22153 fadeEffect: { 22154 crossFade: !1 22155 } 22156 }, 22157 create: function () { 22158 d.extend(this, { 22159 fadeEffect: { 22160 setTranslate: ge.setTranslate.bind(this), 22161 setTransition: ge.setTransition.bind(this) 22162 } 22163 }); 22164 }, 22165 on: { 22166 beforeInit: function () { 22167 if ("fade" === this.params.effect) { 22168 this.classNames.push(this.params.containerModifierClass + "fade"); 22169 var e = { 22170 slidesPerView: 1, 22171 slidesPerColumn: 1, 22172 slidesPerGroup: 1, 22173 watchSlidesProgress: !0, 22174 spaceBetween: 0, 22175 virtualTranslate: !0 22176 }; 22177 d.extend(this.params, e), d.extend(this.originalParams, e); 22178 } 22179 }, 22180 setTranslate: function () { 22181 "fade" === this.params.effect && this.fadeEffect.setTranslate(); 22182 }, 22183 setTransition: function (e) { 22184 "fade" === this.params.effect && this.fadeEffect.setTransition(e); 22185 } 22186 } 22187 }, { 22188 name: "effect-cube", 22189 params: { 22190 cubeEffect: { 22191 slideShadows: !0, 22192 shadow: !0, 22193 shadowOffset: 20, 22194 shadowScale: .94 22195 } 22196 }, 22197 create: function () { 22198 d.extend(this, { 22199 cubeEffect: { 22200 setTranslate: be.setTranslate.bind(this), 22201 setTransition: be.setTransition.bind(this) 22202 } 22203 }); 22204 }, 22205 on: { 22206 beforeInit: function () { 22207 if ("cube" === this.params.effect) { 22208 this.classNames.push(this.params.containerModifierClass + "cube"), this.classNames.push(this.params.containerModifierClass + "3d"); 22209 var e = { 22210 slidesPerView: 1, 22211 slidesPerColumn: 1, 22212 slidesPerGroup: 1, 22213 watchSlidesProgress: !0, 22214 resistanceRatio: 0, 22215 spaceBetween: 0, 22216 centeredSlides: !1, 22217 virtualTranslate: !0 22218 }; 22219 d.extend(this.params, e), d.extend(this.originalParams, e); 22220 } 22221 }, 22222 setTranslate: function () { 22223 "cube" === this.params.effect && this.cubeEffect.setTranslate(); 22224 }, 22225 setTransition: function (e) { 22226 "cube" === this.params.effect && this.cubeEffect.setTransition(e); 22227 } 22228 } 22229 }, { 22230 name: "effect-flip", 22231 params: { 22232 flipEffect: { 22233 slideShadows: !0, 22234 limitRotation: !0 22235 } 22236 }, 22237 create: function () { 22238 d.extend(this, { 22239 flipEffect: { 22240 setTranslate: we.setTranslate.bind(this), 22241 setTransition: we.setTransition.bind(this) 22242 } 22243 }); 22244 }, 22245 on: { 22246 beforeInit: function () { 22247 if ("flip" === this.params.effect) { 22248 this.classNames.push(this.params.containerModifierClass + "flip"), this.classNames.push(this.params.containerModifierClass + "3d"); 22249 var e = { 22250 slidesPerView: 1, 22251 slidesPerColumn: 1, 22252 slidesPerGroup: 1, 22253 watchSlidesProgress: !0, 22254 spaceBetween: 0, 22255 virtualTranslate: !0 22256 }; 22257 d.extend(this.params, e), d.extend(this.originalParams, e); 22258 } 22259 }, 22260 setTranslate: function () { 22261 "flip" === this.params.effect && this.flipEffect.setTranslate(); 22262 }, 22263 setTransition: function (e) { 22264 "flip" === this.params.effect && this.flipEffect.setTransition(e); 22265 } 22266 } 22267 }, { 22268 name: "effect-coverflow", 22269 params: { 22270 coverflowEffect: { 22271 rotate: 50, 22272 stretch: 0, 22273 depth: 100, 22274 scale: 1, 22275 modifier: 1, 22276 slideShadows: !0 22277 } 22278 }, 22279 create: function () { 22280 d.extend(this, { 22281 coverflowEffect: { 22282 setTranslate: ye.setTranslate.bind(this), 22283 setTransition: ye.setTransition.bind(this) 22284 } 22285 }); 22286 }, 22287 on: { 22288 beforeInit: function () { 22289 "coverflow" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "coverflow"), this.classNames.push(this.params.containerModifierClass + "3d"), this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0); 22290 }, 22291 setTranslate: function () { 22292 "coverflow" === this.params.effect && this.coverflowEffect.setTranslate(); 22293 }, 22294 setTransition: function (e) { 22295 "coverflow" === this.params.effect && this.coverflowEffect.setTransition(e); 22296 } 22297 } 22298 }, { 22299 name: "thumbs", 22300 params: { 22301 thumbs: { 22302 swiper: null, 22303 multipleActiveThumbs: !0, 22304 autoScrollOffset: 0, 22305 slideThumbActiveClass: "swiper-slide-thumb-active", 22306 thumbsContainerClass: "swiper-container-thumbs" 22307 } 22308 }, 22309 create: function () { 22310 d.extend(this, { 22311 thumbs: { 22312 swiper: null, 22313 init: xe.init.bind(this), 22314 update: xe.update.bind(this), 22315 onThumbClick: xe.onThumbClick.bind(this) 22316 } 22317 }); 22318 }, 22319 on: { 22320 beforeInit: function () { 22321 var e = this.params.thumbs; 22322 e && e.swiper && (this.thumbs.init(), this.thumbs.update(!0)); 22323 }, 22324 slideChange: function () { 22325 this.thumbs.swiper && this.thumbs.update(); 22326 }, 22327 update: function () { 22328 this.thumbs.swiper && this.thumbs.update(); 22329 }, 22330 resize: function () { 22331 this.thumbs.swiper && this.thumbs.update(); 22332 }, 22333 observerUpdate: function () { 22334 this.thumbs.swiper && this.thumbs.update(); 22335 }, 22336 setTransition: function (e) { 22337 var t = this.thumbs.swiper; 22338 t && t.setTransition(e); 22339 }, 22340 beforeDestroy: function () { 22341 var e = this.thumbs.swiper; 22342 e && this.thumbs.swiperCreated && e && e.destroy(); 22343 } 22344 } 22345 }]; 22346 return void 0 === j.use && (j.use = j.Class.use, j.installModule = j.Class.installModule), j.use(Ee), j; 22347}); 22348 22349/***/ }), 22350
vendor: 784 bytes, lines 22351-22381
22351/***/ "./node_modules/webpack/buildin/global.js": 22352/*!***********************************!*\ 22353 !*** (webpack)/buildin/global.js ***! 22354 \***********************************/ 22355/*! no static exports found */ 22356/***/ (function(module, exports) { 22357 22358/*** IMPORTS FROM imports-loader ***/ 22359var define = false; 22360var g; 22361 22362// This works in non-strict mode 22363g = function () { 22364 return this; 22365}(); 22366try { 22367 // This works if eval is allowed (see CSP) 22368 g = g || new Function("return this")(); 22369} catch (e) { 22370 // This works if the window reference is available 22371 if (typeof window === "object") g = window; 22372} 22373 22374// g can still be undefined, but nothing to do about it... 22375// We return undefined, instead of nothing here, so it's 22376// easier to handle this case. if(!global) { ...} 22377 22378module.exports = g; 22379 22380/***/ }), 22381
vendor: 857 bytes, lines 22382-22415
22382/***/ "./node_modules/webpack/buildin/module.js": 22383/*!***********************************!*\ 22384 !*** (webpack)/buildin/module.js ***! 22385 \***********************************/ 22386/*! no static exports found */ 22387/***/ (function(module, exports) { 22388 22389/*** IMPORTS FROM imports-loader ***/ 22390var define = false; 22391module.exports = function (module) { 22392 if (!module.webpackPolyfill) { 22393 module.deprecate = function () {}; 22394 module.paths = []; 22395 // module.parent = undefined by default 22396 if (!module.children) module.children = []; 22397 Object.defineProperty(module, "loaded", { 22398 enumerable: true, 22399 get: function () { 22400 return module.l; 22401 } 22402 }); 22403 Object.defineProperty(module, "id", { 22404 enumerable: true, 22405 get: function () { 22406 return module.i; 22407 } 22408 }); 22409 module.webpackPolyfill = 1; 22410 } 22411 return module; 22412}; 22413 22414/***/ }), 22415
22416/***/ "./src/js/app.js": 22417/*!***********************!*\ 22418 !*** ./src/js/app.js ***! 22419 \***********************/ 22420/*! no exports provided */ 22421/***/ (function(module, __webpack_exports__, __webpack_require__) { 22422 22423"use strict"; 22424__webpack_require__.r(__webpack_exports__); 22425/* WEBPACK VAR INJECTION */(function($, jQuery) {/* harmony import */ var swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swiper/js/swiper.min */ "./node_modules/swiper/js/swiper.min.js"); 22426/* harmony import */ var swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0__); 22427/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js"); 22428/* harmony import */ var gsap_ScrollToPlugin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap/ScrollToPlugin */ "./node_modules/gsap/ScrollToPlugin.js"); 22429/* harmony import */ var _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/gsap-pro/SplitText.js */ "./src/lib/gsap-pro/SplitText.js"); 22430/* harmony import */ var _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3__); 22431/* harmony import */ var scrollmagic__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js"); 22432/* harmony import */ var scrollmagic__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scrollmagic__WEBPACK_IMPORTED_MODULE_4__); 22433/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators */ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js"); 22434/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5__); 22435/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js"); 22436/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6__); 22437/* harmony import */ var _components_cookie_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/cookie-manager */ "./src/js/components/cookie-manager.js"); 22438/* harmony import */ var _components_custom_google_map_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @components/custom-google-map.js */ "./src/js/components/custom-google-map.js"); 22439/* harmony import */ var _components_materialize_form_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @components/materialize-form.js */ "./src/js/components/materialize-form.js"); 22440/* harmony import */ var _components_kira_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @components/kira.js */ "./src/js/components/kira.js"); 22441/* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @components/menu.js */ "./src/js/components/menu.js"); 22442/* harmony import */ var _utils_router_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @utils/router.js */ "./src/js/utils/router.js"); 22443/* harmony import */ var _components_global_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @components/global.js */ "./src/js/components/global.js"); 22444/* harmony import */ var _pages_main_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @pages/main.js */ "./src/js/pages/main.js"); 22445/* harmony import */ var _pages_news_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @pages/news.js */ "./src/js/pages/news.js"); 22446/* harmony import */ var _pages_animations_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @pages/animations.js */ "./src/js/pages/animations.js"); 22447/* harmony import */ var _pages_sample_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @pages/sample.js */ "./src/js/pages/sample.js"); 22448/* harmony import */ var _pages_contact_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @pages/contact.js */ "./src/js/pages/contact.js"); 22449/*** IMPORTS FROM imports-loader ***/ 22450var define = false;
22451 22452// src/js/app.js 22453 22454 22455__webpack_require__(/*! @lib/iziModal/js/iziModal.js */ "./src/lib/iziModal/js/iziModal.js")($); 22456 22457 22458 22459gsap__WEBPACK_IMPORTED_MODULE_1__["gsap"].registerPlugin(gsap_ScrollToPlugin__WEBPACK_IMPORTED_MODULE_2__["ScrollToPlugin"], _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3___default.a); 22460 22461// IMPORT de ScrollMagic (plus via window) 22462 22463 22464 22465 22466 22467 22468 22469 22470 22471 22472 22473 22474 22475 22476 22477var routes = new _utils_router_js__WEBPACK_IMPORTED_MODULE_12__["default"]([{ 22478 file: _pages_animations_js__WEBPACK_IMPORTED_MODULE_16__["default"], 22479 dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_menu_js__WEBPACK_IMPORTED_MODULE_11__["default"], _components_kira_js__WEBPACK_IMPORTED_MODULE_10__["default"], scrollmagic__WEBPACK_IMPORTED_MODULE_4___default.a, gsap__WEBPACK_IMPORTED_MODULE_1__["gsap"]] 22480}, { 22481 file: _pages_main_js__WEBPACK_IMPORTED_MODULE_14__["default"], 22482 dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_cookie_manager__WEBPACK_IMPORTED_MODULE_7__["default"], swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0___default.a] 22483}, { 22484 file: _pages_news_js__WEBPACK_IMPORTED_MODULE_15__["default"], 22485 dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__], 22486 resolve: '#page-news-archive' 22487}, { 22488 file: _pages_sample_js__WEBPACK_IMPORTED_MODULE_17__["default"], 22489 dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__], 22490 resolve: '#page-sample' 22491}, { 22492 file: _pages_contact_js__WEBPACK_IMPORTED_MODULE_18__["default"], 22493 dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_materialize_form_js__WEBPACK_IMPORTED_MODULE_9__["default"], _components_custom_google_map_js__WEBPACK_IMPORTED_MODULE_8__["default"]], 22494 resolve: '#page-contact' 22495}]); 22496(function ($) { 22497 routes.load(); 22498})(jQuery); 22499/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 22500 22501/***/ }), 22502
22503/***/ "./src/js/components/cookie-manager.js": 22504/*!*********************************************!*\ 22505 !*** ./src/js/components/cookie-manager.js ***! 22506 \*********************************************/ 22507/*! exports provided: default */ 22508/***/ (function(module, __webpack_exports__, __webpack_require__) { 22509 22510"use strict"; 22511__webpack_require__.r(__webpack_exports__); 22512/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 22513function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } 22514function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } 22515function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } 22516function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 22517function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 22518function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 22519function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 22520function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 22521/*** IMPORTS FROM imports-loader ***/ 22522var define = false; 22523 22524/* 22525|-------------------------------------------------------------------------------- 22526| CookieManager 22527|-------------------------------------------------------------------------------- 22528| 22529| CookieManager handles simple cookie banners 22530| 22531*/ 22532 22533/* 22534| 22535| Class 22536|-------- 22537| 22538*/ 22539var CookieManager = /*#__PURE__*/function () { 22540 /* 22541 | 22542 | Constructor 22543 |-------------- 22544 */ 22545 function CookieManager($banner) { 22546 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 22547 _classCallCheck(this, CookieManager); 22548 this.banner = $banner; 22549 this.params = this.initParams(params); 22550 this.cookies; 22551 this.init(); 22552 } 22553 22554 /* 22555 | 22556 | initParams 22557 |-------------- 22558 */ 22559 return _createClass(CookieManager, [{ 22560 key: "initParams", 22561 value: function initParams(params) { 22562 var name = params.name, 22563 value = params.value, 22564 duration = params.duration, 22565 buttons = params.buttons, 22566 onAccept = params.onAccept, 22567 onRefuse = params.onRefuse; 22568 var paramsObj = { 22569 'name': this.isDefined(name) ? name : 'adveris_cookie_accepted', 22570 'duration': this.isDefined(duration) ? duration : 30, 22571 'onAccept': this.isDefined(onAccept) ? onAccept : null, 22572 'onRefuse': this.isDefined(onRefuse) ? onRefuse : null 22573 }; 22574 if (this.isDefined(buttons)) { 22575 var accept = buttons.accept, 22576 refuse = buttons.refuse, 22577 close = buttons.close; 22578 var buttonsParams = { 22579 accept: this.isDefined(accept) ? accept : this.banner.find('.item-cookie-banner-accept'), 22580 refuse: this.isDefined(refuse) ? refuse : this.banner.find('.item-cookie-banner-refuse'), 22581 close: this.isDefined(close) ? close : this.banner.find('.item-cookie-banner-close') 22582 }; 22583 paramsObj = _objectSpread(_objectSpread({}, paramsObj), {}, { 22584 buttons: buttonsParams 22585 }); 22586 } 22587 return paramsObj; 22588 } 22589 22590 /** 22591 | 22592 | Init 22593 |------- 22594 */ 22595 }, { 22596 key: "init",
22597 value: function init() { 22598 if (this.cookieBannerDefined() && this.cookieBannerExist()) { 22599 this.storeCookies(); 22600 this.handleCookieBanner(); 22601 } 22602 } 22603 22604 /** 22605 | 22606 | handleCookieBanner 22607 |--------------------- 22608 */ 22609 }, { 22610 key: "handleCookieBanner", 22611 value: function handleCookieBanner() { 22612 this.handleShow(); 22613 this.handleActions(); 22614 } 22615 22616 /** 22617 | 22618 | handleShow 22619 |-------------- 22620 */ 22621 }, { 22622 key: "handleShow", 22623 value: function handleShow() { 22624 var name = this.params.name; 22625 if (typeof this.cookies[name] === 'undefined') { 22626 this.banner.show(); 22627 } 22628 } 22629 22630 /** 22631 | 22632 | handleActions 22633 |---------------- 22634 */ 22635 }, { 22636 key: "handleActions", 22637 value: function handleActions() { 22638 var _this = this; 22639 var _this$params = this.params, 22640 name = _this$params.name, 22641 duration = _this$params.duration, 22642 buttons = _this$params.buttons; 22643 var accept = buttons.accept, 22644 refuse = buttons.refuse, 22645 close = buttons.close; 22646 var $banner = this.banner; 22647 close.on('click', function (e) { 22648 e.preventDefault(); 22649 $banner.fadeOut(); 22650 }); 22651 accept.on('click', function (e) { 22652 return _this.closeCookieBanner(e); 22653 }); 22654 close.on('click', function (e) { 22655 return _this.closeCookieBanner(e); 22656 }); 22657 refuse.on('click', function (e) { 22658 return _this.closeCookieBanner(e, false); 22659 }); 22660 } 22661 22662 /** 22663 | 22664 | storeCookies 22665 |--------------- 22666 */ 22667 }, { 22668 key: "closeCookieBanner", 22669 value: function closeCookieBanner(e) { 22670 var _this2 = this; 22671 var accept = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 22672 e.preventDefault(); 22673 var _this$params2 = this.params, 22674 name = _this$params2.name, 22675 duration = _this$params2.duration; 22676 var $banner = this.banner; 22677 $banner.fadeOut(400, function () { 22678 $banner.remove(); 22679 _this2.setCookie(name, accept, duration); 22680 }); 22681 } 22682 22683 /** 22684 | 22685 | storeCookies 22686 |--------------- 22687 */ 22688 }, { 22689 key: "storeCookies", 22690 value: function storeCookies() { 22691 var decodedCookie = decodeURIComponent(document.cookie); 22692 var objCookies = decodedCookie.split(';'); 22693 var obj = {}; 22694 $.each(objCookies, function (k, v) { 22695 var cookie_name = v.split(/=(.+)/)[0].replace(' ', ''); 22696 var cookie_value = v.split(/=(.+)/)[1]; 22697 obj[cookie_name] = cookie_value; 22698 }); 22699 this.cookies = obj; 22700 } 22701 22702 /** 22703 | 22704 | setCookie 22705 |------------ 22706 */ 22707 }, { 22708 key: "setCookie", 22709 value: function setCookie(name, value, nbDays) { 22710 var _this$params3 = this.params, 22711 onAccept = _this$params3.onAccept, 22712 onRefuse = _this$params3.onRefuse; 22713 var date = new Date(); 22714 date.setTime(date.getTime() + nbDays * 24 * 60 * 60 * 1000); 22715 var expires = "expires=" + date.toUTCString(); 22716 document.cookie = name + "=" + value + ";" + expires + ";path=/"; 22717 if (value == false) { 22718 if (onRefuse !== null) { 22719 onRefuse(); 22720 } 22721 } else { 22722 if (onAccept !== null) { 22723 onAccept(); 22724 } 22725 } 22726 } 22727 22728 /** 22729 | 22730 | cookieBannerDefined 22731 |------------------- 22732 */ 22733 }, { 22734 key: "cookieBannerDefined", 22735 value: function cookieBannerDefined() { 22736 return this.control(this.isDefined(this.banner), this.getMessage('cookieBannerDefined')); 22737 } 22738 22739 /** 22740 | 22741 | cookieBannerExist 22742 |------------------- 22743 */ 22744 }, { 22745 key: "cookieBannerExist", 22746 value: function cookieBannerExist() { 22747 return this.control(this.exist(this.banner), this.getMessage('cookieBannerExist'), this.banner); 22748 } 22749 22750 /** 22751 | 22752 | Helper: isDefined 22753 |-------------------- 22754 | 22755 */ 22756 }, { 22757 key: "isDefined", 22758 value: function isDefined(item) { 22759 return typeof item !== 'undefined'; 22760 } 22761 22762 /** 22763 | 22764 | Helper: exist 22765 |---------------- 22766 */ 22767 }, { 22768 key: "exist", 22769 value: function exist($item) { 22770 return $item.length; 22771 } 22772 22773 /** 22774 | 22775 | Helper: control 22776 |------------------ 22777 */ 22778 }, { 22779 key: "control", 22780 value: function control(condition, message) { 22781 var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 22782 if (!condition) { 22783 if (selector === null) { 22784 console.error(message); 22785 } else { 22786 console.error(message, selector); 22787 } 22788 } 22789 return condition; 22790 } 22791 22792 /** 22793 | 22794 | Helper: getMessage 22795 |--------------------- 22796 */ 22797 }, { 22798 key: "getMessage",
22799 value: function getMessage(messageKey) { 22800 var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 22801 var var2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 22802 var messages = { 22803 'cookieBannerDefined': 'No cookie banner specified as 1st parameter', 22804 'cookieBannerExist': 'The cookie banner (specified as 1st parameter) does not exist:' 22805 }; 22806 return 'Cookie Manager: ' + messages[messageKey]; 22807 } 22808 }]); 22809}(); 22810/* harmony default export */ __webpack_exports__["default"] = (CookieManager); 22811/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 22812 22813/***/ }), 22814
22815/***/ "./src/js/components/custom-google-map.js": 22816/*!************************************************!*\ 22817 !*** ./src/js/components/custom-google-map.js ***! 22818 \************************************************/ 22819/*! exports provided: default */ 22820/***/ (function(module, __webpack_exports__, __webpack_require__) { 22821 22822"use strict"; 22823__webpack_require__.r(__webpack_exports__); 22824/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 22825function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 22826function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 22827function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 22828function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 22829function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 22830/*** IMPORTS FROM imports-loader ***/ 22831var define = false; 22832 22833/* 22834|-------------------------------------------------------------------------------- 22835| Custom Google Map 22836|-------------------------------------------------------------------------------- 22837| 22838| Scroller is a lightweight library to manage "animated & looped" sliding contents 22839| It uses Greensock as main dependency 22840| 22841*/ 22842 22843/* 22844| 22845| Class 22846|-------- 22847| 22848*/ 22849var customGoogleMap = /*#__PURE__*/function () { 22850 /* 22851 | 22852 | Constructor 22853 |-------------- 22854 */ 22855 function customGoogleMap($map, params) { 22856 _classCallCheck(this, customGoogleMap); 22857 this.map = $map; 22858 this.params = params; 22859 this.init(); 22860 } 22861 22862 /* 22863 | 22864 | init 22865 |------- 22866 */ 22867 return _createClass(customGoogleMap, [{ 22868 key: "init", 22869 value: function init() { 22870 var _this = this; 22871 var map = new google.maps.Map(_this.map[0], { 22872 zoom: 1, 22873 scrollwheel: false, 22874 center: new google.maps.LatLng(0, 0), 22875 mapTypeId: google.maps.MapTypeId.ROADMAP, 22876 styles: this.getCustomization() 22877 }); 22878 map.markers = []; 22879 $.each(this.params.markers, function () { 22880 _this.add_marker($(this), map); 22881 }); 22882 _this.center_map(map); 22883 return map; 22884 } 22885 22886 /* 22887 | 22888 | add_marker 22889 |------------- 22890 */ 22891 }, { 22892 key: "add_marker", 22893 value: function add_marker($marker, map) { 22894 var latlng = new google.maps.LatLng($marker.data('lat'), $marker.data('lng')); 22895 var icon = { 22896 url: $marker.data('icon'), 22897 scaledSize: new google.maps.Size(60, 60), 22898 origin: new google.maps.Point(0, 0), 22899 anchor: new google.maps.Point(0, 0) 22900 }; 22901 var marker = new google.maps.Marker({ 22902 position: latlng, 22903 map: map, 22904 icon: icon 22905 }); 22906 map.markers.push(marker); 22907 if ($marker.html()) { 22908 var infowindow = new google.maps.InfoWindow({ 22909 content: '<div class="map-card">' + $marker.html() + '</div>' 22910 }); 22911 google.maps.event.addListener(marker, 'click', function () { 22912 infowindow.open(map, marker); 22913 }); 22914 } 22915 } 22916 22917 /* 22918 | 22919 | center_map 22920 |------------- 22921 */ 22922 }, { 22923 key: "center_map", 22924 value: function center_map(map) { 22925 var bounds = new google.maps.LatLngBounds(); 22926 $.each(map.markers, function (i, marker) { 22927 var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng()); 22928 bounds.extend(latlng); 22929 }); 22930 if (map.markers.length == 1) { 22931 map.setCenter(bounds.getCenter()); 22932 map.setZoom(this.params.zoom); 22933 } else { 22934 map.fitBounds(bounds); 22935 } 22936 } 22937 22938 /* 22939 | 22940 | getCustomization 22941 |------------------- 22942 */ 22943 }, { 22944 key: "getCustomization", 22945 value: function getCustomization() { 22946 return [{ 22947 "elementType": "geometry", 22948 "stylers": [{ 22949 "color": "#f5f5f5" 22950 }] 22951 }, { 22952 "elementType": "labels.icon", 22953 "stylers": [{ 22954 "visibility": "off" 22955 }] 22956 }, { 22957 "elementType": "labels.text.fill", 22958 "stylers": [{ 22959 "color": "#616161" 22960 }] 22961 }, { 22962 "elementType": "labels.text.stroke", 22963 "stylers": [{ 22964 "color": "#f5f5f5" 22965 }] 22966 }, { 22967 "featureType": "administrative.land_parcel", 22968 "elementType": "labels.text.fill", 22969 "stylers": [{ 22970 "color": "#bdbdbd" 22971 }] 22972 }, { 22973 "featureType": "poi", 22974 "elementType": "geometry", 22975 "stylers": [{ 22976 "color": "#eeeeee" 22977 }] 22978 }, { 22979 "featureType": "poi", 22980 "elementType": "labels.text.fill", 22981 "stylers": [{ 22982 "color": "#757575" 22983 }] 22984 }, { 22985 "featureType": "poi.park", 22986 "elementType": "geometry", 22987 "stylers": [{ 22988 "color": "#e5e5e5" 22989 }] 22990 }, { 22991 "featureType": "poi.park", 22992 "elementType": "labels.text.fill", 22993 "stylers": [{ 22994 "color": "#9e9e9e" 22995 }] 22996 }, { 22997 "featureType": "road", 22998 "elementType": "geometry", 22999 "stylers": [{ 23000 "color": "#ffffff" 23001 }] 23002 }, { 23003 "featureType": "road.arterial", 23004 "elementType": "labels.text.fill", 23005 "stylers": [{ 23006 "color": "#757575" 23007 }] 23008 }, { 23009 "featureType": "road.highway", 23010 "elementType": "geometry", 23011 "stylers": [{ 23012 "color": "#dadada" 23013 }] 23014 }, { 23015 "featureType": "road.highway", 23016 "elementType": "labels.text.fill", 23017 "stylers": [{ 23018 "color": "#616161" 23019 }] 23020 }, { 23021 "featureType": "road.local", 23022 "elementType": "labels.text.fill", 23023 "stylers": [{ 23024 "color": "#9e9e9e" 23025 }] 23026 }, { 23027 "featureType": "transit.line", 23028 "elementType": "geometry", 23029 "stylers": [{ 23030 "color": "#e5e5e5" 23031 }] 23032 }, { 23033 "featureType": "transit.station", 23034 "elementType": "geometry", 23035 "stylers": [{ 23036 "color": "#eeeeee" 23037 }] 23038 }, { 23039 "featureType": "water", 23040 "elementType": "geometry", 23041 "stylers": [{ 23042 "color": "#c9c9c9" 23043 }] 23044 }, { 23045 "featureType": "water", 23046 "elementType": "labels.text.fill", 23047 "stylers": [{ 23048 "color": "#9e9e9e" 23049 }] 23050 }]; 23051 } 23052 }]); 23053}(); 23054/* harmony default export */ __webpack_exports__["default"] = (customGoogleMap); 23055/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 23056 23057/***/ }), 23058
23059/***/ "./src/js/components/global.js": 23060/*!*************************************!*\ 23061 !*** ./src/js/components/global.js ***! 23062 \*************************************/ 23063/*! exports provided: dump, dispachEvent, isDefined, exist, isValidEmail, setCookie, getCookie, deleteCookie */ 23064/***/ (function(module, __webpack_exports__, __webpack_require__) { 23065 23066"use strict"; 23067__webpack_require__.r(__webpack_exports__); 23068/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dump", function() { return dump; }); 23069/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispachEvent", function() { return dispachEvent; }); 23070/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDefined", function() { return isDefined; }); 23071/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exist", function() { return exist; }); 23072/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isValidEmail", function() { return isValidEmail; }); 23073/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCookie", function() { return setCookie; }); 23074/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCookie", function() { return getCookie; }); 23075/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteCookie", function() { return deleteCookie; }); 23076function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } 23077function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 23078function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 23079function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 23080function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } 23081function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } 23082/*** IMPORTS FROM imports-loader ***/ 23083var define = false; 23084 23085/* 23086| 23087| JQuery replaceClass 23088|---------------------- 23089*/ 23090$.fn.replaceClass = function (oldClasses, newClasses) { 23091 return this.each(function () { 23092 $(this).removeClass(oldClasses).addClass(newClasses); 23093 }); 23094}; 23095 23096/* 23097| 23098| Dump 23099|-------- 23100*/ 23101function dump(value) { 23102 console.log(value); 23103} 23104 23105/* 23106| 23107| Dispatch event 23108|----------------- 23109*/ 23110function dispachEvent($element, eventName) { 23111 var datas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23112 var event = $.Event(eventName); 23113 if (datas !== null) { 23114 for (var _i = 0, _Object$entries = Object.entries(datas); _i < _Object$entries.length; _i++) { 23115 var _ref = _Object$entries[_i]; 23116 var _ref2 = _slicedToArray(_ref, 2); 23117 var key = _ref2[0]; 23118 var value = _ref2[1]; 23119 event[key] = value; 23120 } 23121 } 23122 $element.trigger(event); 23123} 23124 23125/* 23126| 23127| Check defined 23128|---------------- 23129*/ 23130function isDefined(item) { 23131 return typeof item !== 'undefined'; 23132} 23133 23134/* 23135| 23136| Check exist 23137|------------------- 23138*/ 23139function exist(element) { 23140 return element.length; 23141} 23142 23143/* 23144| 23145| Email validation 23146|------------------- 23147*/ 23148function isValidEmail(email) { 23149 var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 23150 return re.test(String(email).toLowerCase()); 23151} 23152 23153/* 23154| 23155| Set cookie 23156|------------ 23157*/ 23158function setCookie(name, value, nbDays) { 23159 var date = new Date(); 23160 date.setTime(date.getTime() + nbDays * 24 * 60 * 60 * 1000); 23161 var expires = "expires=" + date.toUTCString(); 23162 document.cookie = name + "=" + value + ";" + expires + ";path=/"; 23163} 23164
23165/* 23166| 23167| Get cookie 23168|------------------- 23169*/ 23170function getCookie(cname) { 23171 var name = cname + "="; 23172 var decodedCookie = decodeURIComponent(document.cookie); 23173 var ca = decodedCookie.split(';'); 23174 for (var i = 0; i < ca.length; i++) { 23175 var c = ca[i]; 23176 while (c.charAt(0) == ' ') { 23177 c = c.substring(1); 23178 } 23179 if (c.indexOf(name) == 0) { 23180 return c.substring(name.length, c.length); 23181 } 23182 } 23183 return null; 23184} 23185function deleteCookie(name) { 23186 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 23187} 23188/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 23189 23190/***/ }), 23191
23192/***/ "./src/js/components/kira.js": 23193/*!***********************************!*\ 23194 !*** ./src/js/components/kira.js ***! 23195 \***********************************/ 23196/*! exports provided: default */ 23197/***/ (function(module, __webpack_exports__, __webpack_require__) { 23198 23199"use strict"; 23200__webpack_require__.r(__webpack_exports__); 23201/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js"); 23202function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 23203function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } 23204function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } 23205function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } 23206function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 23207function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 23208function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 23209function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 23210function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 23211/*** IMPORTS FROM imports-loader ***/ 23212var define = false; 23213 23214// src/js/kira.js 23215 23216 23217var Kira = /*#__PURE__*/function () { 23218 function Kira(scrollmagic) { 23219 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 23220 _classCallCheck(this, Kira); 23221 this.scrollmagic = scrollmagic; 23222 this.defaults = this.initDefaults(); 23223 this.params = this.initParams(params); 23224 this.timelines = {}; 23225 this.scenes = {}; 23226 this.tweens = {}; 23227 this.scrollMagicController = null; 23228 } 23229 return _createClass(Kira, [{ 23230 key: "initDefaults", 23231 value: function initDefaults() { 23232 return { 23233 debug: false, 23234 loadEvent: { 23235 domElement: null, 23236 eventName: null 23237 }, 23238 optimize: false, 23239 options: { 23240 start: "-=0.4", 23241 triggerHook: "onCenter", 23242 reverse: true 23243 }, 23244 selectors: { 23245 onLoadWrappers: { 23246 element: $("[data-kira-timeline-onload]"), 23247 data: "kira-timeline-onload" 23248 }, 23249 onScrollWrappers: { 23250 element: $("[data-kira-timeline]"), 23251 data: "kira-timeline" 23252 }, 23253 item: { 23254 element: $("[data-kira-item]"), 23255 data: "kira-item" 23256 } 23257 } 23258 }; 23259 } 23260 }, { 23261 key: "initParams", 23262 value: function initParams(params) { 23263 var paramsObj = _objectSpread({}, this.defaults); 23264 var debug = params.debug, 23265 loadEvent = params.loadEvent, 23266 optimize = params.optimize, 23267 options = params.options; 23268 if (this.isDefined(debug)) paramsObj.debug = debug; 23269 if (this.isDefined(loadEvent)) paramsObj.loadEvent = _objectSpread(_objectSpread({}, paramsObj.loadEvent), loadEvent); 23270 if (this.isDefined(optimize)) paramsObj.optimize = optimize; 23271 if (this.isDefined(options)) paramsObj.options = _objectSpread(_objectSpread({}, paramsObj.options), options); 23272 return paramsObj; 23273 } 23274 }, { 23275 key: "init",
23276 value: function init() { 23277 if (this.scrollMagicIsDefined()) { 23278 this.runOnloadAnimations(); 23279 this.runOnScrollAnimations(); 23280 } 23281 } 23282 }, { 23283 key: "setTimeline", 23284 value: function setTimeline(timelineName, paused, $selector) { 23285 var _this = this; 23286 var timeline = gsap__WEBPACK_IMPORTED_MODULE_0__["gsap"].timeline({ 23287 paused: paused, 23288 onStart: function onStart() { 23289 _this.dispachEvent($selector, "kira:timelineStart", { 23290 timeline: this 23291 }); 23292 }, 23293 onUpdate: function onUpdate() { 23294 _this.dispachEvent($selector, "kira:timelineUpdate", { 23295 timeline: this 23296 }); 23297 }, 23298 onComplete: function onComplete() { 23299 _this.dispachEvent($selector, "kira:timelineComplete", { 23300 timeline: this 23301 }); 23302 } 23303 }); 23304 _this.registerTimeline(timelineName, timeline); 23305 return timeline; 23306 } 23307 }, { 23308 key: "registerTimeline", 23309 value: function registerTimeline(timelineName, timeline) { 23310 if (this.isDefined(timelineName)) { 23311 this.timelines[String(timelineName)] = timeline; 23312 } 23313 } 23314 }, { 23315 key: "runOnloadAnimations", 23316 value: function runOnloadAnimations() { 23317 var _this2 = this; 23318 var _this$params$loadEven = this.params.loadEvent, 23319 domElement = _this$params$loadEven.domElement, 23320 eventName = _this$params$loadEven.eventName; 23321 if (domElement && eventName) { 23322 domElement.on(eventName, function () { 23323 return _this2.initTimelines("onLoadWrappers"); 23324 }); 23325 } else { 23326 this.initTimelines("onLoadWrappers"); 23327 } 23328 } 23329 }, { 23330 key: "initTimelines", 23331 value: function initTimelines(selectorKey) { 23332 var _this3 = this; 23333 var paused = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 23334 var autoplay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 23335 var selector = this.params.selectors[selectorKey]; 23336 var $elements = selector.element; 23337 var dataAttr = selector.data; 23338 $elements.each(function (_, el) { 23339 var $el = $(el); 23340 if (_this3.isValidTimeline($el)) { 23341 var name = $el.data(dataAttr); 23342 var timeline = _this3.setTimeline(name, paused, $el); 23343 _this3.generateTimelineTweens({ 23344 selector: $el, 23345 timeline: timeline, 23346 timelineName: name 23347 }); 23348 autoplay && timeline.play(); 23349 } 23350 }); 23351 } 23352 }, { 23353 key: "runOnScrollAnimations", 23354 value: function runOnScrollAnimations() { 23355 var _this4 = this; 23356 var controller = this.getScrollMagicController(this.scrollmagic); 23357 var sel = this.params.selectors.onScrollWrappers; 23358 var scenes = []; 23359 sel.element.each(function (_, el) { 23360 scenes.push(_this4.createScene($(el), sel.data)); 23361 }); 23362 controller.addScene(scenes); 23363 } 23364 }, { 23365 key: "getScrollMagicController", 23366 value: function getScrollMagicController(ScrollMagic) { 23367 if (!this.scrollMagicController) { 23368 this.scrollMagicController = new ScrollMagic.Controller(); 23369 } 23370 return this.scrollMagicController; 23371 } 23372 }, { 23373 key: "createScene", 23374 value: function createScene($selector, dataName) { 23375 var scene = null; 23376 if (this.isValidTimeline($selector)) { 23377 var timelineName = $selector.data(dataName); 23378 var timeline = this.setTimeline(timelineName, false, $selector); 23379 var options = this.getSceneOptions($selector); 23380 this.generateTimelineTweens({ 23381 selector: $selector, 23382 timeline: timeline, 23383 timelineName: timelineName 23384 }); 23385 scene = new this.scrollmagic.Scene(options).setTween(timeline); 23386 this.params.debug && scene.addIndicators(); 23387 this.registerScene(timelineName, scene); 23388 } 23389 return scene; 23390 } 23391 }, { 23392 key: "registerScene", 23393 value: function registerScene(timelineName, scene) { 23394 this.scenes[timelineName] = scene; 23395 } 23396 }, { 23397 key: "getSceneOptions", 23398 value: function getSceneOptions($selector) { 23399 var _$selector$data = $selector.data(), 23400 triggerHook = _$selector$data.triggerHook, 23401 reverse = _$selector$data.reverse; 23402 var def = this.params.options; 23403 return { 23404 triggerElement: $selector, 23405 triggerHook: this.isDefined(triggerHook) ? triggerHook : def.triggerHook, 23406 reverse: this.isDefined(reverse) ? reverse : def.reverse 23407 }; 23408 } 23409 }, { 23410 key: "generateTimelineTweens", 23411 value: function generateTimelineTweens(_ref) { 23412 var _this5 = this; 23413 var $selector = _ref.selector, 23414 timeline = _ref.timeline; 23415 var itemSel = this.params.selectors.item; 23416 $selector.find(itemSel.element).each(function (i, el) { 23417 var _$item$data, _this5$tweens$key, _this5$tweens; 23418 var $item = $(el); 23419 var key = $item.data(itemSel.data); 23420 var start = (_$item$data = $item.data("start")) !== null && _$item$data !== void 0 ? _$item$data : i === 0 ? "start" : _this5.params.options.start; 23421 (_this5$tweens$key = (_this5$tweens = _this5.tweens)[key]) === null || _this5$tweens$key === void 0 || _this5$tweens$key.c
23421all(_this5$tweens, $item, timeline, start); 23422 }); 23423 } 23424 }, { 23425 key: "add", 23426 value: function add(index, callback) { 23427 this.tweens[index] = callback; 23428 } 23429 }, { 23430 key: "isValidTimeline", 23431 value: function isValidTimeline($selector) { 23432 var name = $selector.data("kira-timeline"); 23433 var ok = true, 23434 msg; 23435 if (name && this.timelines[name]) { 23436 ok = false; 23437 msg = this.getMessage("isValidTimelineDuplicate", name); 23438 } 23439 return this.control(ok, msg, $selector); 23440 } 23441 }, { 23442 key: "scrollMagicIsDefined", 23443 value: function scrollMagicIsDefined() { 23444 return this.control(this.isDefined(this.scrollmagic), this.getMessage("scrollMagicIsDefined")); 23445 } 23446 }, { 23447 key: "dispachEvent", 23448 value: function dispachEvent($el, eventName) { 23449 var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23450 var e = $.Event(eventName); 23451 if (data) $.each(data, function (k, v) { 23452 return e[k] = v; 23453 }); 23454 $el.trigger(e); 23455 } 23456 }, { 23457 key: "isDefined", 23458 value: function isDefined(v) { 23459 return typeof v !== "undefined"; 23460 } 23461 }, { 23462 key: "control", 23463 value: function control(condition, message) { 23464 var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23465 if (!condition) { 23466 selector ? console.error(message, selector) : console.error(message); 23467 } 23468 return condition; 23469 } 23470 }, { 23471 key: "getMessage", 23472 value: function getMessage(key) { 23473 var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; 23474 var msgs = { 23475 scrollMagicIsDefined: "ScrollMagic is required to init Kira.", 23476 isValidTimelineDuplicate: "You already have a timeline called " + var1 + ", rename it." 23477 }; 23478 return "Kira: " + (msgs[key] || ""); 23479 } 23480 }]); 23481}(); 23482/* harmony default export */ __webpack_exports__["default"] = (Kira); 23483/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 23484 23485/***/ }), 23486
23487/***/ "./src/js/components/materialize-form.js": 23488/*!***********************************************!*\ 23489 !*** ./src/js/components/materialize-form.js ***! 23490 \***********************************************/ 23491/*! exports provided: default */ 23492/***/ (function(module, __webpack_exports__, __webpack_require__) { 23493 23494"use strict"; 23495__webpack_require__.r(__webpack_exports__); 23496/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 23497function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 23498function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 23499function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 23500function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 23501function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 23502/*** IMPORTS FROM imports-loader ***/ 23503var define = false; 23504 23505/* 23506|-------------------------------------------------------------------------------- 23507| Materialize Form 23508|-------------------------------------------------------------------------------- 23509| 23510| Materialize Form allows to easily implement materialize form effects 23511| 23512*/ 23513 23514/* 23515| 23516| Class 23517|-------- 23518| 23519*/ 23520var MaterializeForm = /*#__PURE__*/function () { 23521 /* 23522 | 23523 | Constructor 23524 |-------------- 23525 */ 23526 function MaterializeForm($formWrapper) { 23527 var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 23528 _classCallCheck(this, MaterializeForm); 23529 this.formWrapper = $formWrapper; 23530 this.params = this.initParams(params); 23531 this.init(); 23532 } 23533 23534 /* 23535 | 23536 | initParams 23537 |-------------- 23538 */ 23539 return _createClass(MaterializeForm, [{ 23540 key: "initParams", 23541 value: function initParams(params) { 23542 var selectors = params.selectors, 23543 labelEffect = params.labelEffect; 23544 var group = selectors.group, 23545 label = selectors.label, 23546 input = selectors.input; 23547 var duration = labelEffect.duration, 23548 scale = labelEffect.scale, 23549 y = labelEffect.y, 23550 ease = labelEffect.ease; 23551 return { 23552 'selectors': { 23553 'group': this.isDefined(group) ? group : 'form-group', 23554 'label': this.isDefined(label) ? label : 'label', 23555 'input': this.isDefined(input) ? input : 'input' 23556 }, 23557 'labelEffect': { 23558 'duration': this.isDefined(duration) ? duration : 0.3, 23559 'scale': this.isDefined(scale) ? scale : 0.7, 23560 'y': this.isDefined(y) ? y : -10, 23561 'ease': this.isDefined(ease) ? ease : Power1.easeOut 23562 },
23563 'focusedClasses': { 23564 'group': 'materialize-group-focused', 23565 'label': 'materialize-label-focused', 23566 'input': 'materialize-input-focused' 23567 } 23568 }; 23569 } 23570 23571 /* 23572 | 23573 | initTimeline 23574 |--------------- 23575 */ 23576 }, { 23577 key: "initTimeline", 23578 value: function initTimeline() { 23579 return new TimelineMax({ 23580 paused: true, 23581 onComplete: this.handleComplete, 23582 onReverseComplete: this.handleReverseComplete 23583 }); 23584 } 23585 23586 /** 23587 | 23588 | Init 23589 |------- 23590 */ 23591 }, { 23592 key: "init", 23593 value: function init() { 23594 if (this.formWrapperExist()) { 23595 this.handleToggleInputs(); 23596 } 23597 } 23598 23599 /** 23600 | 23601 | handleToggleInputs 23602 |--------------------- 23603 */ 23604 }, { 23605 key: "handleToggleInputs", 23606 value: function handleToggleInputs() { 23607 var _this = this; 23608 var $formWraper = this.formWrapper; 23609 var _this$params$selector = this.params.selectors, 23610 group = _this$params$selector.group, 23611 input = _this$params$selector.input; 23612 var $input = $formWraper.find(group + ' ' + input); 23613 $.each($input, function () { 23614 var $input = $(this), 23615 $group = $input.closest(group), 23616 $label = $group.find('label'); 23617 if ($input.val() != '') { 23618 _this.animateFocus($label); 23619 } 23620 }); 23621 $input.on('blur focus', function (e) { 23622 console.log('error'); 23623 var event = e.type, 23624 $input = $(this), 23625 $group = $input.closest(group), 23626 $label = $group.find('label'); 23627 event === 'focus' && _this.handleFocus($group, $label); 23628 event === 'blur' && _this.handleBlur($group, $label, $input); 23629 }); 23630 } 23631 23632 /** 23633 | 23634 | handleFocus 23635 |-------------- 23636 */ 23637 }, { 23638 key: "handleFocus", 23639 value: function handleFocus($group, $label) {
23640 var _this$params$focusedC = this.params.focusedClasses, 23641 group = _this$params$focusedC.group, 23642 label = _this$params$focusedC.label; 23643 $group.addClass(group); 23644 $label.addClass(label); 23645 this.animateFocus($label); 23646 } 23647 23648 /** 23649 | 23650 | animateFocus 23651 |-------------- 23652 */ 23653 }, { 23654 key: "animateFocus", 23655 value: function animateFocus($label) { 23656 var _this$params$labelEff = this.params.labelEffect, 23657 duration = _this$params$labelEff.duration, 23658 scale = _this$params$labelEff.scale, 23659 y = _this$params$labelEff.y, 23660 ease = _this$params$labelEff.ease; 23661 TweenMax.to($label, duration, { 23662 scale: scale, 23663 y: y, 23664 transformOrigin: 'left top', 23665 ease: ease 23666 }); 23667 } 23668 23669 /** 23670 | 23671 | handleFocus 23672 |-------------- 23673 */ 23674 }, { 23675 key: "handleBlur", 23676 value: function handleBlur($group, $label, $input) { 23677 var _this$params$focusedC2 = this.params.focusedClasses, 23678 group = _this$params$focusedC2.group, 23679 label = _this$params$focusedC2.label; 23680 if ($input.val() === '') { 23681 $group.removeClass(group); 23682 $label.removeClass(label); 23683 this.animateBlur($label); 23684 } 23685 } 23686 23687 /** 23688 | 23689 | animateBlur 23690 |-------------- 23691 */ 23692 }, { 23693 key: "animateBlur", 23694 value: function animateBlur($label) { 23695 var _this$params$labelEff2 = this.params.labelEffect, 23696 duration = _this$params$labelEff2.duration, 23697 ease = _this$params$labelEff2.ease; 23698 TweenMax.to($label, duration, { 23699 scale: 1, 23700 y: 0, 23701 transformOrigin: 'left top', 23702 ease: ease 23703 }); 23704 } 23705 23706 /** 23707 | 23708 | formWrapperExist 23709 |------------------- 23710 */ 23711 }, { 23712 key: "formWrapperExist", 23713 value: function formWrapperExist() { 23714 return this.control(this.exist(this.formWrapper), this.getMessage('formWrapperExist'), this.formWrapper); 23715 } 23716 23717 /** 23718 | 23719 | Helper: isDefined 23720 |-------------------- 23721 | 23722 */ 23723 }, { 23724 key: "isDefined", 23725 value: function isDefined(item) { 23726 return typeof item !== 'undefined'; 23727 } 23728 23729 /** 23730 | 23731 | Helper: exist 23732 |---------------- 23733 */ 23734 }, { 23735 key: "exist", 23736 value: function exist($item) { 23737 return $item.length; 23738 } 23739 23740 /** 23741 | 23742 | Helper: control 23743 |------------------ 23744 */ 23745 }, { 23746 key: "control", 23747 value: function control(condition, message) { 23748 var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23749 if (!condition) { 23750 if (selector === null) { 23751 console.error(message); 23752 } else { 23753 console.error(message, selector); 23754 } 23755 } 23756 return condition; 23757 } 23758 23759 /** 23760 | 23761 | Helper: getMessage 23762 |--------------------- 23763 */ 23764 }, { 23765 key: "getMessage", 23766 value: function getMessage(messageKey) { 23767 var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 23768 var var2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 23769 var messages = { 23770 'formWrapperExist': 'The form wrapper (specified as 1st parameter) does not exist:' 23771 }; 23772 return 'Materialize form: ' + messages[messageKey]; 23773 } 23774 }]); 23775}(); 23776/* harmony default export */ __webpack_exports__["default"] = (MaterializeForm); 23777/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 23778 23779/***/ }), 23780
23781/***/ "./src/js/components/menu.js": 23782/*!***********************************!*\ 23783 !*** ./src/js/components/menu.js ***! 23784 \***********************************/ 23785/*! exports provided: default */ 23786/***/ (function(module, __webpack_exports__, __webpack_require__) { 23787 23788"use strict"; 23789__webpack_require__.r(__webpack_exports__); 23790/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js"); 23791function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 23792function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 23793function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 23794function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 23795function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 23796function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 23797/*** IMPORTS FROM imports-loader ***/ 23798var define = false; 23799 23800// src/js/components/menu.js 23801 23802 23803var Menu = /*#__PURE__*/function () { 23804 function Menu($menuWrapper, $menuButton) { 23805 var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 23806 _classCallCheck(this, Menu); 23807 this.bindMethods(); 23808 this.handleSubmenus(); 23809 this.menuWrapper = $menuWrapper; 23810 this.menuButton = $menuButton; 23811 this.menuTimeline = this.initTimeline(); 23812 this.params = this.initParams(params); 23813 } 23814 return _createClass(Menu, [{ 23815 key: "bindMethods", 23816 value: function bindMethods() { 23817 this.handleComplete = this.handleComplete.bind(this); 23818 this.handleReverseComplete = this.handleReverseComplete.bind(this); 23819 } 23820 }, { 23821 key: "initParams", 23822 value: function initParams(params) { 23823 var activeClass = params.activeClass, 23824 reverseTimeScale = params.reverseTimeScale; 23825 return { 23826 activeClass: activeClass != null ? activeClass : 'menu-active', 23827 reverseTimeScale: reverseTimeScale != null ? reverseTimeScale : 1 23828 }; 23829 } 23830 }, { 23831 key: "initTimeline", 23832 value: function initTimeline() { 23833 return gsap__WEBPACK_IMPORTED_MODULE_0__["gsap"].timeline({ 23834 paused: true, 23835 onComplete: this.handleComplete, 23836 onReverseComplete: this.handleReverseComplete 23837 }); 23838 } 23839 }, { 23840 key: "init", 23841 value: function init() { 23842 if (this.menuWrapperExist() && this.menuButtonExist()) { 23843 this.handleToggleMenu(); 23844 } 23845 } 23846 }, { 23847 key: "handleToggleMenu", 23848 value: function handleToggleMenu() { 23849 var _this = this; 23850 this.menuButton.on('click', function () { 23851 if (_this.menuIsActive()) { 23852 _this.close(); 23853 } else { 23854 _this.open(); 23855 } 23856 }); 23857 } 23858 }, { 23859 key: "handleComplete", 23860 value: function handleComplete() { 23861 this.dispachEvent(this.menuWrapper, 'menu:opened'); 23862 } 23863 }, { 23864 key: "handleReverseComplete", 23865 value: function handleReverseComplete() { 23866 this.dispachEvent(this.menuWrapper, 'menu:closed'); 23867 } 23868 }, { 23869 key: "open", 23870 value: function open() { 23871 this.menuTimeline.timeScale(1).play(); 23872 this.dispachEvent(this.menuWrapper, 'menu:open'); 23873 } 23874 }, { 23875 key: "close", 23876 value: function close() { 23877 this.menuTimeline.timeScale(this.params.reverseTimeScale).reverse(); 23878 this.dispachEvent(this.menuWrapper, 'menu:close'); 23879 } 23880 }, { 23881 key: "menuIsActive", 23882 value: function menuIsActive() { 23883 return this.menuTimeline.totalProgress() !== 0; 23884 } 23885 }, { 23886 key: "menuWrapperExist", 23887 value: function menuWrapperExist() { 23888 return this.control(this.exist(this.menuWrapper), this.getMessage('menuWrapperExist')); 23889 } 23890 }, { 23891 key: "menuButtonExist", 23892 value: function menuButtonExist() { 23893 return this.control(this.exist(this.menuButton), this.getMessage('menuButtonExist')); 23894 } 23895 }, { 23896 key: "isDefined", 23897 value: function isDefined(item) { 23898 return typeof item !== 'undefined'; 23899 } 23900 }, { 23901 key: "exist", 23902 value: function exist($item) { 23903 return $item.length > 0; 23904 } 23905 }, { 23906 key: "control", 23907 value: function control(condition, message) { 23908 var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23909 if (!condition) { 23910 console.error(message, selector || ''); 23911 } 23912 return condition; 23913 } 23914 }, { 23915 key: "dispachEvent", 23916 value: function dispachEvent($element, eventName) { 23917 var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 23918 var event = $.Event(eventName); 23919 if (data) {
23920 Object.keys(data).forEach(function (key) { 23921 event[key] = data[key]; 23922 }); 23923 } 23924 $element.trigger(event); 23925 } 23926 }, { 23927 key: "getMessage", 23928 value: function getMessage(key) { 23929 var messages = { 23930 menuWrapperExist: 'The menu wrapper (specified as 1st parameter) does not exist', 23931 menuButtonExist: 'The button menu (specified as 2nd parameter) does not exist' 23932 }; 23933 return "Menu: ".concat(messages[key]); 23934 } 23935 }, { 23936 key: "handleSubmenus", 23937 value: function handleSubmenus() { 23938 var $toggles = $('[data-toggle-submenu]'); 23939 var $overlay = $('.submenu-overlay'); 23940 $('nav .item-menu a').on('click', function (e) { 23941 if (this.getAttribute('href') === '#') { 23942 e.preventDefault(); 23943 } 23944 }); 23945 $toggles.on('click', function (e) { 23946 var $this = $(this); 23947 var isOpen = $this.hasClass('submenu-open'); 23948 $('[data-toggle-submenu]').removeClass('submenu-open'); 23949 $overlay.removeClass('visible'); 23950 if (!isOpen) { 23951 $this.addClass('submenu-open'); 23952 $overlay.addClass('visible'); 23953 } 23954 }); 23955 $overlay.on('click', function () { 23956 $('[data-toggle-submenu]').removeClass('submenu-open'); 23957 $overlay.removeClass('visible'); 23958 }); 23959 } 23960 }]); 23961}(); 23962/* harmony default export */ __webpack_exports__["default"] = (Menu); 23963/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 23964 23965/***/ }), 23966
23967/***/ "./src/js/pages/animations.js": 23968/*!************************************!*\ 23969 !*** ./src/js/pages/animations.js ***! 23970 \************************************/ 23971/*! exports provided: default */ 23972/***/ (function(module, __webpack_exports__, __webpack_require__) { 23973 23974"use strict"; 23975__webpack_require__.r(__webpack_exports__); 23976/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lib/gsap-pro/SplitText */ "./src/lib/gsap-pro/SplitText.js"); 23977/* harmony import */ var _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0__); 23978/*** IMPORTS FROM imports-loader ***/ 23979var define = false; 23980 23981// src/js/pages/animations.js 23982 23983/* harmony default export */ __webpack_exports__["default"] = ({ 23984 init: function init(app, Menu, Kira, ScrollMagic, gsap) { 23985 var $body = $('body'), 23986 $pageLoader = $('.page-loader'), 23987 scrollAreas = document.querySelectorAll('.scroll-area'), 23988 $splitItems = $body.find('[data-splittext]'), 23989 $menuWrapper = $('#mobile-menu'), 23990 $menuButton = $('#header .btn-menu'), 23991 $menuBars = $menuButton.find('.item-burger > span'), 23992 $menuClose = $menuWrapper.find('.item-close'), 23993 $menuStaggerItems = $menuWrapper.find('[data-stagger-item]'); 23994 $splitItems.each(function () { 23995 var $item = $(this); 23996 var split = new _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0___default.a($item, { 23997 type: $item.data('splittext') || 'words, chars', 23998 linesClass: 'item-line', 23999 wordsClass: 'item-word', 24000 charsClass: 'item-char' 24001 }); 24002 $item[0].split = split; 24003 }); 24004 $body.on('loaderEnd', function () { 24005 $splitItems.addClass('split-ready'); 24006 }); 24007 scrollAreas.forEach(function (el) { 24008 return Scrollbar.init(el); 24009 }); 24010 var loaderTl = gsap.timeline({ 24011 paused: true 24012 }); 24013 loaderTl.to($pageLoader.find('.item-loadbar-inner'), { 24014 duration: 0.4, 24015 scaleX: 1, 24016 ease: 'none' 24017 }, 'start').to($pageLoader.find('.item-content'), { 24018 duration: 0.8, 24019 autoAlpha: 0, 24020 ease: 'power1.out' 24021 }, 'start').call(function () { 24022 app.dispachEvent($body, 'loaderEnd'); 24023 }).to($pageLoader, { 24024 duration: 0.8, 24025 autoAlpha: 0, 24026 ease: 'power1.out' 24027 }); 24028 $(window).on('load', function () { 24029 return loaderTl.play(); 24030 }); 24031 var menu = new Menu($menuWrapper, $menuButton, { 24032 reverseTimeScale: 2 24033 }); 24034 menu.menuTimeline.to($menuBars.eq(1), { 24035 duration: 0.3, 24036 autoAlpha: 0 24037 }, 'start').to($menuBars.eq(0), { 24038 duration: 0.5, 24039 x: 0, 24040 y: 8, 24041 rotation: 45, 24042 ease: 'power1.out' 24043 }, 'start').to($menuBars.eq(2), { 24044 duration: 0.5, 24045 x: 0, 24046 y: -8, 24047 rotation: -45, 24048 ease: 'power1.out' 24049 }, 'start').to($menuWrapper, { 24050 duration: 0.5, 24051 autoAlpha: 1, 24052 ease: 'power1.out' 24053 }, 'start+=0.3').staggerFrom($menuStaggerItems, 0.6, { 24054 autoAlpha: 0, 24055 x: 20, 24056 ease: 'power1.out' 24057 }, 0.1, 'start+=0.3'); 24058 menu.init(); 24059 var kira = new Kira(ScrollMagic, { 24060 debug: false, 24061 loadEvent: { 24062 domElement: $body, 24063 eventName: 'loaderEnd' 24064 }, 24065 optimize: true, 24066 options: { 24067 start: '-=0.6', 24068 triggerHook: 'onEnter' 24069 } 24070 }); 24071 kira.add('fadeInUp', function ($item, timeline, start) { 24072 timeline.fromTo($item, { 24073 y: 50 24074 }, { 24075 y: 0, 24076 autoAlpha: 1, 24077 duration: 1.3, 24078 ease: 'power1.out' 24079 }, start); 24080 }); 24081 kira.add('fadeInUp.parallax', function ($item, timeline, start) { 24082 timeline.fromTo($item, { 24083 y: 100 24084 }, { 24085 y: 0, 24086 autoAlpha: 1, 24087 duration: 0.8, 24088 ease: 'sine.out' 24089 }, start); 24090 }); 24091 kira.add('splitline', function ($item, timeline, start) { 24092 $item.find('.item-line').each(function () { 24093 timeline.from($(this).children(), { 24094 y: '101%', 24095 duration: 1.35, 24096 ease: 'power1.out' 24097 }, start); 24098 }); 24099 }); 24100 kira.add('splittext.long', function ($item, timeline, start) { 24101 timeline.staggerFrom($item[0].split.chars, 0.8, { 24102 y: 5, 24103 opacity: 0, 24104 ease: 'sine.out' 24105 }, $item.data('delay') || 0.01, start); 24106 }); 24107 kira.add('fadeInLeft.stagger.sm', function ($item, timeline, start) { 24108 timeline.staggerFromTo($item.find('[data-stagger-item]'), 0.6, { 24109 x: 20 24110 }, { 24111 autoAlpha: 1, 24112 x: 0, 24113 ease: 'power1.out' 24114 }, 0.1, start); 24115 }); 24116 kira.add('fadeInUp.stagger.sm', function ($item, timeline, start) { 24117 timeline.staggerFromTo($item.find('[data-stagger-item]'), 0.6, { 24118 y: 20 24119 }, { 24120 autoAlpha: 1, 24121 y: 0, 24122 ease: 'power1.out' 24123 }, 0.1, start); 24124 }); 24125 kira.add('scaleX', function ($item, timeline, start) { 24126 timeline.from($item, { 24127 scaleX: 0, 24128 transformOrigin: 'left top', 24129 duration: 1, 24130 ease: 'expo.inOut' 24131 }, start); 24132 }); 24133 kira.init(); 24134 } 24135}); 24136/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 24137 24138/***/ }), 24139
24140/***/ "./src/js/pages/contact.js": 24141/*!*********************************!*\ 24142 !*** ./src/js/pages/contact.js ***! 24143 \*********************************/ 24144/*! exports provided: default */ 24145/***/ (function(module, __webpack_exports__, __webpack_require__) { 24146 24147"use strict"; 24148__webpack_require__.r(__webpack_exports__); 24149/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/ 24150var define = false; 24151/* harmony default export */ __webpack_exports__["default"] = ({ 24152 init: function init(app, MaterializeForm, customGoogleMap) { 24153 /* 24154 | 24155 | Constants 24156 |------------ 24157 */ 24158 var $map = $('#map'), 24159 $contactForm = $('.contact-form'); 24160 24161 /* 24162 | 24163 | initGoogleMap 24164 |---------------- 24165 | 24166 */ 24167 $.each($map, function () { 24168 var $map = $(this); 24169 var map = new customGoogleMap($map, { 24170 'markers': $map.find('.marker'), 24171 'zoom': 16 24172 }); 24173 }); 24174 24175 /* 24176 | 24177 | Materialize form 24178 |------------------- 24179 | 24180 */ 24181 new MaterializeForm($contactForm, { 24182 selectors: { 24183 group: '.gfield', 24184 label: '.gfield_label', 24185 input: '.ginput_container_text input, .ginput_container_email input' 24186 }, 24187 labelEffect: { 24188 duration: 0.3, 24189 ease: Power2.easeOut 24190 } 24191 }); 24192 } 24193}); 24194/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 24195 24196/***/ }), 24197
24198/***/ "./src/js/pages/main.js": 24199/*!******************************!*\ 24200 !*** ./src/js/pages/main.js ***! 24201 \******************************/ 24202/*! exports provided: default */ 24203/***/ (function(module, __webpack_exports__, __webpack_require__) { 24204 24205"use strict"; 24206__webpack_require__.r(__webpack_exports__); 24207/* WEBPACK VAR INJECTION */(function($, jQuery) {/*** IMPORTS FROM imports-loader ***/ 24208var define = false; 24209/* harmony default export */ __webpack_exports__["default"] = ({ 24210 init: function init(app, CookieManager, Swiper) { 24211 /* 24212 | 24213 | Constants 24214 |----------- 24215 */ 24216 var $body = $('body'), 24217 $cookieBanner = $('.cookie-banner'), 24218 $cookieClose = $cookieBanner.find('.item-close'), 24219 $cookieAccept = $cookieBanner.find('.item-accept'), 24220 $cookieRefuse = $cookieBanner.find('.item-refuse'); 24221 24222 /* 24223 | 24224 | Cookie Manager 24225 |----------------- 24226 */ 24227 new CookieManager($cookieBanner, { 24228 name: 'adveris_cookie_use', 24229 duration: 30, 24230 buttons: { 24231 accept: $cookieAccept, 24232 refuse: $cookieRefuse, 24233 close: $cookieClose 24234 }, 24235 onAccept: function onAccept() { 24236 console.log('accpeted'); 24237 }, 24238 onRefuse: function onRefuse() { 24239 console.log('refused'); 24240 } 24241 }); 24242 24243 /* 24244 | 24245 | Slider flex 24246 |----------------- 24247 */ 24248 var swipergallery = new Swiper('.swiper-gallery', { 24249 loop: true, 24250 autoplay: { 24251 delay: 5000 24252 }, 24253 speed: 1000, 24254 slidesPerView: 1, 24255 loopedSlides: 50, 24256 navigation: { 24257 nextEl: ".swiper-button-next", 24258 prevEl: ".swiper-button-prev" 24259 } 24260 }); 24261 24262 /* 24263 | 24264 | Slider logo 24265 |----------------- 24266 */ 24267 var swiperslider = new Swiper('.swiper-logo', { 24268 navigation: { 24269 nextEl: ".swiper-button-next", 24270 prevEl: ".swiper-button-prev" 24271 }, 24272 loop: true, 24273 speed: 1000, 24274 slidesPerView: 1, 24275 breakpoints: { 24276 480: { 24277 slidesPerView: 1, 24278 spaceBetween: 30 24279 }, 24280 768: { 24281 slidesPerView: 2, 24282 spaceBetween: 30 24283 }, 24284 992: { 24285 slidesPerView: 3, 24286 spaceBetween: 40 24287 }, 24288 1200: { 24289 slidesPerView: 4, 24290 spaceBetween: 40 24291 } 24292 } 24293 }); 24294 24295 /* 24296 | 24297 | Slider flex 24298 |----------------- 24299 */ 24300 // var swipercontainer = new Swiper('#swiper-container', { 24301 // loop: true, 24302 // autoplay: { 24303 // delay: 5000, 24304 // }, 24305 // speed: 1000, 24306 // slidesPerView: 1, 24307 // spaceBetween: 15, 24308 // loopedSlides: 50, 24309 // navigation: { 24310 // nextEl: ".swiper-button-next", 24311 // prevEl: ".swiper-button-prev" 24312 // } 24313 // }); 24314 24315 /* 24316 | 24317 | Slider actus 24318 |----------------- 24319 */ 24320 var swiperactus = new Swiper('.swiper-actus', { 24321 loop: true, 24322 autoplay: { 24323 delay: 5000 24324 }, 24325 speed: 1000, 24326 slidesPerView: 1, 24327 spaceBetween: 15, 24328 loopedSlides: 50, 24329 navigation: { 24330 nextEl: ".swiper-button-next", 24331 prevEl: ".swiper-button-prev" 24332 } 24333 }); 24334 24335 /* 24336 | 24337 | Slider home 24338 |----------------- 24339 */ 24340 var swiperhome = new Swiper('.swiper-home', { 24341 autoHeight: true, 24342 //enable auto height 24343 loop: true, 24344 slidesPerView: 1, 24345 loopedSlides: 50, 24346 navigation: { 24347 nextEl: ".swiper-button-next", 24348 prevEl: ".swiper-button-prev" 24349 } 24350 }); 24351 24352 /* 24353 | 24354 | Slider chrono 24355 |----------------- 24356 */ 24357 var chronoThumbs = new Swiper('.chrono-thumbs', { 24358 spaceBetween: 10, 24359 centeredSlides: true, 24360 touchRatio: 0.2, 24361 slideToClickedSlide: true, 24362 slidesPerView: 5, 24363 speed: 1000, 24364 navigation: { 24365 nextEl: '.swiper-chrono-prev', 24366 prevEl: '.swiper-chrono-next' 24367 }, 24368 breakpoints: { 24369 0: { 24370 slidesPerView: 1 24371 }, 24372 480: { 24373 slidesPerView: 1 24374 }, 24375 768: { 24376 slidesPerView: 3 24377 }, 24378 992: { 24379 slidesPerView: 3 24380 }, 24381 1200: { 24382 slidesPerView: 5 24383 } 24384 } 24385 }); 24386 var chronoContent = new Swiper('.chrono-content', { 24387 autoHeight: true //enable auto height 24388 }); 24389 var chronoGalerie = new Swiper('.chrono-galerie', { 24390 autoHeight: true, 24391 //enable auto height 24392 loop: true, 24393 speed: 1000, 24394 slidesPerView: 1, 24395 loopedSlides: 50, 24396 navigation: { 24397 nextEl: ".swiper-button-next", 24398 prevEl: ".swiper-button-prev" 24399 } 24400 }); 24401 if (document.getElementsByClassName('chrono-thumbs').length) { 24402 chronoContent.controller.control = chronoThumbs; 24403 chronoThumbs.controller.control = chronoContent; 24404 } 24405 24406 /* 24407 | 24408 | Menu home
24409 |----------------- 24410 */ 24411 jQuery('.menu-sites a').on("mouseover", function () { 24412 var bgimg = jQuery(this).data("image"); 24413 jQuery(this).parent().css("background-image", 'url(' + bgimg + ')'); 24414 }); 24415 24416 /* 24417 | 24418 | Menu scroll 24419 |----------------- 24420 */ 24421 var lastScrollTop = 0; 24422 $(window).scroll(function () { 24423 var st = $(this).scrollTop(); 24424 var banner = $('#header'); 24425 if ($(this).scrollTop() > 5) { 24426 banner.addClass('active'); 24427 } else { 24428 banner.removeClass('active'); 24429 } 24430 }); 24431 24432 /* 24433 | 24434 | top-banner 24435 |----------------- 24436 */ 24437 var banner = document.querySelector('.top-banner'); 24438 var closeBtn = banner === null || banner === void 0 ? void 0 : banner.querySelector('.close'); 24439 var menu = document.querySelector('.sticky-menu'); 24440 if (banner && closeBtn) { 24441 if (document.cookie.includes('bannerClosed=true')) { 24442 banner.classList.add('closed'); 24443 menu.style.marginTop = '0'; 24444 } 24445 closeBtn.addEventListener('click', function () { 24446 banner.classList.add('closed'); 24447 menu.style.marginTop = '0'; 24448 var d = new Date(); 24449 d.setTime(d.getTime() + 7 * 24 * 60 * 60 * 1000); 24450 document.cookie = 'bannerClosed=true; expires=' + d.toUTCString() + '; path=/'; 24451 }); 24452 } 24453 24454 // $body.on('loaderEnd', () => console.log('ended')) 24455 } 24456}); 24457/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 24458 24459/***/ }), 24460
24461/***/ "./src/js/pages/news.js": 24462/*!******************************!*\ 24463 !*** ./src/js/pages/news.js ***! 24464 \******************************/ 24465/*! exports provided: default */ 24466/***/ (function(module, __webpack_exports__, __webpack_require__) { 24467 24468"use strict"; 24469__webpack_require__.r(__webpack_exports__); 24470/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/ 24471var define = false; 24472/* harmony default export */ __webpack_exports__["default"] = ({ 24473 init: function init(app) { 24474 /* 24475 | 24476 | Constants 24477 |------------ 24478 */ 24479 var $loadMoreBtn = $('.load-more-btn'), 24480 $postsContainer = $('.loaded-posts'), 24481 $loadMoreContainer = $('.load-more-container'), 24482 $loadMore = $('.load-more'), 24483 $loaderContainer = $('.loader-container'); 24484 var xhr = null; 24485 24486 /* 24487 | 24488 | Load more ajax 24489 |-------------- 24490 */ 24491 $loadMoreBtn.on('click', function (e) { 24492 e.preventDefault(); 24493 abort(xhr); 24494 var offset = $postsContainer.find('.custom-card').length; 24495 var url = "/ajax/posts/".concat(offset, "/"); 24496 xhr = $.ajax({ 24497 url: url, 24498 type: 'GET', 24499 method: 'GET', 24500 dataType: 'json', 24501 beforeSend: function beforeSend() { 24502 TweenMax.to($loadMore, 0.5, { 24503 autoAlpha: 0, 24504 y: 30, 24505 display: "none", 24506 ease: Power1.easeOut, 24507 onComplete: function onComplete() { 24508 TweenMax.fromTo($loaderContainer, 0.5, { 24509 autoAlpha: 0, 24510 y: 30, 24511 display: "none" 24512 }, { 24513 autoAlpha: 1, 24514 y: 0, 24515 display: "block", 24516 ease: Power1.easeOut 24517 }); 24518 } 24519 }); 24520 }, 24521 success: function success(response, status) { 24522 $postsContainer.append(response); 24523 TweenMax.to($loaderContainer, 0.5, { 24524 autoAlpha: 0, 24525 y: 50, 24526 display: "none", 24527 ease: Power1.easeOut 24528 }); 24529 if ($(response).find('.no-more-post').length) { 24530 $loadMoreContainer.remove(); 24531 } else { 24532 TweenMax.to($loadMore, 0.5, { 24533 autoAlpha: 1, 24534 y: 0, 24535 display: "block", 24536 ease: Power1.easeOut 24537 }); 24538 } 24539 xhr = null; 24540 }, 24541 error: function error(response, status, _error) { 24542 console.log(_error); 24543 } 24544 }); 24545 }); 24546 24547 /* 24548 | HELPER 24549 | 24550 | abort ajax request 24551 |------------ 24552 */ 24553 function abort(xhrVar) { 24554 var $list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; 24555 if (xhrVar !== null) { 24556 xhrVar.abort(); 24557 } 24558 if ($list !== null) { 24559 $list.find('.loading--ajax').hide(); 24560 } 24561 } 24562 } 24563}); 24564/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 24565 24566/***/ }), 24567
24568/***/ "./src/js/pages/sample.js": 24569/*!********************************!*\ 24570 !*** ./src/js/pages/sample.js ***! 24571 \********************************/ 24572/*! exports provided: default */ 24573/***/ (function(module, __webpack_exports__, __webpack_require__) { 24574 24575"use strict"; 24576__webpack_require__.r(__webpack_exports__); 24577/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/ 24578var define = false; 24579/* harmony default export */ __webpack_exports__["default"] = ({ 24580 init: function init(app) { 24581 app.dump('sample.js'); 24582 24583 /* 24584 | 24585 | Constants 24586 |----------- 24587 */ 24588 var $loadedPostsContainer = $('.loaded-posts'); 24589 24590 /* 24591 | 24592 | Ajax Sample 24593 |-------------- 24594 */ 24595 $('[data-ajax-url]').on('click', function (e) { 24596 e.preventDefault(); 24597 $.ajax({ 24598 url: $(this).data('ajax-url'), 24599 type: 'GET', 24600 dataType: 'json', 24601 success: function success(response, status) { 24602 $loadedPostsContainer.append(response); 24603 }, 24604 error: function error(response, status, _error) { 24605 console.log(response, status, _error); 24606 } 24607 }); 24608 }); 24609 } 24610}); 24611/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 24612 24613/***/ }), 24614
24615/***/ "./src/js/utils/router.js": 24616/*!********************************!*\ 24617 !*** ./src/js/utils/router.js ***! 24618 \********************************/ 24619/*! exports provided: default */ 24620/***/ (function(module, __webpack_exports__, __webpack_require__) { 24621 24622"use strict"; 24623__webpack_require__.r(__webpack_exports__); 24624function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 24625function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 24626function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 24627function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 24628function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 24629function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 24630/*** IMPORTS FROM imports-loader ***/ 24631var define = false; 24632var Router = /*#__PURE__*/function () { 24633 function Router(routes) { 24634 _classCallCheck(this, Router); 24635 this.routes = routes; 24636 } 24637 return _createClass(Router, [{ 24638 key: "load", 24639 value: function load() { 24640 var _this = this; 24641 var routes = this.routes; 24642 routes.map(function (route) { 24643 var resolve = route.resolve; 24644 if (typeof route.resolve !== 'undefined') { 24645 document.querySelectorAll(resolve).length && _this.runInitialization(route); 24646 } else { 24647 _this.runInitialization(route); 24648 } 24649 }); 24650 } 24651 }, { 24652 key: "runInitialization", 24653 value: function runInitialization(route) { 24654 route.file.init.apply(null, route.dependencies); 24655 } 24656 }]); 24657}(); 24658/* harmony default export */ __webpack_exports__["default"] = (Router); 24659 24660/***/ }), 24661
24662/***/ "./src/lib/gsap-pro/SplitText.js": 24663/*!***************************************!*\ 24664 !*** ./src/lib/gsap-pro/SplitText.js ***! 24665 \***************************************/ 24666/*! no static exports found */ 24667/***/ (function(module, exports, __webpack_require__) { 24668 24669/* WEBPACK VAR INJECTION */(function(global) {/*** IMPORTS FROM imports-loader ***/ 24670var define = false; 24671 24672/*! 24673 * VERSION: 0.5.8 24674 * DATE: 2017-08-22 24675 * UPDATES AND DOCS AT: http://greensock.com 24676 * 24677 * @license Copyright (c) 2008-2017, GreenSock. All rights reserved. 24678 * SplitText is a Club GreenSock membership benefit; You must have a valid membership to use 24679 * this code without violating the terms of use. Visit http://greensock.com/club/ to sign up or get more details. 24680 * This work is subject to the software agreement that was issued with your membership. 24681 * 24682 * @author: Jack Doyle, [email protected] 24683 */ 24684var _gsScope = true && module.exports && typeof global !== "undefined" ? global : this || window; //helps ensure compatibility with AMD/RequireJS and CommonJS/Node 24685(function (window) { 24686 "use strict"; 24687 24688 var _globals = window.GreenSockGlobals || window, 24689 _namespace = function _namespace(ns) { 24690 var a = ns.split("."), 24691 p = _globals, 24692 i; 24693 for (i = 0; i < a.length; i++) { 24694 p[a[i]] = p = p[a[i]] || {}; 24695 } 24696 return p; 24697 }, 24698 pkg = _namespace("com.greensock.utils"), 24699 _getText2 = function _getText(e) { 24700 var type = e.nodeType, 24701 result = ""; 24702 if (type === 1 || type === 9 || type === 11) { 24703 if (typeof e.textContent === "string") { 24704 return e.textContent; 24705 } else { 24706 for (e = e.firstChild; e; e = e.nextSibling) { 24707 result += _getText2(e); 24708 } 24709 } 24710 } else if (type === 3 || type === 4) { 24711 return e.nodeValue; 24712 } 24713 return result; 24714 }, 24715 _doc = document, 24716 _getComputedStyle = _doc.defaultView ? _doc.defaultView.getComputedStyle : function () {}, 24717 _capsExp = /([A-Z])/g, 24718 _getStyle = function _getStyle(t, p, cs, str) { 24719 var result; 24720 if (cs = cs || _getComputedStyle(t, null)) { 24721 t = cs.getPropertyValue(p.replace(_capsExp, "-$1").toLowerCase()); 24722 result = t || cs.length ? t : cs[p]; //Opera behaves VERY strangely - length is usually 0 and cs[p] is the only way to get accurate results EXCEPT when checking for -o-transform which only works with cs.getPropertyValue()! 24723 } else if (t.currentStyle) { 24724 cs = t.currentStyle; 24725 result = cs[p]; 24726 } 24727 return str ? result : parseInt(result, 10) || 0; 24728 }, 24729 _isArrayLike = function _isArrayLike(e) { 24730 return e.length && e[0] && (e[0].nodeType && e[0].style && !e.nodeType || e[0].length && e[0][0]) ? true : false; //could be an array of jQuery objects too, so accommodate that. 24731 }, 24732 _flattenArray = function _flattenArray(a) { 24733 var result = [], 24734 l = a.length, 24735 i, 24736 e, 24737 j; 24738 for (i = 0; i < l; i++) { 24739 e = a[i]; 24740 if (_isArrayLike(e)) { 24741 j = e.length; 24742 for (j = 0; j < e.length; j++) { 24743 result.push(e[j]); 24744 } 24745 } else { 24746 result.push(e); 24747 } 24748 } 24749 return result; 24750 }, 24751 _stripExp = /(?:\r|\n|\t\t)/g, 24752 //find carriage returns, new line feeds and double-tabs. 24753 _multipleSpacesExp = /(?:\s\s+)/g, 24754 _emojiStart = 0xD800, 24755 _emojiEnd = 0xDBFF, 24756 _emojiLowStart = 0xDC00, 24757 _emojiRegionStart = 0x1F1E6, 24758 _emojiRegionEnd = 0x1F1FF, 24759 _emojiModStart = 0x1f3fb, 24760 _emojiModEnd = 0x1f3ff, 24761 _emojiPairCode = function _emojiPairCode(s) { 24762 return (s.charCodeAt(0) - _emojiStart << 10) + (s.charCodeAt(1) - _emojiLowStart) + 0x10000; 24763 }, 24764 _isOldIE = _doc.all && !_doc.addEventListener, 24765 _divStart = " style='position:relative;display:inline-block;" + (_isOldIE ? "*display:inline;*zoom:1;'" : "'"), 24766 //note: we must use both display:inline-block and *display:inline for IE8 and earlier, otherwise it won't flow correctly (and if we only use display:inline, IE won't render most of the property tweens - very odd). 24767 _cssClassFunc = function _cssClassFunc(cssClass, tag) { 24768 cssClass = cssClass || ""; 24769 var iterate = cssClass.indexOf("++") !== -1, 24770 num = 1; 24771 if (iterate) { 24772 cssClass = cssClass.split("++").join(""); 24773 } 24774 return function () { 24775 return "<" + tag + _divStart + (cssClass ? " class='" + cssClass + (iterate ? num++ : "") + "'>" : ">"); 24776 }; 24777 }, 24778 SplitText = pkg.SplitText = _globals.SplitText = function (element, vars) { 24779 if (typeof element === "string") { 24780 element = SplitText.selector(element); 24781 } 24782 if (!element) { 24783 throw "cannot split a null element."; 24784 } 24785 this.elements = _isArrayLike(element) ? _flattenArray(element) : [element]; 24786 this.chars = []; 24787 this.words = []; 24788 this.lines = []; 24789 this._originals = []; 24790 this.vars = vars || {}; 24791 this.split(vars); 24792 }, 24793 _swapText2 = function _swapText(element, oldText, newText) { 24794 var type = element.nodeType; 24795 if (type === 1 || type === 9 || type === 11) { 24796 for (element = element.firstChild; element; element = element.nextSibling) { 24797 _swapText2(element, oldText, newText); 24798 } 24799 } else if (type === 3 || type === 4) { 24800 element.nodeValue = element.nodeValue.split(oldText).join(newText); 24801 } 24802 }, 24803 _pushReversed = function _pushReversed(a, merge) { 24804 var i = merge.length; 24805 while (--i > -1) { 24806 a.push(merge[i]); 24807 } 24808 }, 24809 _slice = function _slice(a) { 24810 //don't use Array.prototype.slice.call(target, 0) because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll() 24811 var b = [], 24812 l = a.length, 24813 i; 24814 for (i = 0; i !== l; b.push(a[i++])) {} 24815 return b; 24816 }, 24817 _isBeforeWordDelimiter = function _isBeforeWordDelimiter(e, root, wordDelimiter) { 24818 var next; 24819 while (e && e !== root) { 24820 next = e._next || e.nextSibling; 24821 if (next) { 24822 return next.textContent.charAt(0) === wordDelimiter; 24823 } 24824 e = e.parentNode || e._parent; 24825 } 24826 return false;
24827 }, 24828 _deWordify2 = function _deWordify(e) { 24829 var children = _slice(e.childNodes), 24830 l = children.length, 24831 i, 24832 child; 24833 for (i = 0; i < l; i++) { 24834 child = children[i]; 24835 if (child._isSplit) { 24836 _deWordify2(child); 24837 } else { 24838 if (i && child.previousSibling.nodeType === 3) { 24839 child.previousSibling.nodeValue += child.nodeType === 3 ? child.nodeValue : child.firstChild.nodeValue; 24840 } else if (child.nodeType !== 3) { 24841 e.insertBefore(child.firstChild, child); 24842 } 24843 e.removeChild(child); 24844 } 24845 } 24846 }, 24847 _setPositionsAfterSplit = function _setPositionsAfterSplit(element, vars, allChars, allWords, allLines, origWidth, origHeight) { 24848 var cs = _getComputedStyle(element), 24849 paddingLeft = _getStyle(element, "paddingLeft", cs), 24850 lineOffsetY = -999, 24851 borderTopAndBottom = _getStyle(element, "borderBottomWidth", cs) + _getStyle(element, "borderTopWidth", cs), 24852 borderLeftAndRight = _getStyle(element, "borderLeftWidth", cs) + _getStyle(element, "borderRightWidth", cs), 24853 padTopAndBottom = _getStyle(element, "paddingTop", cs) + _getStyle(element, "paddingBottom", cs), 24854 padLeftAndRight = _getStyle(element, "paddingLeft", cs) + _getStyle(element, "paddingRight", cs), 24855 lineThreshold = _getStyle(element, "fontSize") * 0.2, 24856 textAlign = _getStyle(element, "textAlign", cs, true), 24857 charArray = [], 24858 wordArray = [], 24859 lineArray = [], 24860 wordDelimiter = vars.wordDelimiter || " ", 24861 tag = vars.span ? "span" : "div", 24862 types = vars.type || vars.split || "chars,words,lines", 24863 lines = allLines && types.indexOf("lines") !== -1 ? [] : null, 24864 words = types.indexOf("words") !== -1, 24865 chars = types.indexOf("chars") !== -1, 24866 absolute = vars.position === "absolute" || vars.absolute === true, 24867 linesClass = vars.linesClass, 24868 iterateLine = (linesClass || "").indexOf("++") !== -1, 24869 spaceNodesToRemove = [], 24870 i, 24871 j, 24872 l, 24873 node, 24874 nodes, 24875 isChild, 24876 curLine, 24877 addWordSpaces, 24878 style, 24879 lineNode, 24880 lineWidth, 24881 offset; 24882 if (lines && element.children.length === 1 && element.children[0]._isSplit) { 24883 //lines are always split on the main element (not inside nested elements), so if there's only one child, bust apart lines inside that rather than forcing it all into one big line. Like <div><div>lots of stuff</div></div> - if they split the outer one, it'd all be in one line. 24884 element = element.children[0]; 24885 } 24886 if (iterateLine) { 24887 linesClass = linesClass.split("++").join(""); 24888 } 24889 24890 //copy all the descendant nodes into an array (we can't use a regular nodeList because it's live and we may need to renest things) 24891 j = element.getElementsByTagName("*"); 24892 l = j.length; 24893 nodes = []; 24894 for (i = 0; i < l; i++) { 24895 nodes[i] = j[i]; 24896 } 24897 24898 //for absolute positioning, we need to record the x/y offsets and width/height for every <div>. And even if we're not positioning things absolutely, in order to accommodate lines, we must figure out where the y offset changes so that we can sense where the lines break, and we populate the lines array. 24899 if (lines || absolute) { 24900 for (i = 0; i < l; i++) { 24901 node = nodes[i]; 24902 isChild = node.parentNode === element; 24903 if (isChild || absolute || chars && !words) { 24904 offset = node.offsetTop; 24905 if (lines && isChild && Math.abs(offset - lineOffsetY) > lineThreshold && (node.nodeName !== "BR" || i === 0)) { 24906 //we found some rare occasions where a certain character like ‑ could cause the offsetTop to be off by 1 pixel, so we build in a threshold. 24907 curLine = []; 24908 lines.push(curLine); 24909 lineOffsetY = offset; 24910 } 24911 if (absolute) { 24912 //record offset x and y, as well as width and height so that we can access them later for positioning. Grabbing them at once ensures we don't trigger a browser paint & we maximize performance. 24913 node._x = node.offsetLeft; 24914 node._y = offset; 24915 node._w = node.offsetWidth; 24916 node._h = node.offsetHeight; 24917 } 24918 if (lines) { 24919 if (node._isSplit && isChild || !chars && isChild || words && isChild || !words && node.parentNode.parentNode === element && !node.parentNode._isSplit) { 24920 curLine.push(node); 24921 node._x -= paddingLeft; 24922 if (_isBeforeWordDelimiter(node, element, wordDelimiter)) { 24923 node._wordEnd = true; 24924 } 24925 } 24926 if (node.nodeName === "BR" && (node.nextSibling && node.nextSibling.nodeName === "BR" || i === 0)) { 24927 //two consecutive <br> tags signify a new [empty] line. Also, if the entire block of content STARTS with a <br>, add a line. 24928 lines.push([]); 24929 } 24930 } 24931 } 24932 } 24933 } 24934 for (i = 0; i < l; i++) { 24935 node = nodes[i]; 24936 isChild = node.parentNode === element; 24937 if (node.nodeName === "BR") { 24938 if (lines || absolute) { 24939 if (node.parentNode) { 24940 node.parentNode.removeChild(node); 24941 } 24942 nodes.splice(i--, 1); 24943 l--; 24944 } else if (!words) { 24945 element.appendChild(node); 24946 } 24947 continue; 24948 } 24949 if (absolute) { 24950 style = node.style; 24951 if (!words && !isChild) { 24952 node._x += node.parentNode._x; 24953 node._y += node.parentNode._y; 24954 } 24955 style.left = node._x + "px"; 24956 style.top = node._y + "px"; 24957 style.position = "absolute"; 24958 style.display = "block"; 24959 //if we don't set the width/height, things collapse in older versions of IE and the origin for transforms is thrown off in all browsers. 24960 style.width = node._w + 1 + "px"; //IE is 1px short sometimes. Avoid wrapping 24961 style.height = node._h + "px"; 24962 } 24963 if (!words && chars) { 24964 //we always start out wrapping words in their own <div> so that line breaks happen correctly, but here we'll remove those <
24964div> tags if necessary and renest the characters directly into the element rather than inside the word <div> 24965 if (node._isSplit) { 24966 node._next = node.nextSibling; 24967 node.parentNode.appendChild(node); //put it at the end to keep the order correct. 24968 } else if (node.parentNode._isSplit) { 24969 node._parent = node.parentNode; 24970 if (!node.previousSibling && node.firstChild) { 24971 node.firstChild._isFirst = true; 24972 } 24973 if (node.nextSibling && node.nextSibling.textContent === " " && !node.nextSibling.nextSibling) { 24974 //if the last node inside a nested element is just a space (like T<span>nested </span>), remove it otherwise it'll get placed in the wrong order. Don't remove it right away, though, because we need to sense when words/characters are before a space like _isBeforeWordDelimiter(). Removing it now would make that a false negative. 24975 spaceNodesToRemove.push(node.nextSibling); 24976 } 24977 node._next = node.nextSibling && node.nextSibling._isFirst ? null : node.nextSibling; 24978 node.parentNode.removeChild(node); 24979 nodes.splice(i--, 1); 24980 l--; 24981 } else if (!isChild) { 24982 offset = !node.nextSibling && _isBeforeWordDelimiter(node.parentNode, element, wordDelimiter); //if this is the last letter in the word (and we're not breaking by lines and not positioning things absolutely), we need to add a space afterwards so that the characters don't just mash together 24983 if (node.parentNode._parent) { 24984 node.parentNode._parent.appendChild(node); 24985 } 24986 if (offset) { 24987 node.parentNode.appendChild(_doc.createTextNode(" ")); 24988 } 24989 if (vars.span) { 24990 node.style.display = "inline"; //so that word breaks are honored properly. 24991 } 24992 charArray.push(node); 24993 } 24994 } else if (node.parentNode._isSplit && !node._isSplit && node.innerHTML !== "") { 24995 wordArray.push(node); 24996 } else if (chars && !node._isSplit) { 24997 if (vars.span) { 24998 node.style.display = "inline"; 24999 } 25000 charArray.push(node); 25001 } 25002 } 25003 i = spaceNodesToRemove.length; 25004 while (--i > -1) { 25005 spaceNodesToRemove[i].parentNode.removeChild(spaceNodesToRemove[i]); 25006 } 25007 if (lines) { 25008 //the next 7 lines just give us the line width in the most reliable way and figure out the left offset (if position isn't relative or absolute). We must set the width along with text-align to ensure everything works properly for various alignments. 25009 if (absolute) { 25010 lineNode = _doc.createElement(tag); 25011 element.appendChild(lineNode); 25012 lineWidth = lineNode.offsetWidth + "px"; 25013 offset = lineNode.offsetParent === element ? 0 : element.offsetLeft; 25014 element.removeChild(lineNode); 25015 } 25016 style = element.style.cssText; 25017 element.style.cssText = "display:none;"; //to improve performance, set display:none on the element so that the browser doesn't have to worry about reflowing or rendering while we're renesting things. We'll revert the cssText later. 25018 //we can't use element.innerHTML = "" because that causes IE to literally delete all the nodes and their content even though we've stored them in an array! So we must loop through the children and remove them. 25019 while (element.firstChild) { 25020 element.removeChild(element.firstChild); 25021 } 25022 addWordSpaces = wordDelimiter === " " && (!absolute || !words && !c
25022hars); 25023 for (i = 0; i < lines.length; i++) { 25024 curLine = lines[i]; 25025 lineNode = _doc.createElement(tag); 25026 lineNode.style.cssText = "display:block;text-align:" + textAlign + ";position:" + (absolute ? "absolute;" : "relative;"); 25027 if (linesClass) { 25028 lineNode.className = linesClass + (iterateLine ? i + 1 : ""); 25029 } 25030 lineArray.push(lineNode); 25031 l = curLine.length; 25032 for (j = 0; j < l; j++) { 25033 if (curLine[j].nodeName !== "BR") { 25034 node = curLine[j]; 25035 lineNode.appendChild(node); 25036 if (addWordSpaces && node._wordEnd) { 25037 lineNode.appendChild(_doc.createTextNode(" ")); 25038 } 25039 if (absolute) { 25040 if (j === 0) { 25041 lineNode.style.top = node._y + "px"; 25042 lineNode.style.left = paddingLeft + offset + "px"; 25043 } 25044 node.style.top = "0px"; 25045 if (offset) { 25046 node.style.left = node._x - offset + "px"; 25047 } 25048 } 25049 } 25050 } 25051 if (l === 0) { 25052 //if there are no nodes in the line (typically meaning there were two consecutive <br> tags, just add a non-breaking space so that things display properly. 25053 lineNode.innerHTML = " "; 25054 } else if (!words && !chars) { 25055 _deWordify2(lineNode); 25056 _swapText2(lineNode, String.fromCharCode(160), " "); 25057 } 25058 if (absolute) { 25059 lineNode.style.width = lineWidth; 25060 lineNode.style.height = node._h + "px"; 25061 } 25062 element.appendChild(lineNode); 25063 } 25064 element.style.cssText = style; 25065 } 25066 25067 //if everything shifts to being position:absolute, the container can collapse in terms of height or width, so fix that here. 25068 if (absolute) { 25069 if (origHeight > element.clientHeight) { 25070 element.style.height = origHeight - padTopAndBottom + "px"; 25071 if (element.clientHeight < origHeight) { 25072 //IE8 and earlier use a different box model - we must include padding and borders 25073 element.style.height = origHeight + borderTopAndBottom + "px"; 25074 } 25075 } 25076 if (origWidth > element.clientWidth) { 25077 element.style.width = origWidth - padLeftAndRight + "px"; 25078 if (element.clientWidth < origWidth) { 25079 //IE8 and earlier use a different box model - we must include padding and borders 25080 element.style.width = origWidth + borderLeftAndRight + "px"; 25081 } 25082 } 25083 } 25084 _pushReversed(allChars, charArray); 25085 _pushReversed(allWords, wordArray); 25086 _pushReversed(allLines, lineArray); 25087 }, 25088 _splitRawText = function _splitRawText(element, vars, wordStart, charStart) { 25089 var tag = vars.span ? "span" : "div", 25090 types = vars.type || vars.split || "chars,words,lines", 25091 //words = (types.indexOf("words") !== -1), 25092 chars = types.indexOf("chars") !== -1, 25093 absolute = vars.position === "absolute" || vars.absolute === true, 25094 wordDelimiter = vars.wordDelimiter || " ", 25095 space = wordDelimiter !== " " ? "" : absolute ? "­ " : " ", 25096 wordEnd = vars.span ? "</span>" : "</div>", 25097 wordIsOpen = true, 25098 text, 25099 splitText, 25100 i, 25101 j, 25102 l, 25103 character, 25104 hasTagStart, 25105 emojiPair1, 25106 emojiPair2, 25107 container = _doc.createElement("div"), 25108 parent = element.parentNode; 25109 parent.insertBefore(container, element); 25110 container.textContent = element.nodeValue; 25111 parent.removeChild(element); 25112 element = container; 25113 text = _getText2(element); 25114 hasTagStart = text.indexOf("<") !== -1; 25115 if (vars.reduceWhiteSpace !== false) { 25116 text = text.replace(_multipleSpacesExp, " ").replace(_stripExp, ""); 25117 } 25118 if (hasTagStart) { 25119 text = text.split("<").join("{{LT}}"); //we can't leave "<" in the string, or when we set the innerHTML, it can be interpreted as a node 25120 } 25121 l = text.length; 25122 splitText = (text.charAt(0) === " " ? space : "") + wordStart(); 25123 for (i = 0; i < l; i++) { 25124 character = text.charAt(i); 25125 if (character === wordDelimiter && text.charAt(i - 1) !== wordDelimiter && i) { 25126 splitText += wordIsOpen ? wordEnd : ""; 25127 wordIsOpen = false;
25128 while (text.charAt(i + 1) === wordDelimiter) { 25129 //skip over empty spaces (to avoid making them words) 25130 splitText += space; 25131 i++; 25132 } 25133 if (i === l - 1) { 25134 splitText += space; 25135 } else if (text.charAt(i + 1) !== ")") { 25136 splitText += space + wordStart(); 25137 wordIsOpen = true; 25138 } 25139 } else if (character === "{" && text.substr(i, 6) === "{{LT}}") { 25140 splitText += chars ? charStart() + "{{LT}}" + "</" + tag + ">" : "{{LT}}"; 25141 i += 5; 25142 } else if (character.charCodeAt(0) >= _emojiStart && character.charCodeAt(0) <= _emojiEnd || text.charCodeAt(i + 1) >= 0xFE00 && text.charCodeAt(i + 1) <= 0xFE0F) { 25143 //special emoji characters use 2 or 4 unicode characters that we must keep together. 25144 emojiPair1 = _emojiPairCode(text.substr(i, 2)); 25145 emojiPair2 = _emojiPairCode(text.substr(i + 2, 2)); 25146 j = emojiPair1 >= _emojiRegionStart && emojiPair1 <= _emojiRegionEnd && emojiPair2 >= _emojiRegionStart && emojiPair2 <= _emojiRegionEnd || emojiPair2 >= _emojiModStart && emojiPair2 <= _emojiModEnd ? 4 : 2; 25147 splitText += chars && character !== " " ? charStart() + text.substr(i, j) + "</" + tag + ">" : text.substr(i, j); 25148 i += j - 1; 25149 } else { 25150 splitText += chars && character !== " " ? charStart() + character + "</" + tag + ">" : character; 25151 } 25152 } 25153 element.outerHTML = splitText + (wordIsOpen ? wordEnd : ""); 25154 if (hasTagStart) { 25155 _swapText2(parent, "{{LT}}", "<"); //note: don't perform this on "element" because that gets replaced with all new elements when we set element.outerHTML. 25156 } 25157 }, 25158 _split2 = function _split(element, vars, wordStart, charStart) { 25159 var children = _slice(element.childNodes), 25160 l = children.length, 25161 absolute = vars.position === "absolute" || vars.absolute === true, 25162 i, 25163 child; 25164 if (element.nodeType !== 3 || l > 1) { 25165 vars.absolute = false; 25166 for (i = 0; i < l; i++) { 25167 child = children[i]; 25168 if (child.nodeType !== 3 || /\S+/.test(child.nodeValue)) { 25169 if (absolute && child.nodeType !== 3 && _getStyle(child, "display", null, true) === "inline") { 25170 //if there's a child node that's display:inline, switch it to inline-block so that absolute positioning works properly (most browsers don't report offsetTop/offsetLeft properly inside a <span> for example) 25171 child.style.display = "inline-block"; 25172 child.style.position = "relative"; 25173 } 25174 child._isSplit = true; 25175 _split2(child, vars, wordStart, charStart); //don't split lines on child elements 25176 } 25177 } 25178 vars.absolute = absolute; 25179 element._isSplit = true; 25180 return; 25181 } 25182 _splitRawText(element, vars, wordStart, charStart); 25183 }, 25184 p = SplitText.prototype; 25185 p.split = function (vars) { 25186 if (this.isSplit) { 25187 this.revert(); 25188 } 25189 this.vars = vars = vars || this.vars; 25190 this._originals.length = this.chars.length = this.words.length = this.lines.length = 0; 25191 var i = this.elements.length, 25192 tag = vars.span ? "span" : "div", 25193 wordStart = _cssClassFunc(vars.wordsClass, tag), 25194 charStart = _cssClassFunc(vars.charsClass, tag), 25195 origHeight, 25196 origWidth, 25197 e; 25198 //we split in reversed order so that if/when we position:absolute elements, they don't affect the position of the ones after them in the document flow (shifting them up as they're taken out of the document flow). 25199 while (--i > -1) { 25200 e = this.elements[i]; 25201 this._originals[i] = e.innerHTML; 25202 origHeight = e.clientHeight; 25203 origWidth = e.clientWidth; 25204 _split2(e, vars, wordStart, charStart); 25205 _setPositionsAfterSplit(e, vars, this.chars, this.words, this.lines, origWidth, origHeight); 25206 } 25207 this.chars.reverse(); 25208 this.words.reverse(); 25209 this.lines.reverse(); 25210 this.isSplit = true; 25211 return this; 25212 }; 25213 p.revert = function () { 25214 if (!this._originals) { 25215 throw "revert() call wasn't scoped properly."; 25216 } 25217 var i = this._originals.length; 25218 while (--i > -1) { 25219 this.elements[i].innerHTML = this._originals[i]; 25220 } 25221 this.chars = []; 25222 this.words = []; 25223 this.lines = []; 25224 this.isSplit = false;
25225 return this; 25226 }; 25227 SplitText.selector = window.$ || window.jQuery || function (e) { 25228 var selector = window.$ || window.jQuery; 25229 if (selector) { 25230 SplitText.selector = selector; 25231 return selector(e); 25232 } 25233 return typeof document === "undefined" ? e : document.querySelectorAll ? document.querySelectorAll(e) : document.getElementById(e.charAt(0) === "#" ? e.substr(1) : e); 25234 }; 25235 SplitText.version = "0.5.8"; 25236})(_gsScope); 25237 25238//export to AMD/RequireJS and CommonJS/Node (precursor to full modular build system coming at a later date) 25239(function (name) { 25240 "use strict"; 25241 25242 var getGlobal = function getGlobal() { 25243 return (_gsScope.GreenSockGlobals || _gsScope)[name]; 25244 }; 25245 if ( true && module.exports) { 25246 //node 25247 module.exports = getGlobal(); 25248 } else if (typeof define === "function" && define.amd) { 25249 //AMD 25250 define([], getGlobal); 25251 } 25252})("SplitText"); 25253/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) 25254 25255/***/ }), 25256
25257/***/ "./src/lib/iziModal/css/iziModal.min.css": 25258/*!***********************************************!*\ 25259 !*** ./src/lib/iziModal/css/iziModal.min.css ***! 25260 \***********************************************/ 25261/*! no static exports found */ 25262/***/ (function(module, exports, __webpack_require__) { 25263 25264// extracted by mini-css-extract-plugin 25265 25266/***/ }), 25267
25268/***/ "./src/lib/iziModal/js/iziModal.js": 25269/*!*****************************************!*\ 25270 !*** ./src/lib/iziModal/js/iziModal.js ***! 25271 \*****************************************/ 25272/*! no static exports found */ 25273/***/ (function(module, exports, __webpack_require__) { 25274 25275/* WEBPACK VAR INJECTION */(function(module, jQuery) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 25276/*** IMPORTS FROM imports-loader ***/ 25277var define = false; 25278 25279/* 25280* iziModal | v1.6.0 25281* http://izimodal.marcelodolce.com 25282* by Marcelo Dolce. 25283*/ 25284(function (factory) { 25285 if (typeof define === 'function' && define.amd) { 25286 define(['jquery'], factory); 25287 } else if (( false ? undefined : _typeof(module)) === 'object' && module.exports) { 25288 module.exports = function (root, jQuery) { 25289 if (jQuery === undefined) { 25290 if (typeof window !== 'undefined') { 25291 jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 25292 } else { 25293 jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")(root); 25294 } 25295 } 25296 factory(jQuery); 25297 return jQuery; 25298 }; 25299 } else { 25300 factory(jQuery); 25301 } 25302})(function ($) { 25303 var $window = $(window), 25304 $document = $(document), 25305 PLUGIN_NAME = 'iziModal', 25306 STATES = { 25307 CLOSING: 'closing', 25308 CLOSED: 'closed', 25309 OPENING: 'opening', 25310 OPENED: 'opened', 25311 DESTROYED: 'destroyed' 25312 }; 25313 function whichAnimationEvent() { 25314 var t, 25315 el = document.createElement('fakeelement'), 25316 animations = { 25317 'animation': 'animationend', 25318 'OAnimation': 'oAnimationEnd', 25319 'MozAnimation': 'animationend', 25320 'WebkitAnimation': 'webkitAnimationEnd' 25321 }; 25322 for (t in animations) { 25323 if (el.style[t] !== undefined) { 25324 return animations[t]; 25325 } 25326 } 25327 } 25328 function isIE(version) { 25329 if (version === 9) { 25330 return navigator.appVersion.indexOf('MSIE 9.') !== -1; 25331 } else { 25332 userAgent = navigator.userAgent; 25333 return userAgent.indexOf('MSIE ') > -1 || userAgent.indexOf('Trident/') > -1; 25334 } 25335 } 25336 function clearValue(value) { 25337 var separators = /%|px|em|cm|vh|vw/; 25338 return parseInt(String(value).split(separators)[0]); 25339 } 25340 function changeHashWithoutScrolling(hash) { 25341 var id = hash.replace(/^.*#/, ''), 25342 $elem = $(hash); 25343 $elem.attr('id', id + '-tmp'); 25344 window.location.hash = hash; 25345 $elem.attr('id', id); 25346 } 25347 var animationEvent = whichAnimationEvent(), 25348 isMobile = /Mobi/.test(navigator.userAgent) ? true : false; 25349 window.$iziModal = {}; 25350 window.$iziModal.autoOpen = 0; 25351 window.$iziModal.history = false; 25352 var iziModal = function iziModal(element, options) { 25353 this.init(element, options); 25354 }; 25355 iziModal.prototype = { 25356 constructor: iziModal, 25357 init: function init(element, options) { 25358 var that = this; 25359 this.$element = $(element); 25360 if (this.$element[0].id !== undefined && this.$element[0].id !== '') { 25361 this.id = this.$element[0].id; 25362 } else { 25363 this.id = PLUGIN_NAME + Math.floor(Math.random() * 10000000 + 1); 25364 this.$element.attr('id', this.id); 25365 } 25366 this.classes = this.$element.attr('class') !== undefined ? this.$element.attr('class') : ''; 25367 this.content = this.$element.html(); 25368 this.state = STATES.CLOSED; 25369 this.options = options; 25370 this.width = 0; 25371 this.timer = null; 25372 this.timerTimeout = null; 25373 this.progressBar = null; 25374 this.isPaused = false; 25375 this.isFullscreen = false; 25376 this.headerHeight = 0; 25377 this.modalHeight = 0; 25378 this.$overlay = $('<div class="' + PLUGIN_NAME + '-overlay" style="background-color:' + options.overlayColor + '"></div>'); 25379 this.$navigate = $('<div class="' + PLUGIN_NAME + '-navigate"><div class="' + PLUGIN_NAME + '-navigate-caption">Use</div><button class="' + PLUGIN_NAME + '-navigate-prev"></button><button class="' + PLUGIN_NAME + '-navigate-next"></button></div>'); 25380 this.group = { 25381 name: this.$element.attr('data-' + PLUGIN_NAME + '-group'), 25382 index: null, 25383 ids: [] 25384 }; 25385 this.$element.attr('aria-hidden', 'true'); 25386 this.$element.attr('aria-labelledby', this.id); 25387 this.$element.attr('role', 'dialog'); 25388 if (!this.$element.hasClass('iziModal')) { 25389 this.$element.addClass('iziModal'); 25390 } 25391 if (this.group.name === undefined && options.group !== '') { 25392 this.group.name = options.group; 25393 this.$element.attr('data-' + PLUGIN_NAME + '-group', options.group); 25394 } 25395 if (this.options.loop === true) { 25396 this.$element.attr('data-' + PLUGIN_NAME + '-loop', true); 25397 } 25398 $.each(this.options, function (index, val) { 25399 var attr = that.$element.attr('data-' + PLUGIN_NAME + '-' + index); 25400 try { 25401 if (_typeof(attr) !== ( true ? "undefined" : undefined)) { 25402 if (attr === '' || attr == 'true') { 25403 options[index] = true; 25404 } else if (attr == 'false') { 25405 options[index] = false;
25406 } else if (typeof val == 'function') { 25407 options[index] = new Function(attr); 25408 } else { 25409 options[index] = attr; 25410 } 25411 } 25412 } catch (exc) {} 25413 }); 25414 if (options.appendTo !== false) { 25415 this.$element.appendTo(options.appendTo); 25416 } 25417 if (options.iframe === true) { 25418 this.$element.html('<div class="' + PLUGIN_NAME + '-wrap"><div class="' + PLUGIN_NAME + '-content"><iframe class="' + PLUGIN_NAME + '-iframe"></iframe>' + this.content + "</div></div>"); 25419 if (options.iframeHeight !== null) { 25420 this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', options.iframeHeight); 25421 } 25422 } else { 25423 this.$element.html('<div class="' + PLUGIN_NAME + '-wrap"><div class="' + PLUGIN_NAME + '-content">' + this.content + '</div></div>'); 25424 } 25425 if (this.options.background !== null) { 25426 this.$element.css('background', this.options.background); 25427 } 25428 this.$wrap = this.$element.find('.' + PLUGIN_NAME + '-wrap'); 25429 if (options.zindex !== null && !isNaN(parseInt(options.zindex))) { 25430 this.$element.css('z-index', options.zindex); 25431 this.$navigate.css('z-index', options.zindex - 1); 25432 this.$overlay.css('z-index', options.zindex - 2); 25433 } 25434 if (options.radius !== '') { 25435 this.$element.css('border-radius', options.radius); 25436 } 25437 if (options.padding !== '') { 25438 this.$element.find('.' + PLUGIN_NAME + '-content').css('padding', options.padding); 25439 } 25440 if (options.theme !== '') { 25441 if (options.theme === 'light') { 25442 this.$element.addClass(PLUGIN_NAME + '-light'); 25443 } else { 25444 this.$element.addClass(options.theme); 25445 } 25446 } 25447 if (options.rtl === true) { 25448 this.$element.addClass(PLUGIN_NAME + '-rtl'); 25449 } 25450 if (options.openFullscreen === true) { 25451 this.isFullscreen = true; 25452 this.$element.addClass('isFullscreen'); 25453 } 25454 this.createHeader(); 25455 this.recalcWidth(); 25456 this.recalcVerticalPos(); 25457 if (that.options.afterRender && (typeof that.options.afterRender === 'function' || _typeof(that.options.afterRender) === 'object')) { 25458 that.options.afterRender(that); 25459 } 25460 }, 25461 createHeader: function createHeader() { 25462 this.$header = $('<div class="' + PLUGIN_NAME + '-header"><h2 class="' + PLUGIN_NAME + '-header-title">' + this.options.title + '</h2><p class="' + PLUGIN_NAME + '-header-subtitle">' + this.options.subtitle + '</p><div class="' + PLUGIN_NAME + '-header-buttons"></div></div>'); 25463 if (this.options.closeButton === true) { 25464 this.$header.find('.' + PLUGIN_NAME + '-header-buttons').append('<a href="javascript:void(0)" class="' + PLUGIN_NAME + '-button ' + PLUGIN_NAME + '-button-close" data-' + PLUGIN_NAME + '-close></a>'); 25465 } 25466 if (this.options.fullscreen === true) { 25467 this.$header.find('.' + PLUGIN_NAME + '-header-buttons').append('<a href="javascript:void(0)" class="' + PLUGIN_NAME + '-button ' + PLUGIN_NAME + '-button-fullscreen" data-' + PLUGIN_NAME + '-fullscreen></a>'); 25468 } 25469 25470 //if (this.options.timeoutProgressbar === true && !isNaN(parseInt(this.options.timeout)) && this.options.timeout !== false && this.options.timeout !== 0) { 25471 if (this.options.timeoutProgressbar === true) { 25472 this.$header.prepend('<div class="' + PLUGIN_NAME + '-progressbar"><div style="background-color:' + this.options.timeoutProgressbarColor + '"></div></div>'); 25473 } 25474 if (this.options.subtitle === '') { 25475 this.$header.addClass(PLUGIN_NAME + '-noSubtitle'); 25476 } 25477 if (this.options.title !== '') { 25478 if (this.options.headerColor !== null) { 25479 if (this.options.borderBottom === true) { 25480 this.$element.css('border-bottom', '3px solid ' + this.options.headerColor + ''); 25481 } 25482 this.$header.css('background', this.options.headerColor); 25483 } 25484 if (this.options.icon !== null || this.options.iconText !== null) { 25485 this.$header.prepend('<i class="' + PLUGIN_NAME + '-header-icon"></i>'); 25486 if (this.options.icon !== null) { 25487 this.$header.find('.' + PLUGIN_NAME + '-header-icon').addClass(this.options.icon).css('color', this.options.iconColor); 25488 } 25489 if (this.options.iconText !== null) { 25490 this.$header.find('.' + PLUGIN_NAME + '-header-icon').html(this.options.iconText); 25491 } 25492 } 25493 this.$element.css('overflow', 'hidden').prepend(this.$header); 25494 } 25495 }, 25496 setGroup: function setGroup(groupName) { 25497 var that = this, 25498 group = this.group.name || groupName; 25499 this.group.ids = []; 25500 if (groupName !== undefined && groupName !== this.group.name) { 25501 group = groupName; 25502 this.group.name = group; 25503 this.$element.attr('data-' + PLUGIN_NAME + '-group', group); 25504 } 25505 if (group !== undefined && group !== '') { 25506 var count = 0; 25507 $.each($('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group=' + group + ']'), function (index, val) { 25508 that.group.ids.push($(this)[0].id);
25509 if (that.id == $(this)[0].id) { 25510 that.group.index = count; 25511 } 25512 count++; 25513 }); 25514 } 25515 }, 25516 toggle: function toggle() { 25517 if (this.state == STATES.OPENED) { 25518 this.close(); 25519 } 25520 if (this.state == STATES.CLOSED) { 25521 this.open(); 25522 } 25523 }, 25524 startProgress: function startProgress(param) { 25525 var that = this; 25526 this.isPaused = false; 25527 clearTimeout(this.timerTimeout); 25528 if (this.options.timeoutProgressbar === true) { 25529 this.progressBar = { 25530 hideEta: null, 25531 maxHideTime: null, 25532 currentTime: new Date().getTime(), 25533 el: this.$element.find('.' + PLUGIN_NAME + '-progressbar > div'), 25534 updateProgress: function updateProgress() { 25535 if (!that.isPaused) { 25536 that.progressBar.currentTime = that.progressBar.currentTime + 10; 25537 var percentage = (that.progressBar.hideEta - that.progressBar.currentTime) / that.progressBar.maxHideTime * 100; 25538 that.progressBar.el.width(percentage + '%'); 25539 if (percentage < 0) { 25540 that.close(); 25541 } 25542 } 25543 } 25544 }; 25545 if (param > 0) { 25546 this.progressBar.maxHideTime = parseFloat(param); 25547 this.progressBar.hideEta = new Date().getTime() + this.progressBar.maxHideTime; 25548 this.timerTimeout = setInterval(this.progressBar.updateProgress, 10); 25549 } 25550 } else { 25551 this.timerTimeout = setTimeout(function () { 25552 that.close(); 25553 }, that.options.timeout); 25554 } 25555 }, 25556 pauseProgress: function pauseProgress() { 25557 this.isPaused = true; 25558 }, 25559 resumeProgress: function resumeProgress() { 25560 this.isPaused = false; 25561 }, 25562 resetProgress: function resetProgress(param) { 25563 clearTimeout(this.timerTimeout); 25564 this.progressBar = {}; 25565 this.$element.find('.' + PLUGIN_NAME + '-progressbar > div').width('100%'); 25566 }, 25567 open: function open(param) { 25568 var that = this; 25569 try { 25570 if (param !== undefined && param.preventClose === false) { 25571 $.each($('.' + PLUGIN_NAME), function (index, modal) { 25572 if ($(modal).data().iziModal !== undefined) { 25573 var state = $(modal).iziModal('getState'); 25574 if (state == 'opened' || state == 'opening') { 25575 $(modal).iziModal('close'); 25576 } 25577 } 25578 }); 25579 } 25580 } catch (e) {/*console.warn(exc);*/} 25581 (function urlHash() { 25582 if (that.options.history) { 25583 var oldTitle = document.title; 25584 document.title = oldTitle + " - " + that.options.title; 25585 changeHashWithoutScrolling('#' + that.id); 25586 document.title = oldTitle; 25587 //history.pushState({}, that.options.title, "#"+that.id); 25588 25589 window.$iziModal.history = true; 25590 } else { 25591 window.$iziModal.history = false; 25592 } 25593 })(); 25594 function opened() { 25595 // console.info('[ '+PLUGIN_NAME+' | '+that.id+' ] Opened.'); 25596 25597 that.state = STATES.OPENED; 25598 that.$element.trigger(STATES.OPENED); 25599 if (that.options.onOpened && (typeof that.options.onOpened === "function" || _typeof(that.options.onOpened) === "object")) { 25600 that.options.onOpened(that); 25601 } 25602 } 25603 function bindEvents() { 25604 // Close when button pressed 25605 that.$element.off('click', '[data-' + PLUGIN_NAME + '-close]').on('click', '[data-' + PLUGIN_NAME + '-close]', function (e) { 25606 e.preventDefault(); 25607 var transition = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionOut'); 25608 if (transition !== undefined) { 25609 that.close({ 25610 transition: transition 25611 }); 25612 } else { 25613 that.close(); 25614 } 25615 }); 25616 25617 // Expand when button pressed 25618 that.$element.off('click', '[data-' + PLUGIN_NAME + '-fullscreen]').on('click', '[data-' + PLUGIN_NAME + '-fullscreen]', function (e) { 25619 e.preventDefault();
25620 if (that.isFullscreen === true) { 25621 that.isFullscreen = false; 25622 that.$element.removeClass('isFullscreen'); 25623 } else { 25624 that.isFullscreen = true; 25625 that.$element.addClass('isFullscreen'); 25626 } 25627 if (that.options.onFullscreen && typeof that.options.onFullscreen === "function") { 25628 that.options.onFullscreen(that); 25629 } 25630 that.$element.trigger('fullscreen', that); 25631 }); 25632 25633 // Next modal 25634 that.$navigate.off('click', '.' + PLUGIN_NAME + '-navigate-next').on('click', '.' + PLUGIN_NAME + '-navigate-next', function (e) { 25635 that.next(e); 25636 }); 25637 that.$element.off('click', '[data-' + PLUGIN_NAME + '-next]').on('click', '[data-' + PLUGIN_NAME + '-next]', function (e) { 25638 that.next(e); 25639 }); 25640 25641 // Previous modal 25642 that.$navigate.off('click', '.' + PLUGIN_NAME + '-navigate-prev').on('click', '.' + PLUGIN_NAME + '-navigate-prev', function (e) { 25643 that.prev(e); 25644 }); 25645 that.$element.off('click', '[data-' + PLUGIN_NAME + '-prev]').on('click', '[data-' + PLUGIN_NAME + '-prev]', function (e) { 25646 that.prev(e); 25647 }); 25648 } 25649 if (this.state == STATES.CLOSED) { 25650 bindEvents(); 25651 this.setGroup(); 25652 this.state = STATES.OPENING; 25653 this.$element.trigger(STATES.OPENING); 25654 this.$element.attr('aria-hidden', 'false'); 25655 25656 // console.info('[ '+PLUGIN_NAME+' | '+this.id+' ] Opening...'); 25657 25658 if (this.options.timeoutProgressbar === true) { 25659 this.$element.find('.' + PLUGIN_NAME + '-progressbar > div').width('100%'); 25660 } 25661 if (this.options.iframe === true) { 25662 this.$element.find('.' + PLUGIN_NAME + '-content').addClass(PLUGIN_NAME + '-content-loader'); 25663 this.$element.find('.' + PLUGIN_NAME + '-iframe').on('load', function () { 25664 $(this).parent().removeClass(PLUGIN_NAME + '-content-loader'); 25665 }); 25666 var href = null; 25667 try { 25668 href = $(param.currentTarget).attr('href') !== '' ? $(param.currentTarget).attr('href') : null; 25669 } catch (e) {/* console.warn(exc); */} 25670 if (this.options.iframeURL !== null && (href === null || href === undefined)) { 25671 href = this.options.iframeURL; 25672 } 25673 if (href === null || href === undefined) { 25674 throw new Error('Failed to find iframe URL'); 25675 } 25676 this.$element.find('.' + PLUGIN_NAME + '-iframe').attr('src', href); 25677 } 25678 if (this.options.bodyOverflow || isMobile) { 25679 $('html').addClass(PLUGIN_NAME + '-isOverflow'); 25680 if (isMobile) { 25681 $('body').css('overflow', 'hidden'); 25682 } 25683 } 25684 if (this.options.onOpening && typeof this.options.onOpening === 'function') { 25685 this.options.onOpening(this); 25686 } 25687 (function open() { 25688 if (that.group.ids.length > 1) { 25689 that.$navigate.appendTo('body'); 25690 that.$navigate.addClass('fadeIn'); 25691 if (that.options.navigateCaption === true) { 25692 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-caption').show(); 25693 } 25694 var modalWidth = that.$element.outerWidth(); 25695 if (that.options.navigateArrows !== false) { 25696 if (that.options.navigateArrows === 'closeScreenEdge') { 25697 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('left', 0).show(); 25698 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('right', 0).show(); 25699 } else { 25700 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('margin-left', -(modalWidth / 2 + 84)).show(); 25701 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('margin-right', -(modalWidth / 2 + 84)).show(); 25702 } 25703 } else { 25704 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').hide(); 25705 that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').hide(); 25706 } 25707 var loop; 25708 if (that.group.index === 0) { 25709 loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length; 25710 if (loop === 0 && that.options.loop === false) that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').hide(); 25711 } 25712 if (that.group.index + 1 === that.group.ids.length) { 25713 loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length; 25714 if (loop === 0 && that.options.loop === false) that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').hide(); 25715 } 25716 }
25717 if (that.options.overlay === true) { 25718 if (that.options.appendToOverlay === false) { 25719 that.$overlay.appendTo('body'); 25720 } else { 25721 that.$overlay.appendTo(that.options.appendToOverlay); 25722 } 25723 } 25724 if (that.options.transitionInOverlay) { 25725 that.$overlay.addClass(that.options.transitionInOverlay); 25726 } 25727 var transitionIn = that.options.transitionIn; 25728 if (_typeof(param) == 'object') { 25729 if (param.transition !== undefined || param.transitionIn !== undefined) { 25730 transitionIn = param.transition || param.transitionIn; 25731 } 25732 if (param.zindex !== undefined) { 25733 that.setZindex(param.zindex); 25734 } 25735 } 25736 if (transitionIn !== '' && animationEvent !== undefined) { 25737 that.$element.addClass('transitionIn ' + transitionIn).show(); 25738 that.$wrap.one(animationEvent, function () { 25739 that.$element.removeClass(transitionIn + ' transitionIn'); 25740 that.$overlay.removeClass(that.options.transitionInOverlay); 25741 that.$navigate.removeClass('fadeIn'); 25742 opened(); 25743 }); 25744 } else { 25745 that.$element.show(); 25746 opened(); 25747 } 25748 if (that.options.pauseOnHover === true && that.options.pauseOnHover === true && that.options.timeout !== false && !isNaN(parseInt(that.options.timeout)) && that.options.timeout !== false && that.options.timeout !== 0) { 25749 that.$element.off('mouseenter').on('mouseenter', function (event) { 25750 event.preventDefault(); 25751 that.isPaused = true; 25752 }); 25753 that.$element.off('mouseleave').on('mouseleave', function (event) { 25754 event.preventDefault(); 25755 that.isPaused = false; 25756 }); 25757 } 25758 })(); 25759 if (this.options.timeout !== false && !isNaN(parseInt(this.options.timeout)) && this.options.timeout !== false && this.options.timeout !== 0) { 25760 that.startProgress(this.options.timeout); 25761 } 25762 25763 // Close on overlay click 25764 if (this.options.overlayClose && !this.$element.hasClass(this.options.transitionOut)) { 25765 this.$overlay.click(function () { 25766 that.close(); 25767 }); 25768 } 25769 if (this.options.focusInput) { 25770 this.$element.find(':input:not(button):enabled:visible:first').focus(); // Focus on the first field 25771 } 25772 (function updateTimer() { 25773 that.recalcLayout(); 25774 that.timer = setTimeout(updateTimer, 300); 25775 })(); 25776 25777 // Close when the Escape key is pressed 25778 $document.on('keydown.' + PLUGIN_NAME, function (e) { 25779 if (that.options.closeOnEscape && e.keyCode === 27) { 25780 that.close(); 25781 } 25782 }); 25783 } 25784 }, 25785 close: function close(param) { 25786 var that = this; 25787 function closed() { 25788 // console.info('[ '+PLUGIN_NAME+' | '+that.id+' ] Closed.'); 25789 25790 that.state = STATES.CLOSED; 25791 that.$element.trigger(STATES.CLOSED); 25792 if (that.options.iframe === true) { 25793 that.$element.find('.' + PLUGIN_NAME + '-iframe').attr('src', ''); 25794 } 25795 if (that.options.bodyOverflow || isMobile) { 25796 $('html').removeClass(PLUGIN_NAME + '-isOverflow'); 25797 if (isMobile) { 25798 $('body').css('overflow', 'auto'); 25799 } 25800 } 25801 if (that.options.onClosed && typeof that.options.onClosed === 'function') { 25802 that.options.onClosed(that); 25803 } 25804 if (that.options.restoreDefaultContent === true) { 25805 that.$element.find('.' + PLUGIN_NAME + '-content').html(that.content); 25806 } 25807 if ($('.' + PLUGIN_NAME + ':visible').length === 0) { 25808 $('html').removeClass(PLUGIN_NAME + '-isAttached'); 25809 } 25810 } 25811 if (this.state == STATES.OPENED || this.state == STATES.OPENING) { 25812 $document.off('keydown.' + PLUGIN_NAME); 25813 this.state = STATES.CLOSING; 25814 this.$element.trigger(STATES.CLOSING); 25815 this.$element.attr('aria-hidden', 'true'); 25816 25817 // console.info('[ '+PLUGIN_NAME+' | '+this.id+' ] Closing...'); 25818 25819 clearTimeout(this.timer); 25820 clearTimeout(this.timerTimeout); 25821 if (that.options.onClosing && typeof that.options.onClosing === "function") { 25822 that.options.onClosing(this); 25823 } 25824 var transitionOut = this.options.transitionOut; 25825 if (_typeof(param) == 'object') { 25826 if (param.transition !== undefined || param.transitionOut !== undefined) { 25827 transitionOut = param.transition || param.transitionOut; 25828 } 25829 } 25830 if (transitionOut === false || transitionOut === '' || animationEvent === undefined) { 25831 this.$element.hide(); 25832 this.$overlay.remove(); 25833 this.$navigate.remove(); 25834 closed(); 25835 } else { 25836 this.$element.attr('class', [this.classes, PLUGIN_NAME, transitionOut, this.options.theme == 'light' ? PLUGIN_NAME + '-light' : this.options.theme, this.isFullscreen === true ? 'isFullscreen' : '', this.options.rtl ? PLUGIN_NAME + '-rtl' : ''].join(' '));
25837 this.$overlay.attr('class', PLUGIN_NAME + '-overlay ' + this.options.transitionOutOverlay); 25838 if (that.options.navigateArrows !== false && !isMobile) { 25839 this.$navigate.attr('class', PLUGIN_NAME + '-navigate fadeOut'); 25840 } 25841 this.$element.one(animationEvent, function () { 25842 if (that.$element.hasClass(transitionOut)) { 25843 that.$element.removeClass(transitionOut + ' transitionOut').hide(); 25844 } 25845 that.$overlay.removeClass(that.options.transitionOutOverlay).remove(); 25846 that.$navigate.removeClass('fadeOut').remove(); 25847 closed(); 25848 }); 25849 } 25850 } 25851 }, 25852 next: function next(e) { 25853 var that = this; 25854 var transitionIn = 'fadeInRight'; 25855 var transitionOut = 'fadeOutLeft'; 25856 var modal = $('.' + PLUGIN_NAME + ':visible'); 25857 var modals = {}; 25858 modals.out = this; 25859 if (e !== undefined && _typeof(e) !== 'object') { 25860 e.preventDefault(); 25861 modal = $(e.currentTarget); 25862 transitionIn = modal.attr('data-' + PLUGIN_NAME + '-transitionIn'); 25863 transitionOut = modal.attr('data-' + PLUGIN_NAME + '-transitionOut'); 25864 } else if (e !== undefined) { 25865 if (e.transitionIn !== undefined) { 25866 transitionIn = e.transitionIn; 25867 } 25868 if (e.transitionOut !== undefined) { 25869 transitionOut = e.transitionOut; 25870 } 25871 } 25872 this.close({ 25873 transition: transitionOut 25874 }); 25875 setTimeout(function () { 25876 var loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length; 25877 for (var i = that.group.index + 1; i <= that.group.ids.length; i++) { 25878 try { 25879 modals["in"] = $("#" + that.group.ids[i]).data().iziModal; 25880 } catch (log) { 25881 // console.info('[ '+PLUGIN_NAME+' ] No next modal.'); 25882 } 25883 if (typeof modals["in"] !== 'undefined') { 25884 $('#' + that.group.ids[i]).iziModal('open', { 25885 transition: transitionIn 25886 }); 25887 break; 25888 } else { 25889 if (i == that.group.ids.length && loop > 0 || that.options.loop === true) { 25890 for (var index = 0; index <= that.group.ids.length; index++) { 25891 modals["in"] = $('#' + that.group.ids[index]).data().iziModal; 25892 if (typeof modals["in"] !== 'undefined') { 25893 $('#' + that.group.ids[index]).iziModal('open', { 25894 transition: transitionIn 25895 }); 25896 break; 25897 } 25898 } 25899 } 25900 } 25901 } 25902 }, 200); 25903 $(document).trigger(PLUGIN_NAME + '-group-change', modals); 25904 }, 25905 prev: function prev(e) { 25906 var that = this; 25907 var transitionIn = 'fadeInLeft'; 25908 var transitionOut = 'fadeOutRight'; 25909 var modal = $('.' + PLUGIN_NAME + ':visible'); 25910 var modals = {}; 25911 modals.out = this; 25912 if (e !== undefined && _typeof(e) !== 'object') { 25913 e.preventDefault(); 25914 modal = $(e.currentTarget); 25915 transitionIn = modal.attr('data-' + PLUGIN_NAME + '-transitionIn'); 25916 transitionOut = modal.attr('data-' + PLUGIN_NAME + '-transitionOut'); 25917 } else if (e !== undefined) { 25918 if (e.transitionIn !== undefined) { 25919 transitionIn = e.transitionIn; 25920 } 25921 if (e.transitionOut !== undefined) { 25922 transitionOut = e.transitionOut; 25923 } 25924 } 25925 this.close({ 25926 transition: transitionOut 25927 }); 25928 setTimeout(function () { 25929 var loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length; 25930 for (var i = that.group.index; i >= 0; i--) { 25931 try { 25932 modals["in"] = $('#' + that.group.ids[i - 1]).data().iziModal; 25933 } catch (log) { 25934 // console.info('[ '+PLUGIN_NAME+' ] No previous modal.'); 25935 } 25936 if (typeof modals["in"] !== 'undefined') { 25937 $('#' + that.group.ids[i - 1]).iziModal('open', { 25938 transition: transitionIn 25939 }); 25940 break; 25941 } else { 25942 if (i === 0 && loop > 0 || that.options.loop === true) { 25943 for (var index = that.group.ids.length - 1; index >= 0; index--) { 25944 modals["in"] = $('#' + that.group.ids[index]).data().iziModal;
25945 if (typeof modals["in"] !== 'undefined') { 25946 $('#' + that.group.ids[index]).iziModal('open', { 25947 transition: transitionIn 25948 }); 25949 break; 25950 } 25951 } 25952 } 25953 } 25954 } 25955 }, 200); 25956 $(document).trigger(PLUGIN_NAME + '-group-change', modals); 25957 }, 25958 destroy: function destroy() { 25959 var e = $.Event('destroy'); 25960 this.$element.trigger(e); 25961 $document.off('keydown.' + PLUGIN_NAME); 25962 clearTimeout(this.timer); 25963 clearTimeout(this.timerTimeout); 25964 if (this.options.iframe === true) { 25965 this.$element.find('.' + PLUGIN_NAME + '-iframe').remove(); 25966 } 25967 this.$element.html(this.$element.find('.' + PLUGIN_NAME + '-content').html()); 25968 this.$element.off('click', '[data-' + PLUGIN_NAME + '-close]'); 25969 this.$element.off('click', '[data-' + PLUGIN_NAME + '-fullscreen]'); 25970 this.$element.off('.' + PLUGIN_NAME).removeData(PLUGIN_NAME).attr('style', ''); 25971 this.$overlay.remove(); 25972 this.$navigate.remove(); 25973 this.$element.trigger(STATES.DESTROYED); 25974 this.$element = null; 25975 }, 25976 getState: function getState() { 25977 return this.state; 25978 }, 25979 getGroup: function getGroup() { 25980 return this.group; 25981 }, 25982 setWidth: function setWidth(width) { 25983 this.options.width = width; 25984 this.recalcWidth(); 25985 var modalWidth = this.$element.outerWidth(); 25986 if (this.options.navigateArrows === true || this.options.navigateArrows == 'closeToModal') { 25987 this.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('margin-left', -(modalWidth / 2 + 84)).show(); 25988 this.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('margin-right', -(modalWidth / 2 + 84)).show(); 25989 } 25990 }, 25991 setTop: function setTop(top) { 25992 this.options.top = top; 25993 this.recalcVerticalPos(false); 25994 }, 25995 setBottom: function setBottom(bottom) { 25996 this.options.bottom = bottom; 25997 this.recalcVerticalPos(false); 25998 }, 25999 setHeader: function setHeader(status) { 26000 if (status) { 26001 this.$element.find('.' + PLUGIN_NAME + '-header').show(); 26002 } else { 26003 this.headerHeight = 0; 26004 this.$element.find('.' + PLUGIN_NAME + '-header').hide(); 26005 } 26006 }, 26007 setTitle: function setTitle(title) { 26008 this.options.title = title; 26009 if (this.headerHeight === 0) { 26010 this.createHeader(); 26011 } 26012 if (this.$header.find('.' + PLUGIN_NAME + '-header-title').length === 0) { 26013 this.$header.append('<h2 class="' + PLUGIN_NAME + '-header-title"></h2>'); 26014 } 26015 this.$header.find('.' + PLUGIN_NAME + '-header-title').html(title); 26016 }, 26017 setSubtitle: function setSubtitle(subtitle) { 26018 if (subtitle === '') { 26019 this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').remove(); 26020 this.$header.addClass(PLUGIN_NAME + '-noSubtitle'); 26021 } else { 26022 if (this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').length === 0) { 26023 this.$header.append('<p class="' + PLUGIN_NAME + '-header-subtitle"></p>'); 26024 } 26025 this.$header.removeClass(PLUGIN_NAME + '-noSubtitle'); 26026 } 26027 this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').html(subtitle); 26028 this.options.subtitle = subtitle; 26029 }, 26030 setIcon: function setIcon(icon) { 26031 if (this.$header.find('.' + PLUGIN_NAME + '-header-icon').length === 0) { 26032 this.$header.prepend('<i class="' + PLUGIN_NAME + '-header-icon"></i>'); 26033 } 26034 this.$header.find('.' + PLUGIN_NAME + '-header-icon').attr('class', PLUGIN_NAME + '-header-icon ' + icon); 26035 this.options.icon = icon; 26036 }, 26037 setIconText: function setIconText(iconText) { 26038 this.$header.find('.' + PLUGIN_NAME + '-header-icon').html(iconText); 26039 this.options.iconText = iconText; 26040 }, 26041 setHeaderColor: function setHeaderColor(headerColor) { 26042 if (this.options.borderBottom === true) { 26043 this.$element.css('border-bottom', '3px solid ' + headerColor + ''); 26044 } 26045 this.$header.css('background', headerColor); 26046 this.options.headerColor = headerColor; 26047 },
26048 setBackground: function setBackground(background) { 26049 if (background === false) { 26050 this.options.background = null; 26051 this.$element.css('background', ''); 26052 } else { 26053 this.$element.css('background', background); 26054 this.options.background = background; 26055 } 26056 }, 26057 setZindex: function setZindex(zindex) { 26058 if (!isNaN(parseInt(this.options.zindex))) { 26059 this.options.zindex = zindex; 26060 this.$element.css('z-index', zindex); 26061 this.$navigate.css('z-index', zindex - 1); 26062 this.$overlay.css('z-index', zindex - 2); 26063 } 26064 }, 26065 setFullscreen: function setFullscreen(value) { 26066 if (value) { 26067 this.isFullscreen = true; 26068 this.$element.addClass('isFullscreen'); 26069 } else { 26070 this.isFullscreen = false; 26071 this.$element.removeClass('isFullscreen'); 26072 } 26073 }, 26074 setContent: function setContent(content) { 26075 if (_typeof(content) == 'object') { 26076 var replace = content["default"] || false; 26077 if (replace === true) { 26078 this.content = content.content; 26079 } 26080 content = content.content; 26081 } 26082 if (this.options.iframe === false) { 26083 this.$element.find('.' + PLUGIN_NAME + '-content').html(content); 26084 } 26085 }, 26086 setTransitionIn: function setTransitionIn(transition) { 26087 this.options.transitionIn = transition; 26088 }, 26089 setTransitionOut: function setTransitionOut(transition) { 26090 this.options.transitionOut = transition; 26091 }, 26092 setTimeout: function setTimeout(timeout) { 26093 this.options.timeout = timeout; 26094 }, 26095 resetContent: function resetContent() { 26096 this.$element.find('.' + PLUGIN_NAME + '-content').html(this.content); 26097 }, 26098 startLoading: function startLoading() { 26099 if (!this.$element.find('.' + PLUGIN_NAME + '-loader').length) { 26100 this.$element.append('<div class="' + PLUGIN_NAME + '-loader fadeIn"></div>'); 26101 } 26102 this.$element.find('.' + PLUGIN_NAME + '-loader').css({ 26103 top: this.headerHeight, 26104 borderRadius: this.options.radius 26105 }); 26106 }, 26107 stopLoading: function stopLoading() { 26108 var $loader = this.$element.find('.' + PLUGIN_NAME + '-loader'); 26109 if (!$loader.length) { 26110 this.$element.prepend('<div class="' + PLUGIN_NAME + '-loader fadeIn"></div>'); 26111 $loader = this.$element.find('.' + PLUGIN_NAME + '-loader').css('border-radius', this.options.radius); 26112 } 26113 $loader.removeClass('fadeIn').addClass('fadeOut'); 26114 setTimeout(function () { 26115 $loader.remove(); 26116 }, 600); 26117 }, 26118 recalcWidth: function recalcWidth() { 26119 var that = this; 26120 this.$element.css('max-width', this.options.width); 26121 if (isIE()) { 26122 var modalWidth = that.options.width; 26123 if (modalWidth.toString().split('%').length > 1) { 26124 modalWidth = that.$element.outerWidth(); 26125 } 26126 that.$element.css({ 26127 left: '50%', 26128 marginLeft: -(modalWidth / 2) 26129 }); 26130 } 26131 }, 26132 recalcVerticalPos: function recalcVerticalPos(first) { 26133 if (this.options.top !== null && this.options.top !== false) { 26134 this.$element.css('margin-top', this.options.top); 26135 if (this.options.top === 0) { 26136 this.$element.css({ 26137 borderTopRightRadius: 0, 26138 borderTopLeftRadius: 0 26139 }); 26140 } 26141 } else { 26142 if (first === false) { 26143 this.$element.css({ 26144 marginTop: '', 26145 borderRadius: this.options.radius 26146 }); 26147 } 26148 } 26149 if (this.options.bottom !== null && this.options.bottom !== false) { 26150 this.$element.css('margin-bottom', this.options.bottom); 26151 if (this.options.bottom === 0) { 26152 this.$element.css({ 26153 borderBottomRightRadius: 0, 26154 borderBottomLeftRadius: 0 26155 }); 26156 } 26157 } else { 26158 if (first === false) { 26159 this.$element.css({ 26160 marginBottom: '', 26161 borderRadius: this.options.radius 26162 }); 26163 } 26164 } 26165 }, 26166 recalcLayout: function recalcLayout() { 26167 var that = this, 26168 windowHeight = $window.height(),
26169 modalHeight = this.$element.outerHeight(), 26170 modalWidth = this.$element.outerWidth(), 26171 contentHeight = this.$element.find('.' + PLUGIN_NAME + '-content')[0].scrollHeight, 26172 outerHeight = contentHeight + this.headerHeight, 26173 wrapperHeight = this.$element.innerHeight() - this.headerHeight, 26174 modalMargin = parseInt(-((this.$element.innerHeight() + 1) / 2)) + 'px', 26175 scrollTop = this.$wrap.scrollTop(), 26176 borderSize = 0; 26177 if (isIE()) { 26178 if (modalWidth >= $window.width() || this.isFullscreen === true) { 26179 this.$element.css({ 26180 left: '0', 26181 marginLeft: '' 26182 }); 26183 } else { 26184 this.$element.css({ 26185 left: '50%', 26186 marginLeft: -(modalWidth / 2) 26187 }); 26188 } 26189 } 26190 if (this.options.borderBottom === true && this.options.title !== '') { 26191 borderSize = 3; 26192 } 26193 if (this.$element.find('.' + PLUGIN_NAME + '-header').length && this.$element.find('.' + PLUGIN_NAME + '-header').is(':visible')) { 26194 this.headerHeight = parseInt(this.$element.find('.' + PLUGIN_NAME + '-header').innerHeight()); 26195 this.$element.css('overflow', 'hidden'); 26196 } else { 26197 this.headerHeight = 0; 26198 this.$element.css('overflow', ''); 26199 } 26200 if (this.$element.find('.' + PLUGIN_NAME + '-loader').length) { 26201 this.$element.find('.' + PLUGIN_NAME + '-loader').css('top', this.headerHeight); 26202 } 26203 if (modalHeight !== this.modalHeight) { 26204 this.modalHeight = modalHeight; 26205 if (this.options.onResize && typeof this.options.onResize === "function") { 26206 this.options.onResize(this); 26207 } 26208 } 26209 if (this.state == STATES.OPENED || this.state == STATES.OPENING) { 26210 if (this.options.iframe === true) { 26211 // If the height of the window is smaller than the modal with iframe 26212 if (windowHeight < this.options.iframeHeight + this.headerHeight + borderSize || this.isFullscreen === true) { 26213 this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', windowHeight - (this.headerHeight + borderSize)); 26214 } else { 26215 this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', this.options.iframeHeight); 26216 } 26217 } 26218 if (modalHeight == windowHeight) { 26219 this.$element.addClass('isAttached'); 26220 } else { 26221 this.$element.removeClass('isAttached'); 26222 } 26223 if (this.isFullscreen === false && this.$element.width() >= $window.width()) { 26224 this.$element.find('.' + PLUGIN_NAME + '-button-fullscreen').hide(); 26225 } else { 26226 this.$element.find('.' + PLUGIN_NAME + '-button-fullscreen').show(); 26227 } 26228 this.recalcButtons(); 26229 if (this.isFullscreen === false) { 26230 windowHeight = windowHeight - (clearValue(this.options.top) || 0) - (clearValue(this.options.bottom) || 0); 26231 } 26232 // If the modal is larger than the height of the window.. 26233 if (outerHeight > windowHeight) { 26234 if (this.options.top > 0 && this.options.bottom === null && contentHeight < $window.height()) { 26235 this.$element.addClass('isAttachedBottom'); 26236 } 26237 if (this.options.bottom > 0 && this.options.top === null && contentHeight < $window.height()) { 26238 this.$element.addClass('isAttachedTop'); 26239 } 26240 if ($('.' + PLUGIN_NAME + ':visible').length === 1) { 26241 $('html').addClass(PLUGIN_NAME + '-isAttached'); 26242 } 26243 this.$element.css('height', windowHeight); 26244 } else { 26245 this.$element.css('height', contentHeight + (this.headerHeight + borderSize)); 26246 this.$element.removeClass('isAttachedTop isAttachedBottom'); 26247 if ($('.' + PLUGIN_NAME + ':visible').length === 1) { 26248 $('html').removeClass(PLUGIN_NAME + '-isAttached'); 26249 } 26250 } 26251 (function applyScroll() { 26252 if (contentHeight > wrapperHeight && outerHeight > windowHeight) { 26253 that.$element.addClass('hasScroll');
26254 that.$wrap.css('height', modalHeight - (that.headerHeight + borderSize)); 26255 } else { 26256 that.$element.removeClass('hasScroll'); 26257 that.$wrap.css('height', 'auto'); 26258 } 26259 })(); 26260 (function applyShadow() { 26261 if (wrapperHeight + scrollTop < contentHeight - 30) { 26262 that.$element.addClass('hasShadow'); 26263 } else { 26264 that.$element.removeClass('hasShadow'); 26265 } 26266 })(); 26267 } 26268 }, 26269 recalcButtons: function recalcButtons() { 26270 var widthButtons = this.$header.find('.' + PLUGIN_NAME + '-header-buttons').innerWidth() + 10; 26271 if (this.options.rtl === true) { 26272 this.$header.css('padding-left', widthButtons); 26273 } else { 26274 this.$header.css('padding-right', widthButtons); 26275 } 26276 } 26277 }; 26278 $window.off('load.' + PLUGIN_NAME).on('load.' + PLUGIN_NAME, function (e) { 26279 var modalHash = document.location.hash; 26280 if (window.$iziModal.autoOpen === 0 && !$('.' + PLUGIN_NAME).is(':visible')) { 26281 try { 26282 var data = $(modalHash).data(); 26283 if (typeof data !== 'undefined') { 26284 if (data.iziModal.options.autoOpen !== false) { 26285 $(modalHash).iziModal('open'); 26286 } 26287 } 26288 } catch (exc) {/* console.warn(exc); */} 26289 } 26290 }); 26291 $window.off('hashchange.' + PLUGIN_NAME).on('hashchange.' + PLUGIN_NAME, function (e) { 26292 var modalHash = document.location.hash; 26293 if (modalHash !== '') { 26294 try { 26295 var data = $(modalHash).data(); 26296 if (typeof data !== 'undefined' && $(modalHash).iziModal('getState') !== 'opening') { 26297 setTimeout(function () { 26298 $(modalHash).iziModal('open', { 26299 preventClose: false 26300 }); 26301 }, 200); 26302 } 26303 } catch (exc) {/* console.warn(exc); */} 26304 } else { 26305 if (window.$iziModal.history) { 26306 $.each($('.' + PLUGIN_NAME), function (index, modal) { 26307 if ($(modal).data().iziModal !== undefined) { 26308 var state = $(modal).iziModal('getState'); 26309 if (state == 'opened' || state == 'opening') { 26310 $(modal).iziModal('close'); 26311 } 26312 } 26313 }); 26314 } 26315 } 26316 }); 26317 $document.off('click', '[data-' + PLUGIN_NAME + '-open]').on('click', '[data-' + PLUGIN_NAME + '-open]', function (e) { 26318 e.preventDefault(); 26319 var modal = $('.' + PLUGIN_NAME + ':visible'); 26320 var openModal = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-open'); 26321 var preventClose = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-preventClose'); 26322 var transitionIn = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionIn'); 26323 var transitionOut = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionOut'); 26324 var zindex = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-zindex'); 26325 if (zindex !== undefined) $(openModal).iziModal('setZindex', zindex); 26326 if (preventClose === undefined) { 26327 if (transitionOut !== undefined) { 26328 modal.iziModal('close', { 26329 transition: transitionOut 26330 }); 26331 } else { 26332 modal.iziModal('close'); 26333 } 26334 } 26335 setTimeout(function () { 26336 if (transitionIn !== undefined) { 26337 $(openModal).iziModal('open', { 26338 transition: transitionIn 26339 }); 26340 } else { 26341 $(openModal).iziModal('open'); 26342 } 26343 }, 200); 26344 }); 26345 $document.off('keyup.' + PLUGIN_NAME).on('keyup.' + PLUGIN_NAME, function (event) { 26346 if ($('.' + PLUGIN_NAME + ':visible').length) { 26347 var modal = $('.' + PLUGIN_NAME + ':visible')[0].id, 26348 arrowKeys = $('#' + modal).data().iziModal.options.arrowKeys, 26349 group = $('#' + modal).iziModal('getGroup'), 26350 e = event || window.event, 26351 target = e.target || e.srcElement, 26352 modals = {}; 26353 if (modal !== undefined && arrowKeys && group.name !== undefined && !e.ctrlKey && !e.metaKey && !e.altKey && target.tagName.toUpperCase() !== 'INPUT' && target.tagName.toUpperCase() != 'TEXTAREA') { 26354 //&& $(e.target).is('body') 26355 26356 if (e.keyCode === 37) { 26357 // left 26358 $('#' + modal).iziModal('prev', e); 26359 } else if (e.keyCode === 39) { 26360 // right 26361 $('#' + modal).iziModal('next', e); 26362 } 26363 } 26364 } 26365 }); 26366 $.fn[PLUGIN_NAME] = function (option, args) { 26367 if (!$(this).length && _typeof(option) == 'object') { 26368 var newEL = { 26369 $el: document.createElement('div'), 26370 id: this.selector.split('#'), 26371 "class": this.selector.split('.') 26372 }; 26373 if (newEL.id.length > 1) { 26374 try { 26375 newEL.$el = document.createElement(id[0]); 26376 } catch (exc) {} 26377 newEL.$el.id = this.selector.split('#')[1].trim(); 26378 } else if (newEL["class"].length > 1) { 26379 try { 26380 newEL.$el = document.createElement(newEL["class"][0]); 26381 } catch (exc) {} 26382 for (var x = 1; x < newEL["class"].length; x++) { 26383 newEL.$el.classList.add(newEL["class"][x].trim()); 26384 } 26385 } 26386 document.body.appendChild(newEL.$el); 26387 this.push($(this.selector)); 26388 } 26389 var objs = this; 26390 for (var i = 0; i < objs.length; i++) { 26391 var $this = $(objs[i]); 26392 var data = $this.data(PLUGIN_NAME); 26393 var options = $.extend({}, $.fn[PLUGIN_NAME].defaults, $this.data(), _typeof(option) == 'object' && option); 26394 if (!data && (!option || _typeof(option) == 'object')) { 26395 $this.data(PLUGIN_NAME, data = new iziModal($this, options)); 26396 } else if (typeof option == 'string' && typeof data != 'undefined') { 26397 return data[option].apply(data, [].concat(args)); 26398 } 26399 if (options.autoOpen) { 26400 // Automatically open the modal if autoOpen setted true or ms 26401 26402 if (!isNaN(parseInt(options.autoOpen))) { 26403 setTimeout(function () { 26404 data.open(); 26405 }, options.autoOpen); 26406 } else if (options.autoOpen === true) { 26407 data.open(); 26408 } 26409 window.$iziModal.autoOpen++; 26410 } 26411 } 26412 return this; 26413 }; 26414 $.fn[PLUGIN_NAME].defaults = { 26415 title: '', 26416 subtitle: '', 26417 headerColor: '#88A0B9', 26418 background: null, 26419 theme: '', 26420 // light 26421 icon: null, 26422 iconText: null, 26423 iconColor: '', 26424 rtl: false, 26425 width: 600, 26426 top: null, 26427 bottom: null, 26428 borderBottom: true, 26429 padding: 0, 26430 radius: 3, 26431 zindex: 999, 26432 iframe: false, 26433 iframeHeight: 400, 26434 iframeURL: null, 26435 focusInput: true, 26436 group: '', 26437 loop: false, 26438 arrowKeys: true, 26439 navigateCaption: true, 26440 navigateArrows: true, 26441 // Boolean, 'closeToModal', 'closeScreenEdge' 26442 history: false, 26443 restoreDefaultContent: false, 26444 autoOpen: 0, 26445 // Boolean, Number 26446 bodyOverflow: false, 26447 fullscreen: false, 26448 openFullscreen: false, 26449 closeOnEscape: true, 26450 closeButton: true, 26451 appendTo: 'body', 26452 // or false 26453 appendToOverlay: 'body', 26454 // or false 26455 overlay: true, 26456 overlayClose: true, 26457 overlayColor: 'rgba(0, 0, 0, 0.4)', 26458 timeout: false, 26459 timeoutProgressbar: false, 26460 pauseOnHover: false, 26461 timeoutProgressbarColor: 'rgba(255,255,255,0.5)', 26462 transitionIn: 'comingIn', 26463 // comingIn, bounceInDown, bounceInUp, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX 26464 transitionOut: 'comingOut', 26465 // comingOut, bounceOutDown, bounceOutUp, fadeOutDown, fadeOutUp, , fadeOutLeft, fadeOutRight, flipOutX 26466 transitionInOverlay: 'fadeIn', 26467 transitionOutOverlay: 'fadeOut', 26468 onFullscreen: function onFullscreen() {}, 26469 onResize: function onResize() {}, 26470 onOpening: function onOpening() {}, 26471 onOpened: function onOpened() {}, 26472 onClosing: function onClosing() {}, 26473 onClosed: function onClosed() {},
26474 afterRender: function afterRender() {} 26475 }; 26476 $.fn[PLUGIN_NAME].Constructor = iziModal; 26477 return $.fn.iziModal; 26478}); 26479/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) 26480 26481/***/ }), 26482
26483/***/ "./src/sass/app.scss": 26484/*!***************************!*\ 26485 !*** ./src/sass/app.scss ***! 26486 \***************************/ 26487/*! no static exports found */ 26488/***/ (function(module, exports, __webpack_require__) { 26489 26490// extracted by mini-css-extract-plugin 26491 26492/***/ })
26492, 26493 26494/***/ 0: 26495/*!*******************************************************************************************************************!*\ 26496 !*** multi swiper/css/swiper.min.css ./src/lib/iziModal/css/iziModal.min.css ./src/sass/app.scss ./src/js/app.js ***! 26497 \*******************************************************************************************************************/ 26498/*! no static exports found */ 26499/***/ (function(module, exports, __webpack_require__) { 26500 26501__webpack_require__(/*! swiper/css/swiper.min.css */"./node_modules/swiper/css/swiper.min.css"); 26502__webpack_require__(/*! ./src/lib/iziModal/css/iziModal.min.css */"./src/lib/iziModal/css/iziModal.min.css"); 26503__webpack_require__(/*! ./src/sass/app.scss */"./src/sass/app.scss"); 26504module.exports = __webpack_require__(/*! ./src/js/app.js */"./src/js/app.js"); 26505 26506 26507/***/ }) 26508 26509/******/ }); 26510//# sourceMappingURL=app.js.map
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.