UNPKG

98.4 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3 typeof define === 'function' && define.amd ? define(['exports'], factory) :
4 (global = global || self, factory(global.window = global.window || {}));
5}(this, (function (exports) { 'use strict';
6
7 function _defineProperties(target, props) {
8 for (var i = 0; i < props.length; i++) {
9 var descriptor = props[i];
10 descriptor.enumerable = descriptor.enumerable || false;
11 descriptor.configurable = true;
12 if ("value" in descriptor) descriptor.writable = true;
13 Object.defineProperty(target, descriptor.key, descriptor);
14 }
15 }
16
17 function _createClass(Constructor, protoProps, staticProps) {
18 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
19 if (staticProps) _defineProperties(Constructor, staticProps);
20 return Constructor;
21 }
22
23 /*!
24 * Observer 3.10.3
25 * https://greensock.com
26 *
27 * @license Copyright 2008-2022, GreenSock. All rights reserved.
28 * Subject to the terms at https://greensock.com/standard-license or for
29 * Club GreenSock members, the agreement issued with that membership.
30 * @author: Jack Doyle, jack@greensock.com
31 */
32 var gsap,
33 _coreInitted,
34 _clamp,
35 _win,
36 _doc,
37 _docEl,
38 _body,
39 _isTouch,
40 _pointerType,
41 ScrollTrigger,
42 _root,
43 _normalizer,
44 _eventTypes,
45 _getGSAP = function _getGSAP() {
46 return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap;
47 },
48 _startup = 1,
49 _observers = [],
50 _scrollers = [],
51 _proxies = [],
52 _getTime = Date.now,
53 _bridge = function _bridge(name, value) {
54 return value;
55 },
56 _integrate = function _integrate() {
57 var core = ScrollTrigger.core,
58 data = core.bridge || {},
59 scrollers = core._scrollers,
60 proxies = core._proxies;
61 scrollers.push.apply(scrollers, _scrollers);
62 proxies.push.apply(proxies, _proxies);
63 _scrollers = scrollers;
64 _proxies = proxies;
65
66 _bridge = function _bridge(name, value) {
67 return data[name](value);
68 };
69 },
70 _getProxyProp = function _getProxyProp(element, property) {
71 return ~_proxies.indexOf(element) && _proxies[_proxies.indexOf(element) + 1][property];
72 },
73 _isViewport = function _isViewport(el) {
74 return !!~_root.indexOf(el);
75 },
76 _addListener = function _addListener(element, type, func, nonPassive, capture) {
77 return element.addEventListener(type, func, {
78 passive: !nonPassive,
79 capture: !!capture
80 });
81 },
82 _removeListener = function _removeListener(element, type, func) {
83 return element.removeEventListener(type, func);
84 },
85 _scrollLeft = "scrollLeft",
86 _scrollTop = "scrollTop",
87 _onScroll = function _onScroll() {
88 return _normalizer && _normalizer.isPressed || _scrollers.cache++;
89 },
90 _scrollCacheFunc = function _scrollCacheFunc(f) {
91 return function (value) {
92 if (value || value === 0) {
93 _startup && (_win.history.scrollRestoration = "manual");
94 f(value);
95 f.v = value;
96 f.c = _scrollers.cache;
97 _normalizer && _normalizer.isPressed && _bridge("ss", value);
98 } else if (_scrollers.cache !== f.c || _bridge("ref")) {
99 f.c = _scrollers.cache;
100 f.v = f();
101 }
102
103 return f.v;
104 };
105 },
106 _horizontal = {
107 s: _scrollLeft,
108 p: "left",
109 p2: "Left",
110 os: "right",
111 os2: "Right",
112 d: "width",
113 d2: "Width",
114 a: "x",
115 sc: _scrollCacheFunc(function (value) {
116 return arguments.length ? _win.scrollTo(value, _vertical.sc()) : _win.pageXOffset || _doc[_scrollLeft] || _docEl[_scrollLeft] || _body[_scrollLeft] || 0;
117 })
118 },
119 _vertical = {
120 s: _scrollTop,
121 p: "top",
122 p2: "Top",
123 os: "bottom",
124 os2: "Bottom",
125 d: "height",
126 d2: "Height",
127 a: "y",
128 op: _horizontal,
129 sc: _scrollCacheFunc(function (value) {
130 return arguments.length ? _win.scrollTo(_horizontal.sc(), value) : _win.pageYOffset || _doc[_scrollTop] || _docEl[_scrollTop] || _body[_scrollTop] || 0;
131 })
132 },
133 _getTarget = function _getTarget(t) {
134 return gsap.utils.toArray(t)[0] || (typeof t === "string" && gsap.config().nullTargetWarn !== false ? console.warn("Element not found:", t) : null);
135 },
136 _getScrollFunc = function _getScrollFunc(element, _ref) {
137 var s = _ref.s,
138 sc = _ref.sc;
139
140 var i = _scrollers.indexOf(element),
141 offset = sc === _vertical.sc ? 1 : 2;
142
143 !~i && (i = _scrollers.push(element) - 1);
144 return _scrollers[i + offset] || (_scrollers[i + offset] = _getProxyProp(element, s) || (_isViewport(element) ? sc : _scrollCacheFunc(function (value) {
145 return arguments.length ? element[s] = value : element[s];
146 })));
147 },
148 _getVelocityProp = function _getVelocityProp(value, minTimeRefresh, useDelta) {
149 var v1 = value,
150 v2 = value,
151 t1 = _getTime(),
152 t2 = t1,
153 min = minTimeRefresh || 50,
154 dropToZeroTime = Math.max(500, min * 3),
155 update = function update(value, force) {
156 var t = _getTime();
157
158 if (force || t - t1 > min) {
159 v2 = v1;
160 v1 = value;
161 t2 = t1;
162 t1 = t;
163 } else if (useDelta) {
164 v1 += value;
165 } else {
166 v1 = v2 + (value - v2) / (t - t2) * (t1 - t2);
167 }
168 },
169 reset = function reset() {
170 v2 = v1 = useDelta ? 0 : v1;
171 t2 = t1 = 0;
172 },
173 getVelocity = function getVelocity(latestValue) {
174 var tOld = t2,
175 vOld = v2,
176 t = _getTime();
177
178 (latestValue || latestValue === 0) && latestValue !== v1 && update(latestValue);
179 return t1 === t2 || t - t2 > dropToZeroTime ? 0 : (v1 + (useDelta ? vOld : -vOld)) / ((useDelta ? t : t1) - tOld) * 1000;
180 };
181
182 return {
183 update: update,
184 reset: reset,
185 getVelocity: getVelocity
186 };
187 },
188 _getEvent = function _getEvent(e, preventDefault) {
189 preventDefault && !e._gsapAllow && e.preventDefault();
190 return e.changedTouches ? e.changedTouches[0] : e;
191 },
192 _getAbsoluteMax = function _getAbsoluteMax(a) {
193 var max = Math.max.apply(Math, a),
194 min = Math.min.apply(Math, a);
195 return Math.abs(max) >= Math.abs(min) ? max : min;
196 },
197 _setScrollTrigger = function _setScrollTrigger() {
198 ScrollTrigger = gsap.core.globals().ScrollTrigger;
199 ScrollTrigger && ScrollTrigger.core && _integrate();
200 },
201 _initCore = function _initCore(core) {
202 gsap = core || _getGSAP();
203
204 if (gsap && typeof document !== "undefined" && document.body) {
205 _win = window;
206 _doc = document;
207 _docEl = _doc.documentElement;
208 _body = _doc.body;
209 _root = [_win, _doc, _docEl, _body];
210 _clamp = gsap.utils.clamp;
211 _pointerType = "onpointerenter" in _body ? "pointer" : "mouse";
212 _isTouch = Observer.isTouch = _win.matchMedia && _win.matchMedia("(hover: none), (pointer: coarse)").matches ? 1 : "ontouchstart" in _win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ? 2 : 0;
213 _eventTypes = Observer.eventTypes = ("ontouchstart" in _docEl ? "touchstart,touchmove,touchcancel,touchend" : !("onpointerdown" in _docEl) ? "mousedown,mousemove,mouseup,mouseup" : "pointerdown,pointermove,pointercancel,pointerup").split(",");
214 setTimeout(function () {
215 return _startup = 0;
216 }, 500);
217
218 _setScrollTrigger();
219
220 _coreInitted = 1;
221 }
222
223 return _coreInitted;
224 };
225
226 _horizontal.op = _vertical;
227 _scrollers.cache = 0;
228 var Observer = function () {
229 function Observer(vars) {
230 this.init(vars);
231 }
232
233 var _proto = Observer.prototype;
234
235 _proto.init = function init(vars) {
236 _coreInitted || _initCore(gsap) || console.warn("Please gsap.registerPlugin(Observer)");
237 ScrollTrigger || _setScrollTrigger();
238 var tolerance = vars.tolerance,
239 dragMinimum = vars.dragMinimum,
240 type = vars.type,
241 target = vars.target,
242 lineHeight = vars.lineHeight,
243 debounce = vars.debounce,
244 preventDefault = vars.preventDefault,
245 onStop = vars.onStop,
246 onStopDelay = vars.onStopDelay,
247 ignore = vars.ignore,
248 wheelSpeed = vars.wheelSpeed,
249 event = vars.event,
250 onDragStart = vars.onDragStart,
251 onDragEnd = vars.onDragEnd,
252 onDrag = vars.onDrag,
253 onPress = vars.onPress,
254 onRelease = vars.onRelease,
255 onRight = vars.onRight,
256 onLeft = vars.onLeft,
257 onUp = vars.onUp,
258 onDown = vars.onDown,
259 onChangeX = vars.onChangeX,
260 onChangeY = vars.onChangeY,
261 onChange = vars.onChange,
262 onToggleX = vars.onToggleX,
263 onToggleY = vars.onToggleY,
264 onHover = vars.onHover,
265 onHoverEnd = vars.onHoverEnd,
266 onMove = vars.onMove,
267 ignoreCheck = vars.ignoreCheck,
268 isNormalizer = vars.isNormalizer,
269 onGestureStart = vars.onGestureStart,
270 onGestureEnd = vars.onGestureEnd,
271 onWheel = vars.onWheel,
272 onEnable = vars.onEnable,
273 onDisable = vars.onDisable,
274 onClick = vars.onClick,
275 scrollSpeed = vars.scrollSpeed,
276 capture = vars.capture,
277 allowClicks = vars.allowClicks,
278 lockAxis = vars.lockAxis,
279 onLockAxis = vars.onLockAxis;
280 this.target = target = _getTarget(target) || _docEl;
281 this.vars = vars;
282 ignore && (ignore = gsap.utils.toArray(ignore));
283 tolerance = tolerance || 0;
284 dragMinimum = dragMinimum || 0;
285 wheelSpeed = wheelSpeed || 1;
286 scrollSpeed = scrollSpeed || 1;
287 type = type || "wheel,touch,pointer";
288 debounce = debounce !== false;
289 lineHeight || (lineHeight = parseFloat(_win.getComputedStyle(_body).lineHeight) || 22);
290
291 var id,
292 onStopDelayedCall,
293 dragged,
294 moved,
295 wheeled,
296 locked,
297 axis,
298 self = this,
299 prevDeltaX = 0,
300 prevDeltaY = 0,
301 scrollFuncX = _getScrollFunc(target, _horizontal),
302 scrollFuncY = _getScrollFunc(target, _vertical),
303 scrollX = scrollFuncX(),
304 scrollY = scrollFuncY(),
305 limitToTouch = ~type.indexOf("touch") && !~type.indexOf("pointer") && _eventTypes[0] === "pointerdown",
306 isViewport = _isViewport(target),
307 ownerDoc = target.ownerDocument || _doc,
308 deltaX = [0, 0, 0],
309 deltaY = [0, 0, 0],
310 onClickTime = 0,
311 clickCapture = function clickCapture() {
312 return onClickTime = _getTime();
313 },
314 _ignoreCheck = function _ignoreCheck(e, isPointerOrTouch) {
315 return (self.event = e) && ignore && ~ignore.indexOf(e.target) || isPointerOrTouch && limitToTouch && e.pointerType !== "touch" || ignoreCheck && ignoreCheck(e, isPointerOrTouch);
316 },
317 onStopFunc = function onStopFunc() {
318 self._vx.reset();
319
320 self._vy.reset();
321
322 onStopDelayedCall.pause();
323 onStop && onStop(self);
324 },
325 update = function update() {
326 var dx = self.deltaX = _getAbsoluteMax(deltaX),
327 dy = self.deltaY = _getAbsoluteMax(deltaY),
328 changedX = Math.abs(dx) >= tolerance,
329 changedY = Math.abs(dy) >= tolerance;
330
331 onChange && (changedX || changedY) && onChange(self, dx, dy, deltaX, deltaY);
332
333 if (changedX) {
334 onRight && self.deltaX > 0 && onRight(self);
335 onLeft && self.deltaX < 0 && onLeft(self);
336 onChangeX && onChangeX(self);
337 onToggleX && self.deltaX < 0 !== prevDeltaX < 0 && onToggleX(self);
338 prevDeltaX = self.deltaX;
339 deltaX[0] = deltaX[1] = deltaX[2] = 0;
340 }
341
342 if (changedY) {
343 onDown && self.deltaY > 0 && onDown(self);
344 onUp && self.deltaY < 0 && onUp(self);
345 onChangeY && onChangeY(self);
346 onToggleY && self.deltaY < 0 !== prevDeltaY < 0 && onToggleY(self);
347 prevDeltaY = self.deltaY;
348 deltaY[0] = deltaY[1] = deltaY[2] = 0;
349 }
350
351 if (moved || dragged) {
352 onMove && onMove(self);
353 onLockAxis && locked && onLockAxis(self);
354
355 if (dragged) {
356 onDrag(self);
357 dragged = false;
358 }
359
360 moved = locked = false;
361 }
362
363 if (wheeled) {
364 onWheel(self);
365 wheeled = false;
366 }
367
368 id = 0;
369 },
370 onDelta = function onDelta(x, y, index) {
371 deltaX[index] += x;
372 deltaY[index] += y;
373
374 self._vx.update(x);
375
376 self._vy.update(y);
377
378 debounce ? id || (id = requestAnimationFrame(update)) : update();
379 },
380 onTouchOrPointerDelta = function onTouchOrPointerDelta(x, y) {
381 if (axis !== "y") {
382 deltaX[2] += x;
383
384 self._vx.update(x, true);
385 }
386
387 if (axis !== "x") {
388 deltaY[2] += y;
389
390 self._vy.update(y, true);
391 }
392
393 if (lockAxis && !axis) {
394 self.axis = axis = Math.abs(x) > Math.abs(y) ? "x" : "y";
395 locked = true;
396 }
397
398 debounce ? id || (id = requestAnimationFrame(update)) : update();
399 },
400 _onDrag = function _onDrag(e) {
401 if (_ignoreCheck(e, 1)) {
402 return;
403 }
404
405 e = _getEvent(e, preventDefault);
406 var x = e.clientX,
407 y = e.clientY,
408 dx = x - self.x,
409 dy = y - self.y,
410 isDragging = self.isDragging;
411 self.x = x;
412 self.y = y;
413
414 if (isDragging || Math.abs(self.startX - x) >= dragMinimum || Math.abs(self.startY - y) >= dragMinimum) {
415 onDrag && (dragged = true);
416 isDragging || (self.isDragging = true);
417 onTouchOrPointerDelta(dx, dy);
418 isDragging || onDragStart && onDragStart(self);
419 }
420 },
421 _onPress = self.onPress = function (e) {
422 if (_ignoreCheck(e, 1)) {
423 return;
424 }
425
426 self.axis = axis = null;
427 onStopDelayedCall.pause();
428 self.isPressed = true;
429 e = _getEvent(e);
430 prevDeltaX = prevDeltaY = 0;
431 self.startX = self.x = e.clientX;
432 self.startY = self.y = e.clientY;
433
434 self._vx.reset();
435
436 self._vy.reset();
437
438 _addListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, preventDefault, capture);
439
440 self.deltaX = self.deltaY = 0;
441 onPress && onPress(self);
442 },
443 _onRelease = function _onRelease(e) {
444 if (_ignoreCheck(e, 1)) {
445 return;
446 }
447
448 _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag);
449
450 var wasDragging = self.isDragging && (Math.abs(self.x - self.startX) > 3 || Math.abs(self.y - self.startY) > 3),
451 eventData = _getEvent(e);
452
453 if (!wasDragging) {
454 self._vx.reset();
455
456 self._vy.reset();
457
458 if (preventDefault && allowClicks) {
459 gsap.delayedCall(0.05, function () {
460 if (_getTime() - onClickTime > 300 && !e.defaultPrevented) {
461 if (e.target.click) {
462 e.target.click();
463 } else if (ownerDoc.createEvent) {
464 var syntheticEvent = ownerDoc.createEvent("MouseEvents");
465 syntheticEvent.initMouseEvent("click", true, true, _win, 1, eventData.screenX, eventData.screenY, eventData.clientX, eventData.clientY, false, false, false, false, 0, null);
466 e.target.dispatchEvent(syntheticEvent);
467 }
468 }
469 });
470 }
471 }
472
473 self.isDragging = self.isGesturing = self.isPressed = false;
474 onStop && !isNormalizer && onStopDelayedCall.restart(true);
475 onDragEnd && wasDragging && onDragEnd(self);
476 onRelease && onRelease(self, wasDragging);
477 },
478 _onGestureStart = function _onGestureStart(e) {
479 return e.touches && e.touches.length > 1 && (self.isGesturing = true) && onGestureStart(e, self.isDragging);
480 },
481 _onGestureEnd = function _onGestureEnd() {
482 return (self.isGesturing = false) || onGestureEnd(self);
483 },
484 onScroll = function onScroll(e) {
485 if (_ignoreCheck(e)) {
486 return;
487 }
488
489 var x = scrollFuncX(),
490 y = scrollFuncY();
491 onDelta((x - scrollX) * scrollSpeed, (y - scrollY) * scrollSpeed, 1);
492 scrollX = x;
493 scrollY = y;
494 onStop && onStopDelayedCall.restart(true);
495 },
496 _onWheel = function _onWheel(e) {
497 if (_ignoreCheck(e)) {
498 return;
499 }
500
501 e = _getEvent(e, preventDefault);
502 onWheel && (wheeled = true);
503 var multiplier = (e.deltaMode === 1 ? lineHeight : e.deltaMode === 2 ? _win.innerHeight : 1) * wheelSpeed;
504 onDelta(e.deltaX * multiplier, e.deltaY * multiplier, 0);
505 onStop && !isNormalizer && onStopDelayedCall.restart(true);
506 },
507 _onMove = function _onMove(e) {
508 if (_ignoreCheck(e)) {
509 return;
510 }
511
512 var x = e.clientX,
513 y = e.clientY,
514 dx = x - self.x,
515 dy = y - self.y;
516 self.x = x;
517 self.y = y;
518 moved = true;
519 (dx || dy) && onTouchOrPointerDelta(dx, dy);
520 },
521 _onHover = function _onHover(e) {
522 self.event = e;
523 onHover(self);
524 },
525 _onHoverEnd = function _onHoverEnd(e) {
526 self.event = e;
527 onHoverEnd(self);
528 },
529 _onClick = function _onClick(e) {
530 return _ignoreCheck(e) || _getEvent(e, preventDefault) && onClick(self);
531 };
532
533 onStopDelayedCall = self._dc = gsap.delayedCall(onStopDelay || 0.25, onStopFunc).pause();
534 self.deltaX = self.deltaY = 0;
535 self._vx = _getVelocityProp(0, 50, true);
536 self._vy = _getVelocityProp(0, 50, true);
537 self.scrollX = scrollFuncX;
538 self.scrollY = scrollFuncY;
539 self.isDragging = self.isGesturing = self.isPressed = false;
540
541 self.enable = function (e) {
542 if (!self.isEnabled) {
543 _addListener(isViewport ? ownerDoc : target, "scroll", _onScroll);
544
545 type.indexOf("scroll") >= 0 && _addListener(isViewport ? ownerDoc : target, "scroll", onScroll, preventDefault, capture);
546 type.indexOf("wheel") >= 0 && _addListener(target, "wheel", _onWheel, preventDefault, capture);
547
548 if (type.indexOf("touch") >= 0 && _isTouch || type.indexOf("pointer") >= 0) {
549 _addListener(target, _eventTypes[0], _onPress, preventDefault, capture);
550
551 _addListener(ownerDoc, _eventTypes[2], _onRelease);
552
553 _addListener(ownerDoc, _eventTypes[3], _onRelease);
554
555 allowClicks && _addListener(target, "click", clickCapture, false, true);
556 onClick && _addListener(target, "click", _onClick);
557 onGestureStart && _addListener(ownerDoc, "gesturestart", _onGestureStart);
558 onGestureEnd && _addListener(ownerDoc, "gestureend", _onGestureEnd);
559 onHover && _addListener(target, _pointerType + "enter", _onHover);
560 onHoverEnd && _addListener(target, _pointerType + "leave", _onHoverEnd);
561 onMove && _addListener(target, _pointerType + "move", _onMove);
562 }
563
564 self.isEnabled = true;
565 e && e.type && _onPress(e);
566 onEnable && onEnable(self);
567 }
568
569 return self;
570 };
571
572 self.disable = function () {
573 if (self.isEnabled) {
574 _observers.filter(function (o) {
575 return o !== self && _isViewport(o.target);
576 }).length || _removeListener(isViewport ? ownerDoc : target, "scroll", _onScroll);
577
578 if (self.isPressed) {
579 self._vx.reset();
580
581 self._vy.reset();
582
583 _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag);
584 }
585
586 _removeListener(isViewport ? ownerDoc : target, "scroll", onScroll);
587
588 _removeListener(target, "wheel", _onWheel);
589
590 _removeListener(target, _eventTypes[0], _onPress);
591
592 _removeListener(ownerDoc, _eventTypes[2], _onRelease);
593
594 _removeListener(ownerDoc, _eventTypes[3], _onRelease);
595
596 _removeListener(target, "click", clickCapture);
597
598 _removeListener(target, "click", _onClick);
599
600 _removeListener(ownerDoc, "gesturestart", _onGestureStart);
601
602 _removeListener(ownerDoc, "gestureend", _onGestureEnd);
603
604 _removeListener(target, _pointerType + "enter", _onHover);
605
606 _removeListener(target, _pointerType + "leave", _onHoverEnd);
607
608 _removeListener(target, _pointerType + "move", _onMove);
609
610 self.isEnabled = self.isPressed = self.isDragging = false;
611 onDisable && onDisable(self);
612 }
613 };
614
615 self.kill = function () {
616 self.disable();
617
618 var i = _observers.indexOf(self);
619
620 i >= 0 && _observers.splice(i, 1);
621 _normalizer === self && (_normalizer = 0);
622 };
623
624 _observers.push(self);
625
626 isNormalizer && _isViewport(target) && (_normalizer = self);
627 self.enable(event);
628 };
629
630 _createClass(Observer, [{
631 key: "velocityX",
632 get: function get() {
633 return this._vx.getVelocity();
634 }
635 }, {
636 key: "velocityY",
637 get: function get() {
638 return this._vy.getVelocity();
639 }
640 }]);
641
642 return Observer;
643 }();
644 Observer.version = "3.10.3";
645
646 Observer.create = function (vars) {
647 return new Observer(vars);
648 };
649
650 Observer.register = _initCore;
651
652 Observer.getAll = function () {
653 return _observers.slice();
654 };
655
656 Observer.getById = function (id) {
657 return _observers.filter(function (o) {
658 return o.vars.id === id;
659 })[0];
660 };
661
662 _getGSAP() && gsap.registerPlugin(Observer);
663
664 /*!
665 * ScrollTrigger 3.10.3
666 * https://greensock.com
667 *
668 * @license Copyright 2008-2022, GreenSock. All rights reserved.
669 * Subject to the terms at https://greensock.com/standard-license or for
670 * Club GreenSock members, the agreement issued with that membership.
671 * @author: Jack Doyle, jack@greensock.com
672 */
673
674 var gsap$1,
675 _coreInitted$1,
676 _win$1,
677 _doc$1,
678 _docEl$1,
679 _body$1,
680 _root$1,
681 _resizeDelay,
682 _toArray,
683 _clamp$1,
684 _time2,
685 _syncInterval,
686 _refreshing,
687 _pointerIsDown,
688 _transformProp,
689 _i,
690 _prevWidth,
691 _prevHeight,
692 _autoRefresh,
693 _sort,
694 _suppressOverwrites,
695 _ignoreResize,
696 _normalizer$1,
697 _ignoreMobileResize,
698 _baseScreenHeight,
699 _baseScreenWidth,
700 _limitCallbacks,
701 _startup$1 = 1,
702 _getTime$1 = Date.now,
703 _time1 = _getTime$1(),
704 _lastScrollTime = 0,
705 _enabled = 0,
706 _pointerDownHandler = function _pointerDownHandler() {
707 return _pointerIsDown = 1;
708 },
709 _pointerUpHandler = function _pointerUpHandler() {
710 return _pointerIsDown = 0;
711 },
712 _passThrough = function _passThrough(v) {
713 return v;
714 },
715 _round = function _round(value) {
716 return Math.round(value * 100000) / 100000 || 0;
717 },
718 _windowExists = function _windowExists() {
719 return typeof window !== "undefined";
720 },
721 _getGSAP$1 = function _getGSAP() {
722 return gsap$1 || _windowExists() && (gsap$1 = window.gsap) && gsap$1.registerPlugin && gsap$1;
723 },
724 _isViewport$1 = function _isViewport(e) {
725 return !!~_root$1.indexOf(e);
726 },
727 _getBoundsFunc = function _getBoundsFunc(element) {
728 return _getProxyProp(element, "getBoundingClientRect") || (_isViewport$1(element) ? function () {
729 _winOffsets.width = _win$1.innerWidth;
730 _winOffsets.height = _win$1.innerHeight;
731 return _winOffsets;
732 } : function () {
733 return _getBounds(element);
734 });
735 },
736 _getSizeFunc = function _getSizeFunc(scroller, isViewport, _ref) {
737 var d = _ref.d,
738 d2 = _ref.d2,
739 a = _ref.a;
740 return (a = _getProxyProp(scroller, "getBoundingClientRect")) ? function () {
741 return a()[d];
742 } : function () {
743 return (isViewport ? _win$1["inner" + d2] : scroller["client" + d2]) || 0;
744 };
745 },
746 _getOffsetsFunc = function _getOffsetsFunc(element, isViewport) {
747 return !isViewport || ~_proxies.indexOf(element) ? _getBoundsFunc(element) : function () {
748 return _winOffsets;
749 };
750 },
751 _maxScroll = function _maxScroll(element, _ref2) {
752 var s = _ref2.s,
753 d2 = _ref2.d2,
754 d = _ref2.d,
755 a = _ref2.a;
756 return (s = "scroll" + d2) && (a = _getProxyProp(element, s)) ? a() - _getBoundsFunc(element)()[d] : _isViewport$1(element) ? (_docEl$1[s] || _body$1[s]) - (_win$1["inner" + d2] || _docEl$1["client" + d2] || _body$1["client" + d2]) : element[s] - element["offset" + d2];
757 },
758 _iterateAutoRefresh = function _iterateAutoRefresh(func, events) {
759 for (var i = 0; i < _autoRefresh.length; i += 3) {
760 (!events || ~events.indexOf(_autoRefresh[i + 1])) && func(_autoRefresh[i], _autoRefresh[i + 1], _autoRefresh[i + 2]);
761 }
762 },
763 _isString = function _isString(value) {
764 return typeof value === "string";
765 },
766 _isFunction = function _isFunction(value) {
767 return typeof value === "function";
768 },
769 _isNumber = function _isNumber(value) {
770 return typeof value === "number";
771 },
772 _isObject = function _isObject(value) {
773 return typeof value === "object";
774 },
775 _callIfFunc = function _callIfFunc(value) {
776 return _isFunction(value) && value();
777 },
778 _combineFunc = function _combineFunc(f1, f2) {
779 return function () {
780 var result1 = _callIfFunc(f1),
781 result2 = _callIfFunc(f2);
782
783 return function () {
784 _callIfFunc(result1);
785
786 _callIfFunc(result2);
787 };
788 };
789 },
790 _endAnimation = function _endAnimation(animation, reversed, pause) {
791 return animation && animation.progress(reversed ? 0 : 1) && pause && animation.pause();
792 },
793 _callback = function _callback(self, func) {
794 if (self.enabled) {
795 var result = func(self);
796 result && result.totalTime && (self.callbackAnimation = result);
797 }
798 },
799 _abs = Math.abs,
800 _left = "left",
801 _top = "top",
802 _right = "right",
803 _bottom = "bottom",
804 _width = "width",
805 _height = "height",
806 _Right = "Right",
807 _Left = "Left",
808 _Top = "Top",
809 _Bottom = "Bottom",
810 _padding = "padding",
811 _margin = "margin",
812 _Width = "Width",
813 _Height = "Height",
814 _px = "px",
815 _getComputedStyle = function _getComputedStyle(element) {
816 return _win$1.getComputedStyle(element);
817 },
818 _makePositionable = function _makePositionable(element) {
819 var position = _getComputedStyle(element).position;
820
821 element.style.position = position === "absolute" || position === "fixed" ? position : "relative";
822 },
823 _setDefaults = function _setDefaults(obj, defaults) {
824 for (var p in defaults) {
825 p in obj || (obj[p] = defaults[p]);
826 }
827
828 return obj;
829 },
830 _getBounds = function _getBounds(element, withoutTransforms) {
831 var tween = withoutTransforms && _getComputedStyle(element)[_transformProp] !== "matrix(1, 0, 0, 1, 0, 0)" && gsap$1.to(element, {
832 x: 0,
833 y: 0,
834 xPercent: 0,
835 yPercent: 0,
836 rotation: 0,
837 rotationX: 0,
838 rotationY: 0,
839 scale: 1,
840 skewX: 0,
841 skewY: 0
842 }).progress(1),
843 bounds = element.getBoundingClientRect();
844 tween && tween.progress(0).kill();
845 return bounds;
846 },
847 _getSize = function _getSize(element, _ref3) {
848 var d2 = _ref3.d2;
849 return element["offset" + d2] || element["client" + d2] || 0;
850 },
851 _getLabelRatioArray = function _getLabelRatioArray(timeline) {
852 var a = [],
853 labels = timeline.labels,
854 duration = timeline.duration(),
855 p;
856
857 for (p in labels) {
858 a.push(labels[p] / duration);
859 }
860
861 return a;
862 },
863 _getClosestLabel = function _getClosestLabel(animation) {
864 return function (value) {
865 return gsap$1.utils.snap(_getLabelRatioArray(animation), value);
866 };
867 },
868 _snapDirectional = function _snapDirectional(snapIncrementOrArray) {
869 var snap = gsap$1.utils.snap(snapIncrementOrArray),
870 a = Array.isArray(snapIncrementOrArray) && snapIncrementOrArray.slice(0).sort(function (a, b) {
871 return a - b;
872 });
873 return a ? function (value, direction, threshold) {
874 if (threshold === void 0) {
875 threshold = 1e-3;
876 }
877
878 var i;
879
880 if (!direction) {
881 return snap(value);
882 }
883
884 if (direction > 0) {
885 value -= threshold;
886
887 for (i = 0; i < a.length; i++) {
888 if (a[i] >= value) {
889 return a[i];
890 }
891 }
892
893 return a[i - 1];
894 } else {
895 i = a.length;
896 value += threshold;
897
898 while (i--) {
899 if (a[i] <= value) {
900 return a[i];
901 }
902 }
903 }
904
905 return a[0];
906 } : function (value, direction, threshold) {
907 if (threshold === void 0) {
908 threshold = 1e-3;
909 }
910
911 var snapped = snap(value);
912 return !direction || Math.abs(snapped - value) < threshold || snapped - value < 0 === direction < 0 ? snapped : snap(direction < 0 ? value - snapIncrementOrArray : value + snapIncrementOrArray);
913 };
914 },
915 _getLabelAtDirection = function _getLabelAtDirection(timeline) {
916 return function (value, st) {
917 return _snapDirectional(_getLabelRatioArray(timeline))(value, st.direction);
918 };
919 },
920 _multiListener = function _multiListener(func, element, types, callback) {
921 return types.split(",").forEach(function (type) {
922 return func(element, type, callback);
923 });
924 },
925 _addListener$1 = function _addListener(element, type, func, nonPassive, capture) {
926 return element.addEventListener(type, func, {
927 passive: !nonPassive,
928 capture: !!capture
929 });
930 },
931 _removeListener$1 = function _removeListener(element, type, func) {
932 return element.removeEventListener(type, func);
933 },
934 _wheelListener = function _wheelListener(func, el, scrollFunc) {
935 return scrollFunc && scrollFunc.wheelHandler && func(el, "wheel", scrollFunc);
936 },
937 _markerDefaults = {
938 startColor: "green",
939 endColor: "red",
940 indent: 0,
941 fontSize: "16px",
942 fontWeight: "normal"
943 },
944 _defaults = {
945 toggleActions: "play",
946 anticipatePin: 0
947 },
948 _keywords = {
949 top: 0,
950 left: 0,
951 center: 0.5,
952 bottom: 1,
953 right: 1
954 },
955 _offsetToPx = function _offsetToPx(value, size) {
956 if (_isString(value)) {
957 var eqIndex = value.indexOf("="),
958 relative = ~eqIndex ? +(value.charAt(eqIndex - 1) + 1) * parseFloat(value.substr(eqIndex + 1)) : 0;
959
960 if (~eqIndex) {
961 value.indexOf("%") > eqIndex && (relative *= size / 100);
962 value = value.substr(0, eqIndex - 1);
963 }
964
965 value = relative + (value in _keywords ? _keywords[value] * size : ~value.indexOf("%") ? parseFloat(value) * size / 100 : parseFloat(value) || 0);
966 }
967
968 return value;
969 },
970 _createMarker = function _createMarker(type, name, container, direction, _ref4, offset, matchWidthEl, containerAnimation) {
971 var startColor = _ref4.startColor,
972 endColor = _ref4.endColor,
973 fontSize = _ref4.fontSize,
974 indent = _ref4.indent,
975 fontWeight = _ref4.fontWeight;
976
977 var e = _doc$1.createElement("div"),
978 useFixedPosition = _isViewport$1(container) || _getProxyProp(container, "pinType") === "fixed",
979 isScroller = type.indexOf("scroller") !== -1,
980 parent = useFixedPosition ? _body$1 : container,
981 isStart = type.indexOf("start") !== -1,
982 color = isStart ? startColor : endColor,
983 css = "border-color:" + color + ";font-size:" + fontSize + ";color:" + color + ";font-weight:" + fontWeight + ";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;";
984
985 css += "position:" + ((isScroller || containerAnimation) && useFixedPosition ? "fixed;" : "absolute;");
986 (isScroller || containerAnimation || !useFixedPosition) && (css += (direction === _vertical ? _right : _bottom) + ":" + (offset + parseFloat(indent)) + "px;");
987 matchWidthEl && (css += "box-sizing:border-box;text-align:left;width:" + matchWidthEl.offsetWidth + "px;");
988 e._isStart = isStart;
989 e.setAttribute("class", "gsap-marker-" + type + (name ? " marker-" + name : ""));
990 e.style.cssText = css;
991 e.innerText = name || name === 0 ? type + "-" + name : type;
992 parent.children[0] ? parent.insertBefore(e, parent.children[0]) : parent.appendChild(e);
993 e._offset = e["offset" + direction.op.d2];
994
995 _positionMarker(e, 0, direction, isStart);
996
997 return e;
998 },
999 _positionMarker = function _positionMarker(marker, start, direction, flipped) {
1000 var vars = {
1001 display: "block"
1002 },
1003 side = direction[flipped ? "os2" : "p2"],
1004 oppositeSide = direction[flipped ? "p2" : "os2"];
1005 marker._isFlipped = flipped;
1006 vars[direction.a + "Percent"] = flipped ? -100 : 0;
1007 vars[direction.a] = flipped ? "1px" : 0;
1008 vars["border" + side + _Width] = 1;
1009 vars["border" + oppositeSide + _Width] = 0;
1010 vars[direction.p] = start + "px";
1011 gsap$1.set(marker, vars);
1012 },
1013 _triggers = [],
1014 _ids = {},
1015 _rafID,
1016 _sync = function _sync() {
1017 return _getTime$1() - _lastScrollTime > 34 && _updateAll();
1018 },
1019 _onScroll$1 = function _onScroll() {
1020 if (!_normalizer$1 || !_normalizer$1.isPressed) {
1021 _scrollers.cache++;
1022 _rafID || (_rafID = requestAnimationFrame(_updateAll));
1023 _lastScrollTime || _dispatch("scrollStart");
1024 _lastScrollTime = _getTime$1();
1025 }
1026 },
1027 _setBaseDimensions = function _setBaseDimensions() {
1028 _baseScreenWidth = _win$1.innerWidth;
1029 _baseScreenHeight = _win$1.innerHeight;
1030 },
1031 _onResize = function _onResize() {
1032 _scrollers.cache++;
1033 !_refreshing && !_ignoreResize && !_doc$1.fullscreenElement && (!_ignoreMobileResize || _baseScreenWidth !== _win$1.innerWidth || Math.abs(_win$1.innerHeight - _baseScreenHeight) > _win$1.innerHeight * 0.25) && _resizeDelay.restart(true);
1034 },
1035 _listeners = {},
1036 _emptyArray = [],
1037 _media = [],
1038 _creatingMedia,
1039 _lastMediaTick,
1040 _onMediaChange = function _onMediaChange(e) {
1041 var tick = gsap$1.ticker.frame,
1042 matches = [],
1043 i = 0,
1044 index;
1045
1046 if (_lastMediaTick !== tick || _startup$1) {
1047 _revertAll();
1048
1049 for (; i < _media.length; i += 4) {
1050 index = _win$1.matchMedia(_media[i]).matches;
1051
1052 if (index !== _media[i + 3]) {
1053 _media[i + 3] = index;
1054 index ? matches.push(i) : _revertAll(1, _media[i]) || _isFunction(_media[i + 2]) && _media[i + 2]();
1055 }
1056 }
1057
1058 _revertRecorded();
1059
1060 for (i = 0; i < matches.length; i++) {
1061 index = matches[i];
1062 _creatingMedia = _media[index];
1063 _media[index + 2] = _media[index + 1](e);
1064 }
1065
1066 _creatingMedia = 0;
1067 _coreInitted$1 && _refreshAll(0, 1);
1068 _lastMediaTick = tick;
1069
1070 _dispatch("matchMedia");
1071 }
1072 },
1073 _softRefresh = function _softRefresh() {
1074 return _removeListener$1(ScrollTrigger$1, "scrollEnd", _softRefresh) || _refreshAll(true);
1075 },
1076 _dispatch = function _dispatch(type) {
1077 return _listeners[type] && _listeners[type].map(function (f) {
1078 return f();
1079 }) || _emptyArray;
1080 },
1081 _savedStyles = [],
1082 _revertRecorded = function _revertRecorded(media) {
1083 for (var i = 0; i < _savedStyles.length; i += 5) {
1084 if (!media || _savedStyles[i + 4] === media) {
1085 _savedStyles[i].style.cssText = _savedStyles[i + 1];
1086 _savedStyles[i].getBBox && _savedStyles[i].setAttribute("transform", _savedStyles[i + 2] || "");
1087 _savedStyles[i + 3].uncache = 1;
1088 }
1089 }
1090 },
1091 _revertAll = function _revertAll(kill, media) {
1092 var trigger;
1093
1094 for (_i = 0; _i < _triggers.length; _i++) {
1095 trigger = _triggers[_i];
1096
1097 if (!media || trigger.media === media) {
1098 if (kill) {
1099 trigger.kill(1);
1100 } else {
1101 trigger.revert();
1102 }
1103 }
1104 }
1105
1106 media && _revertRecorded(media);
1107 media || _dispatch("revert");
1108 },
1109 _clearScrollMemory = function _clearScrollMemory() {
1110 return _scrollers.cache++ && _scrollers.forEach(function (obj) {
1111 return typeof obj === "function" && (obj.rec = 0);
1112 });
1113 },
1114 _refreshingAll,
1115 _refreshID = 0,
1116 _refreshAll = function _refreshAll(force, skipRevert) {
1117 if (_lastScrollTime && !force) {
1118 _addListener$1(ScrollTrigger$1, "scrollEnd", _softRefresh);
1119
1120 return;
1121 }
1122
1123 _refreshingAll = true;
1124
1125 var refreshInits = _dispatch("refreshInit");
1126
1127 _sort && ScrollTrigger$1.sort();
1128 skipRevert || _revertAll();
1129
1130 _triggers.slice(0).forEach(function (t) {
1131 return t.refresh();
1132 });
1133
1134 _triggers.forEach(function (t) {
1135 return t.vars.end === "max" && t.setPositions(t.start, _maxScroll(t.scroller, t._dir));
1136 });
1137
1138 refreshInits.forEach(function (result) {
1139 return result && result.render && result.render(-1);
1140 });
1141
1142 _clearScrollMemory();
1143
1144 _resizeDelay.pause();
1145
1146 _refreshID++;
1147 _refreshingAll = false;
1148
1149 _dispatch("refresh");
1150 },
1151 _lastScroll = 0,
1152 _direction = 1,
1153 _primary,
1154 _updateAll = function _updateAll() {
1155 if (!_refreshingAll) {
1156 _primary && _primary.update(0);
1157 ScrollTrigger$1.isUpdating = true;
1158
1159 var l = _triggers.length,
1160 time = _getTime$1(),
1161 recordVelocity = time - _time1 >= 50,
1162 scroll = l && _triggers[0].scroll();
1163
1164 _direction = _lastScroll > scroll ? -1 : 1;
1165 _lastScroll = scroll;
1166
1167 if (recordVelocity) {
1168 if (_lastScrollTime && !_pointerIsDown && time - _lastScrollTime > 200) {
1169 _lastScrollTime = 0;
1170
1171 _dispatch("scrollEnd");
1172 }
1173
1174 _time2 = _time1;
1175 _time1 = time;
1176 }
1177
1178 if (_direction < 0) {
1179 _i = l;
1180
1181 while (_i-- > 0) {
1182 _triggers[_i] && _triggers[_i].update(0, recordVelocity);
1183 }
1184
1185 _direction = 1;
1186 } else {
1187 for (_i = 0; _i < l; _i++) {
1188 _triggers[_i] && _triggers[_i].update(0, recordVelocity);
1189 }
1190 }
1191
1192 ScrollTrigger$1.isUpdating = false;
1193 }
1194
1195 _rafID = 0;
1196 },
1197 _propNamesToCopy = [_left, _top, _bottom, _right, _margin + _Bottom, _margin + _Right, _margin + _Top, _margin + _Left, "display", "flexShrink", "float", "zIndex", "gridColumnStart", "gridColumnEnd", "gridRowStart", "gridRowEnd", "gridArea", "justifySelf", "alignSelf", "placeSelf", "order"],
1198 _stateProps = _propNamesToCopy.concat([_width, _height, "boxSizing", "max" + _Width, "max" + _Height, "position", _margin, _padding, _padding + _Top, _padding + _Right, _padding + _Bottom, _padding + _Left]),
1199 _swapPinOut = function _swapPinOut(pin, spacer, state) {
1200 _setState(state);
1201
1202 var cache = pin._gsap;
1203
1204 if (cache.spacerIsNative) {
1205 _setState(cache.spacerState);
1206 } else if (pin.parentNode === spacer) {
1207 var parent = spacer.parentNode;
1208
1209 if (parent) {
1210 parent.insertBefore(pin, spacer);
1211 parent.removeChild(spacer);
1212 }
1213 }
1214 },
1215 _swapPinIn = function _swapPinIn(pin, spacer, cs, spacerState) {
1216 if (pin.parentNode !== spacer) {
1217 var i = _propNamesToCopy.length,
1218 spacerStyle = spacer.style,
1219 pinStyle = pin.style,
1220 p;
1221
1222 while (i--) {
1223 p = _propNamesToCopy[i];
1224 spacerStyle[p] = cs[p];
1225 }
1226
1227 spacerStyle.position = cs.position === "absolute" ? "absolute" : "relative";
1228 cs.display === "inline" && (spacerStyle.display = "inline-block");
1229 pinStyle[_bottom] = pinStyle[_right] = spacerStyle.flexBasis = "auto";
1230 spacerStyle.overflow = "visible";
1231 spacerStyle.boxSizing = "border-box";
1232 spacerStyle[_width] = _getSize(pin, _horizontal) + _px;
1233 spacerStyle[_height] = _getSize(pin, _vertical) + _px;
1234 spacerStyle[_padding] = pinStyle[_margin] = pinStyle[_top] = pinStyle[_left] = "0";
1235
1236 _setState(spacerState);
1237
1238 pinStyle[_width] = pinStyle["max" + _Width] = cs[_width];
1239 pinStyle[_height] = pinStyle["max" + _Height] = cs[_height];
1240 pinStyle[_padding] = cs[_padding];
1241 pin.parentNode.insertBefore(spacer, pin);
1242 spacer.appendChild(pin);
1243 }
1244 },
1245 _capsExp = /([A-Z])/g,
1246 _setState = function _setState(state) {
1247 if (state) {
1248 var style = state.t.style,
1249 l = state.length,
1250 i = 0,
1251 p,
1252 value;
1253 (state.t._gsap || gsap$1.core.getCache(state.t)).uncache = 1;
1254
1255 for (; i < l; i += 2) {
1256 value = state[i + 1];
1257 p = state[i];
1258
1259 if (value) {
1260 style[p] = value;
1261 } else if (style[p]) {
1262 style.removeProperty(p.replace(_capsExp, "-$1").toLowerCase());
1263 }
1264 }
1265 }
1266 },
1267 _getState = function _getState(element) {
1268 var l = _stateProps.length,
1269 style = element.style,
1270 state = [],
1271 i = 0;
1272
1273 for (; i < l; i++) {
1274 state.push(_stateProps[i], style[_stateProps[i]]);
1275 }
1276
1277 state.t = element;
1278 return state;
1279 },
1280 _copyState = function _copyState(state, override, omitOffsets) {
1281 var result = [],
1282 l = state.length,
1283 i = omitOffsets ? 8 : 0,
1284 p;
1285
1286 for (; i < l; i += 2) {
1287 p = state[i];
1288 result.push(p, p in override ? override[p] : state[i + 1]);
1289 }
1290
1291 result.t = state.t;
1292 return result;
1293 },
1294 _winOffsets = {
1295 left: 0,
1296 top: 0
1297 },
1298 _parsePosition = function _parsePosition(value, trigger, scrollerSize, direction, scroll, marker, markerScroller, self, scrollerBounds, borderWidth, useFixedPosition, scrollerMax, containerAnimation) {
1299 _isFunction(value) && (value = value(self));
1300
1301 if (_isString(value) && value.substr(0, 3) === "max") {
1302 value = scrollerMax + (value.charAt(4) === "=" ? _offsetToPx("0" + value.substr(3), scrollerSize) : 0);
1303 }
1304
1305 var time = containerAnimation ? containerAnimation.time() : 0,
1306 p1,
1307 p2,
1308 element;
1309 containerAnimation && containerAnimation.seek(0);
1310
1311 if (!_isNumber(value)) {
1312 _isFunction(trigger) && (trigger = trigger(self));
1313 var offsets = value.split(" "),
1314 bounds,
1315 localOffset,
1316 globalOffset,
1317 display;
1318 element = _getTarget(trigger) || _body$1;
1319 bounds = _getBounds(element) || {};
1320
1321 if ((!bounds || !bounds.left && !bounds.top) && _getComputedStyle(element).display === "none") {
1322 display = element.style.display;
1323 element.style.display = "block";
1324 bounds = _getBounds(element);
1325 display ? element.style.display = display : element.style.removeProperty("display");
1326 }
1327
1328 localOffset = _offsetToPx(offsets[0], bounds[direction.d]);
1329 globalOffset = _offsetToPx(offsets[1] || "0", scrollerSize);
1330 value = bounds[direction.p] - scrollerBounds[direction.p] - borderWidth + localOffset + scroll - globalOffset;
1331 markerScroller && _positionMarker(markerScroller, globalOffset, direction, scrollerSize - globalOffset < 20 || markerScroller._isStart && globalOffset > 20);
1332 scrollerSize -= scrollerSize - globalOffset;
1333 } else if (markerScroller) {
1334 _positionMarker(markerScroller, scrollerSize, direction, true);
1335 }
1336
1337 if (marker) {
1338 var position = value + scrollerSize,
1339 isStart = marker._isStart;
1340 p1 = "scroll" + direction.d2;
1341
1342 _positionMarker(marker, position, direction, isStart && position > 20 || !isStart && (useFixedPosition ? Math.max(_body$1[p1], _docEl$1[p1]) : marker.parentNode[p1]) <= position + 1);
1343
1344 if (useFixedPosition) {
1345 scrollerBounds = _getBounds(markerScroller);
1346 useFixedPosition && (marker.style[direction.op.p] = scrollerBounds[direction.op.p] - direction.op.m - marker._offset + _px);
1347 }
1348 }
1349
1350 if (containerAnimation && element) {
1351 p1 = _getBounds(element);
1352 containerAnimation.seek(scrollerMax);
1353 p2 = _getBounds(element);
1354 containerAnimation._caScrollDist = p1[direction.p] - p2[direction.p];
1355 value = value / containerAnimation._caScrollDist * scrollerMax;
1356 }
1357
1358 containerAnimation && containerAnimation.seek(time);
1359 return containerAnimation ? value : Math.round(value);
1360 },
1361 _prefixExp = /(webkit|moz|length|cssText|inset)/i,
1362 _reparent = function _reparent(element, parent, top, left) {
1363 if (element.parentNode !== parent) {
1364 var style = element.style,
1365 p,
1366 cs;
1367
1368 if (parent === _body$1) {
1369 element._stOrig = style.cssText;
1370 cs = _getComputedStyle(element);
1371
1372 for (p in cs) {
1373 if (!+p && !_prefixExp.test(p) && cs[p] && typeof style[p] === "string" && p !== "0") {
1374 style[p] = cs[p];
1375 }
1376 }
1377
1378 style.top = top;
1379 style.left = left;
1380 } else {
1381 style.cssText = element._stOrig;
1382 }
1383
1384 gsap$1.core.getCache(element).uncache = 1;
1385 parent.appendChild(element);
1386 }
1387 },
1388 _getTweenCreator = function _getTweenCreator(scroller, direction) {
1389 var getScroll = _getScrollFunc(scroller, direction),
1390 prop = "_scroll" + direction.p2,
1391 lastScroll1,
1392 lastScroll2,
1393 getTween = function getTween(scrollTo, vars, initialValue, change1, change2) {
1394 var tween = getTween.tween,
1395 onComplete = vars.onComplete,
1396 modifiers = {};
1397 initialValue = initialValue || getScroll();
1398 change2 = change1 && change2 || 0;
1399 change1 = change1 || scrollTo - initialValue;
1400 tween && tween.kill();
1401 lastScroll1 = Math.round(initialValue);
1402 vars[prop] = scrollTo;
1403 vars.modifiers = modifiers;
1404
1405 modifiers[prop] = function (value) {
1406 value = _round(getScroll());
1407
1408 if (value !== lastScroll1 && value !== lastScroll2 && Math.abs(value - lastScroll1) > 2 && Math.abs(value - lastScroll2) > 2) {
1409 tween.kill();
1410 getTween.tween = 0;
1411 } else {
1412 value = initialValue + change1 * tween.ratio + change2 * tween.ratio * tween.ratio;
1413 }
1414
1415 lastScroll2 = lastScroll1;
1416 return lastScroll1 = _round(value);
1417 };
1418
1419 vars.onComplete = function () {
1420 getTween.tween = 0;
1421 onComplete && onComplete.call(tween);
1422 };
1423
1424 tween = getTween.tween = gsap$1.to(scroller, vars);
1425 return tween;
1426 };
1427
1428 scroller[prop] = getScroll;
1429
1430 getScroll.wheelHandler = function () {
1431 return getTween.tween && getTween.tween.kill() && (getTween.tween = 0);
1432 };
1433
1434 _addListener$1(scroller, "wheel", getScroll.wheelHandler);
1435
1436 return getTween;
1437 };
1438
1439 var ScrollTrigger$1 = function () {
1440 function ScrollTrigger(vars, animation) {
1441 _coreInitted$1 || ScrollTrigger.register(gsap$1) || console.warn("Please gsap.registerPlugin(ScrollTrigger)");
1442 this.init(vars, animation);
1443 }
1444
1445 var _proto = ScrollTrigger.prototype;
1446
1447 _proto.init = function init(vars, animation) {
1448 this.progress = this.start = 0;
1449 this.vars && this.kill(true, true);
1450
1451 if (!_enabled) {
1452 this.update = this.refresh = this.kill = _passThrough;
1453 return;
1454 }
1455
1456 vars = _setDefaults(_isString(vars) || _isNumber(vars) || vars.nodeType ? {
1457 trigger: vars
1458 } : vars, _defaults);
1459
1460 var _vars = vars,
1461 onUpdate = _vars.onUpdate,
1462 toggleClass = _vars.toggleClass,
1463 id = _vars.id,
1464 onToggle = _vars.onToggle,
1465 onRefresh = _vars.onRefresh,
1466 scrub = _vars.scrub,
1467 trigger = _vars.trigger,
1468 pin = _vars.pin,
1469 pinSpacing = _vars.pinSpacing,
1470 invalidateOnRefresh = _vars.invalidateOnRefresh,
1471 anticipatePin = _vars.anticipatePin,
1472 onScrubComplete = _vars.onScrubComplete,
1473 onSnapComplete = _vars.onSnapComplete,
1474 once = _vars.once,
1475 snap = _vars.snap,
1476 pinReparent = _vars.pinReparent,
1477 pinSpacer = _vars.pinSpacer,
1478 containerAnimation = _vars.containerAnimation,
1479 fastScrollEnd = _vars.fastScrollEnd,
1480 preventOverlaps = _vars.preventOverlaps,
1481 direction = vars.horizontal || vars.containerAnimation && vars.horizontal !== false ? _horizontal : _vertical,
1482 isToggle = !scrub && scrub !== 0,
1483 scroller = _getTarget(vars.scroller || _win$1),
1484 scrollerCache = gsap$1.core.getCache(scroller),
1485 isViewport = _isViewport$1(scroller),
1486 useFixedPosition = ("pinType" in vars ? vars.pinType : _getProxyProp(scroller, "pinType") || isViewport && "fixed") === "fixed",
1487 callbacks = [vars.onEnter, vars.onLeave, vars.onEnterBack, vars.onLeaveBack],
1488 toggleActions = isToggle && vars.toggleActions.split(" "),
1489 markers = "markers" in vars ? vars.markers : _defaults.markers,
1490 borderWidth = isViewport ? 0 : parseFloat(_getComputedStyle(scroller)["border" + direction.p2 + _Width]) || 0,
1491 self = this,
1492 onRefreshInit = vars.onRefreshInit && function () {
1493 return vars.onRefreshInit(self);
1494 },
1495 getScrollerSize = _getSizeFunc(scroller, isViewport, direction),
1496 getScrollerOffsets = _getOffsetsFunc(scroller, isViewport),
1497 lastSnap = 0,
1498 lastRefresh = 0,
1499 scrollFunc = _getScrollFunc(scroller, direction),
1500 tweenTo,
1501 pinCache,
1502 snapFunc,
1503 scroll1,
1504 scroll2,
1505 start,
1506 end,
1507 markerStart,
1508 markerEnd,
1509 markerStartTrigger,
1510 markerEndTrigger,
1511 markerVars,
1512 change,
1513 pinOriginalState,
1514 pinActiveState,
1515 pinState,
1516 spacer,
1517 offset,
1518 pinGetter,
1519 pinSetter,
1520 pinStart,
1521 pinChange,
1522 spacingStart,
1523 spacerState,
1524 markerStartSetter,
1525 markerEndSetter,
1526 cs,
1527 snap1,
1528 snap2,
1529 scrubTween,
1530 scrubSmooth,
1531 snapDurClamp,
1532 snapDelayedCall,
1533 prevProgress,
1534 prevScroll,
1535 prevAnimProgress,
1536 caMarkerSetter,
1537 customRevertReturn;
1538
1539 self.media = _creatingMedia;
1540 self._dir = direction;
1541 anticipatePin *= 45;
1542 self.scroller = scroller;
1543 self.scroll = containerAnimation ? containerAnimation.time.bind(containerAnimation) : scrollFunc;
1544 scroll1 = scrollFunc();
1545 self.vars = vars;
1546 animation = animation || vars.animation;
1547
1548 if ("refreshPriority" in vars) {
1549 _sort = 1;
1550 vars.refreshPriority === -9999 && (_primary = self);
1551 }
1552
1553 scrollerCache.tweenScroll = scrollerCache.tweenScroll || {
1554 top: _getTweenCreator(scroller, _vertical),
1555 left: _getTweenCreator(scroller, _horizontal)
1556 };
1557 self.tweenTo = tweenTo = scrollerCache.tweenScroll[direction.p];
1558
1559 self.scrubDuration = function (value) {
1560 scrubSmooth = _isNumber(value) && value;
1561
1562 if (!scrubSmooth) {
1563 scrubTween && scrubTween.progress(1).kill();
1564 scrubTween = 0;
1565 } else {
1566 scrubTween ? scrubTween.duration(value) : scrubTween = gsap$1.to(animation, {
1567 ease: "expo",
1568 totalProgress: "+=0.001",
1569 duration: scrubSmooth,
1570 paused: true,
1571 onComplete: function onComplete() {
1572 return onScrubComplete && onScrubComplete(self);
1573 }
1574 });
1575 }
1576 };
1577
1578 if (animation) {
1579 animation.vars.lazy = false;
1580 animation._initted || animation.vars.immediateRender !== false && vars.immediateRender !== false && animation.render(0, true, true);
1581 self.animation = animation.pause();
1582 animation.scrollTrigger = self;
1583 self.scrubDuration(scrub);
1584 snap1 = 0;
1585 id || (id = animation.vars.id);
1586 }
1587
1588 _triggers.push(self);
1589
1590 if (snap) {
1591 if (!_isObject(snap) || snap.push) {
1592 snap = {
1593 snapTo: snap
1594 };
1595 }
1596
1597 "scrollBehavior" in _body$1.style && gsap$1.set(isViewport ? [_body$1, _docEl$1] : scroller, {
1598 scrollBehavior: "auto"
1599 });
1600 snapFunc = _isFunction(snap.snapTo) ? snap.snapTo : snap.snapTo === "labels" ? _getClosestLabel(animation) : snap.snapTo === "labelsDirectional" ? _getLabelAtDirection(animation) : snap.directional !== false ? function (value, st) {
1601 return _snapDirectional(snap.snapTo)(value, _getTime$1() - lastRefresh < 500 ? 0 : st.direction);
1602 } : gsap$1.utils.snap(snap.snapTo);
1603 snapDurClamp = snap.duration || {
1604 min: 0.1,
1605 max: 2
1606 };
1607 snapDurClamp = _isObject(snapDurClamp) ? _clamp$1(snapDurClamp.min, snapDurClamp.max) : _clamp$1(snapDurClamp, snapDurClamp);
1608 snapDelayedCall = gsap$1.delayedCall(snap.delay || scrubSmooth / 2 || 0.1, function () {
1609 var scroll = scrollFunc(),
1610 refreshedRecently = _getTime$1() - lastRefresh < 500,
1611 tween = tweenTo.tween;
1612
1613 if ((refreshedRecently || Math.abs(self.getVelocity()) < 10) && !tween && !_pointerIsDown && lastSnap !== scroll) {
1614 var progress = (scroll - start) / change,
1615 totalProgress = animation && !isToggle ? animation.totalProgress() : progress,
1616 velocity = refreshedRecently ? 0 : (totalProgress - snap2) / (_getTime$1() - _time2) * 1000 || 0,
1617 change1 = gsap$1.utils.clamp(-progress, 1 - progress, _abs(velocity / 2) * velocity / 0.185),
1618 naturalEnd = progress + (snap.inertia === false ? 0 : change1),
1619 endValue = _clamp$1(0, 1, snapFunc(naturalEnd, self)),
1620 endScroll = Math.round(start + endValue * change),
1621 _snap = snap,
1622 onStart = _snap.onStart,
1623 _onInterrupt = _snap.onInterrupt,
1624 _onComplete = _snap.onComplete;
1625
1626 if (scroll <= end && scroll >= start && endScroll !== scroll) {
1627 if (tween && !tween._initted && tween.data <= _abs(endScroll - scroll)) {
1628 return;
1629 }
1630
1631 if (snap.inertia === false) {
1632 change1 = endValue - progress;
1633 }
1634
1635 tweenTo(endScroll, {
1636 duration: snapDurClamp(_abs(Math.max(_abs(naturalEnd - totalProgress), _abs(endValue - totalProgress)) * 0.185 / velocity / 0.05 || 0)),
1637 ease: snap.ease || "power3",
1638 data: _abs(endScroll - scroll),
1639 onInterrupt: function onInterrupt() {
1640 return snapDelayedCall.restart(true) && _onInterrupt && _onInterrupt(self);
1641 },
1642 onComplete: function onComplete() {
1643 self.update();
1644 lastSnap = scrollFunc();
1645 snap1 = snap2 = animation && !isToggle ? animation.totalProgress() : self.progress;
1646 onSnapComplete && onSnapComplete(self);
1647 _onComplete && _onComplete(self);
1648 }
1649 }, scroll, change1 * change, endScroll - scroll - change1 * change);
1650 onStart && onStart(self, tweenTo.tween);
1651 }
1652 } else if (self.isActive && lastSnap !== scroll) {
1653 snapDelayedCall.restart(true);
1654 }
1655 }).pause();
1656 }
1657
1658 id && (_ids[id] = self);
1659 trigger = self.trigger = _getTarget(trigger || pin);
1660 customRevertReturn = trigger && trigger._gsap && trigger._gsap.stRevert;
1661 customRevertReturn && (customRevertReturn = customRevertReturn(self));
1662 pin = pin === true ? trigger : _getTarget(pin);
1663 _isString(toggleClass) && (toggleClass = {
1664 targets: trigger,
1665 className: toggleClass
1666 });
1667
1668 if (pin) {
1669 pinSpacing === false || pinSpacing === _margin || (pinSpacing = !pinSpacing && _getComputedStyle(pin.parentNode).display === "flex" ? false : _padding);
1670 self.pin = pin;
1671 vars.force3D !== false && gsap$1.set(pin, {
1672 force3D: true
1673 });
1674 pinCache = gsap$1.core.getCache(pin);
1675
1676 if (!pinCache.spacer) {
1677 if (pinSpacer) {
1678 pinSpacer = _getTarget(pinSpacer);
1679 pinSpacer && !pinSpacer.nodeType && (pinSpacer = pinSpacer.current || pinSpacer.nativeElement);
1680 pinCache.spacerIsNative = !!pinSpacer;
1681 pinSpacer && (pinCache.spacerState = _getState(pinSpacer));
1682 }
1683
1684 pinCache.spacer = spacer = pinSpacer || _doc$1.createElement("div");
1685 spacer.classList.add("pin-spacer");
1686 id && spacer.classList.add("pin-spacer-" + id);
1687 pinCache.pinState = pinOriginalState = _getState(pin);
1688 } else {
1689 pinOriginalState = pinCache.pinState;
1690 }
1691
1692 self.spacer = spacer = pinCache.spacer;
1693 cs = _getComputedStyle(pin);
1694 spacingStart = cs[pinSpacing + direction.os2];
1695 pinGetter = gsap$1.getProperty(pin);
1696 pinSetter = gsap$1.quickSetter(pin, direction.a, _px);
1697
1698 _swapPinIn(pin, spacer, cs);
1699
1700 pinState = _getState(pin);
1701 }
1702
1703 if (markers) {
1704 markerVars = _isObject(markers) ? _setDefaults(markers, _markerDefaults) : _markerDefaults;
1705 markerStartTrigger = _createMarker("scroller-start", id, scroller, direction, markerVars, 0);
1706 markerEndTrigger = _createMarker("scroller-end", id, scroller, direction, markerVars, 0, markerStartTrigger);
1707 offset = markerStartTrigger["offset" + direction.op.d2];
1708
1709 var content = _getTarget(_getProxyProp(scroller, "content") || scroller);
1710
1711 markerStart = this.markerStart = _createMarker("start", id, content, direction, markerVars, offset, 0, containerAnimation);
1712 markerEnd = this.markerEnd = _createMarker("end", id, content, direction, markerVars, offset, 0, containerAnimation);
1713 containerAnimation && (caMarkerSetter = gsap$1.quickSetter([markerStart, markerEnd], direction.a, _px));
1714
1715 if (!useFixedPosition && !(_proxies.length && _getProxyProp(scroller, "fixedMarkers") === true)) {
1716 _makePositionable(isViewport ? _body$1 : scroller);
1717
1718 gsap$1.set([markerStartTrigger, markerEndTrigger], {
1719 force3D: true
1720 });
1721 markerStartSetter = gsap$1.quickSetter(markerStartTrigger, direction.a, _px);
1722 markerEndSetter = gsap$1.quickSetter(markerEndTrigger, direction.a, _px);
1723 }
1724 }
1725
1726 if (containerAnimation) {
1727 var oldOnUpdate = containerAnimation.vars.onUpdate,
1728 oldParams = containerAnimation.vars.onUpdateParams;
1729 containerAnimation.eventCallback("onUpdate", function () {
1730 self.update(0, 0, 1);
1731 oldOnUpdate && oldOnUpdate.apply(oldParams || []);
1732 });
1733 }
1734
1735 self.previous = function () {
1736 return _triggers[_triggers.indexOf(self) - 1];
1737 };
1738
1739 self.next = function () {
1740 return _triggers[_triggers.indexOf(self) + 1];
1741 };
1742
1743 self.revert = function (revert) {
1744 var r = revert !== false || !self.enabled,
1745 prevRefreshing = _refreshing;
1746
1747 if (r !== self.isReverted) {
1748 if (r) {
1749 self.scroll.rec || !_refreshing || !_refreshingAll || (self.scroll.rec = scrollFunc());
1750 prevScroll = Math.max(scrollFunc(), self.scroll.rec || 0);
1751 prevProgress = self.progress;
1752 prevAnimProgress = animation && animation.progress();
1753 }
1754
1755 markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {
1756 return m.style.display = r ? "none" : "block";
1757 });
1758 r && (_refreshing = 1);
1759 self.update(r);
1760 _refreshing = prevRefreshing;
1761 pin && (r ? _swapPinOut(pin, spacer, pinOriginalState) : (!pinReparent || !self.isActive) && _swapPinIn(pin, spacer, _getComputedStyle(pin), spacerState));
1762 self.isReverted = r;
1763 }
1764 };
1765
1766 self.refresh = function (soft, force) {
1767 if ((_refreshing || !self.enabled) && !force) {
1768 return;
1769 }
1770
1771 if (pin && soft && _lastScrollTime) {
1772 _addListener$1(ScrollTrigger, "scrollEnd", _softRefresh);
1773
1774 return;
1775 }
1776
1777 !_refreshingAll && onRefreshInit && onRefreshInit(self);
1778 _refreshing = 1;
1779 lastRefresh = _getTime$1();
1780
1781 if (tweenTo.tween) {
1782 tweenTo.tween.kill();
1783 tweenTo.tween = 0;
1784 }
1785
1786 scrubTween && scrubTween.pause();
1787 invalidateOnRefresh && animation && animation.time(-0.01, true).invalidate();
1788 self.isReverted || self.revert();
1789
1790 var size = getScrollerSize(),
1791 scrollerBounds = getScrollerOffsets(),
1792 max = containerAnimation ? containerAnimation.duration() : _maxScroll(scroller, direction),
1793 offset = 0,
1794 otherPinOffset = 0,
1795 parsedEnd = vars.end,
1796 parsedEndTrigger = vars.endTrigger || trigger,
1797 parsedStart = vars.start || (vars.start === 0 || !trigger ? 0 : pin ? "0 0" : "0 100%"),
1798 pinnedContainer = self.pinnedContainer = vars.pinnedContainer && _getTarget(vars.pinnedContainer),
1799 triggerIndex = trigger && Math.max(0, _triggers.indexOf(self)) || 0,
1800 i = triggerIndex,
1801 cs,
1802 bounds,
1803 scroll,
1804 isVertical,
1805 override,
1806 curTrigger,
1807 curPin,
1808 oppositeScroll,
1809 initted,
1810 revertedPins;
1811
1812 while (i--) {
1813 curTrigger = _triggers[i];
1814 curTrigger.end || curTrigger.refresh(0, 1) || (_refreshing = 1);
1815 curPin = curTrigger.pin;
1816
1817 if (curPin && (curPin === trigger || curPin === pin) && !curTrigger.isReverted) {
1818 revertedPins || (revertedPins = []);
1819 revertedPins.unshift(curTrigger);
1820 curTrigger.revert();
1821 }
1822
1823 if (curTrigger !== _triggers[i]) {
1824 triggerIndex--;
1825 i--;
1826 }
1827 }
1828
1829 _isFunction(parsedStart) && (parsedStart = parsedStart(self));
1830 start = _parsePosition(parsedStart, trigger, size, direction, scrollFunc(), markerStart, markerStartTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation) || (pin ? -0.001 : 0);
1831 _isFunction(parsedEnd) && (parsedEnd = parsedEnd(self));
1832
1833 if (_isString(parsedEnd) && !parsedEnd.indexOf("+=")) {
1834 if (~parsedEnd.indexOf(" ")) {
1835 parsedEnd = (_isString(parsedStart) ? parsedStart.split(" ")[0] : "") + parsedEnd;
1836 } else {
1837 offset = _offsetToPx(parsedEnd.substr(2), size);
1838 parsedEnd = _isString(parsedStart) ? parsedStart : start + offset;
1839 parsedEndTrigger = trigger;
1840 }
1841 }
1842
1843 end = Math.max(start, _parsePosition(parsedEnd || (parsedEndTrigger ? "100% 0" : max), parsedEndTrigger, size, direction, scrollFunc() + offset, markerEnd, markerEndTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation)) || -0.001;
1844 change = end - start || (start -= 0.01) && 0.001;
1845 offset = 0;
1846 i = triggerIndex;
1847
1848 while (i--) {
1849 curTrigger = _triggers[i];
1850 curPin = curTrigger.pin;
1851
1852 if (curPin && curTrigger.start - curTrigger._pinPush < start && !containerAnimation && curTrigger.end > 0) {
1853 cs = curTrigger.end - curTrigger.start;
1854
1855 if ((curPin === trigger || curPin === pinnedContainer) && !_isNumber(parsedStart)) {
1856 offset += cs * (1 - curTrigger.progress);
1857 }
1858
1859 curPin === pin && (otherPinOffset += cs);
1860 }
1861 }
1862
1863 start += offset;
1864 end += offset;
1865 self._pinPush = otherPinOffset;
1866
1867 if (markerStart && offset) {
1868 cs = {};
1869 cs[direction.a] = "+=" + offset;
1870 pinnedContainer && (cs[direction.p] = "-=" + scrollFunc());
1871 gsap$1.set([markerStart, markerEnd], cs);
1872 }
1873
1874 if (pin) {
1875 cs = _getComputedStyle(pin);
1876 isVertical = direction === _vertical;
1877 scroll = scrollFunc();
1878 pinStart = parseFloat(pinGetter(direction.a)) + otherPinOffset;
1879 !max && end > 1 && ((isViewport ? _body$1 : scroller).style["overflow-" + direction.a] = "scroll");
1880
1881 _swapPinIn(pin, spacer, cs);
1882
1883 pinState = _getState(pin);
1884 bounds = _getBounds(pin, true);
1885 oppositeScroll = useFixedPosition && _getScrollFunc(scroller, isVertical ? _horizontal : _vertical)();
1886
1887 if (pinSpacing) {
1888 spacerState = [pinSpacing + direction.os2, change + otherPinOffset + _px];
1889 spacerState.t = spacer;
1890 i = pinSpacing === _padding ? _getSize(pin, direction) + change + otherPinOffset : 0;
1891 i && spacerState.push(direction.d, i + _px);
1892
1893 _setState(spacerState);
1894
1895 useFixedPosition && scrollFunc(prevScroll);
1896 }
1897
1898 if (useFixedPosition) {
1899 override = {
1900 top: bounds.top + (isVertical ? scroll - start : oppositeScroll) + _px,
1901 left: bounds.left + (isVertical ? oppositeScroll : scroll - start) + _px,
1902 boxSizing: "border-box",
1903 position: "fixed"
1904 };
1905 override[_width] = override["max" + _Width] = Math.ceil(bounds.width) + _px;
1906 override[_height] = override["max" + _Height] = Math.ceil(bounds.height) + _px;
1907 override[_margin] = override[_margin + _Top] = override[_margin + _Right] = override[_margin + _Bottom] = override[_margin + _Left] = "0";
1908 override[_padding] = cs[_padding];
1909 override[_padding + _Top] = cs[_padding + _Top];
1910 override[_padding + _Right] = cs[_padding + _Right];
1911 override[_padding + _Bottom] = cs[_padding + _Bottom];
1912 override[_padding + _Left] = cs[_padding + _Left];
1913 pinActiveState = _copyState(pinOriginalState, override, pinReparent);
1914 }
1915
1916 if (animation) {
1917 initted = animation._initted;
1918
1919 _suppressOverwrites(1);
1920
1921 animation.render(animation.duration(), true, true);
1922 pinChange = pinGetter(direction.a) - pinStart + change + otherPinOffset;
1923 change !== pinChange && pinActiveState.splice(pinActiveState.length - 2, 2);
1924 animation.render(0, true, true);
1925 initted || animation.invalidate();
1926
1927 _suppressOverwrites(0);
1928 } else {
1929 pinChange = change;
1930 }
1931 } else if (trigger && scrollFunc() && !containerAnimation) {
1932 bounds = trigger.parentNode;
1933
1934 while (bounds && bounds !== _body$1) {
1935 if (bounds._pinOffset) {
1936 start -= bounds._pinOffset;
1937 end -= bounds._pinOffset;
1938 }
1939
1940 bounds = bounds.parentNode;
1941 }
1942 }
1943
1944 revertedPins && revertedPins.forEach(function (t) {
1945 return t.revert(false);
1946 });
1947 self.start = start;
1948 self.end = end;
1949 scroll1 = scroll2 = scrollFunc();
1950
1951 if (!containerAnimation) {
1952 scroll1 < prevScroll && scrollFunc(prevScroll);
1953 self.scroll.rec = 0;
1954 }
1955
1956 self.revert(false);
1957
1958 if (snapDelayedCall) {
1959 lastSnap = -1;
1960 self.isActive && scrollFunc(start + change * prevProgress);
1961 snapDelayedCall.restart(true);
1962 }
1963
1964 _refreshing = 0;
1965 animation && isToggle && (animation._initted || prevAnimProgress) && animation.progress() !== prevAnimProgress && animation.progress(prevAnimProgress, true).render(animation.time(), true, true);
1966
1967 if (prevProgress !== self.progress || containerAnimation) {
1968 animation && !isToggle && animation.totalProgress(prevProgress, true);
1969 self.progress = prevProgress;
1970 self.update(0, 0, 1);
1971 }
1972
1973 pin && pinSpacing && (spacer._pinOffset = Math.round(self.progress * pinChange));
1974 onRefresh && onRefresh(self);
1975 };
1976
1977 self.getVelocity = function () {
1978 return (scrollFunc() - scroll2) / (_getTime$1() - _time2) * 1000 || 0;
1979 };
1980
1981 self.endAnimation = function () {
1982 _endAnimation(self.callbackAnimation);
1983
1984 if (animation) {
1985 scrubTween ? scrubTween.progress(1) : !animation.paused() ? _endAnimation(animation, animation.reversed()) : isToggle || _endAnimation(animation, self.direction < 0, 1);
1986 }
1987 };
1988
1989 self.labelToScroll = function (label) {
1990 return animation && animation.labels && (start || self.refresh() || start) + animation.labels[label] / animation.duration() * change || 0;
1991 };
1992
1993 self.getTrailing = function (name) {
1994 var i = _triggers.indexOf(self),
1995 a = self.direction > 0 ? _triggers.slice(0, i).reverse() : _triggers.slice(i + 1);
1996
1997 return (_isString(name) ? a.filter(function (t) {
1998 return t.vars.preventOverlaps === name;
1999 }) : a).filter(function (t) {
2000 return self.direction > 0 ? t.end <= start : t.start >= end;
2001 });
2002 };
2003
2004 self.update = function (reset, recordVelocity, forceFake) {
2005 if (containerAnimation && !forceFake && !reset) {
2006 return;
2007 }
2008
2009 var scroll = self.scroll(),
2010 p = reset ? 0 : (scroll - start) / change,
2011 clipped = p < 0 ? 0 : p > 1 ? 1 : p || 0,
2012 prevProgress = self.progress,
2013 isActive,
2014 wasActive,
2015 toggleState,
2016 action,
2017 stateChanged,
2018 toggled,
2019 isAtMax,
2020 isTakingAction;
2021
2022 if (recordVelocity) {
2023 scroll2 = scroll1;
2024 scroll1 = containerAnimation ? scrollFunc() : scroll;
2025
2026 if (snap) {
2027 snap2 = snap1;
2028 snap1 = animation && !isToggle ? animation.totalProgress() : clipped;
2029 }
2030 }
2031
2032 anticipatePin && !clipped && pin && !_refreshing && !_startup$1 && _lastScrollTime && start < scroll + (scroll - scroll2) / (_getTime$1() - _time2) * anticipatePin && (clipped = 0.0001);
2033
2034 if (clipped !== prevProgress && self.enabled) {
2035 isActive = self.isActive = !!clipped && clipped < 1;
2036 wasActive = !!prevProgress && prevProgress < 1;
2037 toggled = isActive !== wasActive;
2038 stateChanged = toggled || !!clipped !== !!prevProgress;
2039 self.direction = clipped > prevProgress ? 1 : -1;
2040 self.progress = clipped;
2041
2042 if (stateChanged && !_refreshing) {
2043 toggleState = clipped && !prevProgress ? 0 : clipped === 1 ? 1 : prevProgress === 1 ? 2 : 3;
2044
2045 if (isToggle) {
2046 action = !toggled && toggleActions[toggleState + 1] !== "none" && toggleActions[toggleState + 1] || toggleActions[toggleState];
2047 isTakingAction = animation && (action === "complete" || action === "reset" || action in animation);
2048 }
2049 }
2050
2051 preventOverlaps && (toggled || isTakingAction) && (isTakingAction || scrub || !animation) && (_isFunction(preventOverlaps) ? preventOverlaps(self) : self.getTrailing(preventOverlaps).forEach(function (t) {
2052 return t.endAnimation();
2053 }));
2054
2055 if (!isToggle) {
2056 if (scrubTween && !_refreshing && !_startup$1) {
2057 (containerAnimation || _primary && _primary !== self) && scrubTween.render(scrubTween._dp._time - scrubTween._start);
2058
2059 if (scrubTween.resetTo) {
2060 scrubTween.resetTo("totalProgress", clipped, animation._tTime / animation._tDur);
2061 } else {
2062 scrubTween.vars.totalProgress = clipped;
2063 scrubTween.invalidate().restart();
2064 }
2065 } else if (animation) {
2066 animation.totalProgress(clipped, !!_refreshing);
2067 }
2068 }
2069
2070 if (pin) {
2071 reset && pinSpacing && (spacer.style[pinSpacing + direction.os2] = spacingStart);
2072
2073 if (!useFixedPosition) {
2074 pinSetter(_round(pinStart + pinChange * clipped));
2075 } else if (stateChanged) {
2076 isAtMax = !reset && clipped > prevProgress && end + 1 > scroll && scroll + 1 >= _maxScroll(scroller, direction);
2077
2078 if (pinReparent) {
2079 if (!reset && (isActive || isAtMax)) {
2080 var bounds = _getBounds(pin, true),
2081 _offset = scroll - start;
2082
2083 _reparent(pin, _body$1, bounds.top + (direction === _vertical ? _offset : 0) + _px, bounds.left + (direction === _vertical ? 0 : _offset) + _px);
2084 } else {
2085 _reparent(pin, spacer);
2086 }
2087 }
2088
2089 _setState(isActive || isAtMax ? pinActiveState : pinState);
2090
2091 pinChange !== change && clipped < 1 && isActive || pinSetter(pinStart + (clipped === 1 && !isAtMax ? pinChange : 0));
2092 }
2093 }
2094
2095 snap && !tweenTo.tween && !_refreshing && !_startup$1 && snapDelayedCall.restart(true);
2096 toggleClass && (toggled || once && clipped && (clipped < 1 || !_limitCallbacks)) && _toArray(toggleClass.targets).forEach(function (el) {
2097 return el.classList[isActive || once ? "add" : "remove"](toggleClass.className);
2098 });
2099 onUpdate && !isToggle && !reset && onUpdate(self);
2100
2101 if (stateChanged && !_refreshing) {
2102 if (isToggle) {
2103 if (isTakingAction) {
2104 if (action === "complete") {
2105 animation.pause().totalProgress(1);
2106 } else if (action === "reset") {
2107 animation.restart(true).pause();
2108 } else if (action === "restart") {
2109 animation.restart(true);
2110 } else {
2111 animation[action]();
2112 }
2113 }
2114
2115 onUpdate && onUpdate(self);
2116 }
2117
2118 if (toggled || !_limitCallbacks) {
2119 onToggle && toggled && _callback(self, onToggle);
2120 callbacks[toggleState] && _callback(self, callbacks[toggleState]);
2121 once && (clipped === 1 ? self.kill(false, 1) : callbacks[toggleState] = 0);
2122
2123 if (!toggled) {
2124 toggleState = clipped === 1 ? 1 : 3;
2125 callbacks[toggleState] && _callback(self, callbacks[toggleState]);
2126 }
2127 }
2128
2129 if (fastScrollEnd && !isActive && Math.abs(self.getVelocity()) > (_isNumber(fastScrollEnd) ? fastScrollEnd : 2500)) {
2130 _endAnimation(self.callbackAnimation);
2131
2132 scrubTween ? scrubTween.progress(1) : _endAnimation(animation, !clipped, 1);
2133 }
2134 } else if (isToggle && onUpdate && !_refreshing) {
2135 onUpdate(self);
2136 }
2137 }
2138
2139 if (markerEndSetter) {
2140 var n = containerAnimation ? scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0) : scroll;
2141 markerStartSetter(n + (markerStartTrigger._isFlipped ? 1 : 0));
2142 markerEndSetter(n);
2143 }
2144
2145 caMarkerSetter && caMarkerSetter(-scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0));
2146 };
2147
2148 self.enable = function (reset, refresh) {
2149 if (!self.enabled) {
2150 self.enabled = true;
2151
2152 _addListener$1(scroller, "resize", _onResize);
2153
2154 _addListener$1(isViewport ? _doc$1 : scroller, "scroll", _onScroll$1);
2155
2156 onRefreshInit && _addListener$1(ScrollTrigger, "refreshInit", onRefreshInit);
2157
2158 if (reset !== false) {
2159 self.progress = prevProgress = 0;
2160 scroll1 = scroll2 = lastSnap = scrollFunc();
2161 }
2162
2163 refresh !== false && self.refresh();
2164 }
2165 };
2166
2167 self.getTween = function (snap) {
2168 return snap && tweenTo ? tweenTo.tween : scrubTween;
2169 };
2170
2171 self.setPositions = function (newStart, newEnd) {
2172 if (pin) {
2173 pinStart += newStart - start;
2174 pinChange += newEnd - newStart - change;
2175 }
2176
2177 self.start = start = newStart;
2178 self.end = end = newEnd;
2179 change = newEnd - newStart;
2180 self.update();
2181 };
2182
2183 self.disable = function (reset, allowAnimation) {
2184 if (self.enabled) {
2185 reset !== false && self.revert();
2186 self.enabled = self.isActive = false;
2187 allowAnimation || scrubTween && scrubTween.pause();
2188 prevScroll = 0;
2189 pinCache && (pinCache.uncache = 1);
2190 onRefreshInit && _removeListener$1(ScrollTrigger, "refreshInit", onRefreshInit);
2191
2192 if (snapDelayedCall) {
2193 snapDelayedCall.pause();
2194 tweenTo.tween && tweenTo.tween.kill() && (tweenTo.tween = 0);
2195 }
2196
2197 if (!isViewport) {
2198 var i = _triggers.length;
2199
2200 while (i--) {
2201 if (_triggers[i].scroller === scroller && _triggers[i] !== self) {
2202 return;
2203 }
2204 }
2205
2206 _removeListener$1(scroller, "resize", _onResize);
2207
2208 _removeListener$1(scroller, "scroll", _onScroll$1);
2209 }
2210 }
2211 };
2212
2213 self.kill = function (revert, allowAnimation) {
2214 self.disable(revert, allowAnimation);
2215 scrubTween && !allowAnimation && scrubTween.kill();
2216 id && delete _ids[id];
2217
2218 var i = _triggers.indexOf(self);
2219
2220 i >= 0 && _triggers.splice(i, 1);
2221 i === _i && _direction > 0 && _i--;
2222 i = 0;
2223
2224 _triggers.forEach(function (t) {
2225 return t.scroller === self.scroller && (i = 1);
2226 });
2227
2228 i || (self.scroll.rec = 0);
2229
2230 if (animation) {
2231 animation.scrollTrigger = null;
2232 revert && animation.render(-1);
2233 allowAnimation || animation.kill();
2234 }
2235
2236 markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {
2237 return m.parentNode && m.parentNode.removeChild(m);
2238 });
2239 _primary === self && (_primary = 0);
2240
2241 if (pin) {
2242 pinCache && (pinCache.uncache = 1);
2243 i = 0;
2244
2245 _triggers.forEach(function (t) {
2246 return t.pin === pin && i++;
2247 });
2248
2249 i || (pinCache.spacer = 0);
2250 }
2251
2252 vars.onKill && vars.onKill(self);
2253 };
2254
2255 self.enable(false, false);
2256 customRevertReturn && customRevertReturn(self);
2257 !animation || !animation.add || change ? self.refresh() : gsap$1.delayedCall(0.01, function () {
2258 return start || end || self.refresh();
2259 }) && (change = 0.01) && (start = end = 0);
2260 };
2261
2262 ScrollTrigger.register = function register(core) {
2263 if (!_coreInitted$1) {
2264 gsap$1 = core || _getGSAP$1();
2265 _windowExists() && window.document && ScrollTrigger.enable();
2266 _coreInitted$1 = _enabled;
2267 }
2268
2269 return _coreInitted$1;
2270 };
2271
2272 ScrollTrigger.defaults = function defaults(config) {
2273 if (config) {
2274 for (var p in config) {
2275 _defaults[p] = config[p];
2276 }
2277 }
2278
2279 return _defaults;
2280 };
2281
2282 ScrollTrigger.disable = function disable(reset, kill) {
2283 _enabled = 0;
2284
2285 _triggers.forEach(function (trigger) {
2286 return trigger[kill ? "kill" : "disable"](reset);
2287 });
2288
2289 _removeListener$1(_win$1, "wheel", _onScroll$1);
2290
2291 _removeListener$1(_doc$1, "scroll", _onScroll$1);
2292
2293 clearInterval(_syncInterval);
2294
2295 _removeListener$1(_doc$1, "touchcancel", _passThrough);
2296
2297 _removeListener$1(_body$1, "touchstart", _passThrough);
2298
2299 _multiListener(_removeListener$1, _doc$1, "pointerdown,touchstart,mousedown", _pointerDownHandler);
2300
2301 _multiListener(_removeListener$1, _doc$1, "pointerup,touchend,mouseup", _pointerUpHandler);
2302
2303 _resizeDelay.kill();
2304
2305 _iterateAutoRefresh(_removeListener$1);
2306
2307 for (var i = 0; i < _scrollers.length; i += 3) {
2308 _wheelListener(_removeListener$1, _scrollers[i], _scrollers[i + 1]);
2309
2310 _wheelListener(_removeListener$1, _scrollers[i], _scrollers[i + 2]);
2311 }
2312 };
2313
2314 ScrollTrigger.enable = function enable() {
2315 _win$1 = window;
2316 _doc$1 = document;
2317 _docEl$1 = _doc$1.documentElement;
2318 _body$1 = _doc$1.body;
2319
2320 if (gsap$1) {
2321 _toArray = gsap$1.utils.toArray;
2322 _clamp$1 = gsap$1.utils.clamp;
2323 _suppressOverwrites = gsap$1.core.suppressOverwrites || _passThrough;
2324 gsap$1.core.globals("ScrollTrigger", ScrollTrigger);
2325
2326 if (_body$1) {
2327 _enabled = 1;
2328 Observer.register(gsap$1);
2329 ScrollTrigger.isTouch = Observer.isTouch;
2330
2331 _addListener$1(_win$1, "wheel", _onScroll$1);
2332
2333 _root$1 = [_win$1, _doc$1, _docEl$1, _body$1];
2334 ScrollTrigger.matchMedia({
2335 "(orientation: portrait)": function orientationPortrait() {
2336 _setBaseDimensions();
2337
2338 return _setBaseDimensions;
2339 }
2340 });
2341
2342 _addListener$1(_doc$1, "scroll", _onScroll$1);
2343
2344 var bodyStyle = _body$1.style,
2345 border = bodyStyle.borderTopStyle,
2346 bounds,
2347 i;
2348 bodyStyle.borderTopStyle = "solid";
2349 bounds = _getBounds(_body$1);
2350 _vertical.m = Math.round(bounds.top + _vertical.sc()) || 0;
2351 _horizontal.m = Math.round(bounds.left + _horizontal.sc()) || 0;
2352 border ? bodyStyle.borderTopStyle = border : bodyStyle.removeProperty("border-top-style");
2353 _syncInterval = setInterval(_sync, 250);
2354 gsap$1.delayedCall(0.5, function () {
2355 return _startup$1 = 0;
2356 });
2357
2358 _addListener$1(_doc$1, "touchcancel", _passThrough);
2359
2360 _addListener$1(_body$1, "touchstart", _passThrough);
2361
2362 _multiListener(_addListener$1, _doc$1, "pointerdown,touchstart,mousedown", _pointerDownHandler);
2363
2364 _multiListener(_addListener$1, _doc$1, "pointerup,touchend,mouseup", _pointerUpHandler);
2365
2366 _transformProp = gsap$1.utils.checkPrefix("transform");
2367
2368 _stateProps.push(_transformProp);
2369
2370 _coreInitted$1 = _getTime$1();
2371 _resizeDelay = gsap$1.delayedCall(0.2, _refreshAll).pause();
2372 _autoRefresh = [_doc$1, "visibilitychange", function () {
2373 var w = _win$1.innerWidth,
2374 h = _win$1.innerHeight;
2375
2376 if (_doc$1.hidden) {
2377 _prevWidth = w;
2378 _prevHeight = h;
2379 } else if (_prevWidth !== w || _prevHeight !== h) {
2380 _onResize();
2381 }
2382 }, _doc$1, "DOMContentLoaded", _refreshAll, _win$1, "load", _refreshAll, _win$1, "resize", _onResize];
2383
2384 _iterateAutoRefresh(_addListener$1);
2385
2386 _triggers.forEach(function (trigger) {
2387 return trigger.enable(0, 1);
2388 });
2389
2390 for (i = 0; i < _scrollers.length; i += 3) {
2391 _wheelListener(_removeListener$1, _scrollers[i], _scrollers[i + 1]);
2392
2393 _wheelListener(_removeListener$1, _scrollers[i], _scrollers[i + 2]);
2394 }
2395 }
2396 }
2397 };
2398
2399 ScrollTrigger.config = function config(vars) {
2400 "limitCallbacks" in vars && (_limitCallbacks = !!vars.limitCallbacks);
2401 var ms = vars.syncInterval;
2402 ms && clearInterval(_syncInterval) || (_syncInterval = ms) && setInterval(_sync, ms);
2403 "ignoreMobileResize" in vars && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize);
2404
2405 if ("autoRefreshEvents" in vars) {
2406 _iterateAutoRefresh(_removeListener$1) || _iterateAutoRefresh(_addListener$1, vars.autoRefreshEvents || "none");
2407 _ignoreResize = (vars.autoRefreshEvents + "").indexOf("resize") === -1;
2408 }
2409 };
2410
2411 ScrollTrigger.scrollerProxy = function scrollerProxy(target, vars) {
2412 var t = _getTarget(target),
2413 i = _scrollers.indexOf(t),
2414 isViewport = _isViewport$1(t);
2415
2416 if (~i) {
2417 _scrollers.splice(i, isViewport ? 6 : 2);
2418 }
2419
2420 if (vars) {
2421 isViewport ? _proxies.unshift(_win$1, vars, _body$1, vars, _docEl$1, vars) : _proxies.unshift(t, vars);
2422 }
2423 };
2424
2425 ScrollTrigger.matchMedia = function matchMedia(vars) {
2426 var mq, p, i, func, result;
2427
2428 for (p in vars) {
2429 i = _media.indexOf(p);
2430 func = vars[p];
2431 _creatingMedia = p;
2432
2433 if (p === "all") {
2434 func();
2435 } else {
2436 mq = _win$1.matchMedia(p);
2437
2438 if (mq) {
2439 mq.matches && (result = func());
2440
2441 if (~i) {
2442 _media[i + 1] = _combineFunc(_media[i + 1], func);
2443 _media[i + 2] = _combineFunc(_media[i + 2], result);
2444 } else {
2445 i = _media.length;
2446
2447 _media.push(p, func, result);
2448
2449 mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener("change", _onMediaChange);
2450 }
2451
2452 _media[i + 3] = mq.matches;
2453 }
2454 }
2455
2456 _creatingMedia = 0;
2457 }
2458
2459 return _media;
2460 };
2461
2462 ScrollTrigger.clearMatchMedia = function clearMatchMedia(query) {
2463 query || (_media.length = 0);
2464 query = _media.indexOf(query);
2465 query >= 0 && _media.splice(query, 4);
2466 };
2467
2468 ScrollTrigger.isInViewport = function isInViewport(element, ratio, horizontal) {
2469 var bounds = (_isString(element) ? _getTarget(element) : element).getBoundingClientRect(),
2470 offset = bounds[horizontal ? _width : _height] * ratio || 0;
2471 return horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win$1.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win$1.innerHeight;
2472 };
2473
2474 ScrollTrigger.positionInViewport = function positionInViewport(element, referencePoint, horizontal) {
2475 _isString(element) && (element = _getTarget(element));
2476 var bounds = element.getBoundingClientRect(),
2477 size = bounds[horizontal ? _width : _height],
2478 offset = referencePoint == null ? size / 2 : referencePoint in _keywords ? _keywords[referencePoint] * size : ~referencePoint.indexOf("%") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0;
2479 return horizontal ? (bounds.left + offset) / _win$1.innerWidth : (bounds.top + offset) / _win$1.innerHeight;
2480 };
2481
2482 return ScrollTrigger;
2483 }();
2484 ScrollTrigger$1.version = "3.10.3";
2485
2486 ScrollTrigger$1.saveStyles = function (targets) {
2487 return targets ? _toArray(targets).forEach(function (target) {
2488 if (target && target.style) {
2489 var i = _savedStyles.indexOf(target);
2490
2491 i >= 0 && _savedStyles.splice(i, 5);
2492
2493 _savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute("transform"), gsap$1.core.getCache(target), _creatingMedia);
2494 }
2495 }) : _savedStyles;
2496 };
2497
2498 ScrollTrigger$1.revert = function (soft, media) {
2499 return _revertAll(!soft, media);
2500 };
2501
2502 ScrollTrigger$1.create = function (vars, animation) {
2503 return new ScrollTrigger$1(vars, animation);
2504 };
2505
2506 ScrollTrigger$1.refresh = function (safe) {
2507 return safe ? _onResize() : (_coreInitted$1 || ScrollTrigger$1.register()) && _refreshAll(true);
2508 };
2509
2510 ScrollTrigger$1.update = _updateAll;
2511 ScrollTrigger$1.clearScrollMemory = _clearScrollMemory;
2512
2513 ScrollTrigger$1.maxScroll = function (element, horizontal) {
2514 return _maxScroll(element, horizontal ? _horizontal : _vertical);
2515 };
2516
2517 ScrollTrigger$1.getScrollFunc = function (element, horizontal) {
2518 return _getScrollFunc(_getTarget(element), horizontal ? _horizontal : _vertical);
2519 };
2520
2521 ScrollTrigger$1.getById = function (id) {
2522 return _ids[id];
2523 };
2524
2525 ScrollTrigger$1.getAll = function () {
2526 return _triggers.filter(function (t) {
2527 return t.vars.id !== "ScrollSmoother";
2528 });
2529 };
2530
2531 ScrollTrigger$1.isScrolling = function () {
2532 return !!_lastScrollTime;
2533 };
2534
2535 ScrollTrigger$1.snapDirectional = _snapDirectional;
2536
2537 ScrollTrigger$1.addEventListener = function (type, callback) {
2538 var a = _listeners[type] || (_listeners[type] = []);
2539 ~a.indexOf(callback) || a.push(callback);
2540 };
2541
2542 ScrollTrigger$1.removeEventListener = function (type, callback) {
2543 var a = _listeners[type],
2544 i = a && a.indexOf(callback);
2545 i >= 0 && a.splice(i, 1);
2546 };
2547
2548 ScrollTrigger$1.batch = function (targets, vars) {
2549 var result = [],
2550 varsCopy = {},
2551 interval = vars.interval || 0.016,
2552 batchMax = vars.batchMax || 1e9,
2553 proxyCallback = function proxyCallback(type, callback) {
2554 var elements = [],
2555 triggers = [],
2556 delay = gsap$1.delayedCall(interval, function () {
2557 callback(elements, triggers);
2558 elements = [];
2559 triggers = [];
2560 }).pause();
2561 return function (self) {
2562 elements.length || delay.restart(true);
2563 elements.push(self.trigger);
2564 triggers.push(self);
2565 batchMax <= elements.length && delay.progress(1);
2566 };
2567 },
2568 p;
2569
2570 for (p in vars) {
2571 varsCopy[p] = p.substr(0, 2) === "on" && _isFunction(vars[p]) && p !== "onRefreshInit" ? proxyCallback(p, vars[p]) : vars[p];
2572 }
2573
2574 if (_isFunction(batchMax)) {
2575 batchMax = batchMax();
2576
2577 _addListener$1(ScrollTrigger$1, "refresh", function () {
2578 return batchMax = vars.batchMax();
2579 });
2580 }
2581
2582 _toArray(targets).forEach(function (target) {
2583 var config = {};
2584
2585 for (p in varsCopy) {
2586 config[p] = varsCopy[p];
2587 }
2588
2589 config.trigger = target;
2590 result.push(ScrollTrigger$1.create(config));
2591 });
2592
2593 return result;
2594 };
2595
2596 var _clampScrollAndGetDurationMultiplier = function _clampScrollAndGetDurationMultiplier(scrollFunc, current, end, max) {
2597 current > max ? scrollFunc(max) : current < 0 && scrollFunc(0);
2598 return end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1;
2599 },
2600 _allowNativePanning = function _allowNativePanning(target, direction) {
2601 if (direction === true) {
2602 target.style.removeProperty("touch-action");
2603 } else {
2604 target.style.touchAction = direction ? "pan-" + direction : "none";
2605 }
2606
2607 target === _docEl$1 && _allowNativePanning(_body$1);
2608 },
2609 _overflow = {
2610 auto: 1,
2611 scroll: 1
2612 },
2613 _nestedScroll = function _nestedScroll(_ref5) {
2614 var event = _ref5.event,
2615 target = _ref5.target,
2616 axis = _ref5.axis;
2617
2618 var node = (event.changedTouches ? event.changedTouches[0] : event).target,
2619 cache = node._gsap || gsap$1.core.getCache(node),
2620 time = _getTime$1(),
2621 cs;
2622
2623 if (!cache._isScrollT || time - cache._isScrollT > 2000) {
2624 while (node && node.scrollHeight <= node.clientHeight) {
2625 node = node.parentNode;
2626 }
2627
2628 cache._isScroll = node && !_isViewport$1(node) && node !== target && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]);
2629 cache._isScrollT = time;
2630 }
2631
2632 (cache._isScroll || axis === "x") && (event._gsapAllow = true);
2633 },
2634 _inputObserver = function _inputObserver(target, type, inputs, nested) {
2635 return Observer.create({
2636 target: target,
2637 capture: true,
2638 debounce: false,
2639 lockAxis: true,
2640 type: type,
2641 onWheel: nested = nested && _nestedScroll,
2642 onPress: nested,
2643 onDrag: nested,
2644 onScroll: nested,
2645 onEnable: function onEnable() {
2646 return inputs && _addListener$1(_doc$1, Observer.eventTypes[0], _captureInputs, false, true);
2647 },
2648 onDisable: function onDisable() {
2649 return _removeListener$1(_doc$1, Observer.eventTypes[0], _captureInputs);
2650 }
2651 });
2652 },
2653 _inputExp = /(input|label|select|textarea)/i,
2654 _inputIsFocused,
2655 _captureInputs = function _captureInputs(e) {
2656 var isInput = _inputExp.test(e.target.tagName);
2657
2658 if (isInput || _inputIsFocused) {
2659 e._gsapAllow = true;
2660 _inputIsFocused = isInput;
2661 }
2662 },
2663 _getScrollNormalizer = function _getScrollNormalizer(vars) {
2664 _isObject(vars) || (vars = {});
2665 vars.preventDefault = vars.isNormalizer = vars.allowClicks = true;
2666 vars.type || (vars.type = "wheel,touch");
2667 vars.debounce = !!vars.debounce;
2668 vars.id = vars.id || "normalizer";
2669
2670 var _vars2 = vars,
2671 normalizeScrollX = _vars2.normalizeScrollX,
2672 momentum = _vars2.momentum,
2673 allowNestedScroll = _vars2.allowNestedScroll,
2674 self,
2675 maxY,
2676 target = _getTarget(vars.target) || _docEl$1,
2677 scrollFuncY = _getScrollFunc(target, _vertical),
2678 scrollFuncX = _getScrollFunc(target, _horizontal),
2679 scale = 1,
2680 wheelRefresh = 0,
2681 resolveMomentumDuration = _isFunction(momentum) ? function () {
2682 return momentum(self);
2683 } : function () {
2684 return momentum || 2.8;
2685 },
2686 skipTouchMove,
2687 lastRefreshID,
2688 inputObserver = _inputObserver(target, vars.type, true, allowNestedScroll),
2689 resumeTouchMove = function resumeTouchMove() {
2690 return skipTouchMove = false;
2691 },
2692 scrollClampX = _passThrough,
2693 scrollClampY = _passThrough,
2694 updateClamps = function updateClamps() {
2695 maxY = _maxScroll(target, _vertical);
2696 scrollClampY = _clamp$1(0, maxY);
2697 normalizeScrollX && (scrollClampX = _clamp$1(0, _maxScroll(target, _horizontal)));
2698 lastRefreshID = _refreshID;
2699 },
2700 fixIOSBug = ScrollTrigger$1.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent),
2701 ignoreDrag = function ignoreDrag() {
2702 if (skipTouchMove) {
2703 requestAnimationFrame(resumeTouchMove);
2704 return true;
2705 }
2706
2707 skipTouchMove = true;
2708 },
2709 tween,
2710 startScrollX,
2711 startScrollY,
2712 onStopDelayedCall,
2713 onResize = function onResize() {
2714 updateClamps();
2715 tween.isActive() && tween.vars.scrollY > maxY && tween.resetTo("scrollY", _maxScroll(target, _vertical));
2716 };
2717
2718 vars.ignoreCheck = function (e) {
2719 return fixIOSBug && e.type === "touchmove" && ignoreDrag() || scale > 1 || self.isGesturing || e.touches && e.touches.length > 1;
2720 };
2721
2722 vars.onPress = function () {
2723 var prevScale = scale;
2724 scale = _win$1.visualViewport && _win$1.visualViewport.scale || 1;
2725 tween.pause();
2726 prevScale !== scale && _allowNativePanning(target, scale > 1 ? true : normalizeScrollX ? false : "x");
2727 skipTouchMove = false;
2728 startScrollX = scrollFuncX();
2729 startScrollY = scrollFuncY();
2730 updateClamps();
2731 lastRefreshID = _refreshID;
2732 };
2733
2734 vars.onRelease = vars.onGestureStart = function (self, wasDragging) {
2735 if (!wasDragging) {
2736 onStopDelayedCall.restart(true);
2737 } else {
2738 var dur = resolveMomentumDuration(),
2739 currentScroll,
2740 endScroll;
2741
2742 if (normalizeScrollX) {
2743 currentScroll = scrollFuncX();
2744 endScroll = currentScroll + dur * 0.05 * -self.velocityX / 0.227 / scale;
2745 dur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _horizontal));
2746 tween.vars.scrollX = scrollClampX(endScroll);
2747 }
2748
2749 currentScroll = scrollFuncY();
2750 endScroll = currentScroll + dur * 0.05 * -self.velocityY / 0.227 / scale;
2751 dur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _vertical));
2752 tween.vars.scrollY = scrollClampY(endScroll);
2753 tween.invalidate().duration(dur).play(0.01);
2754 }
2755 };
2756
2757 vars.onWheel = function () {
2758 tween._ts && tween.pause();
2759
2760 if (_getTime$1() - wheelRefresh > 1000) {
2761 lastRefreshID = 0;
2762 wheelRefresh = _getTime$1();
2763 }
2764 };
2765
2766 vars.onChange = function (self, dx, dy, xArray, yArray) {
2767 _refreshID !== lastRefreshID && updateClamps();
2768 dx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) / scale : scrollFuncX() + dx - xArray[1]));
2769 dy && scrollFuncY(scrollClampY(yArray[2] === dy ? startScrollY + (self.startY - self.y) / scale : scrollFuncY() + dy - yArray[1]));
2770
2771 _updateAll();
2772 };
2773
2774 vars.onEnable = function () {
2775 _allowNativePanning(target, normalizeScrollX ? false : "x");
2776
2777 _addListener$1(_win$1, "resize", onResize);
2778
2779 inputObserver.enable();
2780 };
2781
2782 vars.onDisable = function () {
2783 _allowNativePanning(target, true);
2784
2785 _removeListener$1(_win$1, "resize", onResize);
2786
2787 inputObserver.kill();
2788 };
2789
2790 self = new Observer(vars);
2791 onStopDelayedCall = self._dc;
2792 tween = gsap$1.to(self, {
2793 ease: "power4",
2794 paused: true,
2795 scrollX: normalizeScrollX ? "+=0.1" : "+=0",
2796 scrollY: "+=0.1",
2797 onComplete: onStopDelayedCall.vars.onComplete
2798 });
2799 return self;
2800 };
2801
2802 ScrollTrigger$1.sort = function (func) {
2803 return _triggers.sort(func || function (a, b) {
2804 return (a.vars.refreshPriority || 0) * -1e6 + a.start - (b.start + (b.vars.refreshPriority || 0) * -1e6);
2805 });
2806 };
2807
2808 ScrollTrigger$1.observe = function (vars) {
2809 return new Observer(vars);
2810 };
2811
2812 ScrollTrigger$1.normalizeScroll = function (vars) {
2813 if (typeof vars === "undefined") {
2814 return _normalizer$1;
2815 }
2816
2817 if (vars === true && _normalizer$1) {
2818 return _normalizer$1.enable();
2819 }
2820
2821 if (vars === false) {
2822 return _normalizer$1 && _normalizer$1.kill();
2823 }
2824
2825 var normalizer = vars instanceof Observer ? vars : _getScrollNormalizer(vars);
2826 _normalizer$1 && _normalizer$1.target === normalizer.target && _normalizer$1.kill();
2827 _isViewport$1(normalizer.target) && (_normalizer$1 = normalizer);
2828 return normalizer;
2829 };
2830
2831 ScrollTrigger$1.core = {
2832 _getVelocityProp: _getVelocityProp,
2833 _inputObserver: _inputObserver,
2834 _scrollers: _scrollers,
2835 _proxies: _proxies,
2836 bridge: {
2837 ss: function ss() {
2838 _lastScrollTime || _dispatch("scrollStart");
2839 _lastScrollTime = _getTime$1();
2840 },
2841 ref: function ref() {
2842 return _refreshing;
2843 }
2844 }
2845 };
2846 _getGSAP$1() && gsap$1.registerPlugin(ScrollTrigger$1);
2847
2848 exports.ScrollTrigger = ScrollTrigger$1;
2849 exports.default = ScrollTrigger$1;
2850
2851 if (typeof(window) === 'undefined' || window !== exports) {Object.defineProperty(exports, '__esModule', { value: true });} else {delete window.default;}
2852
2853})));