vscroll 1.8.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/bundles/vscroll.esm5.js +3 -3
- package/dist/bundles/vscroll.esm5.js.map +1 -1
- package/dist/bundles/vscroll.esm5.min.js +2 -2
- package/dist/bundles/vscroll.esm5.min.js.map +1 -1
- package/dist/bundles/vscroll.esm6.js +3 -3
- package/dist/bundles/vscroll.esm6.js.map +1 -1
- package/dist/bundles/vscroll.esm6.min.js +2 -2
- package/dist/bundles/vscroll.esm6.min.js.map +1 -1
- package/dist/bundles/vscroll.umd.js +4 -4
- package/dist/bundles/vscroll.umd.js.map +1 -1
- package/dist/bundles/vscroll.umd.min.js +2 -2
- package/dist/bundles/vscroll.umd.min.js.map +1 -1
- package/dist/esm2015/classes/state.js +1 -1
- package/dist/esm2015/classes/state.js.map +1 -1
- package/dist/esm2015/version.js +1 -1
- package/dist/esm2015/version.js.map +1 -1
- package/dist/esm5/classes/state.js +1 -1
- package/dist/esm5/classes/state.js.map +1 -1
- package/dist/esm5/version.js +1 -1
- package/dist/esm5/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll | 2026-02-
|
|
2
|
+
* vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll | 2026-02-08T22:44:35.240Z | MIT license
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
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.1"};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 $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: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&>.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.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 size(e){this.routines.setSizeStyle(this.element,e)}}class kt{constructor(e,t){this.settings=t,this.forward=new zt(z.forward,e),this.backward=new zt(z.backward,e)}byDirection(e,t){return e===z.backward?t?this.forward:this.backward:t?this.backward:this.forward}reset(e,t,s){const i=this.getPositiveSize(t,e,s),r=this.getNegativeSize(t);if(this.settings.inverse){this.forward.reset(r),this.backward.reset(i);const t=e-this.backward.size-s;t>0&&(this.backward.size+=t,this.forward.size-=t)}else{this.forward.reset(i),this.backward.reset(r);const t=e-this.forward.size-s;t>0&&(this.backward.size-=t,this.forward.size+=t)}}getPositiveSize(e,t,s){const{settings:i}=this;let r=t;return isFinite(i.maxIndex)&&(r=(i.maxIndex-e+1)*i.itemSize),s&&(r=Math.max(r-s,0)),r}getNegativeSize(e){const{settings:t}=this;let s=0;return isFinite(t.minIndex)&&(s=(e-t.minIndex)*t.itemSize),s}}class $t{constructor(e,t,s,i){this.settings=e,this.routines=t,this.state=s,this.logger=i,this.paddings=new kt(this.routines,e)}reset(e){this.setOffset(),this.paddings.reset(this.getSize(),e,this.offset),this.scrollPosition=this.paddings.backward.size||0,this.state.scroll.reset()}setPosition(e){if(this.scrollPosition===e)return this.logger.log(()=>["setting scroll position at",e,"[cancelled]"]),e;this.routines.setScrollPosition(e);const t=this.scrollPosition;return this.logger.log(()=>["setting scroll position at",t,...t!==e?[`(${e})`]:[]]),t}get scrollPosition(){return this.routines.getScrollPosition()}set scrollPosition(e){this.setPosition(e)}getSize(){return this.routines.getViewportSize()}getScrollableSize(){return this.routines.getScrollerSize()}getMaxScrollPosition(){return this.getScrollableSize()-this.getSize()}getBufferPadding(){return this.getSize()*this.settings.padding}getEdge(e){return this.routines.getViewportEdge(e)}setOffset(){this.offset=this.routines.getOffset()}findItemElementById(e){return this.routines.findItemElement(e)}getEdgeVisibleItem(e,t){const s=t===z.backward,i=s?z.forward:z.backward,r=this.getEdge(t);let n,o=0;for(let t=s?0:e.length-1;s?t<=e.length-1:t>=0;t+=s?1:-1){if(o=this.routines.getEdge(e[t].element,i)-r,s&&o>0||!s&&o<0){n=e[t];break}}return{item:n,index:n?n.$index:NaN,diff:o}}}class Et{constructor(){this.reset()}reset(){this.newItems=[],this.oldItems=[],this.removed=[]}}class Vt{constructor(e,t){this.itemSize=e,this.sizeStrategy=t,this.sizeMap=new Map,this.recalculation=new Et}reset(e){e&&(this.constantSize=this.itemSize,this.frequentSize=this.itemSize,this.averageSize=this.itemSize,this.averageSizeFloat=this.itemSize,this.sizeMap.clear()),this.recalculation.reset()}get(){switch(this.sizeStrategy){case k.Average:return this.averageSize;case k.Frequent:return this.frequentSize;default:return this.constantSize}}recalculateAverageSize(e){const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(t.length){const i=t.reduce((e,t)=>e+t.size,0),r=t.reduce((e,t)=>e+t.newSize,0),n=this.averageSizeFloat||0;this.averageSizeFloat=n-(i-r)/(e-s.length)}if(s.length){const t=s.reduce((e,t)=>e+t.size,0),i=this.averageSizeFloat||0;this.averageSizeFloat=((e-s.length)*i+t)/e}if(i.length){const t=i.reduce((e,t)=>e+t.size,0),s=this.averageSizeFloat||0;this.averageSizeFloat=((e+i.length)*s-t)/e}this.averageSize=Math.round(this.averageSizeFloat)}recalculateFrequentSize(){const{oldItems:e,newItems:t,removed:s}=this.recalculation,i=this.sizeMap.get(this.frequentSize);t.length&&t.forEach(({size:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1)),e.length&&(e.forEach(({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0))),e.forEach(({newSize:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1))),s.length&&s.forEach(({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0)));const r=[...this.sizeMap.entries()].sort((e,t)=>t[1]-e[1]),n=r[0][1],o=r.filter(e=>e[1]===n);o.length>1&&o.find(e=>e[0]===i)||(this.frequentSize=r[0][0])}recalculate(e){if(this.sizeStrategy===k.Constant)return!1;const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(!t.length&&!s.length&&!i.length)return!1;const r=this.get();return e?(this.sizeStrategy===k.Average?this.recalculateAverageSize(e):this.recalculateFrequentSize(),this.recalculation.reset()):this.reset(!0),this.get()!==r}setExisted(e,t){this.sizeStrategy!==k.Constant&&this.recalculation.oldItems.push({size:e,newSize:t})}setNew(e){this.sizeStrategy!==k.Constant?this.recalculation.newItems.push({size:e}):this.constantSize||(this.constantSize=e)}setRemoved(e){this.sizeStrategy!==k.Constant&&this.recalculation.removed.push({size:e})}}class Mt{constructor(e,t){this.$index=e.$index,this.data=t?e.data:null,this.size=e.size}changeIndex(e){this.$index=e}}class Nt{constructor({itemSize:e,cacheData:t,cacheOnReload:s,sizeStrategy:i},r){this.itemSize=e,this.saveData=t,this.cacheOnReload=s,this.sizeStrategy=i,this.logger=r,this.items=new Map,this.defaultSize=new Vt(e,i),this.reset(!0)}reset(e){(e=e||!this.cacheOnReload)&&(this.minIndex=1/0,this.maxIndex=-1/0,this.items.clear()),this.defaultSize.reset(e)}get size(){return this.items.size}get(e){return this.items.get(e)}getSizeByIndex(e){const t=this.get(e);return t&&t.size||this.defaultSize.get()}getDefaultSize(){return this.defaultSize.get()}recalculateDefaultSize(){return!!this.defaultSize.recalculate(this.size)&&(this.logger.log(()=>`default size has been updated: ${this.defaultSize.get()}`),!0)}add(e){let t=this.get(e.$index);return t?(this.saveData&&(t.data=e.data),t.size!==e.size&&(t.size?this.defaultSize.setExisted(t.size,e.size):this.defaultSize.setNew(e.size),t.size=e.size)):(t=new Mt(e,this.saveData),this.items.set(e.$index,t),this.defaultSize.setNew(e.size)),e.$index<this.minIndex&&(this.minIndex=e.$index),e.$index>this.maxIndex&&(this.maxIndex=e.$index),t}insertItems(e,t,s,i){const r=new Map,n=e.length;let o=1/0,a=-1/0;const l=e=>{r.set(e.$index,e),o=e.$index<o?e.$index:o,a=e.$index>a?e.$index:a};this.items.forEach(e=>{let r=0;s===z.backward?e.$index<t&&i?r=-n:e.$index>=t&&!i&&(r=n):s===z.forward&&(e.$index<=t&&i?r=-n:e.$index>t&&!i&&(r=n)),r&&e.changeIndex(e.$index+r),l(e)}),this.saveData&&e.forEach((e,r)=>{const o=t+r-(i?n:0)+(s===z.forward?1:0),a=new Mt({$index:o,data:e},this.saveData);l(a)}),this.items=r,this.minIndex=o,this.maxIndex=a}removeItems(e,t){const s=new Map;let i=1/0,r=-1/0;this.items.forEach(n=>{if(e.some(e=>e===n.$index))return void(n.size&&this.defaultSize.setRemoved(n.size));const o=t?e.reduce((e,t)=>e+(n.$index<t?1:0),0):e.reduce((e,t)=>e-(n.$index>t?1:0),0);n.changeIndex(n.$index+o),s.set(n.$index,n),i=n.$index<i?n.$index:i,r=n.$index>r?n.$index:r}),this.items=s,this.minIndex=i,this.maxIndex=r}updateSubset(e,t,s){if(!this.size||!e.length)return;const i=e[0].$index,r=e[e.length-1].$index;let n,o;if(t.length){const e=t[0].$index,s=t[t.length-1].$index;n=e-i,o=s-r}else n=s?r-i+1:0,o=s?0:i-r-1;const a=new Map;this.items.forEach(e=>e.$index<i?(e.changeIndex(e.$index+n),void a.set(e.$index,e)):e.$index>r?(e.changeIndex(e.$index+o),void a.set(e.$index,e)):void 0),t.forEach(e=>a.set(e.$index,new Mt(e,this.saveData))),e.filter(e=>e.toRemove).forEach(e=>this.defaultSize.setRemoved(e.size)),this.minIndex+=n,this.maxIndex+=o,this.items=a}shiftIndexes(e){const t=new Map;let s=1/0,i=-1/0;this.items.forEach(r=>{r.changeIndex(r.$index+e),t.set(r.$index,r),s=r.$index<s?r.$index:s,i=r.$index>i?r.$index:i}),this.items=t,this.minIndex=s,this.maxIndex=i}}class Ot{constructor(e,t){this.context=e,this.logger=t}fillEmpty(e,t,s){return e.length?Number.isInteger(t)||Number.isInteger(s)?(this.logger.log(()=>`going to fill the buffer with ${e.length} item(s)`),!0):(this.logger.log("no items to fill the buffer; wrong indexes"),!1):(this.logger.log("no items to fill the buffer; empty list"),!1)}insertInBuffer(e,t,s){const i=Number.isInteger(t)?t:Number.isInteger(s)?s:NaN,r=this.context.items.find(t=>e&&e(t.get())||Number.isInteger(i)&&i===t.$index);return r?r.$index:(this.logger.log("no items to insert in buffer; empty predicate result"),NaN)}insertVirtual(e,t,s){if(!e.length)return this.logger.log("no items to insert virtually; empty list"),!1;const{firstIndex:i,lastIndex:r,finiteAbsMinIndex:n,finiteAbsMaxIndex:o}=this.context;if(t<n||t>o)return this.logger.log(()=>`no items to insert virtually; selected index (${t}) does not match virtual area [${n}..${o}]`),!1;const a=s===z.backward;return t<i+(a?1:0)||t>r-(a?0:1)?(this.logger.log(()=>`going to insert ${e.length} item(s) virtually`),!0):(this.logger.log(`no items to insert virtually; selected index (${t}) belongs Buffer [${i}..${r}]`),!1)}}class Rt{constructor(t,s,i){this._items=[],this.logger=i,this.changeItems=s,this.bof=new e(!1),this.eof=new e(!1),this.cache=new Nt(t,i),this.checkCall=new Ot(this,i),this.startIndexUser=t.startIndex,this.minIndexUser=t.minIndex,this.maxIndexUser=t.maxIndex,this.reset(!0)}dispose(){this.bof.dispose(),this.eof.dispose(),this._items.forEach(e=>e.dispose()),this._items=[]}reset(e,t){this.items.forEach(e=>e.hide()),this.pristine=!0,this.items=[],this.cache.reset(e),this.absMinIndex=this.minIndexUser,this.absMaxIndex=this.maxIndexUser,this.setCurrentStartIndex(t),this.bof.set(!1),this.eof.set(!1),this.pristine=!1}setCurrentStartIndex(e){const t=this.minIndexUser,s=this.maxIndexUser,i=this.startIndexUser;let r=Number(e);Number.isNaN(r)&&(this.logger.log(()=>`fallback startIndex to settings.startIndex (${i})`),r=i),r<t&&(this.logger.log(()=>`setting startIndex to settings.minIndex (${t}) because ${r} < ${t}`),r=t),r>s&&(this.logger.log(()=>`setting startIndex to settings.maxIndex (${s}) because ${r} > ${s}`),r=s),this.startIndex=r}set items(e){this._items=e,this.changeItems(e),this.pristine||(this.checkBOF(),this.checkEOF())}get items(){return this._items}set absMinIndex(e){this._absMinIndex!==e&&(this._absMinIndex=Number.isFinite(this._absMaxIndex)&&e>this._absMaxIndex?this._absMaxIndex:e),this.pristine||this.checkBOF()}get absMinIndex(){return this._absMinIndex}set absMaxIndex(e){this._absMaxIndex!==e&&(this._absMaxIndex=Number.isFinite(this._absMinIndex)&&e<this._absMinIndex?this._absMinIndex:e),this.pristine||this.checkEOF()}get absMaxIndex(){return this._absMaxIndex}checkBOF(){const e=this.items.length?this.items[0].$index===this.absMinIndex:isFinite(this.absMinIndex);this.bof.set(e)}checkEOF(){const e=this.items.length?this.items[this.items.length-1].$index===this.absMaxIndex:isFinite(this.absMaxIndex);this.eof.set(e)}get size(){return this._items.length}get cacheSize(){return this.cache.size}get defaultSize(){return this.cache.getDefaultSize()}get minIndex(){return isFinite(this.cache.minIndex)?this.cache.minIndex:this.startIndex}get maxIndex(){return isFinite(this.cache.maxIndex)?this.cache.maxIndex:this.startIndex}get firstIndex(){return this.items.length?this.items[0].$index:NaN}get lastIndex(){return this.items.length?this.items[this.items.length-1].$index:NaN}get finiteAbsMinIndex(){return isFinite(this.absMinIndex)?this.absMinIndex:this.minIndex}get finiteAbsMaxIndex(){return isFinite(this.absMaxIndex)?this.absMaxIndex:this.maxIndex}get(e){return this.items.find(t=>t.$index===e)}setItems(e){if(this.items.length)if(this.items[0].$index>e[e.length-1].$index)this.items=[...e,...this.items];else{if(!(e[0].$index>this.items[this.items.length-1].$index))return!1;this.items=[...this.items,...e]}else this.items=[...e];return!0}clip(){this.items=this.items.filter(({toRemove:e})=>!e)}getIndexToInsert(e,t,s){return this.checkCall.insertInBuffer(e,t,s)}shiftExtremum(e,t){t?(this.absMinIndex-=e,this.startIndex-=e):this.absMaxIndex+=e,this.startIndex>this.absMaxIndex?this.startIndex=this.absMaxIndex:this.startIndex<this.absMinIndex&&(this.startIndex=this.absMinIndex)}insertVirtually(e,t,s,i){if(!this.checkCall.insertVirtual(e,t,s))return!1;let r=0;return t<=this.firstIndex&&!i?r=e.length:t>=this.lastIndex&&i&&(r=-e.length),r&&(this.items.forEach(e=>e.updateIndex(e.$index+r)),this.cache.insertItems(e,t,s,i),this.items=[...this.items]),this.shiftExtremum(e.length,i),!0}removeVirtually(e,t){const s=this.items.length;let i=!1;for(let r=t?s-1:0;t?r>=0:r<s;t?r--:r++){const s=this.items[r],n=e.reduce((e,i)=>e+(t?s.$index<i?1:0:s.$index>i?-1:0),0);i=i||!!n,s.updateIndex(s.$index+n)}this.shiftExtremum(-e.length,t),i&&(this.items=[...this.items]),this.cache.removeItems(e,t)}fillEmpty(e,t,s,i,r){if(!this.checkCall.fillEmpty(e,t,s))return!1;const n=Number.isInteger(t),o=n?t:s,a=i?e.length:n?1:0;return this.items=e.map((e,t)=>r(o+t+(n?0:1)-a,e)),this._absMinIndex=this.items[0].$index,this._absMaxIndex=this.items[this.size-1].$index,this.startIndex<=this.absMinIndex?this.startIndex=this.absMinIndex:this.startIndex>this.absMaxIndex&&(this.startIndex=this.absMaxIndex),!0}updateItems(e,t,s,i){if(!this.size||Number.isNaN(this.firstIndex))return{trackedIndex:NaN,toRemove:[]};let r=s,n=i?this.lastIndex:this.firstIndex;const o=[],a=i?-1:1,l=this.size-1,c=new Map,d=Array.prototype[i?"unshift":"push"];for(let h=i?l:0;i?h>=0:h<=l;h+=a){const l=this.items[h];c.set(l.$index,l);const u=e(l);if(!u||Array.isArray(u)&&!u.length){l.toRemove=!0,r+=l.$index>=s?i?1:0:i?0:-1,this.shiftExtremum(-1,i);continue}if(!Array.isArray(u)){l.updateIndex(n),d.call(o,l),n+=a;continue}l.$index<s?r+=i?0:u.length-1:l.$index>s&&(r+=i?1-u.length:0);let f=!0;const g=[];(i?[...u].reverse():u).forEach((e,i)=>{let o;l.data===e?(s===l.$index&&(r=n+i*a),l.updateIndex(n+i*a),o=l,f=!1):(o=t(n+i*a,e),o.toInsert=!0),d.call(g,o)}),l.toRemove=f,d.call(o,...g),n+=a*u.length,u.length>1&&this.shiftExtremum(u.length-1,i)}const h=this.items.filter(e=>e.toRemove),u=Array.from(c).map(([e,{size:t,toRemove:s}])=>({$index:e,size:t,toRemove:s})).sort((e,t)=>e.$index-t.$index);return this.items=o,this.cache.updateSubset(u,o,i),this.finiteAbsMinIndex===this.finiteAbsMaxIndex?r=NaN:r>this.finiteAbsMaxIndex?r=this.finiteAbsMaxIndex:r<this.finiteAbsMinIndex&&(r=this.finiteAbsMinIndex),{trackedIndex:r,toRemove:h}}cacheItem(e){this.cache.add(e)}getFirstVisibleItemIndex(){const e=this.items.length;for(let t=0;t<e;t++)if(!this.items[t].invisible)return t;return-1}getLastVisibleItemIndex(){for(let e=this.items.length-1;e>=0;e--)if(!this.items[e].invisible)return e;return-1}getFirstVisibleItem(){const e=this.getFirstVisibleItemIndex();return e>=0?this.items[e]:void 0}getLastVisibleItem(){const e=this.getLastVisibleItemIndex();return e>=0?this.items[e]:void 0}getEdgeVisibleItem(e,t){return e===(t?z.backward:z.forward)?this.getLastVisibleItem():this.getFirstVisibleItem()}getVisibleItemsCount(){return this.items.reduce((e,t)=>e+(t.invisible?0:1),0)}getSizeByIndex(e){return this.cache.getSizeByIndex(e)}checkDefaultSize(){return this.cache.recalculateDefaultSize()}}class At{get first(){return 0===this.count}constructor(t){this.total=t,this.isInitial=!1,this.busy=new e(!1)}done(){this.isInitial=!1,this.count++,this.total++,this.busy.set(!1)}start(){this.busy.set(!0)}dispose(){this.busy.dispose()}}class Ct{get loopId(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total}`}get loopIdNext(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total+1}`}constructor(t,s){const i=s?s.count:1,r=s?s.innerLoop.count:0;this.instanceIndex=t,this.innerLoop=new At(r),this.interrupter=null,this.busy=new e(!1),this.end(i)}start(e,t){this.isInitial=e,this.initiator=t,this.innerLoop.isInitial=e,this.innerLoop.count=0,this.interrupter=null,this.busy.set(!0)}end(e){this.count=e,this.isInitial=!1,this.busy.set(!1)}dispose(e){e&&this.busy.dispose(),this.innerLoop.dispose()}}class Pt{constructor(){this.reset()}reset(){this.startDelta=0,this.before=0}}class Ft{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN,this.position=NaN}}class Tt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN}}class Lt{constructor(){this.reset()}reset(){this.index=NaN,this.delta=0}}class Bt{constructor(e){this.directionPriority=e,this.callCount=0,this.positions=new Pt,this.first=new Ft,this.last=new Tt,this.firstVisible=new Lt,this.reset()}reset(){this._newItemsData=null,this.items=[],this.positions.reset(),this.first.reset(),this.last.reset(),this.firstVisible.reset(),this.hasAnotherPack=!1,this.direction=null,this.cancel=null,this.simulate=!1,this.isCheck=!1,this.doRemove=!1}get newItemsData(){return this._newItemsData}set newItemsData(e){this._newItemsData=e,e&&e.length&&this.callCount++}get shouldFetch(){return!!this.count}get hasNewItems(){return!(!this._newItemsData||!this._newItemsData.length)}get index(){return this.first.index}get count(){return isNaN(this.first.index)||isNaN(this.last.index)?0:this.last.index-this.first.index+1}shouldCheckPreSizeExpectation(e){if(this.directionPriority===z.backward)return!1;const t=this.items[this.items.length-1];return t&&t.$index<e}startSimulate(e){this.simulate=!0,this._newItemsData=e.map(e=>e.data),this.items=e,this.hasAnotherPack=!1}stopSimulate(){this.simulate=!1,this.isCheck=!1,this.doRemove=!1}fill(e,t){this.startSimulate(e),this.first.index=e[0].$index,this.last.index=e[e.length-1].$index,this.direction=z.forward,this.firstVisible.index=t,this.firstVisible.delta=0}check(e){this.startSimulate(e),this.last.index=e[0].$index,this.first.index=e[e.length-1].$index,this.isCheck=!0}update(e,t,s,i){this.startSimulate(s),this.firstVisible.index=e,this.firstVisible.delta=t,this.doRemove=i.length>0}}class Dt{get force(){return this.forceForward||this.forceBackward}constructor(){this.callCount=0,this.reset()}reset(e){this.doClip=!1,e||(this.forceForward=!1,this.forceBackward=!1)}}class jt{get noSize(){return this.sizeBefore===this.sizeAfter}constructor(){this.reset()}reset(){this.sizeBefore=0,this.sizeAfter=0,this.positionBefore=0,this.cancel=null}}class _t{constructor(){this.reset()}reset(){this.previous=null,this.current=null,this.syntheticPosition=null,this.syntheticFulfill=!1,this.positionBeforeAsync=null,this.positionBeforeAdjust=null,this.positionAfterAdjust=null,this.stop()}stop(){this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.cancelAnimation&&(this.cancelAnimation(),this.cancelAnimation=null)}hasPositionChanged(e){const t=this.positionBeforeAdjust,s=this.positionAfterAdjust;return null===t||t!==e||null===s||s!==e}}class Wt{get time(){return Number(new Date)-this.initTime}constructor(t,s,i){this.packageInfo=t,this.settings=s,this.initTime=Number(new Date),this.paused=new e(!1),this.cycle=new Ct(this.settings.instanceIndex,i?i.cycle:void 0),this.fetch=new Bt(s.directionPriority),this.clip=new Dt,this.render=new jt,this.scroll=new _t}startWorkflowCycle(e,t){this.cycle.start(e,t)}endWorkflowCycle(e){this.cycle.end(e)}startInnerLoop(){const{cycle:e,scroll:t,fetch:s,render:i,clip:r}=this;return e.innerLoop.start(),t.positionBeforeAsync=null,s.simulate||s.reset(),r.reset(r.force),i.reset(),Object.assign({},e.innerLoop.first?{process:e.initiator,doRender:s.simulate&&s.items.length>0}:{})}endInnerLoop(){const{fetch:e,clip:t,render:s,cycle:i}=this;e.stopSimulate(),t.reset(!0),e.cancel&&(e.cancel(),e.cancel=null),s.cancel&&(s.cancel(),s.cancel=null),i.innerLoop.done()}dispose(){this.scroll.stop(),this.cycle.dispose(),this.paused.dispose(),this.endInnerLoop()}}const Ut=u(),qt=Ut.filter(e=>!!e.allowedWhenPaused).map(e=>e.name),Gt=(e,t)=>!!e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),Ht=(e,t,s)=>{let i=t;if(!Gt(t,"items")){const r=Array.isArray(t)?t:[t];i=e?{items:r,bof:s}:{items:r,eof:s}}return i};class Xt{get workflow(){return this.getWorkflow()}get reloadCount(){return this.reloadCounter}get reloadId(){return this.id+"."+this.reloadCounter}getPromisifiedMethod(e,t){return new Promise(s=>{this.relax$&&this.relax$.once(e=>s(e)),e.apply(this,t)})}getWorkflowRunnerMethod(e,t){return(...s)=>{var i,r,n,l;return this.relax$?this.paused&&!qt.includes(t)?(null===(l=null===(n=this.logger)||void 0===n?void 0:n.log)||void 0===l||l.call(n,()=>"scroller is paused: "+t+" method is ignored"),Promise.resolve(a)):this.getPromisifiedMethod(e,s):(null===(r=null===(i=this.logger)||void 0===i?void 0:i.log)||void 0===r||r.call(i,()=>"scroller is not initialized: "+t+" method is ignored"),Promise.resolve(o))}}constructor(e,i,r){this.source={},this.box={},this.demand={},this.setFirstOrLastVisible=e=>{},this.getWorkflow=i,this.logger=r,this.relax$=null,this.relaxRun=null,this.reloadCounter=0;const n=(null==e?void 0:e.id)||-1,o=e&&f.get(e.id)||{};x(!0,n);const a=e?Ut.map(t=>{let s=e[t.name];if(e.augmented){const e=o[t.name];e&&(s=e.default)}return Object.assign(Object.assign({},t),{value:s})}):u();Object.entries(o).forEach(([e,t])=>{const s=a.find(({name:t})=>t===e);s&&t&&(s.value=t.default)}),a.filter(({type:e,permanent:t})=>e===s.Scalar&&t).forEach(({name:e,value:t})=>Object.defineProperty(this,e,{configurable:!0,get:()=>t})),a.filter(e=>e.type===s.Reactive).forEach(({name:e,value:t})=>{this.source[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.source[e]})});const l=e=>{if(m(e,n)){const s=[t.firstVisible,t.firstVisible$],i=[t.lastVisible,t.lastVisible$];s.some(t=>t===e.name)?this.setFirstOrLastVisible({first:!0}):i.some(t=>t===e.name)&&this.setFirstOrLastVisible({last:!0})}};a.filter(e=>e.type===s.Scalar&&!!e.reactive).forEach(e=>{const{name:t,value:s,reactive:i}=e;this.box[t]=s,Object.defineProperty(this,t,{configurable:!0,set:e=>{if(e!==this.box[t]){this.box[t]=e,this.source[i].set(e);const s=o[i];s&&s.emit(s.source,e)}},get:()=>(l(e),this.box[t])})}),a.filter(e=>e.type===s.Scalar&&e.onDemand).forEach(({name:e,value:t})=>{this.demand[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.demand[e]})}),e&&(a.forEach(i=>{const{name:r,type:n,permanent:a}=i;let c=this[r];n===s.Function?c=c.bind(this):n===s.WorkflowRunner?c=this.getWorkflowRunnerMethod(c,r):n===s.Reactive&&o[r]?c=e[r]:r===t.augmented&&(c=!0);const d=!a&&n===s.Scalar;Object.defineProperty(e,r,{configurable:!0,get:()=>(l(i),d?this[r]:c)})}),this.externalContext=e,x(!1,n))}initialize({buffer:s,state:i,viewport:r,logger:n,adapterRun$:o,getWorkflow:a}){if(Object.defineProperty(this.demand,t.itemsCount,{get:()=>s.getVisibleItemsCount()}),Object.defineProperty(this.demand,t.bufferInfo,{get:()=>({firstIndex:s.firstIndex,lastIndex:s.lastIndex,minIndex:s.minIndex,maxIndex:s.maxIndex,absMinIndex:s.absMinIndex,absMaxIndex:s.absMaxIndex,defaultSize:s.defaultSize})}),this.bof=s.bof.get(),s.bof.on(e=>this.bof=e),this.eof=s.eof.get(),s.eof.on(e=>this.eof=e),Object.defineProperty(this.demand,t.packageInfo,{get:()=>i.packageInfo}),this.loopPending=i.cycle.innerLoop.busy.get(),i.cycle.innerLoop.busy.on(e=>this.loopPending=e),this.isLoading=i.cycle.busy.get(),i.cycle.busy.on(e=>this.isLoading=e),this.paused=i.paused.get(),i.paused.on(e=>this.paused=e),this.setFirstOrLastVisible=({first:e,last:i,workflow:o})=>{var a,l,c;if(!e&&!i||(null===(a=null==o?void 0:o.call)||void 0===a?void 0:a.interrupted))return;const d=e?t.firstVisible:t.lastVisible;if(!(null===(c=p(null===(l=this.externalContext)||void 0===l?void 0:l.id))||void 0===c?void 0:c[d]))return;if(s.items.some(({element:e})=>!e))return void n.log("skipping first/lastVisible set because not all buffered items are rendered at this moment");const u=e?z.backward:z.forward,{item:f}=r.getEdgeVisibleItem(s.items,u);f&&f.element===this[d].element||(this[d]=f?f.get():h)},this.logger=n,o){this.relax$||(this.relax$=new e);const t=this.relax$;o.on(({status:e,payload:s})=>{let i=()=>{};e===ae.start?i=this.isLoading$.on(e=>{e||(i(),t.set({success:!0,immediate:!1,details:null}))}):e!==ae.done&&e!==ae.error||(i(),t.set({success:e!==ae.error,immediate:!0,details:e===ae.error&&s?String(s.error):null}))})}a&&(this.getWorkflow=a),this.init=!0}dispose(){this.relax$&&this.relax$.dispose(),this.externalContext&&this.resetContext(),Object.getOwnPropertyNames(this).forEach(e=>{delete this[e]}),this.disposed=!0}resetContext(){var e;const t=f.get(null===(e=this.externalContext)||void 0===e?void 0:e.id);Ut.forEach(({type:e,permanent:i,name:r,value:n})=>{if(e===s.Reactive||i||Object.defineProperty(this.externalContext,r,{configurable:!0,get:()=>n}),e===s.Reactive&&t){const e=t[r];e&&(e.default.reset(),e.emit(e.source,e.default.get()))}})}reset(e){this.reloadCounter++,this.logger.logAdapterMethod("reset",e,` of ${this.reloadId}`),this.workflow.call({process:oe.reset,status:ae.start,payload:{options:e}})}reload(e){this.reloadCounter++,this.logger.logAdapterMethod("reload",e,` of ${this.reloadId}`),this.workflow.call({process:oe.reload,status:ae.start,payload:{options:e}})}append(e,t){const s=Ht(!1,e,t);this.logger.logAdapterMethod("append",[s.items,s.eof]),this.workflow.call({process:oe.append,status:ae.start,payload:{options:s}})}prepend(e,t){const s=Ht(!0,e,t);this.logger.logAdapterMethod("prepend",[s.items,s.bof]),this.workflow.call({process:oe.prepend,status:ae.start,payload:{options:s}})}check(){this.logger.logAdapterMethod("check"),this.workflow.call({process:oe.check,status:ae.start})}remove(e){e=(e=>{Gt(e,"predicate")||Gt(e,"indexes")||(e={predicate:e});return e})(e),this.logger.logAdapterMethod("remove",e),this.workflow.call({process:oe.remove,status:ae.start,payload:{options:e}})}clip(e){this.logger.logAdapterMethod("clip",e),this.workflow.call({process:oe.clip,status:ae.start,payload:{options:e}})}insert(e){this.logger.logAdapterMethod("insert",e),this.workflow.call({process:oe.insert,status:ae.start,payload:{options:e}})}replace(e){this.logger.logAdapterMethod("replace",e),this.workflow.call({process:oe.replace,status:ae.start,payload:{options:e}})}update(e){this.logger.logAdapterMethod("update",e),this.workflow.call({process:oe.update,status:ae.start,payload:{options:e}})}pause(){this.logger.logAdapterMethod("pause"),this.workflow.call({process:oe.pause,status:ae.start})}resume(){this.logger.logAdapterMethod("resume"),this.workflow.call({process:oe.pause,status:ae.start,payload:{options:{resume:!0}}})}fix(e){this.logger.logAdapterMethod("fix",e),this.workflow.call({process:oe.fix,status:ae.start,payload:{options:e}})}relaxUnchained(e,t){const s=()=>"function"==typeof e&&t===this.reloadId&&e();return this.isLoading||s(),new Promise(e=>{this.isLoading?this.isLoading$.once(()=>{s(),e(!1)}):e(!0)}).then(e=>{var s,i;if(this.disposed)return{immediate:e,success:!1,details:"Adapter was disposed"};const r=t===this.reloadId;return null===(i=null===(s=this.logger)||void 0===s?void 0:s.log)||void 0===i||i.call(s,()=>r?void 0:`relax promise cancelled due to ${t} != ${this.reloadId}`),{immediate:e,success:r,details:r?null:"Interrupted by reload or reset"}})}relax(e){const t=this.reloadId;return this.logger.logAdapterMethod("relax",e,` of ${t}`),this.init?this.relaxRun=this.relaxRun?this.relaxRun.then(()=>this.relaxUnchained(e,t)):this.relaxUnchained(e,t).then(e=>(this.relaxRun=null,e)):Promise.resolve(o)}showLog(){this.logger.logAdapterMethod("showLog"),this.logger.logForce()}}const Yt="Invalid datasource:";let Jt=0;class Qt{constructor({datasource:e,consumer:t,element:s,workflow:i,Routines:r,scroller:n}){const{get:o}=D(e,U).params;if(!o.isValid)throw new Error(`${Yt} ${o.errors[0]}`);const a=n?n.state.packageInfo:{consumer:t,core:g};if(s=n?n.routines.element:s,i=n?n.workflow:i,r&&!(r.prototype instanceof St)){class e extends St{}Object.getOwnPropertyNames(r.prototype).filter(e=>"constructor"!==e).forEach(t=>e.prototype[t]=null==r?void 0:r.prototype[t]),r=e}this.workflow=i,this.settings=new Xe(e.settings,e.devSettings,++Jt),this.logger=new yt(this,a,e.adapter),this.routines=new(r||St)(s,this.settings),this.state=new Wt(a,this.settings,n?n.state:void 0),this.buffer=new Rt(this.settings,i.onDataChanged,this.logger),this.viewport=new $t(this.settings,this.routines,this.state,this.logger),this.logger.object("vscroll settings object",this.settings,!0),this.initDatasource(e,n)}initDatasource(e,t){if(t)return this.datasource=e,void(this.adapter=t.adapter);const s=e instanceof v,i=!s&&!this.settings.adapter;if(s)this.datasource=e;else{const t=y(()=>({mock:i}));this.datasource=new t(e),this.settings.adapter&&(e.adapter=this.datasource.adapter)}const r=i?null:this.datasource.adapter;this.adapter=new Xt(r,()=>this.workflow,this.logger)}init(e){this.viewport.reset(this.buffer.startIndex),this.logger.stat("initialization"),this.adapter.initialize({buffer:this.buffer,state:this.state,viewport:this.viewport,logger:this.logger,adapterRun$:e,getWorkflow:()=>this.workflow})}dispose(e){this.logger.log(()=>"disposing scroller"+(e?" (forever)":"")),e&&this.adapter.dispose(),this.buffer.dispose(),this.state.dispose()}finalize(){}}class Zt{constructor(t){const{element:s,datasource:i,consumer:r,run:n,Routines:o}=t,a=D(t,He);if(!a.isValid)throw new Error(`Invalid Workflow params: ${a.errors.join(", ")}.`);this.isInitialized=!1,this.disposed=!1,this.initTimer=null,this.adapterRun$=new e,this.cyclesDone=0,this.cyclesDone$=new e(0),this.interruptionCount=0,this.errors=[],this.offScroll=()=>null,this.propagateChanges=n,this.stateMachineMethods={run:this.runProcess(),interrupt:this.interrupt.bind(this),done:this.done.bind(this),onError:this.onError.bind(this)},this.scroller=new Qt({element:s,datasource:i,consumer:r,workflow:this.getUpdater(),Routines:o}),this.scroller.settings.initializeDelay?this.initTimer=setTimeout(()=>{this.initTimer=null,this.init()},this.scroller.settings.initializeDelay):this.init()}init(){this.scroller.init(this.adapterRun$);const{routines:e}=this.scroller;this.offScroll=e.onScroll(e=>this.callWorkflow({process:ne.scroll,status:ae.start,payload:{event:e}})),this.isInitialized=!0,this.callWorkflow({process:ne.init,status:ae.start})}changeItems(e){this.propagateChanges(e)}callWorkflow(e){if(!this.isInitialized)return;const{process:t,status:s}=e;!this.scroller.state.paused.get()||[oe.pause,oe.reset].includes(t)?(t&&t.startsWith("adapter")&&s!==ae.next&&this.adapterRun$.set(e),this.process(e)):this.scroller.logger.log("scroller is paused: "+t+" process is ignored")}getUpdater(){return{call:this.callWorkflow.bind(this),onDataChanged:this.changeItems.bind(this)}}process(e){const{status:t,process:s,payload:i}=e;this.scroller.settings.logProcessRun&&this.scroller.logger.log(()=>[...this.scroller.settings.logColor?["%cfire%c","color: #cc7777;","color: #000000;"]:["fire"],s,`"${t}"`,...void 0!==i?[i]:[]]),this.scroller.logger.logProcess(e),s===ne.end&&this.scroller.finalize(),(({input:{process:e,status:t,payload:s={}},methods:{run:i,interrupt:r,done:n,onError:o}})=>{if(t===ae.error)return o(e,s),void(e.startsWith("adapter")||i(bt)(s));const{options:a}=s;switch(e){case ne.init:t===ae.start&&i(Ze)(e),t===ae.next&&i(ft)();break;case ne.scroll:t===ae.start&&i(Ke)(s),t===ae.next&&i(Ze)(e);break;case oe.reset:case oe.reload:t===ae.start&&(e===oe.reset?i(et)(a):i(tt)(a)),t===ae.next&&(r(Object.assign({process:e},s)),s.finalize?i(bt)():i(Ze)(e));break;case oe.append:case oe.prepend:t===ae.start&&i(nt)({process:e,options:a}),t===ae.next&&i(Ze)(e);break;case oe.check:t===ae.start&&i(ot)(),t===ae.next&&i(Ze)(e);break;case oe.remove:t===ae.start&&i(at)(a),t===ae.next&&i(Ze)(e);break;case oe.clip:t===ae.start&&i(lt)(a),t===ae.next&&i(Ze)(e);break;case oe.insert:t===ae.start&&i(rt)(a),t===ae.next&&i(Ze)(e);break;case oe.replace:t===ae.start&&i(ct)(a),t===ae.next&&i(Ze)(e);break;case oe.update:t===ae.start&&i(it)(a),t===ae.next&&i(Ze)(e);break;case oe.pause:t===ae.start&&i(dt)(a),t===ae.next&&i(Ze)(e);break;case oe.fix:t===ae.start&&i(ut)(a),t===ae.next&&i(Ze)(e);break;case ne.start:switch(s.process){case oe.append:case oe.insert:case oe.replace:case oe.update:s.doRender?i(xt)():i(wt)();break;case oe.check:i(xt)();break;case oe.remove:i(wt)();break;default:i(gt)()}break;case ne.preFetch:t===ae.next&&(s.process===oe.clip?i(It)():i(pt)()),t===ae.done&&i(bt)();break;case ne.fetch:i(mt)();break;case ne.postFetch:t===ae.next&&i(xt)(),t===ae.done&&i(bt)();break;case ne.render:if(t===ae.next)switch(s.process){case oe.append:case oe.check:case oe.insert:case oe.replace:case oe.update:i(wt)();break;default:i(It)()}t===ae.done&&i(bt)();break;case ne.preClip:s.doClip?i(vt)():i(wt)();break;case ne.clip:i(wt)();break;case ne.adjust:i(bt)();break;case ne.end:if(t===ae.next)switch(s.process){case oe.reset:case oe.reload:n(),i(Ze)(s.process);break;default:i(ft)()}t===ae.done&&n()}})({input:e,methods:this.stateMachineMethods})}runProcess(){return({run:e,process:t,name:s})=>(...i)=>{this.scroller.settings.logProcessRun&&this.scroller.logger.log(()=>[...this.scroller.settings.logColor?["%crun%c","color: #333399;","color: #000000;"]:["run"],t||s,...i]),e(this.scroller,...i)}}onError(e,t){const s=t&&String(t.error)||"",{time:i,cycle:r}=this.scroller.state;this.errors.push({process:e,message:s,time:i,loop:r.loopIdNext}),this.scroller.logger.logError(s)}interrupt({process:e,finalize:t,datasource:s}){if(t){const{workflow:t,logger:s}=this.scroller;t.call=e=>s.log("[skip wf call]"),t.call.interrupted=!0,this.scroller.workflow=this.getUpdater(),this.interruptionCount++,s.log(()=>`workflow had been interrupted by the ${e} process (${this.interruptionCount})`)}if(s){const e=()=>{this.scroller.logger.log("new Scroller instantiation");const e=new Qt({datasource:s,scroller:this.scroller});this.scroller.dispose(),this.scroller=e,this.scroller.init()};this.scroller.state.cycle.busy.get()?this.scroller.adapter.relax(e.bind(this)):e()}}done(){const{state:e,logger:t}=this.scroller;this.cyclesDone++,this.cyclesDone$.set(this.cyclesDone),t.logCycle(!1),e.endWorkflowCycle(this.cyclesDone+1),this.finalize()}dispose(){this.scroller.logger.log(()=>"disposing workflow"),this.initTimer&&clearTimeout(this.initTimer),this.offScroll(),this.adapterRun$.dispose(),this.cyclesDone$.dispose(),this.scroller.dispose(!0),Object.getOwnPropertyNames(this).forEach(e=>{delete this[e]}),this.isInitialized=!1,this.disposed=!0}finalize(){}}export{t as AdapterPropName,z as Direction,h as EMPTY_ITEM,Yt as INVALID_DATASOURCE_PREFIX,St as Routines,k as SizeStrategy,Zt as Workflow,u as getDefaultAdapterProps,y as makeDatasource,g as packageInfo};
|
|
5
|
+
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.2"};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 $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: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&>.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.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 size(e){this.routines.setSizeStyle(this.element,e)}}class kt{constructor(e,t){this.settings=t,this.forward=new zt(z.forward,e),this.backward=new zt(z.backward,e)}byDirection(e,t){return e===z.backward?t?this.forward:this.backward:t?this.backward:this.forward}reset(e,t,s){const i=this.getPositiveSize(t,e,s),r=this.getNegativeSize(t);if(this.settings.inverse){this.forward.reset(r),this.backward.reset(i);const t=e-this.backward.size-s;t>0&&(this.backward.size+=t,this.forward.size-=t)}else{this.forward.reset(i),this.backward.reset(r);const t=e-this.forward.size-s;t>0&&(this.backward.size-=t,this.forward.size+=t)}}getPositiveSize(e,t,s){const{settings:i}=this;let r=t;return isFinite(i.maxIndex)&&(r=(i.maxIndex-e+1)*i.itemSize),s&&(r=Math.max(r-s,0)),r}getNegativeSize(e){const{settings:t}=this;let s=0;return isFinite(t.minIndex)&&(s=(e-t.minIndex)*t.itemSize),s}}class $t{constructor(e,t,s,i){this.settings=e,this.routines=t,this.state=s,this.logger=i,this.paddings=new kt(this.routines,e)}reset(e){this.setOffset(),this.paddings.reset(this.getSize(),e,this.offset),this.scrollPosition=this.paddings.backward.size||0,this.state.scroll.reset()}setPosition(e){if(this.scrollPosition===e)return this.logger.log(()=>["setting scroll position at",e,"[cancelled]"]),e;this.routines.setScrollPosition(e);const t=this.scrollPosition;return this.logger.log(()=>["setting scroll position at",t,...t!==e?[`(${e})`]:[]]),t}get scrollPosition(){return this.routines.getScrollPosition()}set scrollPosition(e){this.setPosition(e)}getSize(){return this.routines.getViewportSize()}getScrollableSize(){return this.routines.getScrollerSize()}getMaxScrollPosition(){return this.getScrollableSize()-this.getSize()}getBufferPadding(){return this.getSize()*this.settings.padding}getEdge(e){return this.routines.getViewportEdge(e)}setOffset(){this.offset=this.routines.getOffset()}findItemElementById(e){return this.routines.findItemElement(e)}getEdgeVisibleItem(e,t){const s=t===z.backward,i=s?z.forward:z.backward,r=this.getEdge(t);let n,o=0;for(let t=s?0:e.length-1;s?t<=e.length-1:t>=0;t+=s?1:-1){if(o=this.routines.getEdge(e[t].element,i)-r,s&&o>0||!s&&o<0){n=e[t];break}}return{item:n,index:n?n.$index:NaN,diff:o}}}class Et{constructor(){this.reset()}reset(){this.newItems=[],this.oldItems=[],this.removed=[]}}class Vt{constructor(e,t){this.itemSize=e,this.sizeStrategy=t,this.sizeMap=new Map,this.recalculation=new Et}reset(e){e&&(this.constantSize=this.itemSize,this.frequentSize=this.itemSize,this.averageSize=this.itemSize,this.averageSizeFloat=this.itemSize,this.sizeMap.clear()),this.recalculation.reset()}get(){switch(this.sizeStrategy){case k.Average:return this.averageSize;case k.Frequent:return this.frequentSize;default:return this.constantSize}}recalculateAverageSize(e){const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(t.length){const i=t.reduce((e,t)=>e+t.size,0),r=t.reduce((e,t)=>e+t.newSize,0),n=this.averageSizeFloat||0;this.averageSizeFloat=n-(i-r)/(e-s.length)}if(s.length){const t=s.reduce((e,t)=>e+t.size,0),i=this.averageSizeFloat||0;this.averageSizeFloat=((e-s.length)*i+t)/e}if(i.length){const t=i.reduce((e,t)=>e+t.size,0),s=this.averageSizeFloat||0;this.averageSizeFloat=((e+i.length)*s-t)/e}this.averageSize=Math.round(this.averageSizeFloat)}recalculateFrequentSize(){const{oldItems:e,newItems:t,removed:s}=this.recalculation,i=this.sizeMap.get(this.frequentSize);t.length&&t.forEach(({size:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1)),e.length&&(e.forEach(({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0))),e.forEach(({newSize:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1))),s.length&&s.forEach(({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0)));const r=[...this.sizeMap.entries()].sort((e,t)=>t[1]-e[1]),n=r[0][1],o=r.filter(e=>e[1]===n);o.length>1&&o.find(e=>e[0]===i)||(this.frequentSize=r[0][0])}recalculate(e){if(this.sizeStrategy===k.Constant)return!1;const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(!t.length&&!s.length&&!i.length)return!1;const r=this.get();return e?(this.sizeStrategy===k.Average?this.recalculateAverageSize(e):this.recalculateFrequentSize(),this.recalculation.reset()):this.reset(!0),this.get()!==r}setExisted(e,t){this.sizeStrategy!==k.Constant&&this.recalculation.oldItems.push({size:e,newSize:t})}setNew(e){this.sizeStrategy!==k.Constant?this.recalculation.newItems.push({size:e}):this.constantSize||(this.constantSize=e)}setRemoved(e){this.sizeStrategy!==k.Constant&&this.recalculation.removed.push({size:e})}}class Mt{constructor(e,t){this.$index=e.$index,this.data=t?e.data:null,this.size=e.size}changeIndex(e){this.$index=e}}class Nt{constructor({itemSize:e,cacheData:t,cacheOnReload:s,sizeStrategy:i},r){this.itemSize=e,this.saveData=t,this.cacheOnReload=s,this.sizeStrategy=i,this.logger=r,this.items=new Map,this.defaultSize=new Vt(e,i),this.reset(!0)}reset(e){(e=e||!this.cacheOnReload)&&(this.minIndex=1/0,this.maxIndex=-1/0,this.items.clear()),this.defaultSize.reset(e)}get size(){return this.items.size}get(e){return this.items.get(e)}getSizeByIndex(e){const t=this.get(e);return t&&t.size||this.defaultSize.get()}getDefaultSize(){return this.defaultSize.get()}recalculateDefaultSize(){return!!this.defaultSize.recalculate(this.size)&&(this.logger.log(()=>`default size has been updated: ${this.defaultSize.get()}`),!0)}add(e){let t=this.get(e.$index);return t?(this.saveData&&(t.data=e.data),t.size!==e.size&&(t.size?this.defaultSize.setExisted(t.size,e.size):this.defaultSize.setNew(e.size),t.size=e.size)):(t=new Mt(e,this.saveData),this.items.set(e.$index,t),this.defaultSize.setNew(e.size)),e.$index<this.minIndex&&(this.minIndex=e.$index),e.$index>this.maxIndex&&(this.maxIndex=e.$index),t}insertItems(e,t,s,i){const r=new Map,n=e.length;let o=1/0,a=-1/0;const l=e=>{r.set(e.$index,e),o=e.$index<o?e.$index:o,a=e.$index>a?e.$index:a};this.items.forEach(e=>{let r=0;s===z.backward?e.$index<t&&i?r=-n:e.$index>=t&&!i&&(r=n):s===z.forward&&(e.$index<=t&&i?r=-n:e.$index>t&&!i&&(r=n)),r&&e.changeIndex(e.$index+r),l(e)}),this.saveData&&e.forEach((e,r)=>{const o=t+r-(i?n:0)+(s===z.forward?1:0),a=new Mt({$index:o,data:e},this.saveData);l(a)}),this.items=r,this.minIndex=o,this.maxIndex=a}removeItems(e,t){const s=new Map;let i=1/0,r=-1/0;this.items.forEach(n=>{if(e.some(e=>e===n.$index))return void(n.size&&this.defaultSize.setRemoved(n.size));const o=t?e.reduce((e,t)=>e+(n.$index<t?1:0),0):e.reduce((e,t)=>e-(n.$index>t?1:0),0);n.changeIndex(n.$index+o),s.set(n.$index,n),i=n.$index<i?n.$index:i,r=n.$index>r?n.$index:r}),this.items=s,this.minIndex=i,this.maxIndex=r}updateSubset(e,t,s){if(!this.size||!e.length)return;const i=e[0].$index,r=e[e.length-1].$index;let n,o;if(t.length){const e=t[0].$index,s=t[t.length-1].$index;n=e-i,o=s-r}else n=s?r-i+1:0,o=s?0:i-r-1;const a=new Map;this.items.forEach(e=>e.$index<i?(e.changeIndex(e.$index+n),void a.set(e.$index,e)):e.$index>r?(e.changeIndex(e.$index+o),void a.set(e.$index,e)):void 0),t.forEach(e=>a.set(e.$index,new Mt(e,this.saveData))),e.filter(e=>e.toRemove).forEach(e=>this.defaultSize.setRemoved(e.size)),this.minIndex+=n,this.maxIndex+=o,this.items=a}shiftIndexes(e){const t=new Map;let s=1/0,i=-1/0;this.items.forEach(r=>{r.changeIndex(r.$index+e),t.set(r.$index,r),s=r.$index<s?r.$index:s,i=r.$index>i?r.$index:i}),this.items=t,this.minIndex=s,this.maxIndex=i}}class Ot{constructor(e,t){this.context=e,this.logger=t}fillEmpty(e,t,s){return e.length?Number.isInteger(t)||Number.isInteger(s)?(this.logger.log(()=>`going to fill the buffer with ${e.length} item(s)`),!0):(this.logger.log("no items to fill the buffer; wrong indexes"),!1):(this.logger.log("no items to fill the buffer; empty list"),!1)}insertInBuffer(e,t,s){const i=Number.isInteger(t)?t:Number.isInteger(s)?s:NaN,r=this.context.items.find(t=>e&&e(t.get())||Number.isInteger(i)&&i===t.$index);return r?r.$index:(this.logger.log("no items to insert in buffer; empty predicate result"),NaN)}insertVirtual(e,t,s){if(!e.length)return this.logger.log("no items to insert virtually; empty list"),!1;const{firstIndex:i,lastIndex:r,finiteAbsMinIndex:n,finiteAbsMaxIndex:o}=this.context;if(t<n||t>o)return this.logger.log(()=>`no items to insert virtually; selected index (${t}) does not match virtual area [${n}..${o}]`),!1;const a=s===z.backward;return t<i+(a?1:0)||t>r-(a?0:1)?(this.logger.log(()=>`going to insert ${e.length} item(s) virtually`),!0):(this.logger.log(`no items to insert virtually; selected index (${t}) belongs Buffer [${i}..${r}]`),!1)}}class Rt{constructor(t,s,i){this._items=[],this.logger=i,this.changeItems=s,this.bof=new e(!1),this.eof=new e(!1),this.cache=new Nt(t,i),this.checkCall=new Ot(this,i),this.startIndexUser=t.startIndex,this.minIndexUser=t.minIndex,this.maxIndexUser=t.maxIndex,this.reset(!0)}dispose(){this.bof.dispose(),this.eof.dispose(),this._items.forEach(e=>e.dispose()),this._items=[]}reset(e,t){this.items.forEach(e=>e.hide()),this.pristine=!0,this.items=[],this.cache.reset(e),this.absMinIndex=this.minIndexUser,this.absMaxIndex=this.maxIndexUser,this.setCurrentStartIndex(t),this.bof.set(!1),this.eof.set(!1),this.pristine=!1}setCurrentStartIndex(e){const t=this.minIndexUser,s=this.maxIndexUser,i=this.startIndexUser;let r=Number(e);Number.isNaN(r)&&(this.logger.log(()=>`fallback startIndex to settings.startIndex (${i})`),r=i),r<t&&(this.logger.log(()=>`setting startIndex to settings.minIndex (${t}) because ${r} < ${t}`),r=t),r>s&&(this.logger.log(()=>`setting startIndex to settings.maxIndex (${s}) because ${r} > ${s}`),r=s),this.startIndex=r}set items(e){this._items=e,this.changeItems(e),this.pristine||(this.checkBOF(),this.checkEOF())}get items(){return this._items}set absMinIndex(e){this._absMinIndex!==e&&(this._absMinIndex=Number.isFinite(this._absMaxIndex)&&e>this._absMaxIndex?this._absMaxIndex:e),this.pristine||this.checkBOF()}get absMinIndex(){return this._absMinIndex}set absMaxIndex(e){this._absMaxIndex!==e&&(this._absMaxIndex=Number.isFinite(this._absMinIndex)&&e<this._absMinIndex?this._absMinIndex:e),this.pristine||this.checkEOF()}get absMaxIndex(){return this._absMaxIndex}checkBOF(){const e=this.items.length?this.items[0].$index===this.absMinIndex:isFinite(this.absMinIndex);this.bof.set(e)}checkEOF(){const e=this.items.length?this.items[this.items.length-1].$index===this.absMaxIndex:isFinite(this.absMaxIndex);this.eof.set(e)}get size(){return this._items.length}get cacheSize(){return this.cache.size}get defaultSize(){return this.cache.getDefaultSize()}get minIndex(){return isFinite(this.cache.minIndex)?this.cache.minIndex:this.startIndex}get maxIndex(){return isFinite(this.cache.maxIndex)?this.cache.maxIndex:this.startIndex}get firstIndex(){return this.items.length?this.items[0].$index:NaN}get lastIndex(){return this.items.length?this.items[this.items.length-1].$index:NaN}get finiteAbsMinIndex(){return isFinite(this.absMinIndex)?this.absMinIndex:this.minIndex}get finiteAbsMaxIndex(){return isFinite(this.absMaxIndex)?this.absMaxIndex:this.maxIndex}get(e){return this.items.find(t=>t.$index===e)}setItems(e){if(this.items.length)if(this.items[0].$index>e[e.length-1].$index)this.items=[...e,...this.items];else{if(!(e[0].$index>this.items[this.items.length-1].$index))return!1;this.items=[...this.items,...e]}else this.items=[...e];return!0}clip(){this.items=this.items.filter(({toRemove:e})=>!e)}getIndexToInsert(e,t,s){return this.checkCall.insertInBuffer(e,t,s)}shiftExtremum(e,t){t?(this.absMinIndex-=e,this.startIndex-=e):this.absMaxIndex+=e,this.startIndex>this.absMaxIndex?this.startIndex=this.absMaxIndex:this.startIndex<this.absMinIndex&&(this.startIndex=this.absMinIndex)}insertVirtually(e,t,s,i){if(!this.checkCall.insertVirtual(e,t,s))return!1;let r=0;return t<=this.firstIndex&&!i?r=e.length:t>=this.lastIndex&&i&&(r=-e.length),r&&(this.items.forEach(e=>e.updateIndex(e.$index+r)),this.cache.insertItems(e,t,s,i),this.items=[...this.items]),this.shiftExtremum(e.length,i),!0}removeVirtually(e,t){const s=this.items.length;let i=!1;for(let r=t?s-1:0;t?r>=0:r<s;t?r--:r++){const s=this.items[r],n=e.reduce((e,i)=>e+(t?s.$index<i?1:0:s.$index>i?-1:0),0);i=i||!!n,s.updateIndex(s.$index+n)}this.shiftExtremum(-e.length,t),i&&(this.items=[...this.items]),this.cache.removeItems(e,t)}fillEmpty(e,t,s,i,r){if(!this.checkCall.fillEmpty(e,t,s))return!1;const n=Number.isInteger(t),o=n?t:s,a=i?e.length:n?1:0;return this.items=e.map((e,t)=>r(o+t+(n?0:1)-a,e)),this._absMinIndex=this.items[0].$index,this._absMaxIndex=this.items[this.size-1].$index,this.startIndex<=this.absMinIndex?this.startIndex=this.absMinIndex:this.startIndex>this.absMaxIndex&&(this.startIndex=this.absMaxIndex),!0}updateItems(e,t,s,i){if(!this.size||Number.isNaN(this.firstIndex))return{trackedIndex:NaN,toRemove:[]};let r=s,n=i?this.lastIndex:this.firstIndex;const o=[],a=i?-1:1,l=this.size-1,c=new Map,d=Array.prototype[i?"unshift":"push"];for(let h=i?l:0;i?h>=0:h<=l;h+=a){const l=this.items[h];c.set(l.$index,l);const u=e(l);if(!u||Array.isArray(u)&&!u.length){l.toRemove=!0,r+=l.$index>=s?i?1:0:i?0:-1,this.shiftExtremum(-1,i);continue}if(!Array.isArray(u)){l.updateIndex(n),d.call(o,l),n+=a;continue}l.$index<s?r+=i?0:u.length-1:l.$index>s&&(r+=i?1-u.length:0);let f=!0;const g=[];(i?[...u].reverse():u).forEach((e,i)=>{let o;l.data===e?(s===l.$index&&(r=n+i*a),l.updateIndex(n+i*a),o=l,f=!1):(o=t(n+i*a,e),o.toInsert=!0),d.call(g,o)}),l.toRemove=f,d.call(o,...g),n+=a*u.length,u.length>1&&this.shiftExtremum(u.length-1,i)}const h=this.items.filter(e=>e.toRemove),u=Array.from(c).map(([e,{size:t,toRemove:s}])=>({$index:e,size:t,toRemove:s})).sort((e,t)=>e.$index-t.$index);return this.items=o,this.cache.updateSubset(u,o,i),this.finiteAbsMinIndex===this.finiteAbsMaxIndex?r=NaN:r>this.finiteAbsMaxIndex?r=this.finiteAbsMaxIndex:r<this.finiteAbsMinIndex&&(r=this.finiteAbsMinIndex),{trackedIndex:r,toRemove:h}}cacheItem(e){this.cache.add(e)}getFirstVisibleItemIndex(){const e=this.items.length;for(let t=0;t<e;t++)if(!this.items[t].invisible)return t;return-1}getLastVisibleItemIndex(){for(let e=this.items.length-1;e>=0;e--)if(!this.items[e].invisible)return e;return-1}getFirstVisibleItem(){const e=this.getFirstVisibleItemIndex();return e>=0?this.items[e]:void 0}getLastVisibleItem(){const e=this.getLastVisibleItemIndex();return e>=0?this.items[e]:void 0}getEdgeVisibleItem(e,t){return e===(t?z.backward:z.forward)?this.getLastVisibleItem():this.getFirstVisibleItem()}getVisibleItemsCount(){return this.items.reduce((e,t)=>e+(t.invisible?0:1),0)}getSizeByIndex(e){return this.cache.getSizeByIndex(e)}checkDefaultSize(){return this.cache.recalculateDefaultSize()}}class At{get first(){return 0===this.count}constructor(t){this.total=t,this.isInitial=!1,this.busy=new e(!1)}done(){this.isInitial=!1,this.count++,this.total++,this.busy.set(!1)}start(){this.busy.set(!0)}dispose(){this.busy.dispose()}}class Ct{get loopId(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total}`}get loopIdNext(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total+1}`}constructor(t,s){const i=s?s.count:1,r=s?s.innerLoop.count:0;this.instanceIndex=t,this.innerLoop=new At(r),this.interrupter=null,this.busy=new e(!1),this.end(i)}start(e,t){this.isInitial=e,this.initiator=t,this.innerLoop.isInitial=e,this.innerLoop.count=0,this.interrupter=null,this.busy.set(!0)}end(e){this.count=e,this.isInitial=!1,this.busy.set(!1)}dispose(e){e&&this.busy.dispose(),this.innerLoop.dispose()}}class Pt{constructor(){this.reset()}reset(){this.startDelta=0,this.before=0}}class Ft{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN,this.position=NaN}}class Tt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN}}class Lt{constructor(){this.reset()}reset(){this.index=NaN,this.delta=0}}class Bt{constructor(e){this.directionPriority=e,this.callCount=0,this.positions=new Pt,this.first=new Ft,this.last=new Tt,this.firstVisible=new Lt,this.reset()}reset(){this._newItemsData=null,this.items=[],this.positions.reset(),this.first.reset(),this.last.reset(),this.firstVisible.reset(),this.hasAnotherPack=!1,this.direction=null,this.cancel=null,this.simulate=!1,this.isCheck=!1,this.doRemove=!1}get newItemsData(){return this._newItemsData}set newItemsData(e){this._newItemsData=e,e&&e.length&&this.callCount++}get shouldFetch(){return!!this.count}get hasNewItems(){return!(!this._newItemsData||!this._newItemsData.length)}get index(){return this.first.index}get count(){return isNaN(this.first.index)||isNaN(this.last.index)?0:this.last.index-this.first.index+1}shouldCheckPreSizeExpectation(e){if(this.directionPriority===z.backward)return!1;const t=this.items[this.items.length-1];return t&&t.$index<e}startSimulate(e){this.simulate=!0,this._newItemsData=e.map(e=>e.data),this.items=e,this.hasAnotherPack=!1}stopSimulate(){this.simulate=!1,this.isCheck=!1,this.doRemove=!1}fill(e,t){this.startSimulate(e),this.first.index=e[0].$index,this.last.index=e[e.length-1].$index,this.direction=z.forward,this.firstVisible.index=t,this.firstVisible.delta=0}check(e){this.startSimulate(e),this.last.index=e[0].$index,this.first.index=e[e.length-1].$index,this.isCheck=!0}update(e,t,s,i){this.startSimulate(s),this.firstVisible.index=e,this.firstVisible.delta=t,this.doRemove=i.length>0}}class Dt{get force(){return this.forceForward||this.forceBackward}constructor(){this.callCount=0,this.reset()}reset(e){this.doClip=!1,e||(this.forceForward=!1,this.forceBackward=!1)}}class jt{get noSize(){return this.sizeBefore===this.sizeAfter}constructor(){this.reset()}reset(){this.sizeBefore=0,this.sizeAfter=0,this.positionBefore=0,this.cancel=null}}class _t{constructor(){this.reset()}reset(){this.previous=null,this.current=null,this.syntheticPosition=null,this.syntheticFulfill=!1,this.positionBeforeAsync=null,this.positionBeforeAdjust=null,this.positionAfterAdjust=null,this.stop()}stop(){this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.cancelAnimation&&(this.cancelAnimation(),this.cancelAnimation=null)}hasPositionChanged(e){const t=this.positionBeforeAdjust,s=this.positionAfterAdjust;return null===t||t!==e||null===s||s!==e}}class Wt{get time(){return Number(new Date)-this.initTime}constructor(t,s,i){this.packageInfo=t,this.settings=s,this.initTime=Number(new Date),this.paused=new e(!1),this.cycle=new Ct(this.settings.instanceIndex,i?i.cycle:void 0),this.fetch=new Bt(s.directionPriority),this.clip=new Dt,this.render=new jt,this.scroll=new _t}startWorkflowCycle(e,t){this.cycle.start(e,t)}endWorkflowCycle(e){this.cycle.end(e)}startInnerLoop(){const{cycle:e,scroll:t,fetch:s,render:i,clip:r}=this;return e.innerLoop.start(),t.positionBeforeAsync=null,s.simulate||s.reset(),r.reset(r.force),i.reset(),Object.assign({},e.innerLoop.first?{process:e.initiator,doRender:s.simulate&&s.items.length>0}:{})}endInnerLoop(){const{fetch:e,clip:t,render:s,cycle:i}=this;e.stopSimulate(),t.reset(),e.cancel&&(e.cancel(),e.cancel=null),s.cancel&&(s.cancel(),s.cancel=null),i.innerLoop.done()}dispose(){this.scroll.stop(),this.cycle.dispose(),this.paused.dispose(),this.endInnerLoop()}}const Ut=u(),qt=Ut.filter(e=>!!e.allowedWhenPaused).map(e=>e.name),Gt=(e,t)=>!!e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),Ht=(e,t,s)=>{let i=t;if(!Gt(t,"items")){const r=Array.isArray(t)?t:[t];i=e?{items:r,bof:s}:{items:r,eof:s}}return i};class Xt{get workflow(){return this.getWorkflow()}get reloadCount(){return this.reloadCounter}get reloadId(){return this.id+"."+this.reloadCounter}getPromisifiedMethod(e,t){return new Promise(s=>{this.relax$&&this.relax$.once(e=>s(e)),e.apply(this,t)})}getWorkflowRunnerMethod(e,t){return(...s)=>{var i,r,n,l;return this.relax$?this.paused&&!qt.includes(t)?(null===(l=null===(n=this.logger)||void 0===n?void 0:n.log)||void 0===l||l.call(n,()=>"scroller is paused: "+t+" method is ignored"),Promise.resolve(a)):this.getPromisifiedMethod(e,s):(null===(r=null===(i=this.logger)||void 0===i?void 0:i.log)||void 0===r||r.call(i,()=>"scroller is not initialized: "+t+" method is ignored"),Promise.resolve(o))}}constructor(e,i,r){this.source={},this.box={},this.demand={},this.setFirstOrLastVisible=e=>{},this.getWorkflow=i,this.logger=r,this.relax$=null,this.relaxRun=null,this.reloadCounter=0;const n=(null==e?void 0:e.id)||-1,o=e&&f.get(e.id)||{};x(!0,n);const a=e?Ut.map(t=>{let s=e[t.name];if(e.augmented){const e=o[t.name];e&&(s=e.default)}return Object.assign(Object.assign({},t),{value:s})}):u();Object.entries(o).forEach(([e,t])=>{const s=a.find(({name:t})=>t===e);s&&t&&(s.value=t.default)}),a.filter(({type:e,permanent:t})=>e===s.Scalar&&t).forEach(({name:e,value:t})=>Object.defineProperty(this,e,{configurable:!0,get:()=>t})),a.filter(e=>e.type===s.Reactive).forEach(({name:e,value:t})=>{this.source[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.source[e]})});const l=e=>{if(m(e,n)){const s=[t.firstVisible,t.firstVisible$],i=[t.lastVisible,t.lastVisible$];s.some(t=>t===e.name)?this.setFirstOrLastVisible({first:!0}):i.some(t=>t===e.name)&&this.setFirstOrLastVisible({last:!0})}};a.filter(e=>e.type===s.Scalar&&!!e.reactive).forEach(e=>{const{name:t,value:s,reactive:i}=e;this.box[t]=s,Object.defineProperty(this,t,{configurable:!0,set:e=>{if(e!==this.box[t]){this.box[t]=e,this.source[i].set(e);const s=o[i];s&&s.emit(s.source,e)}},get:()=>(l(e),this.box[t])})}),a.filter(e=>e.type===s.Scalar&&e.onDemand).forEach(({name:e,value:t})=>{this.demand[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.demand[e]})}),e&&(a.forEach(i=>{const{name:r,type:n,permanent:a}=i;let c=this[r];n===s.Function?c=c.bind(this):n===s.WorkflowRunner?c=this.getWorkflowRunnerMethod(c,r):n===s.Reactive&&o[r]?c=e[r]:r===t.augmented&&(c=!0);const d=!a&&n===s.Scalar;Object.defineProperty(e,r,{configurable:!0,get:()=>(l(i),d?this[r]:c)})}),this.externalContext=e,x(!1,n))}initialize({buffer:s,state:i,viewport:r,logger:n,adapterRun$:o,getWorkflow:a}){if(Object.defineProperty(this.demand,t.itemsCount,{get:()=>s.getVisibleItemsCount()}),Object.defineProperty(this.demand,t.bufferInfo,{get:()=>({firstIndex:s.firstIndex,lastIndex:s.lastIndex,minIndex:s.minIndex,maxIndex:s.maxIndex,absMinIndex:s.absMinIndex,absMaxIndex:s.absMaxIndex,defaultSize:s.defaultSize})}),this.bof=s.bof.get(),s.bof.on(e=>this.bof=e),this.eof=s.eof.get(),s.eof.on(e=>this.eof=e),Object.defineProperty(this.demand,t.packageInfo,{get:()=>i.packageInfo}),this.loopPending=i.cycle.innerLoop.busy.get(),i.cycle.innerLoop.busy.on(e=>this.loopPending=e),this.isLoading=i.cycle.busy.get(),i.cycle.busy.on(e=>this.isLoading=e),this.paused=i.paused.get(),i.paused.on(e=>this.paused=e),this.setFirstOrLastVisible=({first:e,last:i,workflow:o})=>{var a,l,c;if(!e&&!i||(null===(a=null==o?void 0:o.call)||void 0===a?void 0:a.interrupted))return;const d=e?t.firstVisible:t.lastVisible;if(!(null===(c=p(null===(l=this.externalContext)||void 0===l?void 0:l.id))||void 0===c?void 0:c[d]))return;if(s.items.some(({element:e})=>!e))return void n.log("skipping first/lastVisible set because not all buffered items are rendered at this moment");const u=e?z.backward:z.forward,{item:f}=r.getEdgeVisibleItem(s.items,u);f&&f.element===this[d].element||(this[d]=f?f.get():h)},this.logger=n,o){this.relax$||(this.relax$=new e);const t=this.relax$;o.on(({status:e,payload:s})=>{let i=()=>{};e===ae.start?i=this.isLoading$.on(e=>{e||(i(),t.set({success:!0,immediate:!1,details:null}))}):e!==ae.done&&e!==ae.error||(i(),t.set({success:e!==ae.error,immediate:!0,details:e===ae.error&&s?String(s.error):null}))})}a&&(this.getWorkflow=a),this.init=!0}dispose(){this.relax$&&this.relax$.dispose(),this.externalContext&&this.resetContext(),Object.getOwnPropertyNames(this).forEach(e=>{delete this[e]}),this.disposed=!0}resetContext(){var e;const t=f.get(null===(e=this.externalContext)||void 0===e?void 0:e.id);Ut.forEach(({type:e,permanent:i,name:r,value:n})=>{if(e===s.Reactive||i||Object.defineProperty(this.externalContext,r,{configurable:!0,get:()=>n}),e===s.Reactive&&t){const e=t[r];e&&(e.default.reset(),e.emit(e.source,e.default.get()))}})}reset(e){this.reloadCounter++,this.logger.logAdapterMethod("reset",e,` of ${this.reloadId}`),this.workflow.call({process:oe.reset,status:ae.start,payload:{options:e}})}reload(e){this.reloadCounter++,this.logger.logAdapterMethod("reload",e,` of ${this.reloadId}`),this.workflow.call({process:oe.reload,status:ae.start,payload:{options:e}})}append(e,t){const s=Ht(!1,e,t);this.logger.logAdapterMethod("append",[s.items,s.eof]),this.workflow.call({process:oe.append,status:ae.start,payload:{options:s}})}prepend(e,t){const s=Ht(!0,e,t);this.logger.logAdapterMethod("prepend",[s.items,s.bof]),this.workflow.call({process:oe.prepend,status:ae.start,payload:{options:s}})}check(){this.logger.logAdapterMethod("check"),this.workflow.call({process:oe.check,status:ae.start})}remove(e){e=(e=>{Gt(e,"predicate")||Gt(e,"indexes")||(e={predicate:e});return e})(e),this.logger.logAdapterMethod("remove",e),this.workflow.call({process:oe.remove,status:ae.start,payload:{options:e}})}clip(e){this.logger.logAdapterMethod("clip",e),this.workflow.call({process:oe.clip,status:ae.start,payload:{options:e}})}insert(e){this.logger.logAdapterMethod("insert",e),this.workflow.call({process:oe.insert,status:ae.start,payload:{options:e}})}replace(e){this.logger.logAdapterMethod("replace",e),this.workflow.call({process:oe.replace,status:ae.start,payload:{options:e}})}update(e){this.logger.logAdapterMethod("update",e),this.workflow.call({process:oe.update,status:ae.start,payload:{options:e}})}pause(){this.logger.logAdapterMethod("pause"),this.workflow.call({process:oe.pause,status:ae.start})}resume(){this.logger.logAdapterMethod("resume"),this.workflow.call({process:oe.pause,status:ae.start,payload:{options:{resume:!0}}})}fix(e){this.logger.logAdapterMethod("fix",e),this.workflow.call({process:oe.fix,status:ae.start,payload:{options:e}})}relaxUnchained(e,t){const s=()=>"function"==typeof e&&t===this.reloadId&&e();return this.isLoading||s(),new Promise(e=>{this.isLoading?this.isLoading$.once(()=>{s(),e(!1)}):e(!0)}).then(e=>{var s,i;if(this.disposed)return{immediate:e,success:!1,details:"Adapter was disposed"};const r=t===this.reloadId;return null===(i=null===(s=this.logger)||void 0===s?void 0:s.log)||void 0===i||i.call(s,()=>r?void 0:`relax promise cancelled due to ${t} != ${this.reloadId}`),{immediate:e,success:r,details:r?null:"Interrupted by reload or reset"}})}relax(e){const t=this.reloadId;return this.logger.logAdapterMethod("relax",e,` of ${t}`),this.init?this.relaxRun=this.relaxRun?this.relaxRun.then(()=>this.relaxUnchained(e,t)):this.relaxUnchained(e,t).then(e=>(this.relaxRun=null,e)):Promise.resolve(o)}showLog(){this.logger.logAdapterMethod("showLog"),this.logger.logForce()}}const Yt="Invalid datasource:";let Jt=0;class Qt{constructor({datasource:e,consumer:t,element:s,workflow:i,Routines:r,scroller:n}){const{get:o}=D(e,U).params;if(!o.isValid)throw new Error(`${Yt} ${o.errors[0]}`);const a=n?n.state.packageInfo:{consumer:t,core:g};if(s=n?n.routines.element:s,i=n?n.workflow:i,r&&!(r.prototype instanceof St)){class e extends St{}Object.getOwnPropertyNames(r.prototype).filter(e=>"constructor"!==e).forEach(t=>e.prototype[t]=null==r?void 0:r.prototype[t]),r=e}this.workflow=i,this.settings=new Xe(e.settings,e.devSettings,++Jt),this.logger=new yt(this,a,e.adapter),this.routines=new(r||St)(s,this.settings),this.state=new Wt(a,this.settings,n?n.state:void 0),this.buffer=new Rt(this.settings,i.onDataChanged,this.logger),this.viewport=new $t(this.settings,this.routines,this.state,this.logger),this.logger.object("vscroll settings object",this.settings,!0),this.initDatasource(e,n)}initDatasource(e,t){if(t)return this.datasource=e,void(this.adapter=t.adapter);const s=e instanceof v,i=!s&&!this.settings.adapter;if(s)this.datasource=e;else{const t=y(()=>({mock:i}));this.datasource=new t(e),this.settings.adapter&&(e.adapter=this.datasource.adapter)}const r=i?null:this.datasource.adapter;this.adapter=new Xt(r,()=>this.workflow,this.logger)}init(e){this.viewport.reset(this.buffer.startIndex),this.logger.stat("initialization"),this.adapter.initialize({buffer:this.buffer,state:this.state,viewport:this.viewport,logger:this.logger,adapterRun$:e,getWorkflow:()=>this.workflow})}dispose(e){this.logger.log(()=>"disposing scroller"+(e?" (forever)":"")),e&&this.adapter.dispose(),this.buffer.dispose(),this.state.dispose()}finalize(){}}class Zt{constructor(t){const{element:s,datasource:i,consumer:r,run:n,Routines:o}=t,a=D(t,He);if(!a.isValid)throw new Error(`Invalid Workflow params: ${a.errors.join(", ")}.`);this.isInitialized=!1,this.disposed=!1,this.initTimer=null,this.adapterRun$=new e,this.cyclesDone=0,this.cyclesDone$=new e(0),this.interruptionCount=0,this.errors=[],this.offScroll=()=>null,this.propagateChanges=n,this.stateMachineMethods={run:this.runProcess(),interrupt:this.interrupt.bind(this),done:this.done.bind(this),onError:this.onError.bind(this)},this.scroller=new Qt({element:s,datasource:i,consumer:r,workflow:this.getUpdater(),Routines:o}),this.scroller.settings.initializeDelay?this.initTimer=setTimeout(()=>{this.initTimer=null,this.init()},this.scroller.settings.initializeDelay):this.init()}init(){this.scroller.init(this.adapterRun$);const{routines:e}=this.scroller;this.offScroll=e.onScroll(e=>this.callWorkflow({process:ne.scroll,status:ae.start,payload:{event:e}})),this.isInitialized=!0,this.callWorkflow({process:ne.init,status:ae.start})}changeItems(e){this.propagateChanges(e)}callWorkflow(e){if(!this.isInitialized)return;const{process:t,status:s}=e;!this.scroller.state.paused.get()||[oe.pause,oe.reset].includes(t)?(t&&t.startsWith("adapter")&&s!==ae.next&&this.adapterRun$.set(e),this.process(e)):this.scroller.logger.log("scroller is paused: "+t+" process is ignored")}getUpdater(){return{call:this.callWorkflow.bind(this),onDataChanged:this.changeItems.bind(this)}}process(e){const{status:t,process:s,payload:i}=e;this.scroller.settings.logProcessRun&&this.scroller.logger.log(()=>[...this.scroller.settings.logColor?["%cfire%c","color: #cc7777;","color: #000000;"]:["fire"],s,`"${t}"`,...void 0!==i?[i]:[]]),this.scroller.logger.logProcess(e),s===ne.end&&this.scroller.finalize(),(({input:{process:e,status:t,payload:s={}},methods:{run:i,interrupt:r,done:n,onError:o}})=>{if(t===ae.error)return o(e,s),void(e.startsWith("adapter")||i(bt)(s));const{options:a}=s;switch(e){case ne.init:t===ae.start&&i(Ze)(e),t===ae.next&&i(ft)();break;case ne.scroll:t===ae.start&&i(Ke)(s),t===ae.next&&i(Ze)(e);break;case oe.reset:case oe.reload:t===ae.start&&(e===oe.reset?i(et)(a):i(tt)(a)),t===ae.next&&(r(Object.assign({process:e},s)),s.finalize?i(bt)():i(Ze)(e));break;case oe.append:case oe.prepend:t===ae.start&&i(nt)({process:e,options:a}),t===ae.next&&i(Ze)(e);break;case oe.check:t===ae.start&&i(ot)(),t===ae.next&&i(Ze)(e);break;case oe.remove:t===ae.start&&i(at)(a),t===ae.next&&i(Ze)(e);break;case oe.clip:t===ae.start&&i(lt)(a),t===ae.next&&i(Ze)(e);break;case oe.insert:t===ae.start&&i(rt)(a),t===ae.next&&i(Ze)(e);break;case oe.replace:t===ae.start&&i(ct)(a),t===ae.next&&i(Ze)(e);break;case oe.update:t===ae.start&&i(it)(a),t===ae.next&&i(Ze)(e);break;case oe.pause:t===ae.start&&i(dt)(a),t===ae.next&&i(Ze)(e);break;case oe.fix:t===ae.start&&i(ut)(a),t===ae.next&&i(Ze)(e);break;case ne.start:switch(s.process){case oe.append:case oe.insert:case oe.replace:case oe.update:s.doRender?i(xt)():i(wt)();break;case oe.check:i(xt)();break;case oe.remove:i(wt)();break;default:i(gt)()}break;case ne.preFetch:t===ae.next&&(s.process===oe.clip?i(It)():i(pt)()),t===ae.done&&i(bt)();break;case ne.fetch:i(mt)();break;case ne.postFetch:t===ae.next&&i(xt)(),t===ae.done&&i(bt)();break;case ne.render:if(t===ae.next)switch(s.process){case oe.append:case oe.check:case oe.insert:case oe.replace:case oe.update:i(wt)();break;default:i(It)()}t===ae.done&&i(bt)();break;case ne.preClip:s.doClip?i(vt)():i(wt)();break;case ne.clip:i(wt)();break;case ne.adjust:i(bt)();break;case ne.end:if(t===ae.next)switch(s.process){case oe.reset:case oe.reload:n(),i(Ze)(s.process);break;default:i(ft)()}t===ae.done&&n()}})({input:e,methods:this.stateMachineMethods})}runProcess(){return({run:e,process:t,name:s})=>(...i)=>{this.scroller.settings.logProcessRun&&this.scroller.logger.log(()=>[...this.scroller.settings.logColor?["%crun%c","color: #333399;","color: #000000;"]:["run"],t||s,...i]),e(this.scroller,...i)}}onError(e,t){const s=t&&String(t.error)||"",{time:i,cycle:r}=this.scroller.state;this.errors.push({process:e,message:s,time:i,loop:r.loopIdNext}),this.scroller.logger.logError(s)}interrupt({process:e,finalize:t,datasource:s}){if(t){const{workflow:t,logger:s}=this.scroller;t.call=e=>s.log("[skip wf call]"),t.call.interrupted=!0,this.scroller.workflow=this.getUpdater(),this.interruptionCount++,s.log(()=>`workflow had been interrupted by the ${e} process (${this.interruptionCount})`)}if(s){const e=()=>{this.scroller.logger.log("new Scroller instantiation");const e=new Qt({datasource:s,scroller:this.scroller});this.scroller.dispose(),this.scroller=e,this.scroller.init()};this.scroller.state.cycle.busy.get()?this.scroller.adapter.relax(e.bind(this)):e()}}done(){const{state:e,logger:t}=this.scroller;this.cyclesDone++,this.cyclesDone$.set(this.cyclesDone),t.logCycle(!1),e.endWorkflowCycle(this.cyclesDone+1),this.finalize()}dispose(){this.scroller.logger.log(()=>"disposing workflow"),this.initTimer&&clearTimeout(this.initTimer),this.offScroll(),this.adapterRun$.dispose(),this.cyclesDone$.dispose(),this.scroller.dispose(!0),Object.getOwnPropertyNames(this).forEach(e=>{delete this[e]}),this.isInitialized=!1,this.disposed=!0}finalize(){}}export{t as AdapterPropName,z as Direction,h as EMPTY_ITEM,Yt as INVALID_DATASOURCE_PREFIX,St as Routines,k as SizeStrategy,Zt as Workflow,u as getDefaultAdapterProps,y as makeDatasource,g as packageInfo};
|
|
6
6
|
//# sourceMappingURL=vscroll.esm6.min.js.map
|