UNPKG

22.5 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 exports._scrollers = [];
51 exports._proxies = [];
52 var _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, exports._scrollers);
62 proxies.push.apply(proxies, exports._proxies);
63 exports._scrollers = scrollers;
64 exports._proxies = proxies;
65
66 _bridge = function _bridge(name, value) {
67 return data[name](value);
68 };
69 },
70 _getProxyProp = function _getProxyProp(element, property) {
71 return ~exports._proxies.indexOf(element) && exports._proxies[exports._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 || exports._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 = exports._scrollers.cache;
97 _normalizer && _normalizer.isPressed && _bridge("ss", value);
98 } else if (exports._scrollers.cache !== f.c || _bridge("ref")) {
99 f.c = exports._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 = exports._scrollers.indexOf(element),
141 offset = sc === _vertical.sc ? 1 : 2;
142
143 !~i && (i = exports._scrollers.push(element) - 1);
144 return exports._scrollers[i + offset] || (exports._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 exports._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 exports.Observer = Observer;
665 exports._getProxyProp = _getProxyProp;
666 exports._getScrollFunc = _getScrollFunc;
667 exports._getTarget = _getTarget;
668 exports._getVelocityProp = _getVelocityProp;
669 exports._horizontal = _horizontal;
670 exports._isViewport = _isViewport;
671 exports._vertical = _vertical;
672 exports.default = Observer;
673
674 if (typeof(window) === 'undefined' || window !== exports) {Object.defineProperty(exports, '__esModule', { value: true });} else {delete window.default;}
675
676})));