UNPKG

vscroll

Version:
5 lines (4 loc) 84.6 kB
/** * vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll | 2026-02-15T20:53:41.368Z | 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:l},{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 g={name:"vscroll",version:"1.8.3"};const p=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:()=>g.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():{mock:!1,reactive:u().filter(({type:e})=>e===s.Reactive).reduce((e,{name:t,value:s})=>(e[t]={source:s,emit:(e,t)=>e.set(t)},e),{})})}},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}},A=(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}},C=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}},P={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:A(e,!1)}),ONE_OF_MUST:e=>({type:$.oneOfMust,method:A(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:C(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}},L=(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:[]}},B=(e,t,s)=>{const i=L(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},D=(e,t)=>{const s=new F(e);return Object.entries(t).forEach(([e,t])=>s.setParam(e,s.isValidContext?B(s.context,e,t):L(void 0,t))),s},{OBJECT:j,FUNC_WITH_X_AND_MORE_ARGUMENTS:_}=P;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:[j]},[W.devSettings]:{validators:[j]}},{NUMBER:q,INTEGER:G,INTEGER_UNLIMITED:H,MORE_OR_EQUAL:X,BOOLEAN:Y,ELEMENT:J,FUNC:Q,OR:Z,ENUM:K}=P;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.logColor="logColor",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.logColor]:{validators:[Y],defaultValue:!0},[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:ge,FUNC_WITH_X_TO_Y_ARGUMENTS:pe,ONE_OF_MUST:me,ONE_OF_CAN:xe,OR:be}=P;var we;we||(we={});const Ie={},ve={[W.get]:{validators:[ge(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 Ae={[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 Ce;!function(e){e.items="items",e.predicate="predicate",e.fixRight="fixRight"}(Ce||(Ce={}));const Pe={[Re.items]:{validators:[ue],mandatory:!0},[Ce.predicate]:{validators:[fe(1)],mandatory:!0},[Ce.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 Le;!function(e){e.scrollPosition="scrollPosition",e.minIndex="minIndex",e.maxIndex="maxIndex",e.updater="updater",e.scrollToItem="scrollToItem",e.scrollToItemOpt="scrollToItemOpt"}(Le||(Le={}));const Be={[Le.scrollPosition]:{validators:[ce]},[Le.minIndex]:{validators:[ce]},[Le.maxIndex]:{validators:[ce]},[Le.updater]:{validators:[pe(1,2)]},[Le.scrollToItem]:{validators:[fe(1)]},[Le.scrollToItemOpt]:{validators:[be([de,he])]}},De={[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]:Ce,[oe.update]:Fe,[oe.pause]:we,[oe.fix]:Le},je={[oe.reset]:ve,[oe.reload]:Se,[oe.prepend]:ke,[oe.append]:Ee,[oe.check]:Ie,[oe.remove]:Me,[oe.clip]:Oe,[oe.insert]:Ae,[oe.replace]:Pe,[oe.update]:Te,[oe.pause]:Ie,[oe.fix]:Be},{ELEMENT:_e,OBJECT:We,FUNC:Ue,FUNC_WITH_X_ARGUMENTS:qe}=P;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=D(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=B({value:e},"value",{validators:[P.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:D(s,je[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:i,settings:r,logger:n}=e,{scroll:o}=i;o.current=Ke.getScrollEvent(t,o.previous);const{direction:a,time:l}=o.current,c=o.previous?l-o.previous.time:1/0,d=r.throttle-c,h=isFinite(d)&&d>0,u=!!o.scrollTimer;if(n.log(()=>[a===z.backward?"⤴":"⤵",t,h?c+"ms":"0ms",h?u?"delayed":`/ ${d}ms delay`:""]),!h)return o.scrollTimer&&(clearTimeout(o.scrollTimer),o.scrollTimer=null),void s();u||(o.scrollTimer=setTimeout(()=>{n.log(()=>{const s=Ke.getScrollEvent(e.viewport.scrollPosition,o.current);return[s.direction===z.backward?"⤴":"⤵",s.position,s.time-l+"ms","triggered by timer set on",t]}),o.scrollTimer=null,s()},d))}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{scroll:s,cycle:i}=e.state;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:r,state: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.paddings.backward.reset(),r.paddings.forward.reset();const o={datasource:s};n.cycle.busy.get()&&(o.finalize=!0,n.cycle.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 uid(){return this.container.uid}set uid(e){this.container.uid=e}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={uid:st.nextUid++,$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}}st.nextUid=1;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: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 g=s.items.filter(({toInsert:e})=>e);return o.log(()=>g.length?"items to render: ["+g.map(({$index:e})=>e).join(",")+"]":"no items to render"),r.fetch.update(d,u,g,h),!!h.length||!!g.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: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.fetch.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: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{fetch:h}=a,{index:u,diff:f}=l.getEdgeVisibleItem(o.items,z.backward);return h.firstVisible.index=u,isNaN(u)||(h.simulate=!0,h.firstVisible.delta=-o.getSizeByIndex(u)+f),!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: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)){const{fetch:e}=i;e.first.indexBuffer=s.firstIndex,e.last.indexBuffer=s.lastIndex;const{index:t,diff:a}=r.getEdgeVisibleItem(s.items,z.backward);e.firstVisible.index=t,isNaN(t)||(e.firstVisible.delta=-s.getSizeByIndex(t)+a),e.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: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;const{fetch:u}=o;if(isNaN(u.firstVisible.index)){const{index:e,diff:t}=n.getEdgeVisibleItem(r.items,z.backward);u.firstVisible.index=e,isNaN(e)||(u.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}=De;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 gt extends(Ye(ne.preFetch)){static run(e){const{workflow:t,buffer:s,state:i}=e,{fetch:r,cycle:n}=i;r.minIndex=s.minIndex,gt.setPositionsAndIndexes(e),gt.skipBufferedItems(e),e.settings.infinite&&gt.checkBufferGaps(e),gt.checkFetchPackSize(e),gt.setFetchDirection(e),t.call({process:gt.process,status:gt.getStatus(e),payload:{process:n.initiator}})}static setPositionsAndIndexes(e){gt.setPositions(e),gt.setFirstIndex(e),gt.setLastIndex(e),e.logger.fetch()}static setPositions(e){const{state:t,viewport:s}=e,{positions:i}=t.fetch,r=s.getBufferPadding();i.before=s.scrollPosition,i.startDelta=gt.getStartDelta(e),i.relative=i.before-i.startDelta,i.start=i.relative-r,i.end=i.relative+s.getSize()+r}static getStartDelta(e){const{buffer:t,viewport:s}=e,{offset:i}=s;let r=0;if(i&&(r+=i),!t.defaultSize)return r;for(let e=t.finiteAbsMinIndex;e<t.startIndex;e++)r+=t.getSizeByIndex(e);return e.logger.log(()=>[`start delta is ${r}`,...i?[` (+${i} offset)`]:[]]),r}static setFirstIndex(e){const{state:t,buffer:s}=e,{positions:i,first:r}=t.fetch,{start:n}=i;let o=s.startIndex,a=0;if(t.cycle.innerLoop.isInitial)e.logger.log("skipping fetch backward direction [initial loop]");else if(s.defaultSize){let e=a,t=o;for(;;){if(n>=0){const i=s.getSizeByIndex(t);if(e+i-n>0){o=t,a=e;break}if(e+=i,t++,t<s.absMinIndex)break}if(n<0){if(t--,t<s.absMinIndex)break;e-=s.getSizeByIndex(t);if(o=t,a=e,e-n<=0)break}}}else e.logger.log("skipping fetch backward direction [no item size]");r.index=r.indexBuffer=Math.max(o,s.absMinIndex),r.position=a}static setLastIndex(e){const{state:t,buffer:s,settings:i}=e,{fetch:r,cycle:n}=t,{firstVisible:o,positions:a,first:l,last:c}=r,{relative:d,end:h}=a;let u;if(s.defaultSize){let e=l.indexBuffer,t=l.position;for(u=e;;){u=e;const i=s.getSizeByIndex(e);if(t+=i,isNaN(o.index)&&t>d&&(o.index=e,n.innerLoop.isInitial||(o.delta=t-i-d)),t>=h)break;if(e++>s.absMaxIndex)break}}else u=s.startIndex+i.bufferSize-1,e.logger.log("forcing fetch forward direction [no item size]");c.index=c.indexBuffer=Math.min(u,s.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:s}=e,{fetch:i}=s;if(!t.size)return;const r=i.first.index,n=t.lastIndex;r>n&&(i.first.index=i.first.indexBuffer=n+1);const o=t.firstIndex,a=i.last.index;a<o&&(i.last.index=i.last.indexBuffer=o-1),i.first.index===r&&i.last.index===a||e.logger.fetch("after Buffer filling (no clip case)")}static checkFetchPackSize(e){const{buffer:t,state:s}=e,{fetch:i}=s;if(!i.shouldFetch)return;const r=i.first.index,n=i.last.index,o=e.settings.bufferSize-(n-r+1);if(!(o<=0)){if(!t.size||n>t.items[0].$index){const e=Math.min(n+o,t.absMaxIndex);e>n&&(i.last.index=i.last.indexBuffer=e)}else{const e=Math.max(r-o,t.absMinIndex);e<r&&(i.first.index=i.first.indexBuffer=e)}i.first.index===r&&i.last.index===n||(e.logger.fetch("after bufferSize adjustment"),gt.skipBufferedItems(e))}}static setFetchDirection(e){const{buffer:t,state:s}=e,{fetch:i}=s;if(i.last.index){let s=z.forward;t.size&&(s=i.last.index<t.items[0].$index?z.backward:z.forward),i.direction=s,e.logger.log(()=>`fetch direction is "${s}"`)}}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 pt 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:pt.process,status:ae.next})},fail:e=>t.call({process:pt.process,status:ae.error,payload:{error:e}})},i=pt.get(e);pt.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:i,viewport:r}=e,{scroll:n,fetch:o}=i;null===n.positionBeforeAsync&&(n.positionBeforeAsync=r.scrollPosition),o.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 not set buffer items"}})}static setBufferLimits(e){const{buffer:t,state:s}=e,{fetch:i,cycle:r}=s,{items:n,first:o,last:a}=i;if(n.length){const e=n.length-1;o.index<n[0].$index&&(t.absMinIndex=n[0].$index),a.index>n[e].$index&&(t.absMaxIndex=n[e].$index)}else(a.index<t.minIndex||r.innerLoop.isInitial)&&(t.absMinIndex=t.minIndex),(o.index>t.maxIndex||r.innerLoop.isInitial)&&(t.absMaxIndex=t.maxIndex)}static setItems(e){const{buffer:t,state:s}=e,{fetch:i,cycle:r}=s,n=i.newItemsData;if(!n||!n.length)return!0;let o=i.index;return n.length<i.count&&(r.innerLoop.isInitial?o=t.startIndex:i.first.index<t.minIndex&&(o=t.firstIndex-n.length)),i.items=n.map((t,s)=>new st(o+s,t,e.routines)),t.setItems(i.items)}}class xt extends(Ye(ne.render)){static run(e){const{workflow:t,state:s,viewport:i,routines:r}=e,{cycle:n,render:o,scroll:a,fetch:l}=s;e.logger.stat("before new items render"),null===a.positionBeforeAsync&&(a.positionBeforeAsync=i.scrollPosition),o.cancel=r.render(()=>{o.cancel=null,xt.doRender(e)?t.call({process:xt.process,status:o.noSize?ae.done:ae.next,payload:{process:n.initiator}}):t.call({process:xt.process,status:ae.error,payload:{error:"Can not associate item with element"}})},{items:l.items.map(e=>e.get())})}static doRender(e){const{state:t,viewport:s,buffer:i,logger:r}=e,{fetch:n,render:o}=t;return o.positionBefore=s.scrollPosition,!(!n.isCheck&&(o.sizeBefore=s.getScrollableSize(),!n.items.every(t=>xt.processElement(e,t))))&&(i.checkDefaultSize(),o.sizeAfter=s.getScrollableSize(),r.stat("after new items render"),r.log(()=>o.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:i}=e,{interrupter:r}=i.cycle;if(t||r||bt.calculateParams(e),(({call:e})=>!!e.interrupted)(s))return void s.call({process:bt.process,status:ae.done});const n=bt.shouldContinueRun(e,t);e.state.endInnerLoop(),s.call({process:bt.process,status:n?ae.next:ae.done,payload:Object.assign({},r?{process:r}:{})})}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:i}=e;i.scroll.positionBeforeAdjust=s.scrollPosition,wt.setPaddings(e),i.scroll.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:i,state:r}=e,n=s.getFirstVisibleItem(),o=s.getLastVisibleItem();let a,l;if(n&&o)a=n.$index,l=o.$index;else{const{fetch:e}=r;a=isNaN(e.firstVisible.index)?s.startIndex:e.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 g=u+(t.getScrollableSize()-c.size-d.size)+f,p=t.getSize()-g;p>0&&(i.inverse?u+=p:f+=p,e.logger.log(()=>i.inverse?"backward":`forward padding will be increased by ${p} 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:i}=e,{fetch:r,render:n,scroll:o}=i;let a=t.paddings.backward.size;if(!isNaN(r.firstVisible.index)&&!isNaN(s.firstIndex)){e.logger.log(`first index = ${r.firstVisible.index}, delta = ${r.firstVisible.delta}`);const t=r.shouldCheckPreSizeExpectation(s.lastIndex);s.items.forEach(e=>{e.$index<r.firstVisible.index?a+=e.size:(e.$index===r.firstVisible.index&&r.firstVisible.delta&&(a-=r.firstVisible.delta),t&&e.preSize&&r.items.includes(e)&&(a+=e.size-e.preSize))})}if(null!==o.positionBeforeAsync){const t=n.positionBefore-o.positionBeforeAsync;0!==t&&(e.logger.log(`shift position due to fetch-render difference (${t})`),a+=t)}return t.offset>0&&(a||r.positions.before)&&(a+=t.offset),Math.round(a)}static setAdditionalForwardPadding(e,t){const{viewport:s,buffer:i,state:r}=e;if(!r.cycle.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:i,viewport:r,routines:n}=e,{scroll:o}=i;if(!o.hasPositionChanged(t))return s();o.syntheticPosition=t,o.syntheticFulfill=!1,o.cancelAnimation=n.animate(()=>{o.cancelAnimation=null;const i=o.positionAfterAdjust-r.scrollPosition;let n="";i>0&&(t-=i,o.syntheticPosition=t,n=` (-${i})`),o.syntheticFulfill=!0,r.scrollPosition=t,e.logger.stat("after scroll adjustment"+n),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{fetch:t,clip:s}=e.state;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:i}=e,{clip:r,fetch:n}=i;return r.force?r.forceBackward:n.direction!==z.backward&&t-1>=s.absMinIndex}static isForward(e,t){const{buffer:s,state:i}=e,{clip:r,fetch:n}=i;return r.force?r.forceForward:n.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:s,state:i,logger:r}=e,n={[z.backward]:0,[z.forward]:0};r.stat(`before clip (${++i.clip.callCount})`);const o=t.items.filter(e=>!!e.toRemove&&(e.hide(),n[e.removeDirection]+=e.size,!0));o.length&&(n[z.backward]&&(s.paddings.byDirection(z.backward).size+=n[z.backward]),n[z.forward]&&(s.paddings.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.logColor=i.logColor,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)if(this.logColor){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])}else this.log(()=>["stat"+(e?` ${e}`:"")+", "+this.getStat()])}fetch(e){if(this.debug){const t="fetch interval"+(e?` ${e}`:"");if(this.logColor){const e=["color: #888","color: #000"];this.log(()=>[`%c${t}: %c${this.getFetchRange()}`,...e])}else this.log(()=>[`${t}: ${this.getFetchRange()}`])}}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){const e=`---=== loop ${this.getLoopIdNext()} start`;r.push(this.logColor?`%c${e}`:e)}else if(t===ne.end){const e=`---=== loop ${this.getLoopId()} done`;r.push(this.logColor?`%c${e}`:e);const t=i&&i.process;s===ae.next&&t!==oe.reset&&t!==oe.reload&&(r[0]+=`, loop ${this.getLoopIdNext()} start`)}r.length&&this.log(()=>this.logColor?[...r,"color: #006600;"]:r)}logCycle(e=!0){const t=this.getWorkflowCycleData();if(this.logColor){const 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])}else this.log(()=>[` ~~~ WF Cycle ${t} ${e?"STARTED":"FINALIZED"} ~~~ `])}logError(e){if(this.debug)if(this.logColor){const t=["color: #a00;","color: #000"];this.log(()=>["error:%c"+(e?` ${e}`:"")+`%c (loop ${this.getLoopIdNext()})`,...t])}else this.log(()=>["error:"+(e?` ${e}`:"")+` (loop ${this.getLoopIdNext()})`])}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))}getLogs(){return this.logs}}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 e=window.innerHeight,t=window.innerWidth;return{height:e,width:t,top:0,bottom:e,left:0,right:t,x:0,y:0,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.di