situs-kit 0.2.2 → 0.2.4

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
@@ -47,6 +47,7 @@ The `element` parameter accepts:
47
47
  new SplitText(element, {
48
48
  type: ["chars", "words", "lines"], // which levels to split
49
49
  tag: "span", // wrapper element tag
50
+ children: true, // split children of the target
50
51
  mask: ["chars", "lines"], // which levels to mask
51
52
  resize: true, // auto-reflow lines on resize
52
53
  style: {
@@ -68,6 +69,7 @@ new SplitText(element, {
68
69
  |--------|------|---------|-------------|
69
70
  | `type` | `SplitType \| SplitType[]` | `["chars", "words", "lines"]` | Split granularity |
70
71
  | `tag` | `string` | `"span"` | Wrapper element tag |
72
+ | `children` | `boolean` | `false` | Split the target's child elements instead of the target itself |
71
73
  | `mask` | `boolean \| SplitType[]` | `false` | Create overflow-hidden wrappers. `true` masks all requested types; array masks only specified types |
72
74
  | `resize` | `boolean` | `true` | Auto-reflow lines on window resize (only applies when lines are split) |
73
75
  | `style` | `object` | — | Inline styles per split type (`chars`, `words`, `lines`, `mask`) |
@@ -174,6 +176,25 @@ const split2 = new SplitText("#text", {
174
176
  });
175
177
  ```
176
178
 
179
+ ## Children Mode
180
+
181
+ When `children: true`, SplitText splits each direct child element of the target instead of the target itself. Useful when a container holds multiple blocks (headings, paragraphs) that should all be split with one call.
182
+
183
+ ```ts
184
+ // <div id="hero">
185
+ // <h1>Title</h1>
186
+ // <p>Subtitle text here</p>
187
+ // </div>
188
+
189
+ const split = new SplitText("#hero", {
190
+ type: "words",
191
+ children: true,
192
+ });
193
+
194
+ // splits both <h1> and <p> individually
195
+ split.words; // HTMLElement[] from all children
196
+ ```
197
+
177
198
  ## Multi-Element Support
178
199
 
179
200
  When passing multiple elements (via selector, array, or array-like), SplitText creates sub-instances and aggregates all results into the top-level `chars`, `words`, `lines`, and `masks` arrays.
@@ -267,6 +288,71 @@ scroll.on("scroll", ({ current, target, velocity, direction, max }) => {});
267
288
  scroll.off("scroll", callback);
268
289
  ```
269
290
 
291
+ ## ScrollObserver
292
+
293
+ Observe when elements enter and leave the viewport based on scroll position.
294
+
295
+ ```ts
296
+ scroll.observe({
297
+ trigger: "#my-element",
298
+ start: { dom: "top", viewport: "80%" },
299
+ end: { dom: "bottom", viewport: "20%" },
300
+ onEnter(info) { console.log("entered", info.progress); },
301
+ onLeave(info) { console.log("left"); },
302
+ });
303
+ ```
304
+
305
+ ### `observe(config)` / `obs(config)`
306
+
307
+ Returns a `ScrollObserverInstance` with `kill()` and `info`.
308
+
309
+ ```ts
310
+ const observer = scroll.observe({ trigger: "#el" });
311
+ observer.info.progress; // 0–1
312
+ observer.info.isActive; // boolean
313
+ observer.kill(); // remove this observer
314
+ ```
315
+
316
+ ### Config
317
+
318
+ | Option | Type | Default | Description |
319
+ |--------|------|---------|-------------|
320
+ | `trigger` | `HTMLElement \| string` | — | Element to observe (required) |
321
+ | `start` | `ScrollPosition` | `"top bottom"` | When the observer activates |
322
+ | `end` | `ScrollPosition` | `"bottom top"` | When the observer deactivates |
323
+ | `onEnter` | `(info) => void` | — | Scrolling forward past start |
324
+ | `onLeave` | `(info) => void` | — | Scrolling forward past end |
325
+ | `onEnterBack` | `(info) => void` | — | Scrolling backward past end |
326
+ | `onLeaveBack` | `(info) => void` | — | Scrolling backward past start |
327
+ | `onUpdate` | `(info) => void` | — | Every frame while active |
328
+ | `once` | `boolean` | `false` | Auto-kill after first activation |
329
+ | `markers` | `boolean` | `false` | Show debug lines for start/end |
330
+ | `toggleClass` | `string` | — | Class added while active, removed otherwise |
331
+
332
+ ### ScrollPosition
333
+
334
+ `start` and `end` accept a string or an object:
335
+
336
+ ```ts
337
+ // String form — "dom viewport"
338
+ start: "top 80%"
339
+
340
+ // Object form — self-documenting
341
+ start: { dom: "top", viewport: "80%" }
342
+ ```
343
+
344
+ Both `dom` and `viewport` tokens support named positions (`top`, `center`, `bottom`, `left`, `right`), percentages (`80%`), and offsets (`top+=100`, `bottom-=50`).
345
+
346
+ ### Observer Info
347
+
348
+ | Property | Type | Description |
349
+ |----------|------|-------------|
350
+ | `progress` | `number` | 0–1 between start and end |
351
+ | `isActive` | `boolean` | Whether currently between start and end |
352
+ | `state` | `"before" \| "active" \| "after"` | Current state |
353
+ | `direction` | `1 \| -1` | Scroll direction |
354
+ | `trigger` | `HTMLElement` | The observed element |
355
+
270
356
  ## Window vs Element Mode
271
357
 
272
358
  Both modes use the same scroll-jacking approach: wheel is intercepted for smooth damping, touch and programmatic scrolls sync via native `scroll` events.
@@ -0,0 +1,2 @@
1
+ import{c as C,e as c,f as w}from"./chunk-0t3a7kj5.js";var I=1,x=2,K=4,_="inline-block",h="nowrap",f="baseline",u="0px",E="block",g="maskChar",m="maskWord",n="maskLine",o=/^\s+$/,l=/(\s+)/,t=",div,span,svg,img,br,hr,canvas,video,audio,iframe,input,textarea,select,button,picture,figure,",p={u:"underline",ins:"underline",s:"line-through",strike:"line-through",del:"line-through"};class a{dom;chars;words;lines;masks;_n;_k;_g;_j;_f=[];_o=new Map;_i=null;_h=0;_l=!1;_c="";_d;_e;_b;_a=null;constructor(z,J={}){let F;if(typeof z==="string"){let Q=w(z);if(Q.length>1)F=Q;else{let $=Q[0]??c(z);if(!$)throw Error("SplitText: element not found");F=$}}else F=z;if(J.children){if(Array.isArray(F)||typeof F==="object"&&F!==null&&"length"in F&&typeof F.item==="function")F=Array.from(F).flatMap((H)=>Array.from(H.children));else F=Array.from(F.children);let{children:Q,...$}=J;J=$}if(Array.isArray(F)||typeof F==="object"&&F!==null&&"length"in F&&typeof F.item==="function"){let Q=Array.from(F);if(Q.length===0)throw Error("SplitText: empty element array");this._a=Q.map(($)=>new a($,J)),this.dom=Q,this.chars=this._a.flatMap(($)=>$.chars),this.words=this._a.flatMap(($)=>$.words),this.lines=this._a.flatMap(($)=>$.lines),this.masks={chars:this._a.flatMap(($)=>$.masks.chars),words:this._a.flatMap(($)=>$.masks.words),lines:this._a.flatMap(($)=>$.masks.lines)},this._n="",this._k=0,this._g=0,this._j="";return}let U=F;this._b=U,this.dom=U,this._n=U.innerHTML,this.chars=[],this.words=[],this.lines=[],this.masks={chars:[],words:[],lines:[]};let G=J.type?Array.isArray(J.type)?J.type:[J.type]:["chars","words","lines"],D=0;for(let Q of G)if(Q==="chars")D|=I;else if(Q==="words")D|=x;else if(Q==="lines")D|=K;this._k=D,this._j=J.tag??"span";let Z=0;if(J.mask===!0)Z=D;else if(Array.isArray(J.mask)){for(let Q of J.mask)if(Q==="chars")Z|=I;else if(Q==="words")Z|=x;else if(Q==="lines")Z|=K}if(this._g=Z,this._d=J.style,this._e=J.class,this._w(),(J.resize??!0)&&D&K)this._x()}_p(z,J){let F=document.createElement(this._j);if(z)F.dataset[z]="";if(F.style.display=_,J!==void 0)F.textContent=J;return F}_s(z,J){let F=document.createElement(this._j);if(F.dataset[J]="",F.style.overflow="hidden",F.style.display=z,this._d?.mask)Object.assign(F.style,this._d.mask);if(this._e?.mask)F.classList.add(this._e.mask);return F}_r(z,J,F,q,U){if(this._g&J){let G=this._s(F,q);return G.appendChild(z),U.push(G),G}return z}_m(z,J,F,q){if(F){let{outer:U,inner:G}=F();if(G.appendChild(J),q)this._o.set(q,U);z.appendChild(U)}else z.appendChild(J)}_q(z,J,F){if(z.style.textDecoration=J,F)z.style.textDecorationColor=F}_w(){this._l=!0;let z=this._b,J=C(z),F=J?parseFloat(J.letterSpacing)||0:0;if(this._c=J?J.textIndent:"",this._c&&this._c!==u)z.style.textIndent="0";let q=this._k,U=!!(q&I),G=!!(q&x),D=!!(q&K),Z=G||D,Q=!!(this._g&I),$=new Map,H=(M)=>{for(let N of Array.from(M.childNodes))if(N.nodeType===1){let O=N.tagName.toLowerCase();if(p[O]){let v=C(N)?.textDecorationColor;if(v)$.set(N,v)}H(N)}};H(z);let Y=Array.from(z.childNodes),T=document.createDocumentFragment();z.replaceChildren();let k=(M,N,O,v)=>{if(M.nodeType===3){let X=(M.textContent??"").split(l);for(let j of X){if(!j)continue;if(o.test(j)){T.appendChild(document.createTextNode(j));continue}let V=Z?this._p(G?"word":""):null;if(V){if(V.style.whiteSpace=h,O&&!U)this._q(V,O,v)}if(U){let b=[...j],s=this.chars.length;for(let P=0;P<b.length;P++){let R=this._p("char",b[P]);if(F&&P<b.length-1)R.style.marginRight=`${F}px`;if(O)this._q(R,O,v);if(this.chars.push(R),this._d?.chars)Object.assign(R.style,this._d.chars);if(this._e?.chars)R.classList.add(this._e.chars);let y=Q?this._r(R,I,_,g,this.masks.chars):R;if(V)V.appendChild(y)}if(!V){let P=N?N():null,R=P?P.inner:T;for(let y=s;y<this.chars.length;y++){let S=this.chars[y];R.appendChild(Q&&S.parentElement?.dataset?.[g]!==void 0?S.parentElement:S)}if(P)T.appendChild(P.outer)}}else if(V){if(V.textContent=j,F)V.style.letterSpacing=`${F}px`}if(V){if(G){if(this.words.push(V),this._d?.words)Object.assign(V.style,this._d.words);if(this._e?.words)V.classList.add(this._e.words)}this._f.push(V);let b=this._g&x?this._r(V,x,_,m,this.masks.words):V;this._m(T,b,N,V)}else if(!U)this._m(T,document.createTextNode(j),N)}return}if(M.nodeType!==1)return;let B=M,A=B.tagName.toLowerCase();if(t.includes(","+A+",")){let X=B.cloneNode(!0);if(O)this._q(X,O,v);let j=C(B)?.verticalAlign;if(j&&j!==f)X.style.verticalAlign=j;if(Z){let V=this._p(G?"word":"");if(V.style.whiteSpace=h,j&&j!==f)V.style.verticalAlign=j;if(V.appendChild(X),G){if(this.words.push(V),this._d?.words)Object.assign(V.style,this._d.words);if(this._e?.words)V.classList.add(this._e.words)}this._f.push(V);let b=this._g&x?this._r(V,x,_,m,this.masks.words):V;this._m(T,b,N,V)}else this._m(T,X,N);return}let r=()=>{let X=B.cloneNode(!1);if(N){let{outer:j,inner:V}=N();return V.appendChild(X),{outer:j,inner:X}}return{outer:X,inner:X}},L=p[A],i=L?O?`${O} ${L}`:L:O,d=L?$.get(B)||v:v;for(let X of Array.from(B.childNodes))k(X,r,i,d)};for(let M of Y)k(M,null,"","");z.appendChild(T);let W=!!(this._c&&this._c!==u);if(D)this._y(W);else if(W){let M=G?this.words[0]:U?this.chars[0]:null;if(M)M.style.marginLeft=this._c,z.style.textIndent="0"}this._l=!1}_y(z){if(z&&this._f[0])this._f[0].style.marginLeft=this._c;this._t();let J=[];if(typeof document.fonts?.status==="string"&&document.fonts.status!=="loaded")J.push(document.fonts.ready);let F=this._b.querySelectorAll("img");for(let q=0;q<F.length;q++){let U=F[q];if(!U.complete)J.push(new Promise((G)=>{U.addEventListener("load",G,{once:!0}),U.addEventListener("error",G,{once:!0})}))}if(J.length){let q=this._b.offsetHeight;Promise.all(J).then(()=>{if(this._b.offsetHeight!==q)this.reflow()})}}_u(z){return this._o.get(z)??z}_t(){let z=this._f;if(!z.length)return;let J=z[0].offsetTop,F=J+z[0].offsetHeight,q=[],U=[];for(let Q of z){let $=Q.offsetTop,H=$+Q.offsetHeight;if($<F&&H>J)J=Math.min(J,$),F=Math.max(F,H);else U.push(q),q=[],J=$,F=H;q.push(Q)}if(q.length)U.push(q);let G=!!(this._c&&this._c!==u);if(G&&z[0])z[0].style.marginLeft="";let D=!!(this._g&K),Z=document.createDocumentFragment();for(let Q=0;Q<U.length;Q++){let $=U[Q],H=document.createElement(this._j);if(H.dataset.line="",H.style.display=E,Q===0&&G)H.style.paddingLeft=this._c;for(let Y=0;Y<$.length;Y++){if(Y>0)H.appendChild(document.createTextNode(" "));H.appendChild(this._u($[Y]))}if(this.lines.push(H),this._d?.lines)Object.assign(H.style,this._d.lines);if(this._e?.lines)H.classList.add(this._e.lines);if(D){let Y=this._s(E,n);Y.appendChild(H),this.masks.lines.push(Y),Z.appendChild(Y)}else Z.appendChild(H)}this._b.replaceChildren(Z)}_x(){let z=this._b.offsetParent?this._b.offsetParent.offsetWidth:window.innerWidth,J=()=>{if(this._l)return;let q=this._b.offsetParent,U=q?q.offsetWidth:window.innerWidth;if(U===z)return;if(z=U,this._h)cancelAnimationFrame(this._h);this._h=requestAnimationFrame(()=>this.reflow())};this._i=new ResizeObserver(J);let F=this._b.offsetParent??this._b.parentElement;if(F)this._i.observe(F);else this._i.observe(this._b)}reflow(){if(this._a){this._a.forEach((J)=>J.reflow()),this._v();return}if(!(this._k&K)||this._l)return;let z=document.createDocumentFragment();for(let J=0;J<this._f.length;J++){if(J>0)z.appendChild(document.createTextNode(" "));z.appendChild(this._u(this._f[J]))}if(this._b.replaceChildren(z),this.lines.length=0,this.masks.lines.length=0,this._c&&this._c!==u&&this._f[0])this._f[0].style.marginLeft=this._c;this._t()}revert(){if(this._a){this._a.forEach((z)=>z.revert()),this._v();return}this.destroy(),this._b.innerHTML=this._n,this.chars.length=0,this.words.length=0,this._f.length=0,this._o.clear(),this.lines.length=0,this.masks.chars.length=0,this.masks.words.length=0,this.masks.lines.length=0}destroy(){if(this._a){this._a.forEach((z)=>z.destroy());return}if(this._h)cancelAnimationFrame(this._h),this._h=0;if(this._i)this._i.disconnect(),this._i=null}_v(){if(!this._a)return;this.chars.length=0,this.words.length=0,this.lines.length=0,this.masks.chars.length=0,this.masks.words.length=0,this.masks.lines.length=0;for(let z of this._a)this.chars.push(...z.chars),this.words.push(...z.words),this.lines.push(...z.lines),this.masks.chars.push(...z.masks.chars),this.masks.words.push(...z.masks.words),this.masks.lines.push(...z.masks.lines)}}
2
+ export{a};
@@ -0,0 +1,2 @@
1
+ import{d as M,e as q}from"./chunk-0t3a7kj5.js";import{g as L,h as U}from"./chunk-qjsknche.js";function C(j,B,G){return Math.min(Math.max(j,B),G)}function O(j,B,G){return j+(B-j)*G}function z(j,B,G){let H=B-j;return H===0?0:C((G-j)/H,0,1)}function D(j,B,G,H){let Q=1-Math.exp(-G*H);return O(j,B,Q)}var P={top:0,left:0,center:0.5,bottom:1,right:1};function R(j){if(j in P)return P[j];if(j.endsWith("%"))return parseFloat(j)/100;let B=parseFloat(j);return isNaN(B)?0:B}function W(j){let B=j.indexOf("+=");if(B!==-1){let H=R(j.slice(0,B)),Q=parseFloat(j.slice(B+2));return[H,isNaN(Q)?0:Q]}let G=j.indexOf("-=");if(G!==-1){let H=R(j.slice(0,G)),Q=parseFloat(j.slice(G+2));return[H,isNaN(Q)?0:-Q]}return[R(j),0]}function x(j){if(typeof j==="object"){let[K,Z]=W(j.dom),[J,Y]=W(j.viewport);return[K,J,Z,Y]}let B=j.trim().split(/\s+/),[G,H]=W(B[0]),[Q,V]=B.length>1?W(B[1]):[G,0];return[G,Q,H,V]}class I{_l=new Set;_m=null;_j;constructor(j){this._j=j}_C(j,B){let[G,H,Q,V]=B,K=this._j,Z,J,Y;if(K._b)if(J=j.height,Y=K._d?window.innerHeight:K._c.clientHeight,K._d)Z=j.top+K._a;else{let X=K._c.getBoundingClientRect();Z=j.top-X.top+K._a}else if(J=j.width,Y=K._d?window.innerWidth:K._c.clientWidth,K._d)Z=j.left+K._a;else{let X=K._c.getBoundingClientRect();Z=j.left-X.left+K._a}return Z+G*J-H*Y+Q+V}_D(j){let B=this._j,G=j.el.getBoundingClientRect(),H=this._C(G,j.startParsed),Q=this._C(G,j.endParsed),V=Q-H,K=B._a,Z=V===0?K>=H?1:0:C((K-H)/V,0,1),J;if(K<H)J="before";else if(K>=Q)J="after";else J="active";let{state:Y,info:X,cfg:N}=j;if(X.progress=Z,X.direction=B._k,X.isActive=J==="active",X.state=J,Y!==J){if(j.state=J,N.toggleClass)if(J==="active")j.el.classList.add(N.toggleClass);else j.el.classList.remove(N.toggleClass);if(Y==="before"&&J==="active")N.onEnter?.(X);else if(Y==="active"&&J==="after")N.onLeave?.(X);else if(Y==="after"&&J==="active")N.onEnterBack?.(X);else if(Y==="active"&&J==="before")N.onLeaveBack?.(X);else if(Y==="before"&&J==="after")N.onEnter?.(X),N.onLeave?.(X);else if(Y==="after"&&J==="before")N.onEnterBack?.(X),N.onLeaveBack?.(X);if(N.once&&(J==="active"||Y==="before"&&J==="after")){this._x(j);return}}if(J==="active")N.onUpdate?.(X)}_P(){for(let j of this._l)this._D(j)}_x(j){if(this._l.delete(j),j.cfg.toggleClass&&j.state==="active")j.el.classList.remove(j.cfg.toggleClass);if(j.markerEls){for(let B of j.markerEls)B.parentElement?.removeChild(B);j.markerEls=null}if(this._l.size===0&&this._m)this._j.off("scroll",this._m),this._m=null}killAll(){for(let j of this._l)this._x(j);this._l.clear()}_O(j,B){let G=this._j,H=[],Q=G._b?"top":"left",V=G._b?"height":"width",K=G._b?"width":"height",Z=G._d?G._b?window.innerHeight:window.innerWidth:G._b?G._c.clientHeight:G._c.clientWidth,J=(Y,X)=>{let N=document.createElement("div");if(N.style.position="fixed",N.style[Q]=Y*Z+"px",N.style[K]="100%",N.style[V]="2px",N.style.background=X,N.style.pointerEvents="none",N.style.zIndex="99999",G._b)N.style.left="0";else N.style.top="0";return document.body.appendChild(N),N};return H.push(J(j,"#00ff00")),H.push(J(B,"#ff0000")),H}observe(j){let B=typeof j.trigger==="string"?q(j.trigger):j.trigger;if(!B)throw Error(`ScrollObserver: trigger element not found: ${j.trigger}`);let G=x(j.start??"top bottom"),H=x(j.end??"bottom top"),Q={progress:0,isActive:!1,state:"before",direction:this._j._k,trigger:B},V={el:B,cfg:j,info:Q,state:"before",startParsed:G,endParsed:H,markerEls:null};if(j.markers)V.markerEls=this._O(G[1],H[1]);if(this._l.add(V),!this._m)this._m=()=>this._P(),this._j.on("scroll",this._m);return this._D(V),{kill:()=>this._x(V),get info(){return V.info}}}}var $=0.09;class T{_c;_d;_b;_E;_f;_F;_r=!1;_u=!1;_p=new Map;_a=0;_e=0;_o=0;_k=1;_t=!1;_U={current:0,target:0,velocity:0,direction:1,max:0,scrolling:!1};_g=!1;_B=0;_v=0;_L=0;_h=0;_w=null;_i=$;_n=null;_G;_H;_I;_y;_s;constructor(j={}){let B=j.wrapper??window;this._c=typeof B==="string"?q(B)??window:B,this._d=this._c===window,this._b=(j.direction??"vertical")==="vertical",this._E=j.duration??0,this._f=j.ease??$,this._F=j.prevent??!this._d,this._G=this._Q.bind(this),this._H=this._R.bind(this),this._I=this._S.bind(this),this._y=()=>this._T(),this._s=new I(this);let G=this._d?this._b?window.scrollY:window.scrollX:this._b?this._c.scrollTop:this._c.scrollLeft;this._a=G,this._e=G,this.start()}get scroll(){let j=this._U;return j.current=this._a,j.target=this._e,j.velocity=this._o,j.direction=this._k,j.max=this._z(),j.scrolling=this._t,j}_z(){if(this._d)return this._b?document.documentElement.scrollHeight-window.innerHeight:document.documentElement.scrollWidth-window.innerWidth;let j=this._c;return this._b?j.scrollHeight-j.clientHeight:j.scrollWidth-j.clientWidth}_A(j){return C(j,0,this._z())}on(j,B){let G=this._p.get(j);if(!G)G=new Set,this._p.set(j,G);G.add(B)}off(j,B){this._p.get(j)?.delete(B)}_K(j){let B=this._p.get(j);if(!B)return;let G=this.scroll;for(let H of B)H(G)}_q(){if(this._u)return;this._u=!0,U.add(this._y)}_N(){if(!this._u)return;this._u=!1,U.remove(this._y)}to(j,B={}){let G;if(typeof j==="number")G=j;else{let V=typeof j==="string"?q(j):j;if(!V)return;let K=V.getBoundingClientRect();if(this._d)G=(this._b?K.top:K.left)+this._a;else{let J=this._c.getBoundingClientRect();G=(this._b?K.top-J.top:K.left-J.left)+this._a}}if(G+=B.offset??0,G=this._A(G),B.immediate){this._a=G,this._e=G,this._g=!0,this._J(),this._K("scroll"),this._g=!1,B.onComplete?.();return}this._g=!0,this._q();let H=B.ease??this._f,Q=B.duration??this._E;if(typeof H==="number")this._h=0,this._e=G,this._i=H,this._n=B.onComplete??null;else if(Q>0)this._B=this._a,this._v=G,this._L=performance.now(),this._h=Q,this._i=H,this._w=B.onComplete??null,this._n=null;else this._h=0,this._e=G,this._i=typeof this._f==="number"?this._f:$,this._n=B.onComplete??null}_M(j){let B=this._d?window:this._c;M(B,j,"wheel",this._G),M(B,j,"scroll",this._H,{passive:!0}),M(window,j,"keydown",this._I)}start(){if(this._r)return;this._r=!0,this._M("a")}stop(){if(!this._r)return;this._r=!1,this._M("r"),this._N()}destroy(){this._s.killAll(),this.stop(),this._p.clear()}_Q(j){if(j.preventDefault(),this._F)j.stopPropagation();let B=this._b?j.deltaY:j.deltaX;if(j.deltaMode===1)B*=0.833333;else if(j.deltaMode===2)B*=0.555556;this._e=this._A(this._e+B),this._h=0,this._i=typeof this._f==="number"?this._f:$,this._g=!0,this._q(),this._k=B>0?1:-1}_R(){if(this._g)return;let j=this._d?this._b?window.scrollY:window.scrollX:this._b?this._c.scrollTop:this._c.scrollLeft;this._a=j,this._e=j}_S(j){if(!this._d){let H=document.activeElement;if(H!==this._c&&!this._c.contains(H))return}let B=0,G=this._b?this._d?window.innerHeight:this._c.clientHeight:this._d?window.innerWidth:this._c.clientWidth;switch(j.key){case"ArrowDown":B=100;break;case"ArrowUp":B=-100;break;case"ArrowRight":if(!this._b)B=100;break;case"ArrowLeft":if(!this._b)B=-100;break;case" ":B=j.shiftKey?-G:G;break;case"PageDown":B=G;break;case"PageUp":B=-G;break;case"Home":this._e=0,this._h=0,this._i=typeof this._f==="number"?this._f:$,this._g=!0,this._q();return;case"End":this._e=this._z(),this._h=0,this._i=typeof this._f==="number"?this._f:$,this._g=!0,this._q();return;default:return}if(B)j.preventDefault(),this._e=this._A(this._e+B),this._h=0,this._i=typeof this._f==="number"?this._f:$,this._g=!0,this._q(),this._k=B>0?1:-1}_J(){if(this._d)if(this._b)window.scrollTo(0,this._a);else window.scrollTo(this._a,0);else{let j=this._c;if(this._b)j.scrollTop=this._a;else j.scrollLeft=this._a}}_T(){if(!this._r)return;let j=this._a,B=!1;if(this._g){if(this._h>0){let H=performance.now()-this._L,Q=z(0,this._h,H),V=this._i(Q);if(this._a=this._B+(this._v-this._B)*V,this._e=this._v,Q>=1)this._a=this._v,this._h=0,B=!0}else{let H=this._i;if(this._a=D(this._a,this._e,H,L()),Math.abs(this._e-this._a)<0.5)this._a=this._e,B=!0}this._J()}this._o=this._a-j;let G=this._t;if(this._t=Math.abs(this._o)>0.01,this._o>0)this._k=1;else if(this._o<0)this._k=-1;if(this._t||G)this._K("scroll");if(B){if(this._g=!1,this._N(),this._w){let H=this._w;this._w=null,H()}if(this._n){let H=this._n;this._n=null,H()}}}observe(j){return this._s.observe(j)}obs(j){return this._s.observe(j)}}
2
+ export{T as b};
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { SplitText, type SplitTextOptions, type SplitType, } from "./split-text/index.ts";
2
- export { SmoothScroll, type SmoothScrollOptions, type ScrollToOptions, type ScrollState, } from "./smooth-scroll/index.ts";
2
+ export { SmoothScroll, type SmoothScrollOptions, type ScrollToOptions, type ScrollState, type ScrollObserverConfig, type ScrollObserverInfo, type ScrollObserverInstance, type ScrollPosition, } from "./smooth-scroll/index.ts";
3
3
  export { Ticker, getDeltaFrame, type TickerCallback } from "./ticker/index.ts";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a as t}from"./chunk-se6yyp59.js";import{b as p}from"./chunk-xcfcqftx.js";import"./chunk-0t3a7kj5.js";import{g as e,h as o}from"./chunk-qjsknche.js";export{e as getDeltaFrame,o as Ticker,t as SplitText,p as SmoothScroll};
1
+ import{a as e}from"./chunk-kxrk4nvg.js";import{b as r}from"./chunk-s9ce6x50.js";import"./chunk-0t3a7kj5.js";import{g as t,h as o}from"./chunk-qjsknche.js";export{t as getDeltaFrame,o as Ticker,e as SplitText,r as SmoothScroll};
@@ -1,3 +1,6 @@
1
+ import { _ObserverManager } from "./observer.ts";
2
+ export type { ScrollObserverConfig, ScrollObserverInfo, ScrollObserverInstance, ScrollPosition, } from "./observer.ts";
3
+ import type { ScrollObserverConfig, ScrollObserverInstance } from "./observer.ts";
1
4
  export interface SmoothScrollOptions {
2
5
  wrapper?: Window | HTMLElement | string;
3
6
  direction?: "vertical" | "horizontal";
@@ -49,6 +52,7 @@ export declare class SmoothScroll {
49
52
  /** @internal */ _onScrollBound: () => void;
50
53
  /** @internal */ _onKeyDownBound: (e: KeyboardEvent) => void;
51
54
  /** @internal */ _tickBound: () => void;
55
+ /** @internal */ _obs: _ObserverManager;
52
56
  constructor(options?: SmoothScrollOptions);
53
57
  get scroll(): ScrollState;
54
58
  /** @internal */
@@ -79,5 +83,6 @@ export declare class SmoothScroll {
79
83
  _applyScroll(): void;
80
84
  /** @internal */
81
85
  _tick(): void;
86
+ observe(config: ScrollObserverConfig): ScrollObserverInstance;
87
+ obs(config: ScrollObserverConfig): ScrollObserverInstance;
82
88
  }
83
- export {};
@@ -1 +1 @@
1
- import{b as a}from"../chunk-xcfcqftx.js";import"../chunk-0t3a7kj5.js";import"../chunk-qjsknche.js";export{a as SmoothScroll};
1
+ import{b as a}from"../chunk-s9ce6x50.js";import"../chunk-0t3a7kj5.js";import"../chunk-qjsknche.js";export{a as SmoothScroll};
@@ -0,0 +1,62 @@
1
+ type ObserverState = "before" | "active" | "after";
2
+ export type ScrollPosition = string | {
3
+ dom: string;
4
+ viewport: string;
5
+ };
6
+ export interface ScrollObserverConfig {
7
+ trigger: HTMLElement | string;
8
+ start?: ScrollPosition;
9
+ end?: ScrollPosition;
10
+ onEnter?: (self: ScrollObserverInfo) => void;
11
+ onLeave?: (self: ScrollObserverInfo) => void;
12
+ onEnterBack?: (self: ScrollObserverInfo) => void;
13
+ onLeaveBack?: (self: ScrollObserverInfo) => void;
14
+ onUpdate?: (self: ScrollObserverInfo) => void;
15
+ once?: boolean;
16
+ markers?: boolean;
17
+ toggleClass?: string;
18
+ }
19
+ export interface ScrollObserverInfo {
20
+ progress: number;
21
+ isActive: boolean;
22
+ state: ObserverState;
23
+ direction: 1 | -1;
24
+ trigger: HTMLElement;
25
+ }
26
+ export interface ScrollObserverInstance {
27
+ kill(): void;
28
+ readonly info: ScrollObserverInfo;
29
+ }
30
+ /** Minimal contract the observer needs from the scroll host. */
31
+ export interface ScrollHost {
32
+ _current: number;
33
+ _isW: boolean;
34
+ _vertical: boolean;
35
+ _wrapper: Window | HTMLElement;
36
+ _dir: 1 | -1;
37
+ on(event: string, callback: (...args: any[]) => void): void;
38
+ off(event: string, callback: (...args: any[]) => void): void;
39
+ }
40
+ interface _ObserverEntry {
41
+ el: HTMLElement;
42
+ cfg: ScrollObserverConfig;
43
+ info: ScrollObserverInfo;
44
+ state: ObserverState;
45
+ startParsed: [number, number, number, number];
46
+ endParsed: [number, number, number, number];
47
+ markerEls: HTMLElement[] | null;
48
+ }
49
+ export declare class _ObserverManager {
50
+ _entries: Set<_ObserverEntry>;
51
+ _scrollBound: ((...args: any[]) => void) | null;
52
+ _host: ScrollHost;
53
+ constructor(host: ScrollHost);
54
+ _computeScrollPos(rect: DOMRect, parsed: [number, number, number, number]): number;
55
+ _check(entry: _ObserverEntry): void;
56
+ _update(): void;
57
+ _kill(entry: _ObserverEntry): void;
58
+ killAll(): void;
59
+ _createMarkers(scrollerStartFrac: number, scrollerEndFrac: number): HTMLElement[];
60
+ observe(config: ScrollObserverConfig): ScrollObserverInstance;
61
+ }
62
+ export {};
@@ -4,6 +4,7 @@ export type SplitTypeOption = SplitType | ["chars"] | ["words"] | ["lines"] | ["
4
4
  export interface SplitTextOptions {
5
5
  type?: SplitTypeOption;
6
6
  tag?: string;
7
+ children?: boolean;
7
8
  mask?: boolean | SplitType[];
8
9
  resize?: boolean;
9
10
  style?: {
@@ -1 +1 @@
1
- import{a}from"../chunk-se6yyp59.js";import"../chunk-0t3a7kj5.js";export{a as SplitText};
1
+ import{a}from"../chunk-kxrk4nvg.js";import"../chunk-0t3a7kj5.js";export{a as SplitText};
package/package.json CHANGED
@@ -1,43 +1,43 @@
1
1
  {
2
- "name": "situs-kit",
3
- "version": "0.2.2",
4
- "description": "A creative developer helper library",
5
- "license": "MIT",
6
- "module": "./dist/index.js",
7
- "main": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "type": "module",
10
- "exports": {
11
- ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.js"
14
- },
15
- "./split-text": {
16
- "types": "./dist/split-text/index.d.ts",
17
- "import": "./dist/split-text/index.js"
18
- },
19
- "./smooth-scroll": {
20
- "types": "./dist/smooth-scroll/index.d.ts",
21
- "import": "./dist/smooth-scroll/index.js"
22
- },
23
- "./ticker": {
24
- "types": "./dist/ticker/index.d.ts",
25
- "import": "./dist/ticker/index.js"
26
- }
27
- },
28
- "files": [
29
- "dist"
30
- ],
31
- "scripts": {
32
- "build": "bun build.ts && bunx tsc -p tsconfig.build.json",
33
- "prepublishOnly": "bun run build",
34
- "test": "bun test",
35
- "dev": "bun run examples/serve.ts"
36
- },
37
- "devDependencies": {
38
- "@types/bun": "latest"
39
- },
40
- "peerDependencies": {
41
- "typescript": "^5"
42
- }
2
+ "name": "situs-kit",
3
+ "version": "0.2.4",
4
+ "description": "A creative developer helper library",
5
+ "license": "MIT",
6
+ "module": "./dist/index.js",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "type": "module",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./split-text": {
16
+ "types": "./dist/split-text/index.d.ts",
17
+ "import": "./dist/split-text/index.js"
18
+ },
19
+ "./smooth-scroll": {
20
+ "types": "./dist/smooth-scroll/index.d.ts",
21
+ "import": "./dist/smooth-scroll/index.js"
22
+ },
23
+ "./ticker": {
24
+ "types": "./dist/ticker/index.d.ts",
25
+ "import": "./dist/ticker/index.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "bun build.ts && bunx tsc -p tsconfig.build.json",
33
+ "prepublishOnly": "bun run build",
34
+ "test": "bun test",
35
+ "dev": "bun run examples/serve.ts"
36
+ },
37
+ "devDependencies": {
38
+ "@types/bun": "latest"
39
+ },
40
+ "peerDependencies": {
41
+ "typescript": "^5"
42
+ }
43
43
  }
@@ -1,2 +0,0 @@
1
- import{c as C,e as c,f as w}from"./chunk-0t3a7kj5.js";var I=1,x=2,K=4,_="inline-block",h="nowrap",f="baseline",u="0px",E="block",m="maskChar",g="maskWord",n="maskLine",o=/^\s+$/,l=/(\s+)/,t=",div,span,svg,img,br,hr,canvas,video,audio,iframe,input,textarea,select,button,picture,figure,",p={u:"underline",ins:"underline",s:"line-through",strike:"line-through",del:"line-through"};class a{dom;chars;words;lines;masks;_n;_k;_g;_j;_f=[];_o=new Map;_i=null;_h=0;_l=!1;_c="";_d;_e;_b;_a=null;constructor(z,F={}){let J;if(typeof z==="string"){let $=w(z);if($.length>1)J=$;else{let Q=$[0]??c(z);if(!Q)throw Error("SplitText: element not found");J=Q}}else J=z;if(Array.isArray(J)||typeof J==="object"&&J!==null&&"length"in J&&typeof J.item==="function"){let $=Array.from(J);if($.length===0)throw Error("SplitText: empty element array");this._a=$.map((Q)=>new a(Q,F)),this.dom=$,this.chars=this._a.flatMap((Q)=>Q.chars),this.words=this._a.flatMap((Q)=>Q.words),this.lines=this._a.flatMap((Q)=>Q.lines),this.masks={chars:this._a.flatMap((Q)=>Q.masks.chars),words:this._a.flatMap((Q)=>Q.masks.words),lines:this._a.flatMap((Q)=>Q.masks.lines)},this._n="",this._k=0,this._g=0,this._j="";return}let U=J;this._b=U,this.dom=U,this._n=U.innerHTML,this.chars=[],this.words=[],this.lines=[],this.masks={chars:[],words:[],lines:[]};let G=F.type?Array.isArray(F.type)?F.type:[F.type]:["chars","words","lines"],D=0;for(let $ of G)if($==="chars")D|=I;else if($==="words")D|=x;else if($==="lines")D|=K;this._k=D,this._j=F.tag??"span";let Z=0;if(F.mask===!0)Z=D;else if(Array.isArray(F.mask)){for(let $ of F.mask)if($==="chars")Z|=I;else if($==="words")Z|=x;else if($==="lines")Z|=K}if(this._g=Z,this._d=F.style,this._e=F.class,this._w(),(F.resize??!0)&&D&K)this._x()}_p(z,F){let J=document.createElement(this._j);if(z)J.dataset[z]="";if(J.style.display=_,F!==void 0)J.textContent=F;return J}_s(z,F){let J=document.createElement(this._j);if(J.dataset[F]="",J.style.overflow="hidden",J.style.display=z,this._d?.mask)Object.assign(J.style,this._d.mask);if(this._e?.mask)J.classList.add(this._e.mask);return J}_r(z,F,J,q,U){if(this._g&F){let G=this._s(J,q);return G.appendChild(z),U.push(G),G}return z}_m(z,F,J,q){if(J){let{outer:U,inner:G}=J();if(G.appendChild(F),q)this._o.set(q,U);z.appendChild(U)}else z.appendChild(F)}_q(z,F,J){if(z.style.textDecoration=F,J)z.style.textDecorationColor=J}_w(){this._l=!0;let z=this._b,F=C(z),J=F?parseFloat(F.letterSpacing)||0:0;if(this._c=F?F.textIndent:"",this._c&&this._c!==u)z.style.textIndent="0";let q=this._k,U=!!(q&I),G=!!(q&x),D=!!(q&K),Z=G||D,$=!!(this._g&I),Q=new Map,H=(M)=>{for(let N of Array.from(M.childNodes))if(N.nodeType===1){let O=N.tagName.toLowerCase();if(p[O]){let v=C(N)?.textDecorationColor;if(v)Q.set(N,v)}H(N)}};H(z);let Y=Array.from(z.childNodes),T=document.createDocumentFragment();z.replaceChildren();let k=(M,N,O,v)=>{if(M.nodeType===3){let X=(M.textContent??"").split(l);for(let j of X){if(!j)continue;if(o.test(j)){T.appendChild(document.createTextNode(j));continue}let V=Z?this._p(G?"word":""):null;if(V){if(V.style.whiteSpace=h,O&&!U)this._q(V,O,v)}if(U){let b=[...j],d=this.chars.length;for(let P=0;P<b.length;P++){let R=this._p("char",b[P]);if(J&&P<b.length-1)R.style.marginRight=`${J}px`;if(O)this._q(R,O,v);if(this.chars.push(R),this._d?.chars)Object.assign(R.style,this._d.chars);if(this._e?.chars)R.classList.add(this._e.chars);let y=$?this._r(R,I,_,m,this.masks.chars):R;if(V)V.appendChild(y)}if(!V){let P=N?N():null,R=P?P.inner:T;for(let y=d;y<this.chars.length;y++){let S=this.chars[y];R.appendChild($&&S.parentElement?.dataset?.[m]!==void 0?S.parentElement:S)}if(P)T.appendChild(P.outer)}}else if(V){if(V.textContent=j,J)V.style.letterSpacing=`${J}px`}if(V){if(G){if(this.words.push(V),this._d?.words)Object.assign(V.style,this._d.words);if(this._e?.words)V.classList.add(this._e.words)}this._f.push(V);let b=this._g&x?this._r(V,x,_,g,this.masks.words):V;this._m(T,b,N,V)}else if(!U)this._m(T,document.createTextNode(j),N)}return}if(M.nodeType!==1)return;let B=M,A=B.tagName.toLowerCase();if(t.includes(","+A+",")){let X=B.cloneNode(!0);if(O)this._q(X,O,v);let j=C(B)?.verticalAlign;if(j&&j!==f)X.style.verticalAlign=j;if(Z){let V=this._p(G?"word":"");if(V.style.whiteSpace=h,j&&j!==f)V.style.verticalAlign=j;if(V.appendChild(X),G){if(this.words.push(V),this._d?.words)Object.assign(V.style,this._d.words);if(this._e?.words)V.classList.add(this._e.words)}this._f.push(V);let b=this._g&x?this._r(V,x,_,g,this.masks.words):V;this._m(T,b,N,V)}else this._m(T,X,N);return}let r=()=>{let X=B.cloneNode(!1);if(N){let{outer:j,inner:V}=N();return V.appendChild(X),{outer:j,inner:X}}return{outer:X,inner:X}},L=p[A],i=L?O?`${O} ${L}`:L:O,s=L?Q.get(B)||v:v;for(let X of Array.from(B.childNodes))k(X,r,i,s)};for(let M of Y)k(M,null,"","");z.appendChild(T);let W=!!(this._c&&this._c!==u);if(D)this._y(W);else if(W){let M=G?this.words[0]:U?this.chars[0]:null;if(M)M.style.marginLeft=this._c,z.style.textIndent="0"}this._l=!1}_y(z){if(z&&this._f[0])this._f[0].style.marginLeft=this._c;this._t();let F=[];if(typeof document.fonts?.status==="string"&&document.fonts.status!=="loaded")F.push(document.fonts.ready);let J=this._b.querySelectorAll("img");for(let q=0;q<J.length;q++){let U=J[q];if(!U.complete)F.push(new Promise((G)=>{U.addEventListener("load",G,{once:!0}),U.addEventListener("error",G,{once:!0})}))}if(F.length){let q=this._b.offsetHeight;Promise.all(F).then(()=>{if(this._b.offsetHeight!==q)this.reflow()})}}_u(z){return this._o.get(z)??z}_t(){let z=this._f;if(!z.length)return;let F=z[0].offsetTop,J=F+z[0].offsetHeight,q=[],U=[];for(let $ of z){let Q=$.offsetTop,H=Q+$.offsetHeight;if(Q<J&&H>F)F=Math.min(F,Q),J=Math.max(J,H);else U.push(q),q=[],F=Q,J=H;q.push($)}if(q.length)U.push(q);let G=!!(this._c&&this._c!==u);if(G&&z[0])z[0].style.marginLeft="";let D=!!(this._g&K),Z=document.createDocumentFragment();for(let $=0;$<U.length;$++){let Q=U[$],H=document.createElement(this._j);if(H.dataset.line="",H.style.display=E,$===0&&G)H.style.paddingLeft=this._c;for(let Y=0;Y<Q.length;Y++){if(Y>0)H.appendChild(document.createTextNode(" "));H.appendChild(this._u(Q[Y]))}if(this.lines.push(H),this._d?.lines)Object.assign(H.style,this._d.lines);if(this._e?.lines)H.classList.add(this._e.lines);if(D){let Y=this._s(E,n);Y.appendChild(H),this.masks.lines.push(Y),Z.appendChild(Y)}else Z.appendChild(H)}this._b.replaceChildren(Z)}_x(){let z=this._b.offsetParent?this._b.offsetParent.offsetWidth:window.innerWidth,F=()=>{if(this._l)return;let q=this._b.offsetParent,U=q?q.offsetWidth:window.innerWidth;if(U===z)return;if(z=U,this._h)cancelAnimationFrame(this._h);this._h=requestAnimationFrame(()=>this.reflow())};this._i=new ResizeObserver(F);let J=this._b.offsetParent??this._b.parentElement;if(J)this._i.observe(J);else this._i.observe(this._b)}reflow(){if(this._a){this._a.forEach((F)=>F.reflow()),this._v();return}if(!(this._k&K)||this._l)return;let z=document.createDocumentFragment();for(let F=0;F<this._f.length;F++){if(F>0)z.appendChild(document.createTextNode(" "));z.appendChild(this._u(this._f[F]))}if(this._b.replaceChildren(z),this.lines.length=0,this.masks.lines.length=0,this._c&&this._c!==u&&this._f[0])this._f[0].style.marginLeft=this._c;this._t()}revert(){if(this._a){this._a.forEach((z)=>z.revert()),this._v();return}this.destroy(),this._b.innerHTML=this._n,this.chars.length=0,this.words.length=0,this._f.length=0,this._o.clear(),this.lines.length=0,this.masks.chars.length=0,this.masks.words.length=0,this.masks.lines.length=0}destroy(){if(this._a){this._a.forEach((z)=>z.destroy());return}if(this._h)cancelAnimationFrame(this._h),this._h=0;if(this._i)this._i.disconnect(),this._i=null}_v(){if(!this._a)return;this.chars.length=0,this.words.length=0,this.lines.length=0,this.masks.chars.length=0,this.masks.words.length=0,this.masks.lines.length=0;for(let z of this._a)this.chars.push(...z.chars),this.words.push(...z.words),this.lines.push(...z.lines),this.masks.chars.push(...z.masks.chars),this.masks.words.push(...z.masks.words),this.masks.lines.push(...z.masks.lines)}}
2
- export{a};
@@ -1,2 +0,0 @@
1
- import{d as N,e as P}from"./chunk-0t3a7kj5.js";import{g as Z,h as Q}from"./chunk-qjsknche.js";function O(j,z,B){return Math.min(Math.max(j,z),B)}function $(j,z,B){return j+(z-j)*B}function X(j,z,B){let G=z-j;return G===0?0:O((B-j)/G,0,1)}function Y(j,z,B,G){let H=1-Math.exp(-B*G);return $(j,z,H)}var J=0.09;class y{_d;_f;_c;_x;_e;_y;_o=!1;_q=!1;_m=new Map;_a=0;_b=0;_k=0;_l=1;_p=!1;_L={current:0,target:0,velocity:0,direction:1,max:0,scrolling:!1};_g=!1;_w=0;_r=0;_E=0;_h=0;_s=null;_i=J;_j=null;_z;_A;_B;_t;constructor(j={}){let z=j.wrapper??window;this._d=typeof z==="string"?P(z)??window:z,this._f=this._d===window,this._c=(j.direction??"vertical")==="vertical",this._x=j.duration??0,this._e=j.ease??J,this._y=j.prevent??!this._f,this._z=this._H.bind(this),this._A=this._I.bind(this),this._B=this._J.bind(this),this._t=()=>this._K();let B=this._f?this._c?window.scrollY:window.scrollX:this._c?this._d.scrollTop:this._d.scrollLeft;this._a=B,this._b=B,this.start()}get scroll(){let j=this._L;return j.current=this._a,j.target=this._b,j.velocity=this._k,j.direction=this._l,j.max=this._u(),j.scrolling=this._p,j}_u(){if(this._f)return this._c?document.documentElement.scrollHeight-window.innerHeight:document.documentElement.scrollWidth-window.innerWidth;let j=this._d;return this._c?j.scrollHeight-j.clientHeight:j.scrollWidth-j.clientWidth}_v(j){return O(j,0,this._u())}on(j,z){let B=this._m.get(j);if(!B)B=new Set,this._m.set(j,B);B.add(z)}off(j,z){this._m.get(j)?.delete(z)}_D(j){let z=this._m.get(j);if(!z)return;let B=this.scroll;for(let G of z)G(B)}_n(){if(this._q)return;this._q=!0,Q.add(this._t)}_G(){if(!this._q)return;this._q=!1,Q.remove(this._t)}to(j,z={}){let B;if(typeof j==="number")B=j;else{let K=typeof j==="string"?P(j):j;if(!K)return;let M=K.getBoundingClientRect();if(this._f)B=(this._c?M.top:M.left)+this._a;else{let V=this._d.getBoundingClientRect();B=(this._c?M.top-V.top:M.left-V.left)+this._a}}if(B+=z.offset??0,B=this._v(B),z.immediate){this._a=B,this._b=B,this._g=!0,this._C(),this._D("scroll"),this._g=!1,z.onComplete?.();return}this._g=!0,this._n();let G=z.ease??this._e,H=z.duration??this._x;if(typeof G==="number")this._h=0,this._b=B,this._i=G,this._j=z.onComplete??null;else if(H>0)this._w=this._a,this._r=B,this._E=performance.now(),this._h=H,this._i=G,this._s=z.onComplete??null,this._j=null;else this._h=0,this._b=B,this._i=typeof this._e==="number"?this._e:J,this._j=z.onComplete??null}_F(j){let z=this._f?window:this._d;N(z,j,"wheel",this._z),N(z,j,"scroll",this._A,{passive:!0}),N(window,j,"keydown",this._B)}start(){if(this._o)return;this._o=!0,this._F("a")}stop(){if(!this._o)return;this._o=!1,this._F("r"),this._G()}destroy(){this.stop(),this._m.clear()}_H(j){if(j.preventDefault(),this._y)j.stopPropagation();let z=this._c?j.deltaY:j.deltaX;if(j.deltaMode===1)z*=0.833333;else if(j.deltaMode===2)z*=0.555556;this._b=this._v(this._b+z),this._h=0,this._i=typeof this._e==="number"?this._e:J,this._g=!0,this._n(),this._l=z>0?1:-1}_I(){if(this._g)return;let j=this._f?this._c?window.scrollY:window.scrollX:this._c?this._d.scrollTop:this._d.scrollLeft;this._a=j,this._b=j}_J(j){if(!this._f){let G=document.activeElement;if(G!==this._d&&!this._d.contains(G))return}let z=0,B=this._c?this._f?window.innerHeight:this._d.clientHeight:this._f?window.innerWidth:this._d.clientWidth;switch(j.key){case"ArrowDown":z=100;break;case"ArrowUp":z=-100;break;case"ArrowRight":if(!this._c)z=100;break;case"ArrowLeft":if(!this._c)z=-100;break;case" ":z=j.shiftKey?-B:B;break;case"PageDown":z=B;break;case"PageUp":z=-B;break;case"Home":this._b=0,this._h=0,this._i=typeof this._e==="number"?this._e:J,this._g=!0,this._n();return;case"End":this._b=this._u(),this._h=0,this._i=typeof this._e==="number"?this._e:J,this._g=!0,this._n();return;default:return}if(z)j.preventDefault(),this._b=this._v(this._b+z),this._h=0,this._i=typeof this._e==="number"?this._e:J,this._g=!0,this._n(),this._l=z>0?1:-1}_C(){if(this._f)if(this._c)window.scrollTo(0,this._a);else window.scrollTo(this._a,0);else{let j=this._d;if(this._c)j.scrollTop=this._a;else j.scrollLeft=this._a}}_K(){if(!this._o)return;let j=this._a,z=!1;if(this._g){if(this._h>0){let G=performance.now()-this._E,H=X(0,this._h,G),K=this._i(H);if(this._a=this._w+(this._r-this._w)*K,this._b=this._r,H>=1)this._a=this._r,this._h=0,z=!0}else{let G=this._i;if(this._a=Y(this._a,this._b,G,Z()),Math.abs(this._b-this._a)<0.5)this._a=this._b,z=!0}this._C()}this._k=this._a-j;let B=this._p;if(this._p=Math.abs(this._k)>0.01,this._k>0)this._l=1;else if(this._k<0)this._l=-1;if(this._p||B)this._D("scroll");if(z){if(this._g=!1,this._G(),this._s){let G=this._s;this._s=null,G()}if(this._j){let G=this._j;this._j=null,G()}}}}
2
- export{y as b};