aero-slider 1.0.0-beta.2 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,8 @@ A lightweight (~6.5KB), CSS-first slider library for the modern web.
13
13
 
14
14
  ## Installation
15
15
 
16
+ ### Package manager (recommended)
17
+
16
18
  ```bash
17
19
  bun add aero-slider
18
20
  ```
@@ -30,6 +32,26 @@ import { createSlider } from "aero-slider";
30
32
  import "aero-slider/slider.css";
31
33
  ```
32
34
 
35
+ ### Global script (no bundler)
36
+
37
+ Add the JavaScript and CSS files. Use `type="module"` so the script assigns `AeroSlider` to `window`:
38
+
39
+ ```html
40
+ <link rel="stylesheet" href="https://unpkg.com/aero-slider/dist/aero-slider.min.css" />
41
+ <script type="module" src="https://unpkg.com/aero-slider/dist/aero-slider.min.js"></script>
42
+ ```
43
+
44
+ Or download from the [releases](https://github.com/Negative-Space-Dev/aero-slider/releases) page. This creates a global `AeroSlider` object:
45
+
46
+ ```js
47
+ const slider = AeroSlider.createSlider(document.getElementById("my-slider"), { loop: true });
48
+
49
+ // With thumbnails:
50
+ const main = AeroSlider.createSlider(mainEl);
51
+ const thumbs = AeroSlider.createSlider(thumbsEl);
52
+ const teardown = AeroSlider.syncThumbnails(main, thumbs);
53
+ ```
54
+
33
55
  ## Contributing
34
56
 
35
57
  See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, working on the doc site, and publishing.
@@ -3,6 +3,8 @@ interface SliderConfig {
3
3
  autoplay?: boolean;
4
4
  autoplayInterval?: number;
5
5
  draggable?: boolean;
6
+ /** Keep currentIndex as the centered slide when possible (clamps at ends without loop). */
7
+ centered?: boolean;
6
8
  /** Maximum number of pagination dots to show. Beyond this, edge indicators are used. */
7
9
  maxDots?: number;
8
10
  noDrag?: string;
@@ -54,4 +56,13 @@ interface SyncThumbnailsOptions {
54
56
  */
55
57
  declare function syncThumbnails(primary: SliderInstance, thumbnail: SliderInstance, options?: SyncThumbnailsOptions): () => void;
56
58
 
59
+ declare global {
60
+ interface Window {
61
+ AeroSlider?: {
62
+ createSlider: typeof createSlider;
63
+ syncThumbnails: typeof syncThumbnails;
64
+ };
65
+ }
66
+ }
67
+
57
68
  export { type SliderConfig, type SliderEvent, type SliderEventCallback, type SliderEventData, type SliderInstance, type SyncThumbnailsOptions, createSlider, syncThumbnails };
@@ -0,0 +1 @@
1
+ .aero-slider{position:relative;width:100%;min-width:0;min-height:0;display:flex;flex-direction:column;--slide-aspect: 5 / 3;--slides-per-view: 1;--slide-gap: 0px}.aero-slider[data-aero-defer-visibility]:not(.aero-slider--ready) .aero-slider__track:before{content:"";flex:0 0 max(0px,calc(50% - (100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1)) / (2 * var(--slides-per-view, 1)) - var(--slide-gap, 0px)));scroll-snap-align:none}.aero-slider[data-aero-defer-visibility]:not(.aero-slider--ready) .aero-slider__track>*{scroll-snap-align:center}.aero-slider__viewport{position:relative;width:100%;min-width:0;min-height:0;overflow:hidden;contain:paint}.aero-slider__track{min-height:0;display:flex;flex-direction:row;flex-wrap:nowrap;width:100%;min-width:100%;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;touch-action:manipulation;overscroll-behavior-x:contain;overflow-anchor:none;gap:var(--slide-gap, 0px);cursor:grab;transform:translateZ(0);backface-visibility:hidden;scrollbar-width:none;-ms-overflow-style:none}.aero-slider__track::-webkit-scrollbar{display:none}.aero-slider__track:focus{outline:none}.aero-slider__track:focus-visible{outline:2px solid currentColor;outline-offset:2px}.aero-slider__slide,.aero-slider__track>*{flex:0 0 calc((100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1)) / var(--slides-per-view, 1));flex-shrink:0;flex-grow:0;scroll-snap-align:start;aspect-ratio:var(--slide-aspect, 16 / 9);display:flex;align-items:center;justify-content:center;min-width:0;min-height:0;contain:layout style paint;overflow:hidden;content-visibility:auto;contain-intrinsic-size:auto 100%}.aero-slider__slide>*,.aero-slider__track>*>*{flex:1;min-width:0;min-height:0}.aero-slider--dragging{user-select:none}.aero-slider--dragging .aero-slider__track{cursor:grabbing;scroll-snap-type:none}.aero-slider__nav--prev,.aero-slider__nav--next{touch-action:manipulation}.aero-slider__pagination{display:flex;flex-wrap:nowrap;gap:8px;flex-shrink:0;justify-content:center;align-items:center;padding:12px 0 16px;min-height:44px;box-sizing:border-box}.aero-slider__dot{touch-action:manipulation;cursor:pointer;flex-shrink:0;transition:transform .2s ease-out,opacity .2s ease-out}.aero-slider__pagination--windowed{width:calc(var(--pagination-width) + 12px);max-width:calc(100% + 12px);margin-left:auto;margin-right:auto;overflow:hidden;justify-content:flex-start;padding-left:6px;padding-right:6px;box-sizing:border-box}.aero-slider__pagination-track{display:flex;gap:inherit;align-items:center;transform:translate(var(--track-offset, 0));transition:transform .3s cubic-bezier(.4,0,.2,1)}.aero-slider__dot--hidden{transform:scale(.4);opacity:0}.aero-slider__dot--edge{transform:scale(.6)}.aero-slider__dot--near-edge{transform:scale(.8)}.aero-slider--rtl .aero-slider__track{direction:rtl}.aero-slider--vertical .aero-slider__viewport{aspect-ratio:var(--slide-aspect, 5 / 3);overflow:hidden}.aero-slider--vertical .aero-slider__track{flex-direction:column;overflow-x:hidden;overflow-y:auto;scroll-snap-type:y mandatory;overscroll-behavior-x:initial;overscroll-behavior-y:contain;min-width:initial;height:100%;min-height:100%}.aero-slider--vertical .aero-slider__slide,.aero-slider--vertical .aero-slider__track>*{flex:0 0 calc((100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1)) / var(--slides-per-view, 1));aspect-ratio:initial;width:100%}
@@ -0,0 +1 @@
1
+ var Ee={loop:!1,autoplay:!1,autoplayInterval:5e3,draggable:!0,centered:!0,maxDots:0,noDrag:"",perMove:0,direction:"ltr"},ee={slidesPerView:1,gap:0,aspectRatio:"16 / 9"},be=5,fe=.3,le=80,he=250,Le=300,pe=100,Te=250,j="data-aero-slider-index",q="data-aero-slider-clone";function Ae(e,m,a,c={}){let o=c.debounceMs??100,S=c.maxWaitMs??250,n="",p=null,h=null;function s(){let b=getComputedStyle(e);return m.map(I=>b.getPropertyValue(I).trim()).join("\0")}function t(){p!==null&&(clearTimeout(p),p=null),h=null;let b=s();b!==n&&(n=b,a())}function T(){let b=Date.now();if(h===null&&(h=b),b-h>=S){t();return}p!==null&&clearTimeout(p),p=setTimeout(t,o)}return n=s(),window.addEventListener("resize",T),()=>{window.removeEventListener("resize",T),p!==null&&(clearTimeout(p),p=null)}}var Ke=50,$e=2,Me=3;function Ie(e){let{track:m,state:a}=e,c=null,o=Me;function S(){let y=Math.ceil(e.config.slidesPerView)+$e;return Math.max(Me,Math.ceil(y/e.slideCount))}function n(){return o*e.slideCount*a.slideWidthPx}function p(){return(o+1)*e.slideCount*a.slideWidthPx}function h(y){a.isProgrammaticScroll=!0,m.style.scrollBehavior="auto",m.style.scrollSnapType="none",e.setScrollPos(y),requestAnimationFrame(()=>{requestAnimationFrame(()=>{m.style.scrollBehavior="",m.style.scrollSnapType="",a.isProgrammaticScroll=!1})})}function s(){if(!a.loopModeActive)return;let y=a.slideWidthPx;if(y===0)return;let l=e.slideCount*y,d=n(),u=p(),f=e.getScrollPos(),g=2;if(f<d-g||f>=u+g){for(;f<d;)f+=l;for(;f>=u;)f-=l;h(f)}}function t(){c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,s()},Ke)}function T(){c!==null&&(clearTimeout(c),c=null)}function b(){let y=a.slideWidthPx;if(y===0)return a.currentIndex;let l=e.isVertical()?m.clientHeight:m.clientWidth;if(e.isFractionalView()){let f=y-e.config.gap,g=e.getScrollPos()+l/2,E=n();return(Math.round((g-E-f/2)/y)%e.slideCount+e.slideCount)%e.slideCount}let d=e.getScrollPos()-n();return(Math.round(d/y)%e.slideCount+e.slideCount)%e.slideCount}function I(y){if(!e.isLoopEnabled()){a.loopModeActive&&C(y);return}o=S(),m.querySelectorAll(`[${q}]`).forEach(u=>u.remove());let{slides:l,slideCount:d}=e;for(let u=0;u<o;u++)for(let f=d-1;f>=0;f--){let g=l[f].cloneNode(!0);g.setAttribute(q,""),g.removeAttribute(j),m.prepend(g)}for(let u=0;u<o;u++)for(let f=0;f<d;f++){let g=l[f].cloneNode(!0);g.setAttribute(q,""),g.removeAttribute(j),m.append(g)}a.loopModeActive=!0,e.applySnapAlignment(),requestAnimationFrame(()=>{e.recalcSlideMetrics();let u=e.normalizeIndex(y);a.currentIndex=u;let f=m.querySelector(`[${j}="${u}"]`);if(!f)return;a.isProgrammaticScroll=!0,m.style.scrollBehavior="auto",m.style.scrollSnapType="none";let g=e.isFractionalView()?"center":"start",E=e.isVertical()?e.isFractionalView()?"center":"start":"nearest";f.scrollIntoView({behavior:"instant",inline:g,block:E}),requestAnimationFrame(()=>{requestAnimationFrame(()=>{m.style.scrollBehavior="",m.style.scrollSnapType="",a.isProgrammaticScroll=!1})})})}function C(y){T(),m.querySelectorAll(`[${q}]`).forEach(l=>l.remove()),a.loopModeActive=!1,e.recalcSlideMetrics(),a.currentIndex=Math.max(0,Math.min(y,e.getMaxIndex())),h(e.getScrollPosForIndex(a.currentIndex))}return{getLoopRealStart:n,getLoopRealEnd:p,getLoopIndexFromScroll:b,instantScrollTo:h,teleportIfNeeded:s,scheduleTeleport:t,setupLoopTrack:I,teardownLoopTrack:C,cancelTeleport:T}}function Ce(e,m,a,c,o){let{container:S,track:n,state:p}=e,h=!1,s=!1;function t(l){return e.isVertical()?l.clientY:l.clientX}function T(){return e.config.direction==="rtl"?-1:1}function b(l){if(l.button!==0||l.pointerType==="touch"||e.config.noDrag&&l.target.closest(e.config.noDrag))return;s=!1;let d=T(),u=t(l),f=e.getScrollPos(),g=f,E=null,w=0,L=u,x=performance.now(),k=!1,H=p.currentIndex;function V(){E=null,e.setScrollPos(g)}function Z(R){let P=t(R);if(!k){if(Math.abs(P-u)<be)return;k=!0,s=!0,n.setPointerCapture(R.pointerId),p.isDragging=!0,p.suppressSettleEmit=!1,n.style.scrollBehavior="auto",n.style.scrollSnapType="none",S.classList.add("aero-slider--dragging"),e.emit("dragStart",{index:H}),c()}R.preventDefault(),g=f+(u-P)*d,E===null&&(E=requestAnimationFrame(V));let D=performance.now(),F=D-x;if(F>0){if(F<100){let B=(L-P)*d/F;w=fe*B+(1-fe)*w}else w*=.5;L=P,x=D}}function O(){if(n.removeEventListener("pointermove",Z),n.removeEventListener("pointerup",O),n.removeEventListener("pointercancel",O),!k)return;p.isDragging=!1,S.classList.remove("aero-slider--dragging"),E!==null&&(cancelAnimationFrame(E),E=null,e.setScrollPos(g));let R=performance.now()-x;R>50&&(w*=Math.max(0,1-R/200));let P=e.getSlideSize();if(n.style.scrollBehavior="",P>0)if(p.loopModeActive){m.teleportIfNeeded();let D=m.getLoopRealStart(),F=e.getScrollPos(),B=e.isVertical()?n.clientHeight:n.clientWidth,Y,z;if(e.isFractionalView()){let K=P-e.config.gap,W=F+w*le+B/2;Y=Math.round((W-D-K/2)/P),z=D+Y*P+K/2-B/2}else{let W=F-D+w*le;Y=Math.round(W/P),z=D+Y*P}p.isProgrammaticScroll=!0,p.suppressSettleEmit=!0,e.scrollToPos(z,"smooth"),m.scheduleTeleport();let J=e.normalizeIndex(Y);J!==p.currentIndex&&(p.currentIndex=J,e.emit("slideChange",{index:p.currentIndex}),e.refreshPagination(),e.refreshNavState())}else{let D=e.getScrollPos()+w*le,F=e.getIndexFromScrollPos(D);a(F)}e.emit("dragEnd",{index:p.currentIndex,fromIndex:H}),e.config.autoplay&&o()}n.addEventListener("pointermove",Z),n.addEventListener("pointerup",O),n.addEventListener("pointercancel",O)}function I(l){s&&(l.preventDefault(),l.stopPropagation(),s=!1)}function C(l){l.preventDefault()}function y(l){l!==h&&(l?(n.addEventListener("pointerdown",b),n.addEventListener("click",I,{capture:!0}),n.addEventListener("dragstart",C),h=!0):(n.removeEventListener("pointerdown",b),n.removeEventListener("click",I,{capture:!0}),n.removeEventListener("dragstart",C),h=!1))}return{setEnabled:y,isActive:()=>h}}function xe(e,m,a){let c=null,o=null,S=a,n=m;function p(){c&&(c.removeEventListener("click",S),c=null),o&&(o.removeEventListener("click",n),o=null)}function h(){p(),c=e.container.querySelector(".aero-slider__nav--prev"),o=e.container.querySelector(".aero-slider__nav--next");let t=e.config.direction==="rtl";S=t?m:a,n=t?a:m,c&&c.addEventListener("click",S),o&&o.addEventListener("click",n),s()}function s(){let t=e.getMaxIndex(),T=t>0,b=e.config.direction==="rtl",I=!T||!e.isLoopEnabled()&&e.state.currentIndex===0,C=!T||!e.isLoopEnabled()&&e.state.currentIndex>=t;c&&(c.disabled=b?C:I),o&&(o.disabled=b?I:C)}return{build:h,clear:p,refresh:s}}function _e(e,m){let a=null,c=null,o=null,S=[],n=!1,p=10,h=8;function s(l){let d=l.target.closest(".aero-slider__dot");if(!d||!a)return;let u=d.getAttribute("data-slide-index");u!==null&&m(Number(u))}function t(){if(a){a.removeEventListener("click",s),c?.remove(),c=null,o&&(o.style.display="");let l=a.querySelectorAll(".aero-slider__dot");for(let d=1;d<l.length;d++)l[d]?.remove();a.querySelectorAll(".aero-slider__pagination-label").forEach(d=>d.remove()),a=null}o=null,S=[],n=!1}function T(){return e.isLoopEnabled()?e.slideCount:e.getMaxIndex()+1}function b(){if(a=e.container.querySelector(".aero-slider__pagination"),!a||(o=a.querySelector(".aero-slider__dot"),!o))return;o.style.display==="none"&&(o.style.display=""),o.style.transform="",o.style.opacity="",o.offsetWidth;let d=getComputedStyle(o);p=parseFloat(d.width)||10;let u=getComputedStyle(a);h=parseInt(u.gap)||8,a.setAttribute("role","tablist"),a.addEventListener("click",s);let f=T(),g=e.config.maxDots;n=g>0&&f>g,c?.remove();let E=a.querySelectorAll(".aero-slider__dot");for(let L=1;L<E.length;L++)E[L]?.remove();if(a.querySelectorAll(".aero-slider__pagination-label").forEach(L=>L.remove()),n){a.classList.add("aero-slider__pagination--windowed");let L=g*p+(g-1)*h;a.style.setProperty("--pagination-width",`${L}px`),c=document.createElement("div"),c.className="aero-slider__pagination-track",o.style.display="none";for(let x=0;x<f;x++){let k=o.cloneNode(!0);k.style.display="",c.appendChild(k)}a.appendChild(c)}else{a.classList.remove("aero-slider__pagination--windowed"),a.style.removeProperty("--pagination-width"),o.style.display="";for(let L=1;L<f;L++){let x=o.cloneNode(!0);a.appendChild(x)}}S=Array.from((n&&c?c:a).querySelectorAll(".aero-slider__dot")),S.forEach((L,x)=>{L.setAttribute("role","tab"),L.setAttribute("data-slide-index",String(x)),L.setAttribute("aria-label",`Go to slide ${x+1}`)}),y()}function I(l,d,u,f){if(l<0||l>=d)return"aero-slider__dot--hidden";let g=l===0,E=l===d-1,w=l===1,L=l===d-2;return g&&!u?"aero-slider__dot--edge":w&&!u?"aero-slider__dot--near-edge":E&&!f?"aero-slider__dot--edge":L&&!f?"aero-slider__dot--near-edge":null}function C(l){l.classList.remove("aero-slider__dot--hidden","aero-slider__dot--edge","aero-slider__dot--near-edge")}function y(){let l=T(),d=e.state.currentIndex,u=e.config.maxDots;if(n&&u>0&&c){let f=Math.floor(u/2),g=p+h,E=d-f;E=Math.max(0,Math.min(E,l-u)),c.style.setProperty("--track-offset",`${-E*g}px`);let w=E===0,L=E>=l-u;S.forEach((x,k)=>{let H=k===d;x.classList.toggle("aero-slider__dot--active",H),x.setAttribute("aria-selected",String(H)),C(x);let V=I(k-E,u,w,L);V&&x.classList.add(V)})}else S.forEach((f,g)=>{let E=g===d;f.classList.toggle("aero-slider__dot--active",E),f.setAttribute("aria-selected",String(E)),C(f)})}return{build:b,clear:t,refresh:y}}function we(e,m,a){let c=!1;function o(n){let p=e.config.direction;p==="ttb"?n.key==="ArrowUp"?(n.preventDefault(),a()):n.key==="ArrowDown"&&(n.preventDefault(),m()):p==="rtl"?n.key==="ArrowRight"?(n.preventDefault(),a()):n.key==="ArrowLeft"&&(n.preventDefault(),m()):n.key==="ArrowLeft"?(n.preventDefault(),a()):n.key==="ArrowRight"&&(n.preventDefault(),m())}function S(n){n!==c&&(n?(e.container.setAttribute("tabindex","0"),e.container.addEventListener("keydown",o),c=!0):(e.container.removeAttribute("tabindex"),e.container.removeEventListener("keydown",o),c=!1))}return{setEnabled:S}}function Pe(e,m){let a=null,c=!1,o=null;function S(){e.config.autoplay&&(n(),a=setInterval(()=>{if(!e.state.loopModeActive&&e.state.currentIndex>=e.getMaxIndex()){n();return}m()},e.config.autoplayInterval),e.emit("autoplayStart",{index:e.state.currentIndex}))}function n(){a!==null&&(clearInterval(a),a=null,e.emit("autoplayStop",{index:e.state.currentIndex}))}function p(){n()}function h(){e.config.autoplay&&S()}function s(){o!==null&&(clearTimeout(o),o=null),n()}function t(){e.config.autoplay&&(o=setTimeout(()=>{o=null,e.config.autoplay&&S()},1e3))}function T(b){b!==c&&(b?(e.container.addEventListener("mouseenter",p),e.container.addEventListener("mouseleave",h),e.track.addEventListener("touchstart",s,{passive:!0}),e.track.addEventListener("touchend",t,{passive:!0}),e.track.addEventListener("touchcancel",t,{passive:!0}),c=!0):(e.container.removeEventListener("mouseenter",p),e.container.removeEventListener("mouseleave",h),e.track.removeEventListener("touchstart",s),e.track.removeEventListener("touchend",t),e.track.removeEventListener("touchcancel",t),o!==null&&(clearTimeout(o),o=null),c=!1))}return{start:S,pause:n,setHoverPause:T}}function De(e,m={}){let a=e,c=e.querySelector(".aero-slider__track");if(!c)throw new Error("aero-slider: missing .aero-slider__track");let o=c,S=Array.from(o.children).filter(r=>!r.hasAttribute(q)),n=S.length;if(n===0)throw new Error("aero-slider: no slides found");S.forEach((r,i)=>r.setAttribute(j,String(i)));function p(r,i){if(!r||r==="0"||r==="0px")return i;let v=document.createElement("div");v.style.position="absolute",v.style.visibility="hidden",v.style.width=r,e.appendChild(v);let M=v.offsetWidth;return e.removeChild(v),M||i}function h(){let r=getComputedStyle(e),i=parseFloat(r.getPropertyValue("--slides-per-view")?.trim()||"")||ee.slidesPerView,v=r.getPropertyValue("--slide-gap")?.trim()||"0px",M=p(v,ee.gap),A=r.getPropertyValue("--slide-aspect")?.trim()||ee.aspectRatio;return{slidesPerView:i,gap:M,aspectRatio:A}}let s={...Ee,...m,...ee},t={currentIndex:0,isDragging:!1,isDestroyed:!1,loopModeActive:!1,isProgrammaticScroll:!1,suppressSettleEmit:!1,slideWidthPx:0},T=new Map,b=null,I=null,C=null,y=null,l=null;function d(r,i){T.get(r)?.forEach(v=>v(i))}function u(){return s.direction==="ttb"}function f(){return g()?Math.max(0,n-1):Math.max(0,Math.floor(n-s.slidesPerView))}function g(){return s.centered||s.slidesPerView%1!==0}function E(){return s.loop&&f()>0}function w(){return s.perMove>0?s.perMove:1}function L(r){let i=f();return E()?(Math.trunc(r)%n+n)%n:Math.max(0,Math.min(r,i))}function x(){return s.direction==="rtl"?-o.scrollLeft:s.direction==="ttb"?o.scrollTop:o.scrollLeft}function k(r){s.direction==="rtl"?o.scrollLeft=-r:s.direction==="ttb"?o.scrollTop=r:o.scrollLeft=r}function H(r,i="auto"){s.direction==="ttb"?o.scrollTo({top:r,behavior:i}):s.direction==="rtl"?o.scrollTo({left:-r,behavior:i}):o.scrollTo({left:r,behavior:i})}function V(){return u()?o.clientHeight:o.clientWidth}function Z(){return u()?o.scrollHeight:o.scrollWidth}function O(){if(t.slideWidthPx>0)return t.slideWidthPx;let r=S[0];if(!r)return 0;let i=r.getBoundingClientRect();return t.slideWidthPx=(u()?i.height:i.width)+s.gap,t.slideWidthPx}function R(){t.slideWidthPx=0,O()}function P(){Object.assign(s,h())}function D(r){let i=O();if(i===0)return 0;if(!g())return r*i;let v=V(),M=i-s.gap;if(t.loopModeActive)return r*i+M/2-v/2;let A=f();return r<=0?0:r>=A?Z()-V():r*i+M/2-v/2}function F(r){let i=O();if(i===0)return t.currentIndex;let v=t.loopModeActive?n-1:f(),M=Z()-V();if(!g()){let ie=Math.round(r/i);return Math.max(0,Math.min(ie,v))}if(M<=0||r<=1)return 0;if(r>=M-1)return v;let A=V(),G=i-s.gap,oe=r+A/2,ne=Math.round((oe-G/2)/i);return Math.max(0,Math.min(ne,v))}function B(){let r=Array.from(o.children);if(!g()){for(let i of r)i.style.scrollSnapAlign="";return}if(t.loopModeActive){for(let i of r)i.style.scrollSnapAlign="center";return}for(let i of r)i.style.scrollSnapAlign="center"}function Y(){e.classList.remove("aero-slider--rtl","aero-slider--vertical"),e.removeAttribute("dir"),s.direction==="rtl"?(e.setAttribute("dir","rtl"),e.classList.add("aero-slider--rtl")):s.direction==="ttb"&&e.classList.add("aero-slider--vertical")}let z=new Set;function J(){let r=new Set,i=Math.ceil(s.slidesPerView);for(let v=0;v<i;v++){let M=t.currentIndex+v;if(t.loopModeActive)M=(M%n+n)%n;else if(M>=n)break;r.add(M)}return r}function K(){let r=J();for(let i of z)r.has(i)||d("hidden",{index:i});for(let i of r)z.has(i)||d("visible",{index:i});z.clear();for(let i of r)z.add(i)}let W={container:e,track:o,get slides(){return S},get slideCount(){return n},get config(){return s},state:t,listeners:T,emit:d,getSlideSize:O,recalcSlideMetrics:R,normalizeIndex:L,getMaxIndex:f,getEffectivePerMove:w,isLoopEnabled:E,isFractionalView:g,isVertical:u,getScrollPos:x,setScrollPos:k,scrollToPos:H,getScrollPosForIndex:D,getIndexFromScrollPos:F,refreshPagination:()=>N.refresh(),refreshNavState:()=>$.refresh(),applySnapAlignment:B},_=Ie(W),$=xe(W,re,de),N=_e(W,Q),se=we(W,re,de),U=Pe(W,re),ae=Ce(W,_,Q,U.pause,U.start);function te(){if(t.isDragging||t.isProgrammaticScroll)return;let r=t.loopModeActive?_.getLoopIndexFromScroll():F(x());r!==t.currentIndex&&(t.currentIndex=r,d("slideChange",{index:t.currentIndex}),N.refresh(),$.refresh(),K())}function Re(){if(I=null,t.isProgrammaticScroll=!1,X===null&&(o.style.scrollSnapType=""),t.suppressSettleEmit){t.suppressSettleEmit=!1,N.refresh(),$.refresh();return}te()}function me(){t.loopModeActive&&_.scheduleTeleport(),I!==null&&clearTimeout(I),I=setTimeout(Re,he),b===null&&(b=requestAnimationFrame(()=>{b=null,te()}))}let X=null;function ve(){t.isDragging||(t.suppressSettleEmit=!1,o.style.scrollSnapType="none",X!==null&&clearTimeout(X),X=setTimeout(()=>{X=null,o.style.scrollSnapType=""},Le))}function ge(){if(R(),t.loopModeActive){let r=O();if(r>0){let i=_.getLoopRealStart(),v=i+t.currentIndex*r;if(g()){let M=V(),A=r-s.gap;v=i+t.currentIndex*r+A/2-M/2}k(v)}}else k(D(t.currentIndex))}function Se(){t.isDestroyed||(y===null&&(o.style.scrollSnapType="none",t.isProgrammaticScroll=!0),l===null&&(l=requestAnimationFrame(()=>{l=null,t.isDestroyed||ge()})),y!==null&&clearTimeout(y),y=setTimeout(()=>{y=null,!t.isDestroyed&&(ge(),t.isProgrammaticScroll=!1,o.style.scrollSnapType="")},pe))}let Ve=["--slides-per-view","--slide-gap","--slide-aspect"];function Oe(){C?.(),C=Ae(e,Ve,()=>{t.isDestroyed||(d("resize",{index:t.currentIndex}),ye(),d("resized",{index:t.currentIndex}))},{debounceMs:pe,maxWaitMs:Te})}function re(){t.isDestroyed||Q(L(t.currentIndex+w()))}function de(){t.isDestroyed||Q(L(t.currentIndex-w()))}function Q(r){if(t.isDestroyed)return;let i=L(r),v=O();if(v!==0){if(i!==t.currentIndex&&(t.currentIndex=i,d("slideChange",{index:t.currentIndex}),N.refresh(),$.refresh(),K()),t.suppressSettleEmit=!0,t.loopModeActive){_.cancelTeleport(),t.isProgrammaticScroll=!0;let M=_.getLoopIndexFromScroll(),A=(i-M+n)%n,G=A-n,oe=Math.abs(G)<A?G:A;if(oe===0){let ne=_.getLoopRealStart(),ie=ne+i*v;if(g()){let Ue=V(),Ye=v-s.gap;ie=ne+i*v+Ye/2-Ue/2}H(ie,"smooth"),_.scheduleTeleport();return}H(x()+oe*v,"smooth"),_.scheduleTeleport();return}t.isProgrammaticScroll=!0,H(D(i),"smooth")}}function ye(r){let i=s;if(s={...s,...h(),...r??{}},i.direction!==s.direction&&Y(),P(),R(),ae.setEnabled(s.draggable),se.setEnabled(!0),U.setHoverPause(s.autoplay),(i.slidesPerView!==s.slidesPerView||i.loop!==s.loop||i.maxDots!==s.maxDots||i.perMove!==s.perMove)&&(N.clear(),N.build()),(i.autoplay!==s.autoplay||i.autoplayInterval!==s.autoplayInterval||i.loop!==s.loop)&&(s.autoplay?U.start():U.pause()),i.loop!==s.loop?E()?_.setupLoopTrack(t.currentIndex):_.teardownLoopTrack(t.currentIndex):t.loopModeActive&&i.slidesPerView!==s.slidesPerView&&_.setupLoopTrack(t.currentIndex),B(),!t.loopModeActive){let v=L(t.currentIndex);t.currentIndex=v,H(D(v))}te(),N.refresh(),$.refresh(),K()}function ce(){if(!t.isDestroyed&&(t.loopModeActive&&_.teardownLoopTrack(t.currentIndex),S=Array.from(o.children).filter(r=>!r.hasAttribute(q)),n=S.length,n!==0)){if(S.forEach((r,i)=>{r.setAttribute(j,String(i)),r.classList.add("aero-slider__slide")}),P(),R(),E()&&_.setupLoopTrack(t.currentIndex),B(),!t.loopModeActive){let r=L(t.currentIndex);t.currentIndex=r,H(D(r))}N.clear(),N.build(),$.build(),te(),K()}}function Fe(r,i){if(t.isDestroyed)return;let v=Array.isArray(r)?r:[r];t.loopModeActive&&_.teardownLoopTrack(t.currentIndex);let M=Array.from(o.children).filter(A=>!A.hasAttribute(q));if(i!==void 0&&i<M.length){let A=M[i]??null;for(let G of v)o.insertBefore(G,A)}else for(let A of v)o.appendChild(A);ce()}function Ne(r){if(t.isDestroyed)return;let i=Array.isArray(r)?r:[r];t.loopModeActive&&_.teardownLoopTrack(t.currentIndex);let v=Array.from(o.children).filter(A=>!A.hasAttribute(q)),M=[...i].sort((A,G)=>G-A);for(let A of M)A>=0&&A<v.length&&v[A].remove();ce()}function ze(r,i){T.has(r)||T.set(r,new Set),T.get(r).add(i)}function We(r,i){T.get(r)?.delete(i)}function qe(){t.isDestroyed||(d("destroy",{index:t.currentIndex}),t.isDestroyed=!0,U.pause(),t.loopModeActive&&_.teardownLoopTrack(t.currentIndex),_.cancelTeleport(),t.isProgrammaticScroll=!1,C?.(),C=null,window.removeEventListener("resize",Se),y!==null&&(clearTimeout(y),y=null),l!==null&&(cancelAnimationFrame(l),l=null),o.removeEventListener("scroll",me),o.removeEventListener("wheel",ve),X!==null&&clearTimeout(X),I!==null&&clearTimeout(I),ae.setEnabled(!1),se.setEnabled(!1),U.setHoverPause(!1),b!==null&&cancelAnimationFrame(b),$.clear(),N.clear(),e.removeAttribute("aria-roledescription"),e.removeAttribute("dir"),e.classList.remove("aero-slider--dragging","aero-slider--rtl","aero-slider--vertical","aero-slider--ready"),e.removeAttribute("data-aero-defer-visibility"),a.aeroSlider===ue&&delete a.aeroSlider,T.clear())}e.removeAttribute("data-aero-defer-visibility"),P(),e.classList.add("aero-slider"),e.setAttribute("aria-roledescription","carousel"),o.classList.add("aero-slider__track");for(let r of S)r.classList.add("aero-slider__slide");Y(),P(),R(),B(),o.addEventListener("scroll",me,{passive:!0}),o.addEventListener("wheel",ve,{passive:!0}),window.addEventListener("resize",Se),E()?_.setupLoopTrack(0):k(0),Oe(),ae.setEnabled(s.draggable),se.setEnabled(!0),U.setHoverPause(s.autoplay),$.build(),N.build(),s.autoplay&&U.start();let Be=J();for(let r of Be)z.add(r);for(let r of z)d("visible",{index:r});let ue={get element(){return e},next:re,prev:de,goTo:Q,destroy:qe,update:ye,refresh:ce,add:Fe,remove:Ne,on:ze,off:We,get currentIndex(){return t.currentIndex},get slideCount(){return n}};return a.aeroSlider=ue,e.classList.add("aero-slider--ready"),d("ready",{index:t.currentIndex}),ue}var ke="aero-slider__thumb--active";function Ge(e,m,a){e.querySelectorAll(":scope > *").forEach(o=>{let S=a(o);o.classList.toggle(ke,S===m)})}function He(e,m,a){let c=m.element.querySelector(".aero-slider__track");if(!c)return()=>{};let o=c,S=a?.loop??!0;m.update({draggable:!1,loop:S});let n=Array.from(o.children).filter(l=>l.hasAttribute("data-aero-slider-index"));n.sort((l,d)=>Number(l.getAttribute("data-aero-slider-index"))-Number(d.getAttribute("data-aero-slider-index")));let p=n.length,h=Array.from(o.children).indexOf(n[0]??o),s=[];function t(l){let d=l.getAttribute("data-aero-slider-index");if(d!==null)return Number(d);let u=Array.from(o.children).indexOf(l);return u<h?u%p:(u-h-p)%p}let T=e.currentIndex;function b(l){T=l,Ge(o,T,t)}function I(l){b(l),m.goTo(l),e.goTo(l)}function C(l){b(l),m.goTo(l)}Array.from(o.children).forEach(l=>{let d=l,u=()=>{let f=t(d);I(f)};d.addEventListener("click",u),d.style.cursor="pointer",s.push({el:d,fn:u})});let y=l=>{l.index!==T&&C(l.index)};return e.on("slideChange",y),C(e.currentIndex),()=>{s.forEach(({el:l,fn:d})=>l.removeEventListener("click",d)),o.querySelectorAll(":scope > *").forEach(l=>l.classList.remove(ke)),e.off("slideChange",y)}}typeof window<"u"&&(window.AeroSlider={createSlider:De,syncThumbnails:He});export{De as createSlider,He as syncThumbnails};
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "aero-slider",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.3",
4
4
  "description": "A lightweight, CSS-first slider library for the modern web",
5
5
  "type": "module",
6
6
  "workspaces": [
7
7
  "site"
8
8
  ],
9
- "main": "./dist/aero-slider.js",
10
- "module": "./dist/aero-slider.js",
9
+ "main": "./dist/aero-slider.min.js",
10
+ "module": "./dist/aero-slider.min.js",
11
11
  "types": "./dist/aero-slider.d.ts",
12
12
  "exports": {
13
13
  ".": {
14
14
  "types": "./dist/aero-slider.d.ts",
15
- "import": "./dist/aero-slider.js",
16
- "default": "./dist/aero-slider.js"
15
+ "import": "./dist/aero-slider.min.js",
16
+ "default": "./dist/aero-slider.min.js"
17
17
  },
18
- "./slider.css": "./dist/aero-slider.css"
18
+ "./slider.css": "./dist/aero-slider.min.css"
19
19
  },
20
20
  "files": [
21
21
  "dist"
@@ -33,6 +33,7 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/bun": "latest",
36
+ "esbuild": "^0.27.3",
36
37
  "prettier": "^3.4.2",
37
38
  "tsup": "^8.5.1",
38
39
  "typescript": "^5"
@@ -1,222 +0,0 @@
1
- /* === Container === */
2
- .aero-slider {
3
- position: relative;
4
- width: 100%;
5
- min-width: 0; /* allow shrinking in flex/grid parents */
6
- min-height: 0;
7
- display: flex;
8
- flex-direction: column;
9
- --slide-aspect: 5 / 3;
10
- --slides-per-view: 1;
11
- --slide-gap: 0px;
12
- }
13
-
14
- /* Loop spacer: reserves space for prepended clones so the active slide
15
- renders in its final centered position before JS initializes.
16
- Add data-aero-defer-visibility to the slider in HTML; JS removes
17
- the attribute at init, deactivating the spacer once clones are in place. */
18
- .aero-slider[data-aero-defer-visibility]:not(.aero-slider--ready) .aero-slider__track::before {
19
- content: "";
20
- flex: 0 0 max(
21
- 0px,
22
- calc(
23
- 50%
24
- - (100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1))
25
- / (2 * var(--slides-per-view, 1))
26
- - var(--slide-gap, 0px)
27
- )
28
- );
29
- scroll-snap-align: none;
30
- }
31
-
32
- .aero-slider[data-aero-defer-visibility]:not(.aero-slider--ready) .aero-slider__track > * {
33
- scroll-snap-align: center;
34
- }
35
-
36
- /* Viewport clips the track; pagination sits below in normal flow */
37
- .aero-slider__viewport {
38
- position: relative;
39
- width: 100%;
40
- min-width: 0;
41
- min-height: 0;
42
- overflow: hidden;
43
- contain: paint;
44
- }
45
-
46
- /* === Track === */
47
- .aero-slider__track {
48
- min-height: 0;
49
- display: flex;
50
- flex-direction: row;
51
- flex-wrap: nowrap;
52
- width: 100%;
53
- min-width: 100%;
54
- overflow-x: auto;
55
- overflow-y: hidden;
56
- scroll-snap-type: x mandatory;
57
- touch-action: manipulation;
58
- overscroll-behavior-x: contain;
59
- overflow-anchor: none;
60
- gap: var(--slide-gap, 0px);
61
- cursor: grab;
62
-
63
- scrollbar-width: none;
64
- -ms-overflow-style: none;
65
- }
66
-
67
- .aero-slider__track::-webkit-scrollbar {
68
- display: none;
69
- }
70
-
71
- .aero-slider__track:focus {
72
- outline: none;
73
- }
74
- .aero-slider__track:focus-visible {
75
- outline: 2px solid currentColor;
76
- outline-offset: 2px;
77
- }
78
-
79
- /* === Slides === */
80
- .aero-slider__slide,
81
- .aero-slider__track > * {
82
- flex: 0 0
83
- calc(
84
- (100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1)) / var(--slides-per-view, 1)
85
- );
86
- flex-shrink: 0;
87
- flex-grow: 0;
88
- scroll-snap-align: start;
89
- aspect-ratio: var(--slide-aspect, 16 / 9);
90
- display: flex;
91
- align-items: center;
92
- justify-content: center;
93
- min-width: 0;
94
- min-height: 0;
95
- contain: paint;
96
- overflow: hidden;
97
- }
98
-
99
- .aero-slider__slide > *,
100
- .aero-slider__track > * > * {
101
- flex: 1;
102
- min-width: 0;
103
- min-height: 0;
104
- }
105
-
106
- .aero-slider__slide img,
107
- .aero-slider__track > * img {
108
- display: block;
109
- width: 100%;
110
- height: 100%;
111
- object-fit: cover;
112
- transform: translateZ(0);
113
- backface-visibility: hidden;
114
- pointer-events: none;
115
- }
116
-
117
- /* === Dragging State === */
118
- .aero-slider--dragging {
119
- user-select: none;
120
- }
121
-
122
- .aero-slider--dragging .aero-slider__track {
123
- cursor: grabbing;
124
- scroll-snap-type: none;
125
- }
126
-
127
- /* === Navigation === */
128
- .aero-slider__nav--prev,
129
- .aero-slider__nav--next {
130
- touch-action: manipulation;
131
- }
132
-
133
- /* === Pagination === */
134
- .aero-slider__pagination {
135
- display: flex;
136
- flex-wrap: nowrap;
137
- gap: 8px;
138
- flex-shrink: 0;
139
- justify-content: center;
140
- align-items: center;
141
- padding: 12px 0 16px;
142
- min-height: 44px;
143
- box-sizing: border-box;
144
- }
145
-
146
- .aero-slider__dot {
147
- touch-action: manipulation;
148
- cursor: pointer;
149
- flex-shrink: 0;
150
- transition:
151
- transform 0.2s ease-out,
152
- opacity 0.2s ease-out;
153
- }
154
-
155
- /* iOS-style windowed pagination */
156
- .aero-slider__pagination--windowed {
157
- width: calc(var(--pagination-width) + 12px);
158
- max-width: calc(100% + 12px);
159
- margin-left: auto;
160
- margin-right: auto;
161
- overflow: hidden;
162
- justify-content: flex-start;
163
- padding-left: 6px;
164
- padding-right: 6px;
165
- box-sizing: border-box;
166
- }
167
-
168
- .aero-slider__pagination-track {
169
- display: flex;
170
- gap: inherit;
171
- align-items: center;
172
- transform: translateX(var(--track-offset, 0));
173
- transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
174
- }
175
-
176
- /* Dot scale states for windowed pagination (CSS-driven, not inline styles) */
177
- .aero-slider__dot--hidden {
178
- transform: scale(0.4);
179
- opacity: 0;
180
- }
181
-
182
- .aero-slider__dot--edge {
183
- transform: scale(0.6);
184
- }
185
-
186
- .aero-slider__dot--near-edge {
187
- transform: scale(0.8);
188
- }
189
-
190
- /* === RTL === */
191
- .aero-slider--rtl .aero-slider__track {
192
- direction: rtl;
193
- }
194
-
195
- /* === Vertical (ttb) === */
196
- /* Viewport height derives from width via --slide-aspect (same as horizontal). */
197
- .aero-slider--vertical .aero-slider__viewport {
198
- aspect-ratio: var(--slide-aspect, 5 / 3);
199
- overflow: hidden;
200
- }
201
-
202
- .aero-slider--vertical .aero-slider__track {
203
- flex-direction: column;
204
- overflow-x: hidden;
205
- overflow-y: auto;
206
- scroll-snap-type: y mandatory;
207
- overscroll-behavior-x: initial;
208
- overscroll-behavior-y: contain;
209
- min-width: initial;
210
- height: 100%;
211
- min-height: 100%;
212
- }
213
-
214
- .aero-slider--vertical .aero-slider__slide,
215
- .aero-slider--vertical .aero-slider__track > * {
216
- flex: 0 0
217
- calc(
218
- (100% - var(--slide-gap, 0px) * (var(--slides-per-view, 1) - 1)) / var(--slides-per-view, 1)
219
- );
220
- aspect-ratio: initial;
221
- width: 100%;
222
- }
@@ -1 +0,0 @@
1
- var he={loop:!1,autoplay:!1,autoplayInterval:5e3,draggable:!0,maxDots:0,noDrag:"",perMove:0,direction:"ltr"},J={slidesPerView:1,gap:0,aspectRatio:"16 / 9"},ue=.3,ie=80,be=150,Te=300,fe=100,ye=250,$="data-aero-slider-index",z="data-aero-slider-clone";function Le(e,g,s,d={}){let t=d.debounceMs??100,v=d.maxWaitMs??250,o="",c=null,i=null;function r(){let p=getComputedStyle(e);return g.map(A=>p.getPropertyValue(A).trim()).join("\0")}function S(){c!==null&&(clearTimeout(c),c=null),i=null;let p=r();p!==o&&(o=p,s())}function L(){let p=Date.now();if(i===null&&(i=p),p-i>=v){S();return}c!==null&&clearTimeout(c),c=setTimeout(S,t)}return o=r(),window.addEventListener("resize",L),()=>{window.removeEventListener("resize",L),c!==null&&(clearTimeout(c),c=null)}}var qe=50,Ye=2,Me=3;function Ae(e){let{track:g,state:s}=e,d=null,t=Me;function v(){let u=Math.ceil(e.config.slidesPerView)+Ye;return Math.max(Me,Math.ceil(u/e.slideCount))}function o(){return t*e.slideCount*s.slideWidthPx}function c(){return(t+1)*e.slideCount*s.slideWidthPx}function i(u){g.style.scrollBehavior="auto",e.setScrollPos(u),requestAnimationFrame(()=>{g.style.scrollBehavior=""})}function r(){if(!s.loopModeActive)return;let u=s.slideWidthPx;if(u===0)return;let a=e.slideCount*u,f=o(),h=c(),m=e.getScrollPos(),T=2;if(m<f-T||m>=h+T){for(;m<f;)m+=a;for(;m>=h;)m-=a;i(m)}}function S(){d!==null&&clearTimeout(d),d=setTimeout(()=>{d=null,r()},qe)}function L(){d!==null&&(clearTimeout(d),d=null)}function p(){let u=s.slideWidthPx;if(u===0)return s.currentIndex;let a=e.isVertical()?g.clientHeight:g.clientWidth;if(e.isFractionalView()){let m=u-e.config.gap,T=e.getScrollPos()+a/2,C=o();return(Math.round((T-C-m/2)/u)%e.slideCount+e.slideCount)%e.slideCount}let f=e.getScrollPos()-o();return(Math.round(f/u)%e.slideCount+e.slideCount)%e.slideCount}function A(u){if(!e.isLoopEnabled()){s.loopModeActive&&E(u);return}t=v(),g.querySelectorAll(`[${z}]`).forEach(I=>I.remove());let{slides:a,slideCount:f}=e;for(let I=0;I<t;I++)for(let b=f-1;b>=0;b--){let M=a[b].cloneNode(!0);M.setAttribute(z,""),M.removeAttribute($),g.prepend(M)}for(let I=0;I<t;I++)for(let b=0;b<f;b++){let M=a[b].cloneNode(!0);M.setAttribute(z,""),M.removeAttribute($),g.append(M)}s.loopModeActive=!0,e.recalcSlideMetrics(),e.applySnapAlignment();let h=e.normalizeIndex(u);s.currentIndex=h;let m=s.slideWidthPx,T=t*e.slideCount*m,C=T+h*m;if(e.isFractionalView()){let I=e.isVertical()?g.clientHeight:g.clientWidth,b=m-e.config.gap;C=T+h*m+b/2-I/2}i(C)}function E(u){L(),g.querySelectorAll(`[${z}]`).forEach(a=>a.remove()),s.loopModeActive=!1,e.recalcSlideMetrics(),s.currentIndex=Math.max(0,Math.min(u,e.getMaxIndex())),i(e.getScrollPosForIndex(s.currentIndex))}return{getLoopRealStart:o,getLoopRealEnd:c,getLoopIndexFromScroll:p,instantScrollTo:i,teleportIfNeeded:r,scheduleTeleport:S,setupLoopTrack:A,teardownLoopTrack:E,cancelTeleport:L}}function Ce(e,g,s,d,t){let{container:v,track:o,state:c}=e,i=!1;function r(E){return e.isVertical()?E.clientY:E.clientX}function S(){return e.config.direction==="rtl"?-1:1}function L(E){if(E.button!==0||E.pointerType==="touch"||e.config.noDrag&&E.target.closest(e.config.noDrag))return;o.setPointerCapture(E.pointerId),c.isDragging=!0;let u=S(),a=r(E),f=e.getScrollPos(),h=f,m=null,T=0,C=a,I=performance.now();function b(){m=null,e.setScrollPos(h)}o.style.scrollBehavior="auto",o.style.scrollSnapType="none",v.classList.add("aero-slider--dragging");let M=c.currentIndex;e.emit("dragStart",{index:M}),d();function D(V){if(!c.isDragging)return;V.preventDefault();let P=r(V);h=f+(a-P)*u,m===null&&(m=requestAnimationFrame(b));let H=performance.now(),k=H-I;if(k>0){if(k<100){let O=(C-P)*u/k;T=ue*O+(1-ue)*T}else T*=.5;C=P,I=H}}function R(){if(!c.isDragging)return;c.isDragging=!1,v.classList.remove("aero-slider--dragging"),m!==null&&(cancelAnimationFrame(m),m=null,e.setScrollPos(h));let V=performance.now()-I;V>50&&(T*=Math.max(0,1-V/200));let P=e.getSlideSize();if(o.style.scrollBehavior="",P>0)if(c.loopModeActive){g.teleportIfNeeded();let H=g.getLoopRealStart(),k=e.getScrollPos(),O=e.isVertical()?o.clientHeight:o.clientWidth,B,U;if(e.isFractionalView()){let N=P-e.config.gap,X=k+T*ie+O/2;B=Math.round((X-H-N/2)/P),U=H+B*P+N/2-O/2}else{let X=k-H+T*ie;B=Math.round(X/P),U=H+B*P}c.isProgrammaticScroll=!0,e.scrollToPos(U,"smooth"),g.scheduleTeleport();let G=e.normalizeIndex(B);G!==c.currentIndex&&(c.currentIndex=G,e.emit("slideChange",{index:c.currentIndex}),e.refreshPagination(),e.refreshNavState())}else{let H=e.getScrollPos()+T*ie,k=e.getIndexFromScrollPos(H);s(k)}e.emit("dragEnd",{index:c.currentIndex,fromIndex:M}),o.removeEventListener("pointermove",D),o.removeEventListener("pointerup",R),o.removeEventListener("pointercancel",R),e.config.autoplay&&t()}o.addEventListener("pointermove",D),o.addEventListener("pointerup",R),o.addEventListener("pointercancel",R)}function p(E){E.preventDefault()}function A(E){E!==i&&(E?(o.addEventListener("pointerdown",L),o.addEventListener("dragstart",p),i=!0):(o.removeEventListener("pointerdown",L),o.removeEventListener("dragstart",p),i=!1))}return{setEnabled:A,isActive:()=>i}}function Ie(e,g,s){let d=null,t=null,v=s,o=g;function c(){d&&(d.removeEventListener("click",v),d=null),t&&(t.removeEventListener("click",o),t=null)}function i(){c(),d=e.container.querySelector(".aero-slider__nav--prev"),t=e.container.querySelector(".aero-slider__nav--next");let S=e.config.direction==="rtl";v=S?g:s,o=S?s:g,d&&d.addEventListener("click",v),t&&t.addEventListener("click",o),r()}function r(){let S=e.getMaxIndex(),L=S>0,p=e.config.direction==="rtl",A=!L||!e.isLoopEnabled()&&e.state.currentIndex===0,E=!L||!e.isLoopEnabled()&&e.state.currentIndex>=S;d&&(d.disabled=p?E:A),t&&(t.disabled=p?A:E)}return{build:i,clear:c,refresh:r}}function _e(e,g){let s=null,d=null,t=null,v=[],o=!1,c=10,i=8;function r(a){let f=a.target.closest(".aero-slider__dot");if(!f||!s)return;let h=f.getAttribute("data-slide-index");h!==null&&g(Number(h))}function S(){if(s){s.removeEventListener("click",r),d?.remove(),d=null,t&&(t.style.display="");let a=s.querySelectorAll(".aero-slider__dot");for(let f=1;f<a.length;f++)a[f]?.remove();s.querySelectorAll(".aero-slider__pagination-label").forEach(f=>f.remove()),s=null}t=null,v=[],o=!1}function L(){return e.isLoopEnabled()?e.slideCount:e.getMaxIndex()+1}function p(){if(s=e.container.querySelector(".aero-slider__pagination"),!s||(t=s.querySelector(".aero-slider__dot"),!t))return;t.style.display==="none"&&(t.style.display=""),t.style.transform="",t.style.opacity="",t.offsetWidth;let f=getComputedStyle(t);c=parseFloat(f.width)||10;let h=getComputedStyle(s);i=parseInt(h.gap)||8,s.setAttribute("role","tablist"),s.addEventListener("click",r);let m=L(),T=e.config.maxDots;o=T>0&&m>T,d?.remove();let C=s.querySelectorAll(".aero-slider__dot");for(let b=1;b<C.length;b++)C[b]?.remove();if(s.querySelectorAll(".aero-slider__pagination-label").forEach(b=>b.remove()),o){s.classList.add("aero-slider__pagination--windowed");let b=T*c+(T-1)*i;s.style.setProperty("--pagination-width",`${b}px`),d=document.createElement("div"),d.className="aero-slider__pagination-track",t.style.display="none";for(let M=0;M<m;M++){let D=t.cloneNode(!0);D.style.display="",d.appendChild(D)}s.appendChild(d)}else{s.classList.remove("aero-slider__pagination--windowed"),s.style.removeProperty("--pagination-width"),t.style.display="";for(let b=1;b<m;b++){let M=t.cloneNode(!0);s.appendChild(M)}}v=Array.from((o&&d?d:s).querySelectorAll(".aero-slider__dot")),v.forEach((b,M)=>{b.setAttribute("role","tab"),b.setAttribute("data-slide-index",String(M)),b.setAttribute("aria-label",`Go to slide ${M+1}`)}),u()}function A(a,f,h,m){if(a<0||a>=f)return"aero-slider__dot--hidden";let T=a===0,C=a===f-1,I=a===1,b=a===f-2;return T&&!h?"aero-slider__dot--edge":I&&!h?"aero-slider__dot--near-edge":C&&!m?"aero-slider__dot--edge":b&&!m?"aero-slider__dot--near-edge":null}function E(a){a.classList.remove("aero-slider__dot--hidden","aero-slider__dot--edge","aero-slider__dot--near-edge")}function u(){let a=L(),f=e.state.currentIndex,h=e.config.maxDots;if(o&&h>0&&d){let m=Math.floor(h/2),T=c+i,C=f-m;C=Math.max(0,Math.min(C,a-h)),d.style.setProperty("--track-offset",`${-C*T}px`);let I=C===0,b=C>=a-h;v.forEach((M,D)=>{let R=D===f;M.classList.toggle("aero-slider__dot--active",R),M.setAttribute("aria-selected",String(R)),E(M);let V=A(D-C,h,I,b);V&&M.classList.add(V)})}else v.forEach((m,T)=>{let C=T===f;m.classList.toggle("aero-slider__dot--active",C),m.setAttribute("aria-selected",String(C)),E(m)})}return{build:p,clear:S,refresh:u}}function xe(e,g,s){let d=!1;function t(o){let c=e.config.direction;c==="ttb"?o.key==="ArrowUp"?(o.preventDefault(),s()):o.key==="ArrowDown"&&(o.preventDefault(),g()):c==="rtl"?o.key==="ArrowRight"?(o.preventDefault(),s()):o.key==="ArrowLeft"&&(o.preventDefault(),g()):o.key==="ArrowLeft"?(o.preventDefault(),s()):o.key==="ArrowRight"&&(o.preventDefault(),g())}function v(o){o!==d&&(o?(e.container.setAttribute("tabindex","0"),e.container.addEventListener("keydown",t),d=!0):(e.container.removeAttribute("tabindex"),e.container.removeEventListener("keydown",t),d=!1))}return{setEnabled:v}}function we(e,g){let s=null,d=!1,t=null;function v(){e.config.autoplay&&(o(),s=setInterval(()=>{if(!e.state.loopModeActive&&e.state.currentIndex>=e.getMaxIndex()){o();return}g()},e.config.autoplayInterval),e.emit("autoplayStart",{index:e.state.currentIndex}))}function o(){s!==null&&(clearInterval(s),s=null,e.emit("autoplayStop",{index:e.state.currentIndex}))}function c(){o()}function i(){e.config.autoplay&&v()}function r(){t!==null&&(clearTimeout(t),t=null),o()}function S(){e.config.autoplay&&(t=setTimeout(()=>{t=null,e.config.autoplay&&v()},1e3))}function L(p){p!==d&&(p?(e.container.addEventListener("mouseenter",c),e.container.addEventListener("mouseleave",i),e.track.addEventListener("touchstart",r,{passive:!0}),e.track.addEventListener("touchend",S,{passive:!0}),e.track.addEventListener("touchcancel",S,{passive:!0}),d=!0):(e.container.removeEventListener("mouseenter",c),e.container.removeEventListener("mouseleave",i),e.track.removeEventListener("touchstart",r),e.track.removeEventListener("touchend",S),e.track.removeEventListener("touchcancel",S),t!==null&&(clearTimeout(t),t=null),d=!1))}return{start:v,pause:o,setHoverPause:L}}function Ke(e,g={}){let s=e,d=e.querySelector(".aero-slider__track");if(!d)throw new Error("aero-slider: missing .aero-slider__track");let t=d,v=Array.from(t.children).filter(n=>!n.hasAttribute(z)),o=v.length;if(o===0)throw new Error("aero-slider: no slides found");v.forEach((n,l)=>n.setAttribute($,String(l)));function c(){let n=getComputedStyle(e),l=parseFloat(n.getPropertyValue("--slides-per-view")?.trim()||"")||J.slidesPerView,y=n.getPropertyValue("--slide-gap")?.trim()||"0px",x=parseFloat(y)||J.gap,_=n.getPropertyValue("--slide-aspect")?.trim()||J.aspectRatio;return{slidesPerView:l,gap:x,aspectRatio:_}}let i={...he,...g,...J},r={currentIndex:0,isDragging:!1,isDestroyed:!1,loopModeActive:!1,isProgrammaticScroll:!1,slideWidthPx:0},S=new Map,L=null,p=null,A=null,E=null,u=null;function a(n,l){S.get(n)?.forEach(y=>y(l))}function f(){return i.direction==="ttb"}function h(){return i.slidesPerView%1!==0?Math.max(0,o-1):Math.max(0,Math.floor(o-i.slidesPerView))}function m(){return i.slidesPerView%1!==0}function T(){return i.loop&&h()>0}function C(){return i.perMove>0?i.perMove:1}function I(n){let l=h();return T()?(Math.trunc(n)%o+o)%o:Math.max(0,Math.min(n,l))}function b(){return i.direction==="rtl"?-t.scrollLeft:i.direction==="ttb"?t.scrollTop:t.scrollLeft}function M(n){i.direction==="rtl"?t.scrollLeft=-n:i.direction==="ttb"?t.scrollTop=n:t.scrollLeft=n}function D(n,l="auto"){i.direction==="ttb"?t.scrollTo({top:n,behavior:l}):i.direction==="rtl"?t.scrollTo({left:-n,behavior:l}):t.scrollTo({left:n,behavior:l})}function R(){return f()?t.clientHeight:t.clientWidth}function V(){return f()?t.scrollHeight:t.scrollWidth}function P(){if(r.slideWidthPx>0)return r.slideWidthPx;let n=v[0];if(!n)return 0;let l=n.getBoundingClientRect();return r.slideWidthPx=(f()?l.height:l.width)+i.gap,r.slideWidthPx}function H(){r.slideWidthPx=0,P()}function k(){Object.assign(i,c())}function O(n){let l=P();if(l===0)return 0;if(!m())return n*l;let y=R(),x=l-i.gap;if(r.loopModeActive)return n*l+x/2-y/2;let _=h();return n<=0?0:n>=_?V()-R():n*l+x/2-y/2}function B(n){let l=P();if(l===0)return r.currentIndex;let y=r.loopModeActive?o-1:h(),x=V()-R();if(!m()){let oe=Math.round(n/l);return Math.max(0,Math.min(oe,y))}if(x<=0||n<=1)return 0;if(n>=x-1)return y;let _=R(),q=l-i.gap,re=n+_/2,ne=Math.round((re-q/2)/l);return Math.max(0,Math.min(ne,y))}function U(){let n=Array.from(t.children);if(!m()){for(let l of n)l.style.scrollSnapAlign="";return}if(r.loopModeActive){for(let l of n)l.style.scrollSnapAlign="center";return}for(let l of n)l.style.scrollSnapAlign="center"}function G(){e.classList.remove("aero-slider--rtl","aero-slider--vertical"),e.removeAttribute("dir"),i.direction==="rtl"?(e.setAttribute("dir","rtl"),e.classList.add("aero-slider--rtl")):i.direction==="ttb"&&e.classList.add("aero-slider--vertical")}let N=new Set;function X(){let n=new Set,l=Math.ceil(i.slidesPerView);for(let y=0;y<l;y++){let x=r.currentIndex+y;if(r.loopModeActive)x=(x%o+o)%o;else if(x>=o)break;n.add(x)}return n}function Q(){let n=X();for(let l of N)n.has(l)||a("hidden",{index:l});for(let l of n)N.has(l)||a("visible",{index:l});N.clear();for(let l of n)N.add(l)}let j={container:e,track:t,get slides(){return v},get slideCount(){return o},get config(){return i},state:r,listeners:S,emit:a,getSlideSize:P,recalcSlideMetrics:H,normalizeIndex:I,getMaxIndex:h,getEffectivePerMove:C,isLoopEnabled:T,isFractionalView:m,isVertical:f,getScrollPos:b,setScrollPos:M,scrollToPos:D,getScrollPosForIndex:O,getIndexFromScrollPos:B,refreshPagination:()=>F.refresh(),refreshNavState:()=>Y.refresh(),applySnapAlignment:U},w=Ae(j),Y=Ie(j,te,ae),F=_e(j,Z),le=xe(j,te,ae),W=we(j,te),se=Ce(j,w,Z,W.pause,W.start);function ee(){if(r.isDragging||r.isProgrammaticScroll)return;let n=r.loopModeActive?w.getLoopIndexFromScroll():B(b());n!==r.currentIndex&&(r.currentIndex=n,a("slideChange",{index:r.currentIndex}),F.refresh(),Y.refresh(),Q())}function He(){p=null,r.isProgrammaticScroll=!1,K===null&&(t.style.scrollSnapType=""),ee()}function pe(){r.loopModeActive&&w.scheduleTeleport(),p!==null&&clearTimeout(p),p=setTimeout(He,be),L===null&&(L=requestAnimationFrame(()=>{L=null,ee()}))}let K=null;function ve(){r.isDragging||(t.style.scrollSnapType="none",K!==null&&clearTimeout(K),K=setTimeout(()=>{K=null,t.style.scrollSnapType=""},Te))}function ge(){if(H(),r.loopModeActive){let n=P();if(n>0){let l=w.getLoopRealStart(),y=l+r.currentIndex*n;if(m()){let x=R(),_=n-i.gap;y=l+r.currentIndex*n+_/2-x/2}M(y)}}else M(O(r.currentIndex))}function Se(){r.isDestroyed||(E===null&&(t.style.scrollSnapType="none",r.isProgrammaticScroll=!0),u===null&&(u=requestAnimationFrame(()=>{u=null,r.isDestroyed||ge()})),E!==null&&clearTimeout(E),E=setTimeout(()=>{E=null,!r.isDestroyed&&(ge(),r.isProgrammaticScroll=!1,t.style.scrollSnapType="")},fe))}let Re=["--slides-per-view","--slide-gap","--slide-aspect"];function ke(){A?.(),A=Le(e,Re,()=>{r.isDestroyed||(a("resize",{index:r.currentIndex}),Ee(),a("resized",{index:r.currentIndex}))},{debounceMs:fe,maxWaitMs:ye})}function te(){r.isDestroyed||Z(I(r.currentIndex+C()))}function ae(){r.isDestroyed||Z(I(r.currentIndex-C()))}function Z(n){if(r.isDestroyed)return;let l=I(n),y=P();if(y!==0){if(l!==r.currentIndex&&(r.currentIndex=l,a("slideChange",{index:r.currentIndex}),F.refresh(),Y.refresh(),Q()),r.loopModeActive){w.cancelTeleport(),r.isProgrammaticScroll=!0;let x=w.getLoopIndexFromScroll(),_=(l-x+o)%o,q=_-o,re=Math.abs(q)<_?q:_;if(re===0){let ne=w.getLoopRealStart(),oe=ne+l*y;if(m()){let Be=R(),Ue=y-i.gap;oe=ne+l*y+Ue/2-Be/2}D(oe,"smooth"),w.scheduleTeleport();return}D(b()+re*y,"smooth"),w.scheduleTeleport();return}r.isProgrammaticScroll=!0,D(O(l),"smooth")}}function Ee(n){let l=i;if(i={...i,...c(),...n??{}},l.direction!==i.direction&&G(),k(),H(),se.setEnabled(i.draggable),le.setEnabled(!0),W.setHoverPause(i.autoplay),(l.slidesPerView!==i.slidesPerView||l.loop!==i.loop||l.maxDots!==i.maxDots||l.perMove!==i.perMove)&&(F.clear(),F.build()),(l.autoplay!==i.autoplay||l.autoplayInterval!==i.autoplayInterval||l.loop!==i.loop)&&(i.autoplay?W.start():W.pause()),l.loop!==i.loop?T()?w.setupLoopTrack(r.currentIndex):w.teardownLoopTrack(r.currentIndex):r.loopModeActive&&l.slidesPerView!==i.slidesPerView&&w.setupLoopTrack(r.currentIndex),U(),!r.loopModeActive){let y=I(r.currentIndex);r.currentIndex=y,D(O(y))}ee(),F.refresh(),Y.refresh(),Q()}function de(){if(!r.isDestroyed&&(r.loopModeActive&&w.teardownLoopTrack(r.currentIndex),v=Array.from(t.children).filter(n=>!n.hasAttribute(z)),o=v.length,o!==0)){if(v.forEach((n,l)=>{n.setAttribute($,String(l)),n.classList.add("aero-slider__slide")}),k(),H(),T()&&w.setupLoopTrack(r.currentIndex),U(),!r.loopModeActive){let n=I(r.currentIndex);r.currentIndex=n,D(O(n))}F.clear(),F.build(),Y.build(),ee(),Q()}}function Ve(n,l){if(r.isDestroyed)return;let y=Array.isArray(n)?n:[n];r.loopModeActive&&w.teardownLoopTrack(r.currentIndex);let x=Array.from(t.children).filter(_=>!_.hasAttribute(z));if(l!==void 0&&l<x.length){let _=x[l]??null;for(let q of y)t.insertBefore(q,_)}else for(let _ of y)t.appendChild(_);de()}function Oe(n){if(r.isDestroyed)return;let l=Array.isArray(n)?n:[n];r.loopModeActive&&w.teardownLoopTrack(r.currentIndex);let y=Array.from(t.children).filter(_=>!_.hasAttribute(z)),x=[...l].sort((_,q)=>q-_);for(let _ of x)_>=0&&_<y.length&&y[_].remove();de()}function Ne(n,l){S.has(n)||S.set(n,new Set),S.get(n).add(l)}function Fe(n,l){S.get(n)?.delete(l)}function ze(){r.isDestroyed||(a("destroy",{index:r.currentIndex}),r.isDestroyed=!0,W.pause(),r.loopModeActive&&w.teardownLoopTrack(r.currentIndex),w.cancelTeleport(),r.isProgrammaticScroll=!1,A?.(),A=null,window.removeEventListener("resize",Se),E!==null&&(clearTimeout(E),E=null),u!==null&&(cancelAnimationFrame(u),u=null),t.removeEventListener("scroll",pe),t.removeEventListener("wheel",ve),K!==null&&clearTimeout(K),p!==null&&clearTimeout(p),se.setEnabled(!1),le.setEnabled(!1),W.setHoverPause(!1),L!==null&&cancelAnimationFrame(L),Y.clear(),F.clear(),e.removeAttribute("aria-roledescription"),e.removeAttribute("dir"),e.classList.remove("aero-slider--dragging","aero-slider--rtl","aero-slider--vertical","aero-slider--ready"),e.removeAttribute("data-aero-defer-visibility"),s.aeroSlider===ce&&delete s.aeroSlider,S.clear())}e.removeAttribute("data-aero-defer-visibility"),k(),e.classList.add("aero-slider"),e.setAttribute("aria-roledescription","carousel"),t.classList.add("aero-slider__track");for(let n of v)n.classList.add("aero-slider__slide");G(),k(),H(),U(),t.addEventListener("scroll",pe,{passive:!0}),t.addEventListener("wheel",ve,{passive:!0}),window.addEventListener("resize",Se),T()?w.setupLoopTrack(0):M(0),ke(),se.setEnabled(i.draggable),le.setEnabled(!0),W.setHoverPause(i.autoplay),Y.build(),F.build(),i.autoplay&&W.start();let We=X();for(let n of We)N.add(n);for(let n of N)a("visible",{index:n});let ce={get element(){return e},next:te,prev:ae,goTo:Z,destroy:ze,update:Ee,refresh:de,add:Ve,remove:Oe,on:Ne,off:Fe,get currentIndex(){return r.currentIndex},get slideCount(){return o}};return s.aeroSlider=ce,e.classList.add("aero-slider--ready"),a("ready",{index:r.currentIndex}),ce}var De="aero-slider__thumb--active";function me(e,g,s){e.querySelectorAll(":scope > *").forEach(t=>{let v=s(t);t.classList.toggle(De,v===g)})}function Pe(e,g,s){let d=e.clientWidth,t=e.scrollLeft,v=Array.from(e.children).filter(i=>s(i)===g);if(v.length===0)return;let o=0,c=1/0;for(let i of v){let S=i.offsetLeft+i.offsetWidth/2-d/2,L=e.scrollWidth-d,p=Math.max(0,Math.min(S,L)),A=Math.abs(p-t);A<c&&(c=A,o=p)}e.scrollTo({left:o,behavior:"smooth"})}function Xe(e,g,s){let d=g.element.querySelector(".aero-slider__track");if(!d)return()=>{};let t=d,v=s?.loop??!0;g.update({draggable:!1,loop:v});let o=Array.from(t.children).filter(u=>u.hasAttribute("data-aero-slider-index"));o.sort((u,a)=>Number(u.getAttribute("data-aero-slider-index"))-Number(a.getAttribute("data-aero-slider-index")));let c=o.length,i=Array.from(t.children).indexOf(o[0]??t),r=[];function S(u){let a=u.getAttribute("data-aero-slider-index");if(a!==null)return Number(a);let f=Array.from(t.children).indexOf(u);return f<i?f%c:(f-i-c)%c}let L=null,p=null;Array.from(t.children).forEach(u=>{let a=u,f=()=>{let h=S(a);L=h,me(t,h,S),e.goTo(h)};a.addEventListener("click",f),a.style.cursor="pointer",r.push({el:a,fn:f})});let A=null,E=u=>{if(L!==null){u.index===L?(p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,L=null},200)):p!==null&&(clearTimeout(p),p=null);return}A!==null&&clearTimeout(A),A=setTimeout(()=>{A=null,me(t,u.index,S),Pe(t,u.index,S)},50)};return e.on("slideChange",E),me(t,e.currentIndex,S),Pe(t,e.currentIndex,S),()=>{A!==null&&clearTimeout(A),p!==null&&clearTimeout(p),L=null,r.forEach(({el:u,fn:a})=>u.removeEventListener("click",a)),t.querySelectorAll(":scope > *").forEach(u=>u.classList.remove(De)),e.off("slideChange",E)}}export{Ke as createSlider,Xe as syncThumbnails};