(function (){
'use strict';
function readConfig(el){
var get=function (name, def){
var v=el.getAttribute('data-sstack-' + name);
return (v===null||v==='') ? def:v;
};
var num=function (name, def){
var v=parseFloat(get(name, String(def)));
return isNaN(v) ? def:v;
};
var bool=function (name, def){
var v=get(name, def ? 'true':'false');
return v==='true'||v==='on';
};
return {
selector:      get('selector', ''),
stackPos:      num('position', 20),
stackDist:     num('distance', 20),
itemDist:      num('item-distance', 150),
scrub:         get('scrub', '1'),
ease:          get('ease', 'none'),
anticipate:    bool('anticipate', false),
scaleOn:       bool('scale', true),
baseScale:     num('base-scale', 0.9),
scalePerCard:  num('scale-per-card', 0.03),
rotateOn:      bool('rotate', false),
rotateAmount:  num('rotate-amount', 0),
blurOn:        bool('blur', false),
blurAmount:    num('blur-amount', 0),
opacityOn:     bool('opacity', false),
opacityAmount: num('opacity-amount', 0),
};}
function findCards(section, customSel){
if(customSel){
var custom=section.querySelectorAll(customSel);
if(custom.length >=2) return Array.prototype.slice.call(custom);
}
var rows=section.querySelectorAll(':scope > .et_pb_row, :scope > .et_pb_row_inner');
rows=Array.prototype.slice.call(rows);
if(rows.length >=2) return rows;
if(rows.length===1){
var cols=rows[0].querySelectorAll(':scope > .et_pb_column, :scope > .et_pb_column_inner');
if(cols.length >=2) return Array.prototype.slice.call(cols);
}
return [];
}
function absTop(el){
return el.getBoundingClientRect().top + window.scrollY;
}
function initSection(section){
if(section._dnxteSStackInit) return;
var cfg=readConfig(section);
var cards=findCards(section, cfg.selector);
if(cards.length < 2) return;
if(typeof gsap==='undefined'||typeof ScrollTrigger==='undefined'){
console.warn('[DnxteSStack] GSAP or ScrollTrigger not loaded');
return;
}
gsap.registerPlugin(ScrollTrigger);
section._dnxteSStackInit=true;
var originalSectionOverflow=section.style.overflow;
section.style.setProperty('overflow', 'visible', 'important');
var minH=Math.round(window.innerHeight * 0.5);
var originalCardStyles=cards.map(function (card){
return {
willChange: card.style.willChange,
backfaceVisibility: card.style.backfaceVisibility,
transformOrigin: card.style.transformOrigin,
minHeight: card.style.minHeight,
transition: card.style.transition,
zIndex: card.style.zIndex,
marginTop: card.style.marginTop,
};});
cards.forEach(function (card, i){
card.style.willChange='transform, filter, opacity';
card.style.backfaceVisibility='hidden';
card.style.transformOrigin='center top';
card.style.setProperty('transition', 'none', 'important');
card.style.zIndex=String(i + 1);
if(card.offsetHeight < minH){
card.style.setProperty('min-height', minH + 'px', 'important');
}});
var cardHeights=cards.map(function (c){ return c.offsetHeight; });
cards.forEach(function (card, i){
if(i===0) return;
var pullUp=cardHeights[i - 1] - cfg.stackDist;
if(pullUp > 0){
card.style.setProperty('margin-top', -pullUp + 'px', 'important');
}});
var firstTop=absTop(cards[0]);
var naturalOffsets=cards.map(function (c){ return absTop(c) - firstTop; });
var tl=gsap.timeline();
tl.addLabel('card1', 0);
var dur=0.5;
var ease=cfg.ease||'none';
cards.forEach(function (card, i){
if(i===0) return;
var prev=cards[i - 1];
var label='card' + (i + 1);
tl.addLabel(label);
var prevTo={ duration: dur, ease: ease };
if(cfg.scaleOn){
prevTo.scale=Math.max(0.5, cfg.baseScale + (i - 1) * cfg.scalePerCard);
}
if(cfg.rotateOn&&cfg.rotateAmount!==0){
prevTo.rotation=i * cfg.rotateAmount;
}
if(cfg.blurOn&&cfg.blurAmount > 0){
prevTo.filter='blur(' + cfg.blurAmount + 'px)';
}
if(cfg.opacityOn&&cfg.opacityAmount > 0){
prevTo.opacity=Math.max(0.1, 1 - cfg.opacityAmount);
}
tl.to(prev, prevTo, label);
var targetY=(i * cfg.stackDist) - naturalOffsets[i];
tl.fromTo(card,
{ y: function (){ return window.innerHeight; }},
{
y: function (){ return targetY; },
duration: dur,
ease: ease,
},
label
);
});
tl.addLabel('cardEnd');
var scrubVal=cfg.scrub==='true' ? true:(parseFloat(cfg.scrub)||1);
var st=ScrollTrigger.create({
trigger: cards[0],
start: 'top ' + cfg.stackPos + '%',
endTrigger: section,
end: function (){
var base=window.innerHeight * (cards.length - 1);
var extra=cfg.itemDist > 0 ? cfg.itemDist * (cards.length - 1):0;
return '+=' + (base + extra);
},
pin: section,
pinSpacing: true,
scrub: scrubVal,
snap: {
snapTo: 'labels',
duration: { min: 0.2, max: 0.6 },
ease: 'power1.inOut',
delay: 0.05,
},
animation: tl,
anticipatePin: cfg.anticipate ? 1:0,
invalidateOnRefresh: true,
});
section._dnxteSStackCleanup=function (){
if(st) st.kill();
tl.kill();
section.style.overflow=originalSectionOverflow;
cards.forEach(function (card, i){
var o=originalCardStyles[i];
card.style.willChange=o.willChange;
card.style.backfaceVisibility=o.backfaceVisibility;
card.style.transformOrigin=o.transformOrigin;
card.style.minHeight=o.minHeight;
card.style.transition=o.transition;
card.style.zIndex=o.zIndex;
card.style.marginTop=o.marginTop;
card.style.transform='';
card.style.filter='';
card.style.opacity='';
});
section._dnxteSStackInit=false;
};}
function initAll(){
var els=document.querySelectorAll('[data-sstack-init="true"]');
Array.prototype.forEach.call(els, initSection);
}
function boot(){
initAll();
if(document.body){
var obs=new MutationObserver(function (muts){
var hasNew=false;
for (var i=0; i < muts.length; i++){
if(muts[i].addedNodes&&muts[i].addedNodes.length){ hasNew=true; break; }}
if(hasNew) initAll();
});
obs.observe(document.body, { childList: true, subtree: true });
}}
if(window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches){
return;
}
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', boot);
}else{
boot();
}})();