(function($){
var Sticky=function(element, userSettings){
var $element,
isSticky=false,
isFollowingParent=false,
isReachedEffectsPoint=false,
elements={},
settings,
elementOffsetValue,
elementWidth;
var defaultSettings={
to: 'top',
offset: 0,
effectsOffset: 0,
parent: false,
classes: {
sticky: 'sticky',
stickyActive: 'sticky-active',
stickyEffects: 'sticky-effects',
spacer: 'sticky-spacer',
},
isRTL: false,
isScrollSnapActive: false,
handleScrollbarWidth: false,
};
var initElements=function(){
$element=$(element).addClass(settings.classes.sticky);
elements.$window=$(window);
elements.$body=$(document).find('body');
if(settings.parent){
elements.$parent=$element.parent();
if('parent'!==settings.parent){
elements.$parent=elements.$parent.closest(settings.parent);
}}
};
var initSettings=function(){
settings=jQuery.extend(true, defaultSettings, userSettings);
};
var bindEvents=function(){
elements.$window.on('resize', onWindowResize);
if(settings.isScrollSnapActive){
elements.$body.on('scroll', onWindowScroll);
}else{
elements.$window.on('scroll', onWindowScroll);
}};
var unbindEvents=function(){
elements.$window
.off('scroll', onWindowScroll)
.off('resize', onWindowResize);
elements.$body.off('scroll', onWindowScroll);
};
var init=function(){
initSettings();
initElements();
bindEvents();
checkPosition();
};
var backupCSS=function($elementBackupCSS, backupState, properties){
var css={},
elementStyle=$elementBackupCSS[ 0 ].style;
properties.forEach(function(property){
css[ property ]=undefined!==elementStyle[ property ] ? elementStyle[ property ]:'';
});
$elementBackupCSS.data('css-backup-' + backupState, css);
};
var getCSSBackup=function($elementCSSBackup, backupState){
return $elementCSSBackup.data('css-backup-' + backupState);
};
const updateElementSizesData=()=> {
elementWidth=getElementOuterSize($element, 'width');
elementOffsetValue=$element.offset().left;
if(settings.isRTL){
const documentWidth=settings.handleScrollbarWidth ? window.innerWidth:document.body.offsetWidth;
elementOffsetValue=Math.max(documentWidth - elementWidth - elementOffsetValue, 0);
}}
var addSpacer=function(){
elements.$spacer=$element.clone()
.addClass(settings.classes.spacer)
.css({
visibility: 'hidden',
transition: 'none',
animation: 'none',
});
$element.after(elements.$spacer);
};
var removeSpacer=function(){
elements.$spacer.remove();
};
var stickElement=function(){
backupCSS($element, 'unsticky', [ 'position', 'width', 'margin-top', 'margin-bottom', 'top', 'bottom', 'inset-inline-start' ]);
const css={
position: 'fixed',
width: elementWidth,
marginTop: 0,
marginBottom: 0,
};
css[ settings.to ]=settings.offset;
css[ 'top'===settings.to ? 'bottom':'top' ]='';
if(elementOffsetValue){
css[ 'inset-inline-start' ]=elementOffsetValue + 'px';
}
$element
.css(css)
.addClass(settings.classes.stickyActive);
};
var unstickElement=function(){
$element
.css(getCSSBackup($element, 'unsticky') )
.removeClass(settings.classes.stickyActive);
};
var followParent=function(){
backupCSS(elements.$parent, 'childNotFollowing', [ 'position' ]);
elements.$parent.css('position', 'relative');
backupCSS($element, 'notFollowing', [ 'position', 'inset-inline-start', 'top', 'bottom' ]);
const css={
position: 'absolute',
};
elementOffsetValue=elements.$spacer.position().left;
if(settings.isRTL){
const parentWidth=$element.parent().outerWidth(),
elementOffsetValueLeft=elements.$spacer.position().left;
elementWidth=elements.$spacer.outerWidth();
elementOffsetValue=Math.max(parentWidth - elementWidth - elementOffsetValueLeft, 0);
}
css[ 'inset-inline-start' ]=elementOffsetValue + 'px';
css[ settings.to ]='';
css[ 'top'===settings.to ? 'bottom':'top' ]=0;
$element.css(css);
isFollowingParent=true;
};
var unfollowParent=function(){
elements.$parent.css(getCSSBackup(elements.$parent, 'childNotFollowing') );
$element.css(getCSSBackup($element, 'notFollowing') );
isFollowingParent=false;
};
var getElementOuterSize=function($elementOuterSize, dimension, includeMargins){
var computedStyle=getComputedStyle($elementOuterSize[ 0 ]),
elementSize=parseFloat(computedStyle[ dimension ]),
sides='height'===dimension ? [ 'top', 'bottom' ]:[ 'left', 'right' ],
propertiesToAdd=[];
if('border-box'!==computedStyle.boxSizing){
propertiesToAdd.push('border', 'padding');
}
if(includeMargins){
propertiesToAdd.push('margin');
}
propertiesToAdd.forEach(function(property){
sides.forEach(function(side){
elementSize +=parseFloat(computedStyle[ property + '-' + side ]);
});
});
return elementSize;
};
var getElementViewportOffset=function($elementViewportOffset){
var windowScrollTop=elements.$window.scrollTop(),
elementHeight=getElementOuterSize($elementViewportOffset, 'height'),
viewportHeight=innerHeight,
elementOffsetFromTop=$elementViewportOffset.offset().top,
distanceFromTop=elementOffsetFromTop - windowScrollTop,
topFromBottom=distanceFromTop - viewportHeight;
return {
top: {
fromTop: distanceFromTop,
fromBottom: topFromBottom,
},
bottom: {
fromTop: distanceFromTop + elementHeight,
fromBottom: topFromBottom + elementHeight,
},
};};
var stick=function(){
updateElementSizesData();
addSpacer();
stickElement();
isSticky=true;
$element.trigger('sticky:stick');
};
var unstick=function(){
unstickElement();
removeSpacer();
isSticky=false;
$element.trigger('sticky:unstick');
};
var checkParent=function(){
var elementOffset=getElementViewportOffset($element),
isTop='top'===settings.to;
if(isFollowingParent){
var isNeedUnfollowing=isTop ? elementOffset.top.fromTop > settings.offset:elementOffset.bottom.fromBottom < -settings.offset;
if(isNeedUnfollowing){
unfollowParent();
}}else{
var parentOffset=getElementViewportOffset(elements.$parent),
parentStyle=getComputedStyle(elements.$parent[ 0 ]),
borderWidthToDecrease=parseFloat(parentStyle[ isTop ? 'borderBottomWidth':'borderTopWidth' ]),
parentViewportDistance=isTop ? parentOffset.bottom.fromTop - borderWidthToDecrease:parentOffset.top.fromBottom + borderWidthToDecrease,
isNeedFollowing=isTop ? parentViewportDistance <=elementOffset.bottom.fromTop:parentViewportDistance >=elementOffset.top.fromBottom;
if(isNeedFollowing){
followParent();
}}
};
var checkEffectsPoint=function(distanceFromTriggerPoint){
if(isReachedEffectsPoint&&-distanceFromTriggerPoint < settings.effectsOffset){
$element.removeClass(settings.classes.stickyEffects);
isReachedEffectsPoint=false;
}else if(! isReachedEffectsPoint&&-distanceFromTriggerPoint >=settings.effectsOffset){
$element.addClass(settings.classes.stickyEffects);
isReachedEffectsPoint=true;
}};
var checkPosition=function(){
var offset=settings.offset,
distanceFromTriggerPoint;
if(isSticky){
var spacerViewportOffset=getElementViewportOffset(elements.$spacer);
distanceFromTriggerPoint='top'===settings.to ? spacerViewportOffset.top.fromTop - offset:-spacerViewportOffset.bottom.fromBottom - offset;
if(settings.parent){
checkParent();
}
if(distanceFromTriggerPoint > 0){
unstick();
}}else{
var elementViewportOffset=getElementViewportOffset($element);
distanceFromTriggerPoint='top'===settings.to ? elementViewportOffset.top.fromTop - offset:-elementViewportOffset.bottom.fromBottom - offset;
if(distanceFromTriggerPoint <=0){
stick();
if(settings.parent){
checkParent();
}}
}
checkEffectsPoint(distanceFromTriggerPoint);
};
var onWindowScroll=function(){
checkPosition();
};
var onWindowResize=function(){
if(! isSticky){
return;
}
unstickElement();
removeSpacer();
updateElementSizesData();
addSpacer();
stickElement();
if(settings.parent){
isFollowingParent=false;
checkParent();
}};
this.destroy=function(){
if(isSticky){
unstick();
}
unbindEvents();
$element.removeClass(settings.classes.sticky);
};
init();
};
$.fn.sticky=function(settings){
var isCommand='string'===typeof settings;
this.each(function(){
var $this=$(this);
if(! isCommand){
$this.data('sticky', new Sticky(this, settings) );
return;
}
var instance=$this.data('sticky');
if(! instance){
throw Error('Trying to perform the `' + settings + '` method prior to initialization');
}
if(! instance[ settings ]){
throw ReferenceError('Method `' + settings + '` not found in sticky instance');
}
instance[ settings ].apply(instance, Array.prototype.slice.call(arguments, 1) );
if('destroy'===settings){
$this.removeData('sticky');
}});
return this;
};
window.Sticky=Sticky;
})(jQuery);
!function(t,e){"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,(function(){function t(){}let e=t.prototype;return e.on=function(t,e){if(!t||!e)return this;let i=this._events=this._events||{},s=i[t]=i[t]||[];return s.includes(e)||s.push(e),this},e.once=function(t,e){if(!t||!e)return this;this.on(t,e);let i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this},e.off=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;let s=i.indexOf(e);return-1!=s&&i.splice(s,1),this},e.emitEvent=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;i=i.slice(0),e=e||[];let s=this._onceEvents&&this._onceEvents[t];for(let n of i){s&&s[n]&&(this.off(t,n),delete s[n]),n.apply(this,e)}return this},e.allOff=function(){return delete this._events,delete this._onceEvents,this},t})),
function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,(function(t,e){let i=t.jQuery,s=t.console;function n(t,e,o){if(!(this instanceof n))return new n(t,e,o);let r=t;var h;("string"==typeof t&&(r=document.querySelectorAll(t)),r)?(this.elements=(h=r,Array.isArray(h)?h:"object"==typeof h&&"number"==typeof h.length?[...h]:[h]),this.options={},"function"==typeof e?o=e:Object.assign(this.options,e),o&&this.on("always",o),this.getImages(),i&&(this.jqDeferred=new i.Deferred),setTimeout(this.check.bind(this))):s.error(`Bad element for imagesLoaded ${r||t}`)}n.prototype=Object.create(e.prototype),n.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)};const o=[1,9,11];n.prototype.addElementImages=function(t){"IMG"===t.nodeName&&this.addImage(t),!0===this.options.background&&this.addElementBackgroundImages(t);let{nodeType:e}=t;if(!e||!o.includes(e))return;let i=t.querySelectorAll("img");for(let t of i)this.addImage(t);if("string"==typeof this.options.background){let e=t.querySelectorAll(this.options.background);for(let t of e)this.addElementBackgroundImages(t)}};const r=/url\((['"])?(.*?)\1\)/gi;function h(t){this.img=t}function d(t,e){this.url=t,this.element=e,this.img=new Image}return n.prototype.addElementBackgroundImages=function(t){let e=getComputedStyle(t);if(!e)return;let i=r.exec(e.backgroundImage);for(;null!==i;){let s=i&&i[2];s&&this.addBackground(s,t),i=r.exec(e.backgroundImage)}},n.prototype.addImage=function(t){let e=new h(t);this.images.push(e)},n.prototype.addBackground=function(t,e){let i=new d(t,e);this.images.push(i)},n.prototype.check=function(){if(this.progressedCount=0,this.hasAnyBroken=!1,!this.images.length)return void this.complete();let t=(t,e,i)=>{setTimeout((()=>{this.progress(t,e,i)}))};this.images.forEach((function(e){e.once("progress",t),e.check()}))},n.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount===this.images.length&&this.complete(),this.options.debug&&s&&s.log(`progress: ${i}`,t,e)},n.prototype.complete=function(){let t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){let t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},h.prototype=Object.create(e.prototype),h.prototype.check=function(){this.getIsImageComplete()?this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.img.crossOrigin&&(this.proxyImage.crossOrigin=this.img.crossOrigin),this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.proxyImage.src=this.img.currentSrc||this.img.src)},h.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},h.prototype.confirm=function(t,e){this.isLoaded=t;let{parentNode:i}=this.img,s="PICTURE"===i.nodeName?i:this.img;this.emitEvent("progress",[this,s,e])},h.prototype.handleEvent=function(t){let e="on"+t.type;this[e]&&this[e](t)},h.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},h.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},h.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},d.prototype=Object.create(h.prototype),d.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url,this.getIsImageComplete()&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},d.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},d.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},n.makeJQueryPlugin=function(e){(e=e||t.jQuery)&&(i=e,i.fn.imagesLoaded=function(t,e){return new n(this,t,e).jqDeferred.promise(i(this))})},n.makeJQueryPlugin(),n}));