vscroll
Version:
Virtual scroll engine
5 lines (4 loc) • 83.9 kB
JavaScript
/**
* vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll | 2025-04-20T17:47:11.410Z | MIT license
*/
class e{constructor(e,t){this.id=0,void 0!==e&&(this.value=e,this.initialValue=e),this.options=t||{},this.subscriptions=new Map}set(e){if(this.value!==e||this.options.emitEqual){this.value=e;for(const[,t]of this.subscriptions)if(t.emit(e),this.value!==e)break}}get(){return this.value}on(e){const t=this.id++,s={emit:e,off:()=>{s.emit=()=>null,this.subscriptions.delete(t)}};return this.subscriptions.set(t,s),this.options.emitOnSubscribe&&s.emit(this.value),()=>s.off()}once(e){const t=this.on((s=>{t(),e(s)}));return t}reset(){this.set(this.initialValue)}dispose(){this.subscriptions.forEach((e=>e.off()))}}var t,s;!function(e){e.id="id",e.mock="mock",e.augmented="augmented",e.version="version",e.init="init",e.init$="init$",e.packageInfo="packageInfo",e.itemsCount="itemsCount",e.bufferInfo="bufferInfo",e.isLoading="isLoading",e.isLoading$="isLoading$",e.loopPending="loopPending",e.loopPending$="loopPending$",e.firstVisible="firstVisible",e.firstVisible$="firstVisible$",e.lastVisible="lastVisible",e.lastVisible$="lastVisible$",e.bof="bof",e.bof$="bof$",e.eof="eof",e.eof$="eof$",e.paused="paused",e.paused$="paused$",e.reset="reset",e.reload="reload",e.append="append",e.prepend="prepend",e.check="check",e.remove="remove",e.clip="clip",e.insert="insert",e.replace="replace",e.update="update",e.pause="pause",e.resume="resume",e.fix="fix",e.relax="relax",e.showLog="showLog"}(t||(t={})),function(e){e[e.Scalar=0]="Scalar",e[e.Reactive=1]="Reactive",e[e.WorkflowRunner=2]="WorkflowRunner",e[e.Function=3]="Function"}(s||(s={}));const i=t,r=s,n=()=>null,o={immediate:!0,success:!0,details:"Adapter is not initialized"},a={immediate:!0,success:!0,details:"Scroller is paused"},l=()=>Promise.resolve(o),c={core:{name:"",version:""},consumer:{name:"",version:""}},d={firstIndex:NaN,lastIndex:NaN,minIndex:NaN,maxIndex:NaN,absMinIndex:-1/0,absMaxIndex:1/0,defaultSize:NaN},h={data:{},element:{}},u=()=>[{type:r.Scalar,name:i.id,value:0,permanent:!0},{type:r.Scalar,name:i.mock,value:!0,permanent:!0},{type:r.Scalar,name:i.augmented,value:!1,permanent:!0},{type:r.Scalar,name:i.version,value:"",permanent:!0},{type:r.Scalar,name:i.init,value:!1,reactive:i.init$},{type:r.Scalar,name:i.packageInfo,value:c,onDemand:!0},{type:r.Scalar,name:i.itemsCount,value:0,onDemand:!0},{type:r.Scalar,name:i.bufferInfo,value:d,onDemand:!0},{type:r.Scalar,name:i.isLoading,value:!1,reactive:i.isLoading$},{type:r.Scalar,name:i.loopPending,value:!1,reactive:i.loopPending$},{type:r.Scalar,name:i.firstVisible,value:h,reactive:i.firstVisible$,wanted:!0},{type:r.Scalar,name:i.lastVisible,value:h,reactive:i.lastVisible$,wanted:!0},{type:r.Scalar,name:i.bof,value:!1,reactive:i.bof$},{type:r.Scalar,name:i.eof,value:!1,reactive:i.eof$},{type:r.Scalar,name:i.paused,value:!1,reactive:i.paused$},{type:r.WorkflowRunner,name:i.reset,value:l,allowedWhenPaused:!0},{type:r.WorkflowRunner,name:i.reload,value:l},{type:r.WorkflowRunner,name:i.append,value:l},{type:r.WorkflowRunner,name:i.prepend,value:l},{type:r.WorkflowRunner,name:i.check,value:l},{type:r.WorkflowRunner,name:i.remove,value:l},{type:r.WorkflowRunner,name:i.clip,value:l},{type:r.WorkflowRunner,name:i.insert,value:l},{type:r.WorkflowRunner,name:i.replace,value:l},{type:r.WorkflowRunner,name:i.update,value:l},{type:r.WorkflowRunner,name:i.pause,value:l},{type:r.WorkflowRunner,name:i.resume,value:l,allowedWhenPaused:!0},{type:r.WorkflowRunner,name:i.fix,value:l},{type:r.Function,name:i.relax,value:n},{type:r.Function,name:i.showLog,value:n},{type:r.Reactive,name:i.init$,value:new e},{type:r.Reactive,name:i.isLoading$,value:new e},{type:r.Reactive,name:i.loopPending$,value:new e},{type:r.Reactive,name:i.firstVisible$,value:new e(h,{emitOnSubscribe:!0}),wanted:!0},{type:r.Reactive,name:i.lastVisible$,value:new e(h,{emitOnSubscribe:!0}),wanted:!0},{type:r.Reactive,name:i.bof$,value:new e},{type:r.Reactive,name:i.eof$,value:new e},{type:r.Reactive,name:i.paused$,value:new e}],f=new Map;var p={name:"vscroll",version:"1.6.3"};const g=e=>{var t;return null===(t=b.get(e||-1))||void 0===t?void 0:t.box},m=({name:e,wanted:s},i)=>{const r=b.get(i||-1);if(s&&r&&!r.box[e]&&!r.block){const{firstVisible:s,firstVisible$:i}=t,{lastVisible:n,lastVisible$:o}=t;return r.box[s]=r.box[i]=[s,i].some((t=>t===e))||r.box[s],r.box[n]=r.box[o]=[n,o].some((t=>t===e))||r.box[n],!0}return!1},x=(e,t)=>{const s=b.get(t||-1);s&&(s.block=e)},b=new Map;let w=0;class I{constructor(e){const{mock:i,reactive:r}=e,n=++w,o={configurable:!0},a={};b.set(n,{box:{},block:!1}),Object.defineProperty(this,t.id,Object.assign({get:()=>n},o)),Object.defineProperty(this,t.mock,Object.assign({get:()=>i},o)),Object.defineProperty(this,t.augmented,Object.assign({get:()=>!1},o)),Object.defineProperty(this,t.version,Object.assign({get:()=>p.version},o)),u().filter((({permanent:e})=>!e)).forEach((e=>{let{value:t}=e;if(r&&e.type===s.Reactive){const s=r[e.name];s&&(a[e.name]=Object.assign(Object.assign({},s),{default:t}),t=s.source)}Object.defineProperty(this,e.name,Object.assign({get:()=>(m(e,n),t)},o))})),r&&f.set(n,a)}}class v{constructor(e,t){this.get=e.get,this.settings=e.settings,this.devSettings=e.devSettings;const s=new I(t||{mock:!1});this.adapter=s}dispose(){f.delete(this.adapter.id),b.delete(this.adapter.id)}}const y=e=>class extends v{constructor(t){super(t,"function"==typeof e?e():void 0)}},S=y();var z,k,$;!function(e){e.forward="forward",e.backward="backward"}(z||(z={})),function(e){e.Average="average",e.Constant="constant",e.Frequent="frequent"}(k||(k={})),function(e){e.number="must be a number",e.integer="must be an integer",e.integerUnlimited="must be an integer or infinity",e.moreOrEqual="must be a number greater than (or equal to) {arg1}",e.itemList="must be an array of items {arg1}",e.boolean="must be a boolean",e.object="must be an object",e.element="must be an html element",e.function="must be a function",e.funcOfxArguments="must have {arg1} argument(s)",e.funcOfxAndMoreArguments="must have at least {arg1} argument(s)",e.funcOfXToYArguments="must have {arg1} to {arg2} arguments",e.oneOfCan="can be present as only one item of {arg1} list",e.oneOfMust="must be present as only one item of {arg1} list",e.or="must satisfy at least 1 validator from {arg1} list",e.enum="must belong to {arg1} list"}($||($={}));const E=(e,t)=>(t||[""]).reduce(((e,t,s)=>e.replace(`{arg${s+1}}`,t)),e),V=e=>"number"==typeof e||"string"==typeof e&&""!==e?Number(e):NaN,M=e=>{const t=V(e),s=[];return Number.isNaN(t)&&s.push($.number),{value:t,isSet:!0,isValid:!s.length,errors:s}},N=(e,t)=>s=>{const i=M(s);if(!i.isValid)return i;let r=i.value;const n=[];return r<e&&(t?r=e:n.push(E($.moreOrEqual,[String(e)]))),{value:r,isSet:!0,isValid:!n.length,errors:n}},O=e=>{const t=[];return"function"!=typeof e&&t.push($.function),{value:e,isSet:!0,isValid:!t.length,errors:t}},R=(e,t)=>s=>{const i=O(s);if(!i.isValid)return i;const r=[];return((s=i.value).length<e||s.length>t)&&r.push(E($.funcOfXToYArguments,[String(e),String(t)])),{value:s,isSet:!0,isValid:!r.length,errors:r}},P=(e,t)=>(s,i)=>{const r=[],n=void 0!==s;let o=!n;const a=t?$.oneOfMust:$.oneOfCan;if(Array.isArray(e)&&e.length){for(let t=e.length-1;t>=0;t--){const s=e[t];if("string"!=typeof s){r.push(E(a,[e.join('", "')])+" (non-string token)");break}const l=i&&Object.prototype.hasOwnProperty.call(i,s);if(n&&l){r.push(E(a,[e.join('", "')])+` (${s} is present)`);break}o&&l&&(o=!1)}t&&o&&r.push(E(a,[e.join('", "')]))}else r.push(E(a,["undefined"]));return{value:s,isSet:n,isValid:!r.length,errors:r}},A=e=>t=>{const s=[],i=Object.keys(e).filter((e=>isNaN(Number(e)))).map((t=>e[t]));return i.some((e=>e===t))||s.push(E($.enum,["["+i.join(",")+"]"])),{value:t,isSet:!0,isValid:!s.length,errors:s}},C={NUMBER:{type:$.number,method:M},INTEGER:{type:$.integer,method:e=>{const t=[];e=V(e);const s=parseInt(String(e),10);return e!==s&&t.push($.integer),{value:s,isSet:!0,isValid:!t.length,errors:t}}},INTEGER_UNLIMITED:{type:$.integerUnlimited,method:e=>{let t=e;const s=[];return e=V(e),t=Number.isFinite(e)?parseInt(String(e),10):e,e!==t&&s.push($.integerUnlimited),{value:t,isSet:!0,isValid:!s.length,errors:s}}},MORE_OR_EQUAL:(e,t)=>({type:$.moreOrEqual,method:N(e,t)}),BOOLEAN:{type:$.boolean,method:e=>{const t=[];let s=e;return"true"===e?s=!0:"false"===e&&(s=!1),"boolean"!=typeof s&&t.push($.boolean),{value:s,isSet:!0,isValid:!t.length,errors:t}}},OBJECT:{type:$.object,method:e=>{const t=[];return e&&"[object Object]"===Object.prototype.toString.call(e)||t.push($.object),{value:e,isSet:!0,isValid:!t.length,errors:t}}},ITEM_LIST:{type:$.itemList,method:e=>{let t=e;const s=[];if(Array.isArray(e))if(e.length){if(e.length>1){const t=typeof e[0];for(let i=e.length-1;i>=0;i--)if(typeof e[i]!==t){s.push(E($.itemList,["of items of the same type"]));break}}}else s.push(E($.itemList,["with at least 1 item"]));else s.push($.itemList),t=[];return{value:t,isSet:!0,isValid:!s.length,errors:s}}},ELEMENT:{type:$.element,method:e=>{const t=[];return e instanceof Element||e instanceof Document||t.push($.element),{value:e,isSet:!0,isValid:!t.length,errors:t}}},FUNC:{type:$.function,method:O},FUNC_WITH_X_ARGUMENTS:e=>{return{type:$.funcOfxArguments,method:(t=e,e=>{const s=O(e);if(!s.isValid)return s;const i=[];return(e=s.value).length!==t&&i.push(E($.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_AND_MORE_ARGUMENTS:e=>{return{type:$.funcOfxAndMoreArguments,method:(t=e,e=>{const s=O(e);if(!s.isValid)return s;const i=[];return(e=s.value).length<t&&i.push(E($.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_TO_Y_ARGUMENTS:(e,t)=>({type:$.funcOfXToYArguments,method:R(e,t)}),ONE_OF_CAN:e=>({type:$.oneOfCan,method:P(e,!1)}),ONE_OF_MUST:e=>({type:$.oneOfMust,method:P(e,!0)}),OR:e=>{return{type:$.or,method:(t=e,e=>{const s=[];return t.every((t=>!t.method(e).isValid))&&s.push(t.map((e=>e.type)).join(" OR ")),{value:e,isSet:!0,isValid:!s.length,errors:s}})};var t},ENUM:e=>({type:$.enum,method:A(e)})};class F{constructor(e){this.params={},this.contextErrors=[],this.errors=[],this.isValid=!0,this.setContext(e)}setContext(e){e&&"[object Object]"===Object.prototype.toString.call(e)?this.isValidContext=!0:(this.setCommonError("context is not an object"),this.isValidContext=!1),this.context=e}setValidity(){this.errors=Object.keys(this.params).reduce(((e,t)=>[...e,...this.params[t].errors]),[]),this.isValid=!this.errors.length}setCommonError(e){this.contextErrors.push(e),this.errors.push(e),this.isValid=!1}setParam(e,t){t.isValid||(t.errors=t.isSet?t.errors.map((t=>`"${e}" ${t}`)):[`"${e}" must be set`]),this.params[e]=t,this.setValidity()}showErrors(){return this.errors.length?"validation failed: "+this.errors.join(", "):""}}const T=(e,t,s)=>{const{value:i,errors:r}=e,n=t.method(i,s),o=[...r,...n.errors];return{value:n.value,isSet:n.isSet,isValid:!o.length,errors:o}},B=(e,t)=>{const s=void 0===e,i=!t.mandatory&&void 0!==t.defaultValue;return{value:s?i?t.defaultValue:void 0:e,isSet:!s||i,isValid:!s||!t.mandatory,errors:[]}},L=(e,t,s)=>{const i=B(e[t],s);if(i.isSet)for(const t of Object.values(s.validators)){const r=T(i,t,e);if(!r.isValid&&void 0!==s.defaultValue)return{value:s.defaultValue,isSet:!0,isValid:!0,errors:[]};Object.assign(i,r)}else{const t=s.validators.find((e=>e.type===$.oneOfMust));if(t)return T(i,t,e)}return i},j=(e,t)=>{const s=new F(e);return Object.entries(t).forEach((([e,t])=>s.setParam(e,s.isValidContext?L(s.context,e,t):B(void 0,t)))),s},{OBJECT:D,FUNC_WITH_X_AND_MORE_ARGUMENTS:_}=C;var W;!function(e){e.get="get",e.settings="settings",e.devSettings="devSettings"}(W||(W={}));const U={[W.get]:{validators:[_(2)],mandatory:!0},[W.settings]:{validators:[D]},[W.devSettings]:{validators:[D]}},{NUMBER:q,INTEGER:G,INTEGER_UNLIMITED:H,MORE_OR_EQUAL:X,BOOLEAN:Y,ELEMENT:J,FUNC:Q,OR:Z,ENUM:K}=C;var ee,te;!function(e){e.adapter="adapter",e.startIndex="startIndex",e.minIndex="minIndex",e.maxIndex="maxIndex",e.itemSize="itemSize",e.bufferSize="bufferSize",e.padding="padding",e.infinite="infinite",e.horizontal="horizontal",e.windowViewport="windowViewport",e.viewportElement="viewportElement",e.inverse="inverse",e.onBeforeClip="onBeforeClip",e.sizeStrategy="sizeStrategy"}(ee||(ee={})),function(e){e.debug="debug",e.immediateLog="immediateLog",e.logProcessRun="logProcessRun",e.logTime="logTime",e.throttle="throttle",e.initDelay="initDelay",e.initWindowDelay="initWindowDelay",e.cacheData="cacheData",e.cacheOnReload="cacheOnReload",e.dismissOverflowAnchor="dismissOverflowAnchor",e.directionPriority="directionPriority"}(te||(te={}));const se={[ee.itemSize]:1,[ee.bufferSize]:1,[ee.padding]:.01,[te.throttle]:0,[te.initDelay]:0,[te.initWindowDelay]:0},ie={[ee.adapter]:{validators:[Y],defaultValue:!1},[ee.startIndex]:{validators:[G],defaultValue:1},[ee.minIndex]:{validators:[H],defaultValue:-1/0},[ee.maxIndex]:{validators:[H],defaultValue:1/0},[ee.itemSize]:{validators:[G,X(se[ee.itemSize],!0)],defaultValue:NaN},[ee.bufferSize]:{validators:[G,X(se[ee.bufferSize],!0)],defaultValue:5},[ee.padding]:{validators:[q,X(se[ee.padding],!0)],defaultValue:.5},[ee.infinite]:{validators:[Y],defaultValue:!1},[ee.horizontal]:{validators:[Y],defaultValue:!1},[ee.windowViewport]:{validators:[Y],defaultValue:!1},[ee.viewportElement]:{validators:[Z([J,Q])],defaultValue:null},[ee.inverse]:{validators:[Y],defaultValue:!1},[ee.onBeforeClip]:{validators:[Q],defaultValue:null},[ee.sizeStrategy]:{validators:[K(k)],defaultValue:k.Average}},re={[te.debug]:{validators:[Y],defaultValue:!1},[te.immediateLog]:{validators:[Y],defaultValue:!0},[te.logProcessRun]:{validators:[Y],defaultValue:!1},[te.logTime]:{validators:[Y],defaultValue:!1},[te.throttle]:{validators:[G,X(se[te.throttle],!0)],defaultValue:40},[te.initDelay]:{validators:[G,X(se[te.initDelay],!0)],defaultValue:1},[te.initWindowDelay]:{validators:[G,X(se[te.initWindowDelay],!0)],defaultValue:40},[te.cacheData]:{validators:[Y],defaultValue:!1},[te.cacheOnReload]:{validators:[Y],defaultValue:!1},[te.dismissOverflowAnchor]:{validators:[Y],defaultValue:!0},[te.directionPriority]:{validators:[K(z)],defaultValue:z.backward}};var ne,oe,ae;!function(e){e.init="init",e.scroll="scroll",e.start="start",e.preFetch="preFetch",e.fetch="fetch",e.postFetch="postFetch",e.render="render",e.preClip="preClip",e.clip="clip",e.adjust="adjust",e.end="end"}(ne||(ne={})),function(e){e.reset="adapter.reset",e.reload="adapter.reload",e.append="adapter.append",e.prepend="adapter.prepend",e.check="adapter.check",e.remove="adapter.remove",e.replace="adapter.replace",e.update="adapter.update",e.clip="adapter.clip",e.insert="adapter.insert",e.pause="adapter.pause",e.fix="adapter.fix"}(oe||(oe={})),function(e){e.start="start",e.next="next",e.done="done",e.error="error"}(ae||(ae={}));const{INTEGER:le,INTEGER_UNLIMITED:ce,BOOLEAN:de,OBJECT:he,ITEM_LIST:ue,FUNC_WITH_X_ARGUMENTS:fe,FUNC_WITH_X_AND_MORE_ARGUMENTS:pe,FUNC_WITH_X_TO_Y_ARGUMENTS:ge,ONE_OF_MUST:me,ONE_OF_CAN:xe,OR:be}=C;var we;we||(we={});const Ie={},ve={[W.get]:{validators:[pe(2)]},[W.settings]:{validators:[he]},[W.devSettings]:{validators:[he]}};var ye;!function(e){e.reloadIndex="reloadIndex"}(ye||(ye={}));const Se={[ye.reloadIndex]:{validators:[le]}};var ze;!function(e){e.items="items",e.bof="bof",e.increase="increase",e.virtualize="virtualize"}(ze||(ze={}));const ke={[ze.items]:{validators:[ue],mandatory:!0},[ze.bof]:{validators:[de,xe([ze.virtualize])],defaultValue:!1},[ze.increase]:{validators:[de],defaultValue:!1},[ze.virtualize]:{validators:[de,xe([ze.bof])],defaultValue:!1}};var $e;!function(e){e.items="items",e.eof="eof",e.decrease="decrease",e.virtualize="virtualize"}($e||($e={}));const Ee={[$e.items]:{validators:[ue],mandatory:!0},[$e.eof]:{validators:[de,xe([$e.virtualize])],defaultValue:!1},[$e.decrease]:{validators:[de],defaultValue:!1},[ze.virtualize]:{validators:[de,xe([$e.eof])],defaultValue:!1}};var Ve;!function(e){e.predicate="predicate",e.indexes="indexes",e.increase="increase"}(Ve||(Ve={}));const Me={[Ve.predicate]:{validators:[fe(1),me([Ve.indexes])]},[Ve.indexes]:{validators:[ue,me([Ve.predicate])]},[Ve.increase]:{validators:[de],defaultValue:!1}};var Ne;!function(e){e.backwardOnly="backwardOnly",e.forwardOnly="forwardOnly"}(Ne||(Ne={}));const Oe={[Ne.backwardOnly]:{validators:[de,xe([Ne.forwardOnly])],defaultValue:!1},[Ne.forwardOnly]:{validators:[de,xe([Ne.backwardOnly])],defaultValue:!1}};var Re;!function(e){e.items="items",e.before="before",e.after="after",e.beforeIndex="beforeIndex",e.afterIndex="afterIndex",e.decrease="decrease"}(Re||(Re={}));const Pe={[Re.items]:{validators:[ue],mandatory:!0},[Re.before]:{validators:[fe(1),me([Re.after,Re.beforeIndex,Re.afterIndex])]},[Re.after]:{validators:[fe(1),me([Re.before,Re.beforeIndex,Re.afterIndex])]},[Re.beforeIndex]:{validators:[le,me([Re.before,Re.after,Re.afterIndex])]},[Re.afterIndex]:{validators:[le,me([Re.before,Re.after,Re.beforeIndex])]},[Re.decrease]:{validators:[de],defaultValue:!1}};var Ae;!function(e){e.items="items",e.predicate="predicate",e.fixRight="fixRight"}(Ae||(Ae={}));const Ce={[Re.items]:{validators:[ue],mandatory:!0},[Ae.predicate]:{validators:[fe(1)],mandatory:!0},[Ae.fixRight]:{validators:[de],defaultValue:!1}};var Fe;!function(e){e.predicate="predicate",e.fixRight="fixRight"}(Fe||(Fe={}));const Te={[Fe.predicate]:{validators:[fe(1)],mandatory:!0},[Fe.fixRight]:{validators:[de],defaultValue:!1}};var Be;!function(e){e.scrollPosition="scrollPosition",e.minIndex="minIndex",e.maxIndex="maxIndex",e.updater="updater",e.scrollToItem="scrollToItem",e.scrollToItemOpt="scrollToItemOpt"}(Be||(Be={}));const Le={[Be.scrollPosition]:{validators:[ce]},[Be.minIndex]:{validators:[ce]},[Be.maxIndex]:{validators:[ce]},[Be.updater]:{validators:[ge(1,2)]},[Be.scrollToItem]:{validators:[fe(1)]},[Be.scrollToItemOpt]:{validators:[be([de,he])]}},je={[oe.reset]:W,[oe.reload]:ye,[oe.prepend]:ze,[oe.append]:$e,[oe.check]:we,[oe.remove]:Ve,[oe.clip]:Ne,[oe.insert]:Re,[oe.replace]:Ae,[oe.update]:Fe,[oe.pause]:we,[oe.fix]:Be},De={[oe.reset]:ve,[oe.reload]:Se,[oe.prepend]:ke,[oe.append]:Ee,[oe.check]:Ie,[oe.remove]:Me,[oe.clip]:Oe,[oe.insert]:Pe,[oe.replace]:Ce,[oe.update]:Te,[oe.pause]:Ie,[oe.fix]:Le},{ELEMENT:_e,OBJECT:We,FUNC:Ue,FUNC_WITH_X_ARGUMENTS:qe}=C;var Ge;!function(e){e.consumer="consumer",e.element="element",e.datasource="datasource",e.run="run",e.Routines="Routines"}(Ge||(Ge={}));const He={[Ge.consumer]:{validators:[We]},[Ge.element]:{validators:[_e],mandatory:!0},[Ge.datasource]:{validators:[We],mandatory:!0},[Ge.run]:{validators:[qe(1)],mandatory:!0},[Ge.Routines]:{validators:[Ue]}};class Xe{constructor(e,t,s){this.parseInput(e,ie),this.parseInput(t,re),this.instanceIndex=s,this.initializeDelay=this.getInitializeDelay(),this.viewport=this.getViewport()}parseInput(e,t){const s=j(e,t);if(!s.isValid)throw new Error("Invalid settings");Object.entries(s.params).forEach((([e,t])=>Object.assign(this,{[e]:t.value})))}getInitializeDelay(){let e=0;return this.windowViewport&&this.initWindowDelay&&!("scrollRestoration"in history)&&(e=this.initWindowDelay),this.initDelay>0&&(e=Math.max(e,this.initDelay)),e}getViewport(){if("function"!=typeof this.viewportElement)return this.viewportElement;const e=this.viewportElement(),t=L({value:e},"value",{validators:[C.ELEMENT]});return t.isValid?t.value:null}}const Ye=e=>{var t;return(t=class{}).process=e,t},Je=e=>{var t;return(t=class extends(Ye(e)){static parseInput(t,s,i=!1,r){const n={data:j(s,De[r||e])};return n.data.isValid?n.params=Object.entries(n.data.params).reduce(((e,[t,{value:s}])=>Object.assign(Object.assign({},e),{[t]:s})),{}):(t.logger.log((()=>n.data.showErrors())),i||t.workflow.call({process:e,status:ae.error,payload:{error:`Wrong argument of the "${e}" method call`}})),n}}).process=e,t},Qe=[ne.init,oe.reset,oe.reload];class Ze extends(Ye(ne.init)){static run(e,t){const{state:s,workflow:i}=e,r=Qe.includes(t);e.logger.logCycle(!0),s.startWorkflowCycle(r,t),i.call({process:Ze.process,status:ae.next})}}class Ke extends(Ye(ne.scroll)){static run(e,t){const{workflow:s,viewport:i}=e,r=i.scrollPosition;Ke.onSynthetic(e,r)||Ke.onThrottle(e,r,(()=>Ke.onScroll(e,s)))}static onSynthetic(e,t){const{scroll:s}=e.state,i=s.syntheticPosition;if(null!==i){if(s.syntheticFulfill&&(s.syntheticPosition=null),!s.syntheticFulfill||i===t)return e.logger.log((()=>["skipping scroll",t,`[${s.syntheticFulfill?"":"pre-"}synthetic]`])),!0;e.logger.log((()=>["synthetic scroll has been fulfilled:",t,t<i?"<":">",i]))}return!1}static onThrottle(e,t,s){const{state:{scroll:i},settings:{throttle:r},logger:n}=e;i.current=Ke.getScrollEvent(t,i.previous);const{direction:o,time:a}=i.current,l=i.previous?a-i.previous.time:1/0,c=r-l,d=isFinite(c)&&c>0,h=!!i.scrollTimer;if(n.log((()=>[o===z.backward?"⤴":"⤵",t,d?l+"ms":"0ms",d?h?"delayed":`/ ${c}ms delay`:""])),!d)return i.scrollTimer&&(clearTimeout(i.scrollTimer),i.scrollTimer=null),void s();h||(i.scrollTimer=setTimeout((()=>{n.log((()=>{const s=Ke.getScrollEvent(e.viewport.scrollPosition,i.current);return[s.direction===z.backward?"⤴":"⤵",s.position,s.time-a+"ms","triggered by timer set on",t]})),i.scrollTimer=null,s()}),c))}static getScrollEvent(e,t){const s=Number(new Date);let i=z.forward;return t&&(e===t.position?i=t.direction:e<t.position&&(i=z.backward)),{position:e,direction:i,time:s}}static onScroll(e,t){const{state:{scroll:s,cycle:i}}=e;s.previous=Object.assign({},s.current),s.current=null,i.busy.get()?e.logger.log((()=>["skipping scroll",s.previous.position,"[pending]"])):t.call({process:Ke.process,status:ae.next})}}class et extends(Je(oe.reset)){static run(e,t){const{datasource:s,buffer:i,viewport:{paddings:r},state:{cycle:n}}=e;if(t){const{data:i}=et.parseInput(e,t);if(!i.isValid)return;const r=t instanceof S;Object.keys(W).forEach((e=>{const t=i.params[e],n=s;(t.isSet||r&&n[e])&&(n[e]=t.value)}))}i.reset(!0),r.backward.reset(),r.forward.reset();const o={datasource:s};n.busy.get()&&(o.finalize=!0,n.interrupter=et.process),e.workflow.call({process:et.process,status:ae.next,payload:o})}}class tt extends(Je(oe.reload)){static run(e,t){const{viewport:s,state:i,buffer:r}=e,{params:n}=tt.parseInput(e,{reloadIndex:t},!0);r.reset(!1,n?n.reloadIndex:void 0),s.reset(r.startIndex);const o={};i.cycle.busy.get()&&(o.finalize=!0,i.cycle.interrupter=tt.process),e.workflow.call({process:tt.process,status:ae.next,payload:o})}}class st{get $index(){return this.container.$index}set $index(e){this.container.$index=e}get data(){return this.container.data}set data(e){this.container.data=e}get element(){return this.container.element}set element(e){this.container.element=e}constructor(e,t,s){this.container={$index:e,data:t},this.nodeId=String(e),this.routines=s,this.invisible=!0,this.toRemove=!1,this.toInsert=!1}dispose(){delete this.container.element}setSize(e=0){this.preSize=e,this.element&&(this.size=this.routines.getSize(this.element))}makeVisible(){this.routines.makeElementVisible(this.element),this.invisible=!1}hide(){this.element&&this.routines.hideElement(this.element)}scrollTo(e){this.element&&this.routines.scrollTo(this.element,e)}updateIndex(e){this.$index=e,this.nodeId=String(e)}get(){return this.container}}class it extends(Je(oe.update)){static run(e,t){const{params:s}=it.parseInput(e,t);if(!s)return;const i=it.doUpdate(e,s);e.workflow.call({process:it.process,status:i?ae.next:ae.done})}static doUpdate(e,t){const{buffer:s,viewport:i,state:{fetch:r},routines:n,logger:o}=e;if(!s.items)return o.log((()=>"no items in Buffer")),!1;const{item:a,index:l,diff:c}=i.getEdgeVisibleItem(s.items,z.backward),{trackedIndex:d,toRemove:h}=s.updateItems(t.predicate,((e,t)=>new st(e,t,n)),l,!!t.fixRight);let u=0;const f=s.get(d);a&&a===f&&(u=-s.getSizeByIndex(d)+c),h.forEach((e=>e.hide())),o.log((()=>h.length?"items to remove: ["+h.map((({$index:e})=>e)).join(",")+"]":"no items to remove")),h.length&&s.checkDefaultSize();const p=s.items.filter((({toInsert:e})=>e));return o.log((()=>p.length?"items to render: ["+p.map((({$index:e})=>e)).join(",")+"]":"no items to render")),r.update(d,u,p,h),!!h.length||!!p.length}}class rt extends(Je(oe.insert)){static run(e,t){const{params:s}=rt.parseInput(e,t);if(!s)return;const i=rt.doInsert(e,s);e.workflow.call({process:rt.process,status:i?ae.next:ae.done})}static doInsert(e,t){return!!(rt.insertEmpty(e,t)||rt.insertInBuffer(e,t)||rt.insertVirtually(e,t))}static insertEmpty(e,t){const{buffer:s,routines:i,state:{fetch:r}}=e;if(s.size)return!1;const{beforeIndex:n,afterIndex:o,items:a,decrease:l}=t;return!!s.fillEmpty(a,n,o,!!l,((e,t)=>new st(e,t,i)))&&(r.fill(s.items,s.startIndex),!0)}static insertInBuffer(e,t){const{before:s,after:i,beforeIndex:r,afterIndex:n,items:o,decrease:a}=t,l=e.buffer.getIndexToInsert(s||i,r,n);if(t.virtualize||isNaN(l))return!1;const c=Number.isInteger(r)||s,d={predicate:({$index:e,data:t})=>l!==e||(c?[...o,t]:[t,...o]),fixRight:a};return it.doUpdate(e,d)}static insertVirtually(e,t){const{beforeIndex:s,afterIndex:i,items:r,decrease:n}=t,{buffer:o,state:{fetch:a},viewport:l}=e,c=Number.isInteger(s)?z.backward:z.forward,d=c===z.backward?s:i;if(!o.insertVirtually(r,d,c,!!n))return!1;const{index:h,diff:u}=l.getEdgeVisibleItem(o.items,z.backward);return a.firstVisible.index=h,isNaN(h)||(a.simulate=!0,a.firstVisible.delta=-o.getSizeByIndex(h)+u),!0}}class nt extends(Je(oe.append)){static run(e,{process:t,options:s}){const{params:i}=nt.parseInput(e,s,!1,t);if(!i)return;const r=nt.doAppend(e,t,i);e.workflow.call({process:nt.process,status:r?ae.next:ae.done})}static doAppend(e,t,s){const{bof:i,eof:r,increase:n,decrease:o}=s,{buffer:a}=e,l=t===oe.prepend,c=l?!n:o;let d,h,u=s.items;return l?(d=(i?a.absMinIndex:a.minIndex)+(a.size?0:1),u=[...u].reverse()):h=(r?a.absMaxIndex:a.maxIndex)-(a.size||c?0:1),rt.doInsert(e,{items:u,beforeIndex:d,afterIndex:h,decrease:c,virtualize:s.virtualize})}}class ot extends(Je(oe.check)){static run(e){const{workflow:t,buffer:s,state:{fetch:i},viewport:r}=e;let n=1/0,o=-1/0;if(s.items.forEach((e=>{const t=e.size;e.setSize(),e.size!==t&&(s.cacheItem(e),n=Math.min(n,e.$index),o=Math.max(o,e.$index))})),Number.isFinite(n)){i.first.indexBuffer=s.firstIndex,i.last.indexBuffer=s.lastIndex;const{index:e,diff:t}=r.getEdgeVisibleItem(s.items,z.backward);i.firstVisible.index=e,isNaN(e)||(i.firstVisible.delta=-s.getSizeByIndex(e)+t),i.check(s.items.filter((e=>e.$index>=n&&e.$index<=o)))}e.logger.stat("check"),t.call({process:ot.process,status:Number.isFinite(n)?ae.next:ae.done})}}class at extends(Je(oe.remove)){static run(e,t){const{params:s}=at.parseInput(e,t);if(!s)return;const i=at.doRemove(e,s);e.workflow.call({process:at.process,status:i?ae.next:ae.done})}static doRemove(e,t){const{fetch:s}=e.state;s.firstVisible.index=NaN;const i=at.removeBufferedItems(e,t),r=i.length>0;if(r&&(t.indexes&&t.indexes.length&&(t.indexes=t.indexes.filter((e=>!i.includes(e)))),t.indexes&&t.indexes.length)){const e=(t.increase?1:0)*i.length,s=(t.increase?0:-1)*i.length;t.indexes=t.indexes.map((t=>t+(t<i[0]?e:s)))}const n=at.removeVirtualItems(e,t);return!(!r&&!n)&&(e.logger.stat("after remove"),!0)}static removeBufferedItems(e,t){const{predicate:s,indexes:i,increase:r}=t;if(!s&&!i)return[];const n=e=>s&&s(e)||!!i&&i.includes(e.$index),o=e.buffer.items.reduce(((e,t)=>n(t)?[...e,t.$index]:e),[]),a={predicate:e=>!n(e),fixRight:r};return it.doUpdate(e,a),o}static removeVirtualItems(e,t){const{indexes:s,increase:i}=t;if(!s||!s.length)return!1;const{buffer:r,viewport:n,state:{fetch:o}}=e,{finiteAbsMinIndex:a,firstIndex:l,finiteAbsMaxIndex:c,lastIndex:d}=r,h=[];for(let e=0,t=s.length;e<t;e++){const t=s[e];if(t>=a&&!isNaN(l)&&t<l)h.push(t);else{if(!(t<=c&&!isNaN(d)&&t>d))continue;h.push(t)}}if(!h.length)return!1;if(isNaN(o.firstVisible.index)){const{index:e,diff:t}=n.getEdgeVisibleItem(r.items,z.backward);o.firstVisible.index=e,isNaN(e)||(o.firstVisible.delta=-r.getSizeByIndex(e)+t)}return e.logger.log((()=>`going to remove ${h.length} item(s) virtually`)),r.removeVirtually(h,!!i),r.checkDefaultSize(),at.shiftFirstVisibleIndex(e,h,!!i),!0}static shiftFirstVisibleIndex(e,t,s){const{firstVisible:i}=e.state.fetch;if(isNaN(i.index))return;const r=t.reduce(((e,t)=>e+(s&&t>i.index||!s&&t<i.index?1:0)),0);i.index=i.index+(s?r:-r)}}class lt extends(Je(oe.clip)){static run(e,t){const{params:s}=lt.parseInput(e,t);e.state.clip.forceForward=!(s&&s.backwardOnly),e.state.clip.forceBackward=!(s&&s.forwardOnly),e.workflow.call({process:lt.process,status:ae.next})}}class ct extends(Je(oe.replace)){static run(e,t){const{params:s}=ct.parseInput(e,t);if(!s)return;const i=ct.doReplace(e,s);e.workflow.call({process:ct.process,status:i?ae.next:ae.done})}static doReplace(e,t){const s=e.buffer.items.filter((e=>t.predicate(e))).map((e=>e.$index));if(!s.length)return e.logger.log("no items to be replaced"),!1;let i=!1;const r={predicate:({$index:e})=>!s.includes(e)||!i&&(i=!0,t.items),fixRight:t.fixRight};return it.doUpdate(e,r)}}class dt extends(Je(oe.pause)){static run(e,t){if(!!!(null==t?void 0:t.resume)&&!e.state.paused.get())return e.logger.log("pause scroller"),e.state.paused.set(!0),void e.workflow.call({process:oe.pause,status:ae.done});e.logger.log("resume scroller"),e.state.paused.set(!1),e.workflow.call({process:oe.pause,status:ae.next})}}const{[oe.fix]:ht}=je;class ut extends(Je(oe.fix)){static run(e,t){const{workflow:s}=e,{data:i,params:r}=ut.parseInput(e,t);r&&(Object.entries(i.params).forEach((([t,s])=>{s.isSet&&s.isValid&&ut.runByType(e,t,s.value,i)})),s.call({process:ut.process,status:ae.done}))}static runByType(e,t,s,i){switch(t){case ht.scrollPosition:return ut.setScrollPosition(e,s);case ht.minIndex:return ut.setMinIndex(e,s);case ht.maxIndex:return ut.setMaxIndex(e,s);case ht.updater:return ut.updateItems(e,s);case ht.scrollToItem:if(i.params){const t=i.params[ht.scrollToItemOpt],r=t?t.value:void 0;return ut.scrollToItem(e,s,r)}return;case ht.scrollToItemOpt:return}}static setScrollPosition({viewport:e},t){let s=t;t===-1/0?s=0:t===1/0&&(s=e.getScrollableSize()),e.setPosition(s)}static setMinIndex({buffer:e,settings:t},s){t.minIndex=s,e.absMinIndex=s}static setMaxIndex({buffer:e,settings:t},s){t.maxIndex=s,e.absMaxIndex=s}static updateItems({buffer:e,logger:t},s){let i=!1;const r=()=>i=!0;e.items.forEach((e=>s(e.get(),r))),i&&(t.log((()=>"update Buffer.items reference")),e.items=[...e.items])}static scrollToItem(e,t,s){const i=e.buffer.items.find((e=>t(e.get())));i?i.scrollTo(s):e.logger.log((()=>"scrollToItem cancelled, item not found"))}}class ft extends(Ye(ne.start)){static run(e){const t=e.state.startInnerLoop();e.workflow.call({process:ft.process,status:ae.next,payload:t})}}class pt extends(Ye(ne.preFetch)){static run(e){const{workflow:t,buffer:s,state:{fetch:i,cycle:r}}=e;i.minIndex=s.minIndex,pt.setPositionsAndIndexes(e),pt.skipBufferedItems(e),e.settings.infinite&&pt.checkBufferGaps(e),pt.checkFetchPackSize(e),pt.setFetchDirection(e),t.call({process:pt.process,status:pt.getStatus(e),payload:{process:r.initiator}})}static setPositionsAndIndexes(e){pt.setPositions(e),pt.setFirstIndex(e),pt.setLastIndex(e),e.logger.fetch()}static setPositions(e){const{state:{fetch:{positions:t}},viewport:s}=e,i=s.getBufferPadding();t.before=s.scrollPosition,t.startDelta=pt.getStartDelta(e),t.relative=t.before-t.startDelta,t.start=t.relative-i,t.end=t.relative+s.getSize()+i}static getStartDelta(e){const{buffer:t,viewport:{offset:s}}=e;let i=0;if(s&&(i+=s),!t.defaultSize)return i;for(let e=t.finiteAbsMinIndex;e<t.startIndex;e++)i+=t.getSizeByIndex(e);return e.logger.log((()=>[`start delta is ${i}`,...s?[` (+${s} offset)`]:[]])),i}static setFirstIndex(e){const{state:t,buffer:s}=e,{positions:{start:i},first:r}=t.fetch;let n=s.startIndex,o=0;if(t.cycle.innerLoop.isInitial)e.logger.log("skipping fetch backward direction [initial loop]");else if(s.defaultSize){let e=o,t=n;for(;;){if(i>=0){const r=s.getSizeByIndex(t);if(e+r-i>0){n=t,o=e;break}if(e+=r,t++,t<s.absMinIndex)break}if(i<0){if(t--,t<s.absMinIndex)break;e-=s.getSizeByIndex(t);if(n=t,o=e,e-i<=0)break}}}else e.logger.log("skipping fetch backward direction [no item size]");r.index=r.indexBuffer=Math.max(n,s.absMinIndex),r.position=o}static setLastIndex(e){const{state:{fetch:t,cycle:s},buffer:i,settings:r}=e,{firstVisible:n,positions:{relative:o,end:a},first:l,last:c}=t;let d;if(i.defaultSize){let e=l.indexBuffer,t=l.position;for(d=e;;){d=e;const r=i.getSizeByIndex(e);if(t+=r,isNaN(n.index)&&t>o&&(n.index=e,s.innerLoop.isInitial||(n.delta=t-r-o)),t>=a)break;if(e++>i.absMaxIndex)break}}else d=i.startIndex+r.bufferSize-1,e.logger.log("forcing fetch forward direction [no item size]");c.index=c.indexBuffer=Math.min(d,i.absMaxIndex)}static skipBufferedItems(e){const{buffer:t}=e;if(!t.size)return;const{fetch:s}=e.state,i=s.first.index,r=s.last.index,n=[[]];let o=0;for(let e=i;e<=r;e++)t.get(e)?n[o].length&&(n[++o]=[]):n[o].push(e);let a=n[0];n[0].length&&n[1]&&n[1].length&&(s.hasAnotherPack=!0,n[1].length>=n[0].length&&(a=n[1])),s.first.index=Math.max(a[0],t.absMinIndex),s.last.index=Math.min(a[a.length-1],t.absMaxIndex),s.first.index===i&&s.last.index===r||e.logger.fetch("after Buffer flushing")}static checkBufferGaps(e){const{buffer:t,state:{fetch:s}}=e;if(!t.size)return;const i=s.first.index,r=t.lastIndex;i>r&&(s.first.index=s.first.indexBuffer=r+1);const n=t.firstIndex,o=s.last.index;o<n&&(s.last.index=s.last.indexBuffer=n-1),s.first.index===i&&s.last.index===o||e.logger.fetch("after Buffer filling (no clip case)")}static checkFetchPackSize(e){const{buffer:t,state:{fetch:s}}=e;if(!s.shouldFetch)return;const i=s.first.index,r=s.last.index,n=e.settings.bufferSize-(r-i+1);if(!(n<=0)){if(!t.size||r>t.items[0].$index){const e=Math.min(r+n,t.absMaxIndex);e>r&&(s.last.index=s.last.indexBuffer=e)}else{const e=Math.max(i-n,t.absMinIndex);e<i&&(s.first.index=s.first.indexBuffer=e)}s.first.index===i&&s.last.index===r||(e.logger.fetch("after bufferSize adjustment"),pt.skipBufferedItems(e))}}static setFetchDirection(e){const{buffer:t,state:{fetch:s}}=e;if(s.last.index){let i=z.forward;t.size&&(i=s.last.index<t.items[0].$index?z.backward:z.forward),s.direction=i,e.logger.log((()=>`fetch direction is "${i}"`))}}static getStatus(e){const{cycle:t,fetch:s}=e.state;return t.initiator===oe.clip?(e.logger.log((()=>`going to skip fetch due to "${oe.clip}" process`)),ae.next):s.shouldFetch?(e.logger.log((()=>`going to fetch ${s.count} items started from index ${s.index}`)),ae.next):ae.done}}class gt extends(Ye(ne.fetch)){static run(e){const{workflow:t}=e,s={success:s=>{e.logger.log((()=>`resolved ${s.length} items (index = ${e.state.fetch.index}, count = ${e.state.fetch.count})`)),e.state.fetch.newItemsData=s,t.call({process:gt.process,status:ae.next})},fail:e=>t.call({process:gt.process,status:ae.error,payload:{error:e}})},i=gt.get(e);gt.complete(e,s,i)}static complete(e,t,s){if(Object.prototype.hasOwnProperty.call(s,"data")){const{data:e,error:i,isError:r}=s;r?t.fail(i):t.success(e||[])}else{const{state:{scroll:i,fetch:r},viewport:n}=e;null===i.positionBeforeAsync&&(i.positionBeforeAsync=n.scrollPosition),r.cancel=()=>{t.success=()=>null,t.fail=()=>null},s.then((e=>t.success(e)),(e=>t.fail(e)))}}static get(e){const t=e.datasource.get,{index:s,count:i}=e.state.fetch;let r,n,o,a;const l=e=>{o?o(e):r=e||null},c=e=>{a?a(e):n=e||null},d=t(s,i,l,c);if(d&&"object"==typeof d&&null!==d){if("function"==typeof d.then)return d;if("function"==typeof d.subscribe){let e;e=d.subscribe(l,c,(()=>{e&&"object"==typeof e&&"function"==typeof e.unsubscribe&&e.unsubscribe()}))}}return r||n?{data:n?null:r||[],error:n,isError:!!n}:new Promise(((e,t)=>{o=e,a=t}))}}class mt extends(Ye(ne.postFetch)){static run(e){const{workflow:t}=e;mt.setItems(e)?(mt.setBufferLimits(e),t.call({process:mt.process,status:e.state.fetch.hasNewItems?ae.next:ae.done})):t.call({process:mt.process,status:ae.error,payload:{error:"Can't set buffer items"}})}static setBufferLimits(e){const{buffer:t,state:{fetch:s,cycle:{innerLoop:i}}}=e,{items:r,first:{index:n},last:{index:o}}=s;if(r.length){const e=r.length-1;n<r[0].$index&&(t.absMinIndex=r[0].$index),o>r[e].$index&&(t.absMaxIndex=r[e].$index)}else(o<t.minIndex||i.isInitial)&&(t.absMinIndex=t.minIndex),(n>t.maxIndex||i.isInitial)&&(t.absMaxIndex=t.maxIndex)}static setItems(e){const{buffer:t,state:{fetch:s,cycle:i}}=e,r=s.newItemsData;if(!r||!r.length)return!0;let n=s.index;return r.length<s.count&&(i.innerLoop.isInitial?n=t.startIndex:s.first.index<t.minIndex&&(n=t.firstIndex-r.length)),s.items=r.map(((t,s)=>new st(n+s,t,e.routines))),t.setItems(s.items)}}class xt extends(Ye(ne.render)){static run(e){const{workflow:t,state:{cycle:s,render:i,scroll:r,fetch:n},viewport:o,routines:a}=e;e.logger.stat("before new items render"),null===r.positionBeforeAsync&&(r.positionBeforeAsync=o.scrollPosition),i.cancel=a.render((()=>{i.cancel=null,xt.doRender(e)?t.call({process:xt.process,status:i.noSize?ae.done:ae.next,payload:{process:s.initiator}}):t.call({process:xt.process,status:ae.error,payload:{error:"Can't associate item with element"}})}),{items:n.items.map((e=>e.get()))})}static doRender(e){const{state:{fetch:t,render:s},viewport:i,buffer:r,logger:n}=e;return s.positionBefore=i.scrollPosition,!(!t.isCheck&&(s.sizeBefore=i.getScrollableSize(),!t.items.every((t=>xt.processElement(e,t)))))&&(r.checkDefaultSize(),s.sizeAfter=i.getScrollableSize(),n.stat("after new items render"),n.log((()=>s.noSize?"viewport size has not been changed":void 0)),!0)}static processElement(e,t){const{viewport:s,buffer:i}=e,r=s.findItemElementById(t.nodeId);return!!r&&(t.element=r,t.makeVisible(),t.setSize(i.getSizeByIndex(t.$index)),i.cacheItem(t),!0)}}class bt extends(Ye(ne.end)){static run(e,{error:t}={}){const{workflow:s,state:{cycle:{interrupter:i}}}=e;if(t||i||bt.calculateParams(e),(({call:e})=>!!e.interrupted)(s))return void s.call({process:bt.process,status:ae.done});const r=bt.shouldContinueRun(e,t);e.state.endInnerLoop(),s.call({process:bt.process,status:r?ae.next:ae.done,payload:Object.assign({},i?{process:i}:{})})}static calculateParams(e){const{adapter:t,workflow:s}=e;t.setFirstOrLastVisible({first:!0,workflow:s}),t.setFirstOrLastVisible({last:!0,workflow:s})}static shouldContinueRun(e,t){const{cycle:s,fetch:i,render:r}=e.state;return!!s.interrupter||!t&&(!(!i.simulate||!i.isCheck||r.noSize)||(!(!i.simulate||!i.doRemove)||!(i.simulate||!(i.hasNewItems&&!r.noSize||i.hasAnotherPack))))}}class wt extends(Ye(ne.adjust)){static run(e){const{workflow:t,viewport:s,state:{scroll:i}}=e;i.positionBeforeAdjust=s.scrollPosition,wt.setPaddings(e),i.positionAfterAdjust=s.scrollPosition;const r=wt.calculatePosition(e);wt.setAdditionalForwardPadding(e,r),wt.setPosition(e,r,(()=>t.call({process:wt.process,status:ae.done})))}static setPaddings(e){const{viewport:t,buffer:s,settings:{inverse:i},state:{fetch:r}}=e,n=s.getFirstVisibleItem(),o=s.getLastVisibleItem();let a,l;n&&o?(a=n.$index,l=o.$index):(a=isNaN(r.firstVisible.index)?s.startIndex:r.firstVisible.index,l=a-1);const{forward:c,backward:d}=t.paddings;let h,u=0,f=0;for(h=s.finiteAbsMinIndex;h<a;h++)u+=s.getSizeByIndex(h);for(h=l+1;h<=s.finiteAbsMaxIndex;h++)f+=s.getSizeByIndex(h);const p=u+(t.getScrollableSize()-c.size-d.size)+f,g=t.getSize()-p;g>0&&(i?u+=g:f+=g,e.logger.log((()=>i?"backward":`forward padding will be increased by ${g} to fill the viewport`))),d.size=u,c.size=f,e.logger.stat("after paddings adjustments")}static calculatePosition(e){const{viewport:t,buffer:s,state:{fetch:i,render:r,scroll:n}}=e;let o=t.paddings.backward.size;if(!isNaN(i.firstVisible.index)&&!isNaN(s.firstIndex)){e.logger.log(`first index = ${i.firstVisible.index}, delta = ${i.firstVisible.delta}`);const t=i.shouldCheckPreSizeExpectation(s.lastIndex);s.items.forEach((e=>{e.$index<i.firstVisible.index?o+=e.size:(e.$index===i.firstVisible.index&&i.firstVisible.delta&&(o-=i.firstVisible.delta),t&&e.preSize&&i.items.includes(e)&&(o+=e.size-e.preSize))}))}if(null!==n.positionBeforeAsync){const t=r.positionBefore-n.positionBeforeAsync;0!==t&&(e.logger.log(`shift position due to fetch-render difference (${t})`),o+=t)}return t.offset>0&&(o||i.positions.before)&&(o+=t.offset),Math.round(o)}static setAdditionalForwardPadding(e,t){const{viewport:s,buffer:i,state:{cycle:r}}=e;if(!r.isInitial||!bt.shouldContinueRun(e,null))return;const n=t-s.getMaxScrollPosition();if(n<=0)return;const o=i.getLastVisibleItem();if(!o)return;let a=0,l=o.$index+1;for(;a<=n&&l<=i.absMaxIndex;)a+=i.getSizeByIndex(l++);const c=Math.min(a,n);c&&(s.paddings.forward.size+=c,e.logger.log(`increase fwd padding due to lack of items (${n} -> ${c})`))}static setPosition(e,t,s){const{state:{scroll:i},viewport:r,routines:n}=e;if(!i.hasPositionChanged(t))return s();i.syntheticPosition=t,i.syntheticFulfill=!1,i.cancelAnimation=n.animate((()=>{i.cancelAnimation=null;const n=i.positionAfterAdjust-r.scrollPosition;let o="";n>0&&(t-=n,i.syntheticPosition=t,o=` (-${n})`),i.syntheticFulfill=!0,r.scrollPosition=t,e.logger.stat("after scroll adjustment"+o),s()}))}}class It extends(Ye(ne.preClip)){static run(e){It.prepareClip(e),e.workflow.call({process:It.process,status:ae.next,payload:{doClip:e.state.clip.doClip}})}static prepareClip(e){const{state:{fetch:t,clip:s}}=e;if(It.shouldNotClip(e))return;const i=t.first.indexBuffer,r=t.last.indexBuffer;e.logger.log((()=>`looking for ${t.direction?"anti-"+t.direction+" ":""}items that are out of [${i}..${r}] range`)),It.isBackward(e,i)&&It.prepareClipByDirection(e,z.backward,i),It.isForward(e,r)&&It.prepareClipByDirection(e,z.forward,r),s.doClip||e.logger.log("skipping clip [no items to clip]")}static shouldNotClip(e){const{settings:t,buffer:s,state:i}=e;return t.infinite&&!i.clip.force?(e.logger.log("skipping clip [infinite mode]"),!0):s.size?!!i.cycle.isInitial&&(e.logger.log("skipping clip [initial cycle]"),!0):(e.logger.log("skipping clip [empty buffer]"),!0)}static isBackward(e,t){const{buffer:s,state:{clip:i,fetch:r}}=e;return i.force?i.forceBackward:r.direction!==z.backward&&t-1>=s.absMinIndex}static isForward(e,t){const{buffer:s,state:{clip:i,fetch:r}}=e;return i.force?i.forceForward:r.direction!==z.forward&&t+1<=s.absMaxIndex}static prepareClipByDirection(e,t,s){const i=t===z.forward;e.buffer.items.forEach((r=>{(!i&&r.$index<s||i&&r.$index>s)&&(r.toRemove=!0,r.removeDirection=t,e.state.clip.doClip=!0)}))}}class vt extends(Ye(ne.clip)){static run(e){const{workflow:t}=e;vt.doClip(e),t.call({process:vt.process,status:ae.next})}static doClip(e){const{buffer:t,viewport:{paddings:s},state:{clip:i},logger:r}=e,n={[z.backward]:0,[z.forward]:0};r.stat(`before clip (${++i.callCount})`);const o=t.items.filter((e=>!!e.toRemove&&(e.hide(),n[e.removeDirection]+=e.size,!0)));o.length&&(n[z.backward]&&(s.byDirection(z.backward).size+=n[z.backward]),n[z.forward]&&(s.byDirection(z.forward).size+=n[z.forward]),e.settings.onBeforeClip&&e.settings.onBeforeClip(o.map((e=>e.get())))),t.clip(),r.log((()=>{const e=o.map((({$index:e})=>e));return e.length?[`clipped ${e.length} item(s) from Buffer`+(n.backward?`, +${n.backward} fwd px`:"")+(n.forward?`, +${n.forward} bwd px`:"")+`, range: [${e[0]}..${e[e.length-1]}]`]:"clipped 0 items from Buffer"})),r.stat("after clip")}}class yt{constructor(e,t,s){this.logs=[],this.logAdapterMethod=(e,t,s)=>{if(!this.debug)return;const i=(void 0===t?[]:Array.isArray(t)?t:[t]).map((e=>"function"==typeof e?"func":"object"==typeof e&&e?Array.isArray(e)?`[of ${e.length}]`:"{ "+Object.keys(e).join(", ")+" }":e)).join(", ");this.log(`adapter: ${e}(${i||""})${s||""}`)};const{settings:i}=e;this.debug=i.debug,this.immediateLog=i.immediateLog,this.logTime=i.logTime,this.getTime=()=>e.state&&` // time: ${e.state.time}`,this.getStat=()=>{const{buffer:t,viewport:s}=e,i=t.getFirstVisibleItem(),r=t.getLastVisibleItem();return"pos: "+s.scrollPosition+", size: "+s.getScrollableSize()+", bwd_p: "+s.paddings.backward.size+", fwd_p: "+s.paddings.forward.size+", default: "+(t.defaultSize||"no")+", items: "+t.getVisibleItemsCount()+", range: "+(i&&r?`[${i.$index}..${r.$index}]`:"no")},this.getFetchRange=()=>{const{first:{index:t},last:{index:s}}=e.state.fetch;return Number.isNaN(t)||Number.isNaN(s)?"no":`[${t}..${s}]`},this.getLoopId=()=>e.state.cycle.loopId,this.getLoopIdNext=()=>e.state.cycle.loopIdNext,this.getWorkflowCycleData=()=>`${i.instanceIndex}-${e.state.cycle.count}`,this.getScrollPosition=()=>e.routines.getScrollPosition(),this.log((()=>`vscroll Workflow has been started, core: ${t.core.name} v${t.core.version}, consumer: ${t.consumer.name} v${t.consumer.version}, scroller instance: ${i.instanceIndex}, adapter `+(s?`instance: ${s.id}`:"is not instantiated")))}object(e,t,s){this.log((()=>[e,s?JSON.stringify(t,((e,t)=>Number.isNaN(t)?"NaN":t===1/0?"Infinity":t===-1/0?"-Infinity":t instanceof Element?"HTMLElement":t instanceof HTMLDocument?"HTMLDocument":"function"==typeof t?"Function":t)).replace(/"/g,"").replace(/(\{|:|,)/g,"$1 ").replace(/(\})/g," $1"):t]))}stat(e){if(this.debug){const t=["color: #888; border: dashed #888 0; border-bottom-width: 0px","color: #000; border-width: 0"];this.log((()=>["%cstat"+(e?` ${e}`:"")+",%c "+this.getStat(),...t]))}}fetch(e){if(this.debug){const t="fetch interval"+(e?` ${e}`:""),s=["color: #888","color: #000"];this.log((()=>[`%c${t}: %c${this.getFetchRange()}`,...s]))}}prepareForLog(e){return e instanceof Event&&e.target?this.getScrollPosition():e}logProcess(e){if(!this.debug)return;const{process:t,status:s,payload:i}=e,r=[];if(t===ne.init&&s===ae.next)r.push(`%c---=== loop ${this.getLoopIdNext()} start`);else if(t===ne.end){r.push(`%c---=== loop ${this.getLoopId()} done`);const e=i&&i.process;s===ae.next&&e!==oe.reset&&e!==oe.reload&&(r[0]+=`, loop ${this.getLoopIdNext()} start`)}r.length&&this.log((()=>[...r,"color: #006600;"]))}logCycle(e=!0){const t=this.getWorkflowCycleData(),s=`color: #0000aa; border: solid #555 1px; border-width: ${e?"1px 0 0 1px":"0 0 1px 1px"}; margin-left: -2px`;this.log((()=>[`%c ~~~ WF Cycle ${t} ${e?"STARTED":"FINALIZED"} ~~~ `,s]))}logError(e){if(this.debug){const t=["color: #a00;","color: #000"];this.log((()=>["error:%c"+(e?` ${e}`:"")+`%c (loop ${this.getLoopIdNext()})`,...t]))}}log(...e){if(this.debug){if("function"==typeof e[0]&&(e=e[0](),Array.isArray(e)||(e=[e])),e.every((e=>void 0===e)))return;this.logTime&&(e=[...e,this.getTime()]),e=e.map((e=>this.prepareForLog(e))),this.immediateLog?console.log.apply(this,e):this.logs.push(e)}}logForce(...e){this.debug&&(!this.immediateLog&&this.logs.length&&(this.logs.forEach((e=>console.log.apply(this,e))),this.logs=[]),e.length&&console.log.apply(this,e))}}class St{constructor(e,t){this.element=e,this.settings={viewport:t.viewport,horizontal:t.horizontal,window:t.windowViewport},this.viewport=this.getViewportElement(),this.onInit(t)}checkElement(e){if(!e)throw new Error("HTML element is not defined")}getViewportElement(){if(this.settings.window)return document.documentElement;if(this.settings.viewport)return this.settings.viewport;this.checkElement(this.element);const e=this.element.parentElement;return this.checkElement(e),e}onInit(e){e.windowViewport&&"scrollRestoration"in history&&(history.scrollRestoration="manual"),e.dismissOverflowAnchor&&(this.viewport.style.overflowAnchor="none")}findElementBySelector(e,t){return this.checkElement(e),e.querySelector(t)}findPaddingElement(e){return this.findElementBySelector(this.element,`[data-padding-${e}]`)}findItemElement(e){return this.findElementBySelector(this.element,`[data-sid="${e}"]`)}findItemChildBySelector(e,t){return this.findElementBySelector(this.element,`[data-sid="${e}"] ${t}`)}getScrollPosition(){return this.settings.window?this.settings.horizontal?window.pageXOffset:window.pageYOffset:this.viewport[this.settings.horizontal?"scrollLeft":"scrollTop"]}setScrollPosition(e){e=Math.max(0,e),this.settings.window?this.settings.horizontal?window.scrollTo(e,window.scrollY):window.scrollTo(window.scrollX,e):this.viewport[this.settings.horizontal?"scrollLeft":"scrollTop"]=e}getElementParams(e){return this.checkElement(e),e.getBoundingClientRect()}getWindowParams(){const{clientWidth:e,clientHeight:t,clientLeft:s,clientTop:i}=this.viewport;return{height:t,width:e,top:i,bottom:i+t,left:s,right:s+e,x:s,y:i,toJSON:()=>null}}getSize(e){return this.getElementParams(e)[this.settings.horizontal?"width":"height"]}getScrollerSize(){return this.getElementParams(this.element)[this.settings.horizontal?"width":"height"]}getViewportSize(){return this.settings.window?this.getWindowParams()[this.settings.horizontal?"width":"height"]:this.getSize(this.viewport)}getSizeStyle(e){this.checkElement(e);const t=e.style[this.settings.horizontal?"width":"height"];return parseFloat(t)||0}setSizeStyle(e,t){this.checkElement(e),t=Math.max(0,Math.round(t)),e.style[this.settings.horizontal?"width":"height"]=`${t}px`}getEdge(e,t){const{horizontal:s}=this.settings;return this.getElementParams(e)[t===z.forward?s?"right":"bottom":s?"left":"top"]}getViewportEdge(e){const{window:t,horizontal:s}=this.settings;if(t){return this.getWindowParams()[e===z.forward?s?"right":"bottom":s?"left":"top"]}return this.getEdge(this.viewport,e)}makeElementVisible(e){this.checkElement(e),e.style.left="",e.style.top="",e.style.position=""}hideElement(e){this.checkElement(e),e.style.display="none"}getOffset(){const e=e=>(this.settings.horizontal?e.offsetLeft:e.offsetTop)||0;return e(this.element)-(this.settings.window?0:e(this.viewport))}scrollTo(e,t){this.checkElement(e),e.scrollIntoView(t)}render(e,t){const s=setTimeout((()=>e()));return()=>clearTimeout(s)}animate(e){const t=requestAnimationFrame((()=>e()));return()=>cancelAnimationFrame(t)}onScroll(e){const t=this.settings.window?window:this.viewport;return t.addEventListener("scroll",e),()=>t.removeEventListener("scroll",e)}}class zt{constructor(e,t){const s=t.findPaddingElement(e);t.checkElement(s),this.element=s,this.direction=e,this.routines=t}reset(e){this.size=e||0}get size(){return this.routines.getSizeStyle(this.element)}set si