vscroll 1.4.0-beta.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/bundles/vscroll.esm5.js +383 -392
  2. package/dist/bundles/vscroll.esm5.js.map +1 -1
  3. package/dist/bundles/vscroll.esm5.min.js +2 -2
  4. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  5. package/dist/bundles/vscroll.esm6.js +337 -342
  6. package/dist/bundles/vscroll.esm6.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.min.js +2 -2
  8. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  9. package/dist/bundles/vscroll.umd.js +386 -395
  10. package/dist/bundles/vscroll.umd.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.min.js +2 -2
  12. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  13. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  14. package/dist/esm2015/classes/buffer.js +0 -16
  15. package/dist/esm2015/classes/buffer.js.map +1 -1
  16. package/dist/esm2015/classes/domRoutines.js +56 -0
  17. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  18. package/dist/esm2015/classes/item.js +4 -0
  19. package/dist/esm2015/classes/item.js.map +1 -1
  20. package/dist/esm2015/classes/paddings.js +3 -1
  21. package/dist/esm2015/classes/paddings.js.map +1 -1
  22. package/dist/esm2015/classes/state/cycle.js +7 -6
  23. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  24. package/dist/esm2015/classes/state/fetch.js +0 -12
  25. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  26. package/dist/esm2015/classes/state/render.js +1 -1
  27. package/dist/esm2015/classes/state/render.js.map +1 -1
  28. package/dist/esm2015/classes/state/scroll.js +6 -6
  29. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  30. package/dist/esm2015/classes/state.js +23 -15
  31. package/dist/esm2015/classes/state.js.map +1 -1
  32. package/dist/esm2015/classes/viewport.js +12 -29
  33. package/dist/esm2015/classes/viewport.js.map +1 -1
  34. package/dist/esm2015/interfaces/index.js.map +1 -1
  35. package/dist/esm2015/interfaces/state.js.map +1 -1
  36. package/dist/esm2015/processes/adapter/append.js +15 -74
  37. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  38. package/dist/esm2015/processes/adapter/reload.js +1 -1
  39. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  40. package/dist/esm2015/processes/adjust.js +44 -15
  41. package/dist/esm2015/processes/adjust.js.map +1 -1
  42. package/dist/esm2015/processes/end.js +18 -16
  43. package/dist/esm2015/processes/end.js.map +1 -1
  44. package/dist/esm2015/processes/fetch.js +3 -3
  45. package/dist/esm2015/processes/fetch.js.map +1 -1
  46. package/dist/esm2015/processes/init.js +2 -2
  47. package/dist/esm2015/processes/init.js.map +1 -1
  48. package/dist/esm2015/processes/render.js +8 -11
  49. package/dist/esm2015/processes/render.js.map +1 -1
  50. package/dist/esm2015/processes/scroll.js +21 -21
  51. package/dist/esm2015/processes/scroll.js.map +1 -1
  52. package/dist/esm2015/version.js +1 -1
  53. package/dist/esm2015/version.js.map +1 -1
  54. package/dist/esm2015/workflow.js +5 -6
  55. package/dist/esm2015/workflow.js.map +1 -1
  56. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  57. package/dist/esm5/classes/buffer/defaultSize.js +1 -1
  58. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  59. package/dist/esm5/classes/buffer.js +7 -23
  60. package/dist/esm5/classes/buffer.js.map +1 -1
  61. package/dist/esm5/classes/domRoutines.js +56 -0
  62. package/dist/esm5/classes/domRoutines.js.map +1 -1
  63. package/dist/esm5/classes/item.js +4 -0
  64. package/dist/esm5/classes/item.js.map +1 -1
  65. package/dist/esm5/classes/logger.js +5 -5
  66. package/dist/esm5/classes/logger.js.map +1 -1
  67. package/dist/esm5/classes/paddings.js +3 -1
  68. package/dist/esm5/classes/paddings.js.map +1 -1
  69. package/dist/esm5/classes/state/cycle.js +7 -6
  70. package/dist/esm5/classes/state/cycle.js.map +1 -1
  71. package/dist/esm5/classes/state/fetch.js +0 -12
  72. package/dist/esm5/classes/state/fetch.js.map +1 -1
  73. package/dist/esm5/classes/state/render.js +1 -1
  74. package/dist/esm5/classes/state/render.js.map +1 -1
  75. package/dist/esm5/classes/state/scroll.js +11 -11
  76. package/dist/esm5/classes/state/scroll.js.map +1 -1
  77. package/dist/esm5/classes/state.js +23 -15
  78. package/dist/esm5/classes/state.js.map +1 -1
  79. package/dist/esm5/classes/viewport.js +13 -31
  80. package/dist/esm5/classes/viewport.js.map +1 -1
  81. package/dist/esm5/inputs/validation.js +2 -2
  82. package/dist/esm5/inputs/validation.js.map +1 -1
  83. package/dist/esm5/interfaces/index.js.map +1 -1
  84. package/dist/esm5/interfaces/state.js.map +1 -1
  85. package/dist/esm5/processes/adapter/append.js +15 -75
  86. package/dist/esm5/processes/adapter/append.js.map +1 -1
  87. package/dist/esm5/processes/adapter/fix.js +1 -1
  88. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  89. package/dist/esm5/processes/adapter/insert.js +1 -1
  90. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  91. package/dist/esm5/processes/adapter/reload.js +1 -1
  92. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  93. package/dist/esm5/processes/adapter/remove.js +1 -1
  94. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  95. package/dist/esm5/processes/adjust.js +44 -15
  96. package/dist/esm5/processes/adjust.js.map +1 -1
  97. package/dist/esm5/processes/end.js +18 -16
  98. package/dist/esm5/processes/end.js.map +1 -1
  99. package/dist/esm5/processes/fetch.js +3 -3
  100. package/dist/esm5/processes/fetch.js.map +1 -1
  101. package/dist/esm5/processes/init.js +2 -2
  102. package/dist/esm5/processes/init.js.map +1 -1
  103. package/dist/esm5/processes/preFetch.js +1 -1
  104. package/dist/esm5/processes/preFetch.js.map +1 -1
  105. package/dist/esm5/processes/render.js +8 -11
  106. package/dist/esm5/processes/render.js.map +1 -1
  107. package/dist/esm5/processes/scroll.js +21 -21
  108. package/dist/esm5/processes/scroll.js.map +1 -1
  109. package/dist/esm5/version.js +1 -1
  110. package/dist/esm5/version.js.map +1 -1
  111. package/dist/esm5/workflow.js +10 -13
  112. package/dist/esm5/workflow.js.map +1 -1
  113. package/dist/typings/classes/buffer.d.ts +0 -2
  114. package/dist/typings/classes/domRoutines.d.ts +12 -0
  115. package/dist/typings/classes/item.d.ts +1 -0
  116. package/dist/typings/classes/state/cycle.d.ts +1 -1
  117. package/dist/typings/classes/state/fetch.d.ts +0 -2
  118. package/dist/typings/classes/state/render.d.ts +1 -1
  119. package/dist/typings/classes/state/scroll.d.ts +4 -4
  120. package/dist/typings/classes/state.d.ts +6 -3
  121. package/dist/typings/classes/viewport.d.ts +2 -2
  122. package/dist/typings/interfaces/index.d.ts +2 -2
  123. package/dist/typings/interfaces/state.d.ts +2 -15
  124. package/dist/typings/processes/adapter/append.d.ts +1 -4
  125. package/dist/typings/processes/adjust.d.ts +1 -0
  126. package/dist/typings/processes/end.d.ts +1 -2
  127. package/dist/typings/workflow.d.ts +1 -1
  128. package/package.json +17 -17
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vscroll (https://github.com/dhilt/vscroll) FESM5
3
- * Version: 1.4.0-beta.2 (2021-09-29T18:28:00.088Z)
3
+ * Version: 1.4.3 (2021-11-30T02:54:00.541Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -343,7 +343,7 @@ var reactiveConfigStorage = new Map();
343
343
 
344
344
  var core = {
345
345
  name: 'vscroll',
346
- version: '1.4.0-beta.2'
346
+ version: '1.4.3'
347
347
  };
348
348
 
349
349
  var instanceCount$1 = 0;
@@ -731,7 +731,7 @@ var ValidatedData = /** @class */ (function () {
731
731
  };
732
732
  ValidatedData.prototype.setValidity = function () {
733
733
  var _this = this;
734
- this.errors = Object.keys(this.params).reduce(function (acc, key) { return __spreadArray(__spreadArray([], __read(acc)), __read(_this.params[key].errors)); }, []);
734
+ this.errors = Object.keys(this.params).reduce(function (acc, key) { return __spreadArray(__spreadArray([], __read(acc), false), __read(_this.params[key].errors), false); }, []);
735
735
  this.isValid = !this.errors.length;
736
736
  };
737
737
  ValidatedData.prototype.setCommonError = function (error) {
@@ -760,7 +760,7 @@ var ValidatedData = /** @class */ (function () {
760
760
  var runValidator = function (current, validator, context) {
761
761
  var value = current.value, errors = current.errors;
762
762
  var result = validator.method(value, context);
763
- var _errors = __spreadArray(__spreadArray([], __read(errors)), __read(result.errors));
763
+ var _errors = __spreadArray(__spreadArray([], __read(errors), false), __read(result.errors), false);
764
764
  return {
765
765
  value: result.value,
766
766
  isSet: result.isSet,
@@ -1350,10 +1350,10 @@ var Init = /** @class */ (function (_super) {
1350
1350
  return _super !== null && _super.apply(this, arguments) || this;
1351
1351
  }
1352
1352
  Init.run = function (scroller, process) {
1353
- var cycle = scroller.state.cycle, workflow = scroller.workflow;
1353
+ var state = scroller.state, workflow = scroller.workflow;
1354
1354
  var isInitial = initProcesses.includes(process);
1355
1355
  scroller.logger.logCycle(true);
1356
- cycle.start(isInitial, process);
1356
+ state.startWorkflowCycle(isInitial, process);
1357
1357
  workflow.call({
1358
1358
  process: Init.process,
1359
1359
  status: ProcessStatus.next
@@ -1379,16 +1379,16 @@ var Scroll = /** @class */ (function (_super) {
1379
1379
  });
1380
1380
  };
1381
1381
  Scroll.onSynthetic = function (scroller, position) {
1382
- var scrollState = scroller.state.scrollState;
1383
- var synthPos = scrollState.syntheticPosition;
1382
+ var scroll = scroller.state.scroll;
1383
+ var synthPos = scroll.syntheticPosition;
1384
1384
  if (synthPos !== null) {
1385
- if (scrollState.syntheticFulfill) {
1386
- scrollState.syntheticPosition = null;
1385
+ if (scroll.syntheticFulfill) {
1386
+ scroll.syntheticPosition = null;
1387
1387
  }
1388
- if (!scrollState.syntheticFulfill || synthPos === position) {
1388
+ if (!scroll.syntheticFulfill || synthPos === position) {
1389
1389
  scroller.logger.log(function () { return [
1390
1390
  'skipping scroll', position,
1391
- "[" + (scrollState.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1391
+ "[" + (scroll.syntheticFulfill ? '' : 'pre-') + "synthetic]"
1392
1392
  ]; });
1393
1393
  return true;
1394
1394
  }
@@ -1399,13 +1399,13 @@ var Scroll = /** @class */ (function (_super) {
1399
1399
  return false;
1400
1400
  };
1401
1401
  Scroll.onThrottle = function (scroller, position, done) {
1402
- var scrollState = scroller.state.scrollState, throttle = scroller.settings.throttle, logger = scroller.logger;
1403
- scrollState.current = Scroll.getScrollEvent(position, scrollState.previous);
1404
- var _a = scrollState.current, direction = _a.direction, time = _a.time;
1405
- var timeDiff = scrollState.previous ? time - scrollState.previous.time : Infinity;
1402
+ var scroll = scroller.state.scroll, throttle = scroller.settings.throttle, logger = scroller.logger;
1403
+ scroll.current = Scroll.getScrollEvent(position, scroll.previous);
1404
+ var _a = scroll.current, direction = _a.direction, time = _a.time;
1405
+ var timeDiff = scroll.previous ? time - scroll.previous.time : Infinity;
1406
1406
  var delta = throttle - timeDiff;
1407
1407
  var shouldDelay = isFinite(delta) && delta > 0;
1408
- var alreadyDelayed = !!scrollState.scrollTimer;
1408
+ var alreadyDelayed = !!scroll.scrollTimer;
1409
1409
  logger.log(function () { return [
1410
1410
  direction === Direction.backward ? '\u2934' : '\u2935',
1411
1411
  position,
@@ -1413,17 +1413,17 @@ var Scroll = /** @class */ (function (_super) {
1413
1413
  shouldDelay ? (alreadyDelayed ? 'delayed' : "/ " + delta + "ms delay") : ''
1414
1414
  ]; });
1415
1415
  if (!shouldDelay) {
1416
- if (scrollState.scrollTimer) {
1417
- clearTimeout(scrollState.scrollTimer);
1418
- scrollState.scrollTimer = null;
1416
+ if (scroll.scrollTimer) {
1417
+ clearTimeout(scroll.scrollTimer);
1418
+ scroll.scrollTimer = null;
1419
1419
  }
1420
1420
  done();
1421
1421
  return;
1422
1422
  }
1423
1423
  if (!alreadyDelayed) {
1424
- scrollState.scrollTimer = setTimeout(function () {
1424
+ scroll.scrollTimer = setTimeout(function () {
1425
1425
  logger.log(function () {
1426
- var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scrollState.current);
1426
+ var curr = Scroll.getScrollEvent(scroller.viewport.scrollPosition, scroll.current);
1427
1427
  return [
1428
1428
  curr.direction === Direction.backward ? '\u2934' : '\u2935',
1429
1429
  curr.position,
@@ -1432,7 +1432,7 @@ var Scroll = /** @class */ (function (_super) {
1432
1432
  position
1433
1433
  ];
1434
1434
  });
1435
- scrollState.scrollTimer = null;
1435
+ scroll.scrollTimer = null;
1436
1436
  done();
1437
1437
  }, delta);
1438
1438
  }
@@ -1451,11 +1451,11 @@ var Scroll = /** @class */ (function (_super) {
1451
1451
  return { position: position, direction: direction, time: time };
1452
1452
  };
1453
1453
  Scroll.onScroll = function (scroller, workflow) {
1454
- var _a = scroller.state, scrollState = _a.scrollState, cycle = _a.cycle;
1455
- scrollState.previous = __assign({}, scrollState.current);
1456
- scrollState.current = null;
1454
+ var _a = scroller.state, scroll = _a.scroll, cycle = _a.cycle;
1455
+ scroll.previous = __assign({}, scroll.current);
1456
+ scroll.current = null;
1457
1457
  if (cycle.busy.get()) {
1458
- scroller.logger.log(function () { return ['skipping scroll', scrollState.previous.position, '[pending]']; });
1458
+ scroller.logger.log(function () { return ['skipping scroll', scroll.previous.position, '[pending]']; });
1459
1459
  return;
1460
1460
  }
1461
1461
  workflow.call({
@@ -1516,7 +1516,7 @@ var Reload = /** @class */ (function (_super) {
1516
1516
  viewport.reset(buffer.startIndex);
1517
1517
  var payload = {};
1518
1518
  if (state.cycle.busy.get()) {
1519
- state.scrollState.cleanupTimers();
1519
+ state.scroll.stop();
1520
1520
  payload.finalize = true;
1521
1521
  state.cycle.interrupter = Reload.process;
1522
1522
  }
@@ -1581,6 +1581,10 @@ var Item = /** @class */ (function () {
1581
1581
  this.size = this.routines.getSize(this.element);
1582
1582
  }
1583
1583
  };
1584
+ Item.prototype.makeVisible = function () {
1585
+ this.routines.makeElementVisible(this.element);
1586
+ this.invisible = false;
1587
+ };
1584
1588
  Item.prototype.hide = function () {
1585
1589
  if (this.element) {
1586
1590
  this.routines.hideElement(this.element);
@@ -1656,52 +1660,70 @@ var Update = /** @class */ (function (_super) {
1656
1660
  return Update;
1657
1661
  }(BaseAdapterProcessFactory(AdapterProcess.update)));
1658
1662
 
1659
- var Append = /** @class */ (function (_super) {
1660
- __extends(Append, _super);
1661
- function Append() {
1663
+ var Insert = /** @class */ (function (_super) {
1664
+ __extends(Insert, _super);
1665
+ function Insert() {
1662
1666
  return _super !== null && _super.apply(this, arguments) || this;
1663
1667
  }
1664
- Append.run = function (scroller, _a) {
1665
- var process = _a.process, options = _a.options;
1666
- var params = Append.parseInput(scroller, options, false, process).params;
1668
+ Insert.run = function (scroller, options) {
1669
+ var params = Insert.parseInput(scroller, options).params;
1667
1670
  if (!params) {
1668
1671
  return;
1669
1672
  }
1670
- var shouldAppend = Append.doAppend(scroller, params, process !== AdapterProcess.append);
1673
+ var shouldInsert = Insert.doInsert(scroller, params);
1671
1674
  scroller.workflow.call({
1672
- process: Append.process,
1673
- status: shouldAppend ? ProcessStatus.next : ProcessStatus.done
1675
+ process: Insert.process,
1676
+ status: shouldInsert ? ProcessStatus.next : ProcessStatus.done
1674
1677
  });
1675
1678
  };
1676
- Append.doAppend = function (scroller, params, prepend) {
1677
- var buffer = scroller.buffer;
1678
- var items = params.items, bof = params.bof, eof = params.eof, increase = params.increase, decrease = params.decrease;
1679
- var fixRight = (prepend && !increase) || (!prepend && !!decrease);
1680
- var result = false;
1681
- if ((prepend && bof && !buffer.bof.get()) || (!prepend && eof && !buffer.eof.get())) {
1682
- result = Append.doVirtual(scroller, items, prepend, fixRight);
1683
- }
1684
- else {
1685
- if (!buffer.size) {
1686
- result = Append.doEmpty(scroller, items, prepend, fixRight);
1687
- }
1688
- else {
1689
- result = Append.doRegular(scroller, items, prepend, fixRight);
1679
+ Insert.doInsert = function (scroller, params) {
1680
+ if (!Insert.insertEmpty(scroller, params)) {
1681
+ if (!Insert.insertInBuffer(scroller, params)) {
1682
+ if (!Insert.insertVirtually(scroller, params)) {
1683
+ return false;
1684
+ }
1690
1685
  }
1691
1686
  }
1692
- return result;
1687
+ return true;
1693
1688
  };
1694
- Append.doVirtual = function (scroller, items, prepend, fixRight) {
1695
- var buffer = scroller.buffer, logger = scroller.logger, viewport = scroller.viewport, fetch = scroller.state.fetch;
1696
- var absIndexToken = fixRight ? 'absMinIndex' : 'absMaxIndex';
1697
- if (!isFinite(buffer[absIndexToken])) {
1689
+ Insert.insertEmpty = function (scroller, params) {
1690
+ var buffer = scroller.buffer, routines = scroller.routines, fetch = scroller.state.fetch;
1691
+ if (buffer.size) {
1698
1692
  return false;
1699
1693
  }
1700
- if (prepend) {
1701
- buffer.prependVirtually(items.length, fixRight);
1694
+ var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1695
+ if (!buffer.fillEmpty(items, beforeIndex, afterIndex, !!decrease, function (index, data) { return new Item(index, data, routines); })) {
1696
+ return false;
1702
1697
  }
1703
- else {
1704
- buffer.appendVirtually(items.length, fixRight);
1698
+ fetch.fill(buffer.items, buffer.startIndex);
1699
+ return true;
1700
+ };
1701
+ Insert.insertInBuffer = function (scroller, params) {
1702
+ var before = params.before, after = params.after, beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1703
+ var indexToInsert = scroller.buffer.getIndexToInsert(before || after, beforeIndex, afterIndex);
1704
+ if (isNaN(indexToInsert)) {
1705
+ return false;
1706
+ }
1707
+ var isBackward = Number.isInteger(beforeIndex) || before;
1708
+ var updateOptions = {
1709
+ predicate: function (_a) {
1710
+ var $index = _a.$index, data = _a.data;
1711
+ if (indexToInsert === $index) {
1712
+ return isBackward ? __spreadArray(__spreadArray([], __read(items), false), [data], false) : __spreadArray([data], __read(items), false);
1713
+ }
1714
+ return true;
1715
+ },
1716
+ fixRight: decrease
1717
+ };
1718
+ return Update.doUpdate(scroller, updateOptions);
1719
+ };
1720
+ Insert.insertVirtually = function (scroller, params) {
1721
+ var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1722
+ var buffer = scroller.buffer, fetch = scroller.state.fetch, viewport = scroller.viewport;
1723
+ var direction = Number.isInteger(beforeIndex) ? Direction.backward : Direction.forward;
1724
+ var indexToInsert = (direction === Direction.backward ? beforeIndex : afterIndex);
1725
+ if (!buffer.insertVirtually(items, indexToInsert, direction, !!decrease)) {
1726
+ return false;
1705
1727
  }
1706
1728
  var _a = viewport.getEdgeVisibleItem(buffer.items, Direction.backward), index = _a.index, diff = _a.diff;
1707
1729
  fetch.firstVisible.index = index;
@@ -1709,47 +1731,47 @@ var Append = /** @class */ (function (_super) {
1709
1731
  fetch.simulate = true;
1710
1732
  fetch.firstVisible.delta = -buffer.getSizeByIndex(index) + diff;
1711
1733
  }
1712
- logger.log(function () { return "buffer." + [absIndexToken] + " value is set to " + buffer[absIndexToken]; });
1713
- logger.stat("after virtual " + (prepend ? 'prepend' : 'append'));
1714
1734
  return true;
1715
1735
  };
1716
- Append.doEmpty = function (scroller, items, prepend, fixRight) {
1717
- var buffer = scroller.buffer, fetch = scroller.state.fetch;
1718
- var absIndexToken = fixRight ? 'absMinIndex' : 'absMaxIndex';
1719
- var shift = prepend && !fixRight ? items.length - 1 : (!prepend && fixRight ? 1 - items.length : 0);
1720
- var bufferLimit = buffer[absIndexToken] + (fixRight ? -1 : 1) * (items.length - 1);
1721
- var newItems = [];
1722
- var startIndex = buffer[prepend ? 'minIndex' : 'maxIndex'];
1723
- var index = startIndex;
1724
- items.forEach(function (item) {
1725
- var newItem = new Item(index + shift, item, scroller.routines);
1726
- Array.prototype[prepend ? 'unshift' : 'push'].call(newItems, newItem);
1727
- index += (prepend ? -1 : 1);
1736
+ return Insert;
1737
+ }(BaseAdapterProcessFactory(AdapterProcess.insert)));
1738
+
1739
+ var Append = /** @class */ (function (_super) {
1740
+ __extends(Append, _super);
1741
+ function Append() {
1742
+ return _super !== null && _super.apply(this, arguments) || this;
1743
+ }
1744
+ Append.run = function (scroller, _a) {
1745
+ var process = _a.process, options = _a.options;
1746
+ var params = Append.parseInput(scroller, options, false, process).params;
1747
+ if (!params) {
1748
+ return;
1749
+ }
1750
+ var shouldAppend = Append.doAppend(scroller, process, params);
1751
+ scroller.workflow.call({
1752
+ process: Append.process,
1753
+ status: shouldAppend ? ProcessStatus.next : ProcessStatus.done
1728
1754
  });
1729
- if (bufferLimit !== buffer[absIndexToken]) {
1730
- buffer[absIndexToken] = bufferLimit;
1731
- scroller.logger.log(function () { return "buffer." + absIndexToken + " value is set to " + buffer[absIndexToken]; });
1732
- }
1733
- (prepend ? fetch.prepend : fetch.append).call(fetch, newItems);
1734
- buffer.setItems(newItems);
1735
- fetch.first.indexBuffer = !isNaN(buffer.firstIndex) ? buffer.firstIndex : index;
1736
- fetch.last.indexBuffer = !isNaN(buffer.lastIndex) ? buffer.lastIndex : index;
1737
- fetch.firstVisible.index = startIndex;
1738
- return true;
1739
1755
  };
1740
- Append.doRegular = function (scroller, items, prepend, fixRight) {
1741
- var index = scroller.buffer[prepend ? 'firstIndex' : 'lastIndex'];
1742
- var updateOptions = {
1743
- predicate: function (_a) {
1744
- var $index = _a.$index, data = _a.data;
1745
- if ($index === index) {
1746
- return prepend ? __spreadArray(__spreadArray([], __read(items.reverse())), [data]) : __spreadArray([data], __read(items));
1747
- }
1748
- return true;
1749
- },
1750
- fixRight: fixRight
1751
- };
1752
- return Update.doUpdate(scroller, updateOptions);
1756
+ Append.doAppend = function (scroller, process, params) {
1757
+ var bof = params.bof, eof = params.eof, increase = params.increase, decrease = params.decrease;
1758
+ var buffer = scroller.buffer;
1759
+ var prepend = process === AdapterProcess.prepend;
1760
+ var opposite = prepend ? !increase : decrease;
1761
+ var beforeIndex, afterIndex, items = params.items;
1762
+ if (prepend) {
1763
+ beforeIndex = (bof ? buffer.absMinIndex : buffer.minIndex) + (!buffer.size ? 1 : 0);
1764
+ items = __spreadArray([], __read(items), false).reverse();
1765
+ }
1766
+ else {
1767
+ afterIndex = (eof ? buffer.absMaxIndex : buffer.maxIndex) - (!buffer.size && !opposite ? 1 : 0);
1768
+ }
1769
+ return Insert.doInsert(scroller, {
1770
+ items: items,
1771
+ beforeIndex: beforeIndex,
1772
+ afterIndex: afterIndex,
1773
+ decrease: opposite
1774
+ });
1753
1775
  };
1754
1776
  return Append;
1755
1777
  }(BaseAdapterProcessFactory(AdapterProcess.append)));
@@ -1842,7 +1864,7 @@ var Remove = /** @class */ (function (_super) {
1842
1864
  (!!indexes && indexes.includes(item.$index));
1843
1865
  };
1844
1866
  var indexesToRemove = scroller.buffer.items.reduce(function (acc, item) {
1845
- return newPredicate(item) ? __spreadArray(__spreadArray([], __read(acc)), [item.$index]) : acc;
1867
+ return newPredicate(item) ? __spreadArray(__spreadArray([], __read(acc), false), [item.$index], false) : acc;
1846
1868
  }, []);
1847
1869
  var updateOptions = {
1848
1870
  predicate: function (item) { return !newPredicate(item); },
@@ -1918,82 +1940,6 @@ var UserClip = /** @class */ (function (_super) {
1918
1940
  return UserClip;
1919
1941
  }(BaseAdapterProcessFactory(AdapterProcess.clip)));
1920
1942
 
1921
- var Insert = /** @class */ (function (_super) {
1922
- __extends(Insert, _super);
1923
- function Insert() {
1924
- return _super !== null && _super.apply(this, arguments) || this;
1925
- }
1926
- Insert.run = function (scroller, options) {
1927
- var params = Insert.parseInput(scroller, options).params;
1928
- if (!params) {
1929
- return;
1930
- }
1931
- var shouldInsert = Insert.doInsert(scroller, params);
1932
- scroller.workflow.call({
1933
- process: Insert.process,
1934
- status: shouldInsert ? ProcessStatus.next : ProcessStatus.done
1935
- });
1936
- };
1937
- Insert.doInsert = function (scroller, params) {
1938
- if (!Insert.insertEmpty(scroller, params)) {
1939
- if (!Insert.insertInBuffer(scroller, params)) {
1940
- if (!Insert.insertVirtually(scroller, params)) {
1941
- return false;
1942
- }
1943
- }
1944
- }
1945
- return true;
1946
- };
1947
- Insert.insertEmpty = function (scroller, params) {
1948
- var buffer = scroller.buffer, routines = scroller.routines, fetch = scroller.state.fetch;
1949
- if (buffer.size) {
1950
- return false;
1951
- }
1952
- var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1953
- if (!buffer.fillEmpty(items, beforeIndex, afterIndex, !!decrease, function (index, data) { return new Item(index, data, routines); })) {
1954
- return false;
1955
- }
1956
- fetch.fill(buffer.items, buffer.startIndex);
1957
- return true;
1958
- };
1959
- Insert.insertInBuffer = function (scroller, params) {
1960
- var before = params.before, after = params.after, beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1961
- var indexToInsert = scroller.buffer.getIndexToInsert(before || after, beforeIndex, afterIndex);
1962
- if (isNaN(indexToInsert)) {
1963
- return false;
1964
- }
1965
- var isBackward = Number.isInteger(beforeIndex) || before;
1966
- var updateOptions = {
1967
- predicate: function (_a) {
1968
- var $index = _a.$index, data = _a.data;
1969
- if (indexToInsert === $index) {
1970
- return isBackward ? __spreadArray(__spreadArray([], __read(items)), [data]) : __spreadArray([data], __read(items));
1971
- }
1972
- return true;
1973
- },
1974
- fixRight: decrease
1975
- };
1976
- return Update.doUpdate(scroller, updateOptions);
1977
- };
1978
- Insert.insertVirtually = function (scroller, params) {
1979
- var beforeIndex = params.beforeIndex, afterIndex = params.afterIndex, items = params.items, decrease = params.decrease;
1980
- var buffer = scroller.buffer, fetch = scroller.state.fetch, viewport = scroller.viewport;
1981
- var direction = Number.isInteger(beforeIndex) ? Direction.backward : Direction.forward;
1982
- var indexToInsert = (direction === Direction.backward ? beforeIndex : afterIndex);
1983
- if (!buffer.insertVirtually(items, indexToInsert, direction, !!decrease)) {
1984
- return false;
1985
- }
1986
- var _a = viewport.getEdgeVisibleItem(buffer.items, Direction.backward), index = _a.index, diff = _a.diff;
1987
- fetch.firstVisible.index = index;
1988
- if (!isNaN(index)) {
1989
- fetch.simulate = true;
1990
- fetch.firstVisible.delta = -buffer.getSizeByIndex(index) + diff;
1991
- }
1992
- return true;
1993
- };
1994
- return Insert;
1995
- }(BaseAdapterProcessFactory(AdapterProcess.insert)));
1996
-
1997
1943
  var Replace = /** @class */ (function (_super) {
1998
1944
  __extends(Replace, _super);
1999
1945
  function Replace() {
@@ -2110,7 +2056,7 @@ var Fix = /** @class */ (function (_super) {
2110
2056
  buffer.items.forEach(function (item) { return value(item.get(), updater); });
2111
2057
  if (updateReference) {
2112
2058
  logger.log(function () { return 'update Buffer.items reference'; });
2113
- buffer.items = __spreadArray([], __read(buffer.items));
2059
+ buffer.items = __spreadArray([], __read(buffer.items), false);
2114
2060
  }
2115
2061
  };
2116
2062
  Fix.scrollToItem = function (scroller, value, options) {
@@ -2195,7 +2141,7 @@ var PreFetch = /** @class */ (function (_super) {
2195
2141
  }
2196
2142
  scroller.logger.log(function () { return __spreadArray([
2197
2143
  "start delta is " + startDelta
2198
- ], __read((offset ? [" (+" + offset + " offset)"] : []))); });
2144
+ ], __read((offset ? [" (+" + offset + " offset)"] : [])), false); });
2199
2145
  return startDelta;
2200
2146
  };
2201
2147
  PreFetch.setFirstIndex = function (scroller) {
@@ -2425,9 +2371,9 @@ var Fetch = /** @class */ (function (_super) {
2425
2371
  }
2426
2372
  }
2427
2373
  else {
2428
- var _b = scroller.state, scrollState = _b.scrollState, fetch_1 = _b.fetch, viewport = scroller.viewport;
2429
- if (scrollState.positionBeforeAsync === null) {
2430
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2374
+ var _b = scroller.state, scroll_1 = _b.scroll, fetch_1 = _b.fetch, viewport = scroller.viewport;
2375
+ if (scroll_1.positionBeforeAsync === null) {
2376
+ scroll_1.positionBeforeAsync = viewport.scrollPosition;
2431
2377
  }
2432
2378
  fetch_1.cancel = function () {
2433
2379
  box.success = function () { return null; };
@@ -2559,13 +2505,13 @@ var Render = /** @class */ (function (_super) {
2559
2505
  return _super !== null && _super.apply(this, arguments) || this;
2560
2506
  }
2561
2507
  Render.run = function (scroller) {
2562
- var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scrollState = _a.scrollState, viewport = scroller.viewport;
2508
+ var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, viewport = scroller.viewport, routines = scroller.routines;
2563
2509
  scroller.logger.stat('before new items render');
2564
- if (scrollState.positionBeforeAsync === null) {
2565
- scrollState.positionBeforeAsync = viewport.scrollPosition;
2510
+ if (scroll.positionBeforeAsync === null) {
2511
+ scroll.positionBeforeAsync = viewport.scrollPosition;
2566
2512
  }
2567
- render.renderTimer = setTimeout(function () {
2568
- render.renderTimer = null;
2513
+ render.cancel = routines.render(function () {
2514
+ render.cancel = null;
2569
2515
  if (Render.doRender(scroller)) {
2570
2516
  workflow.call({
2571
2517
  process: Render.process,
@@ -2580,7 +2526,7 @@ var Render = /** @class */ (function (_super) {
2580
2526
  payload: { error: 'Can\'t associate item with element' }
2581
2527
  });
2582
2528
  }
2583
- }, 0);
2529
+ });
2584
2530
  };
2585
2531
  Render.doRender = function (scroller) {
2586
2532
  var _a = scroller.state, fetch = _a.fetch, render = _a.render, viewport = scroller.viewport, buffer = scroller.buffer, logger = scroller.logger;
@@ -2601,15 +2547,12 @@ var Render = /** @class */ (function (_super) {
2601
2547
  };
2602
2548
  Render.processElement = function (scroller, item) {
2603
2549
  var viewport = scroller.viewport, buffer = scroller.buffer;
2604
- var element = viewport.element.querySelector("[data-sid=\"" + item.nodeId + "\"]");
2550
+ var element = viewport.findItemElementById(item.nodeId);
2605
2551
  if (!element) {
2606
2552
  return false;
2607
2553
  }
2608
2554
  item.element = element;
2609
- item.element.style.left = '';
2610
- item.element.style.top = '';
2611
- item.element.style.position = '';
2612
- item.invisible = false;
2555
+ item.makeVisible();
2613
2556
  item.setSize(buffer.getSizeByIndex(item.$index));
2614
2557
  buffer.cacheItem(item);
2615
2558
  return true;
@@ -2617,18 +2560,92 @@ var Render = /** @class */ (function (_super) {
2617
2560
  return Render;
2618
2561
  }(BaseProcessFactory(CommonProcess.render)));
2619
2562
 
2563
+ var isInterrupted = function (_a) {
2564
+ var call = _a.call;
2565
+ return !!call.interrupted;
2566
+ };
2567
+ var End = /** @class */ (function (_super) {
2568
+ __extends(End, _super);
2569
+ function End() {
2570
+ return _super !== null && _super.apply(this, arguments) || this;
2571
+ }
2572
+ End.run = function (scroller, _a) {
2573
+ var _b = _a === void 0 ? {} : _a, error = _b.error;
2574
+ var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2575
+ if (!error && !interrupter) {
2576
+ // set out params accessible via Adapter
2577
+ End.calculateParams(scroller, workflow);
2578
+ }
2579
+ // explicit interruption for we don't want to go through the inner loop finalizing
2580
+ if (isInterrupted(workflow)) {
2581
+ workflow.call({ process: End.process, status: ProcessStatus.done });
2582
+ return;
2583
+ }
2584
+ var next = End.shouldContinueRun(scroller, error);
2585
+ scroller.state.endInnerLoop();
2586
+ workflow.call({
2587
+ process: End.process,
2588
+ status: next ? ProcessStatus.next : ProcessStatus.done,
2589
+ payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2590
+ });
2591
+ };
2592
+ End.calculateParams = function (scroller, workflow) {
2593
+ var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2594
+ if (adapter.wanted.firstVisible) {
2595
+ var item = viewport.getEdgeVisibleItem(items, Direction.backward).item;
2596
+ if (!item || item.element !== adapter.firstVisible.element) {
2597
+ adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2598
+ }
2599
+ }
2600
+ // the workflow can be interrupter on firstVisible change
2601
+ if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2602
+ var item = viewport.getEdgeVisibleItem(items, Direction.forward).item;
2603
+ if (!item || item.element !== adapter.lastVisible.element) {
2604
+ adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2605
+ }
2606
+ }
2607
+ };
2608
+ End.shouldContinueRun = function (scroller, error) {
2609
+ var _a = scroller.state, cycle = _a.cycle, fetch = _a.fetch, render = _a.render;
2610
+ // Adapter.reload or Adapter.reset
2611
+ if (cycle.interrupter) {
2612
+ return true;
2613
+ }
2614
+ // critical error
2615
+ if (error) {
2616
+ return false;
2617
+ }
2618
+ // Adapter.check
2619
+ if (fetch.simulate && fetch.isCheck && !render.noSize) {
2620
+ return true;
2621
+ }
2622
+ // Adapter.remove or Adapter.update with clip
2623
+ if (fetch.simulate && fetch.doRemove) {
2624
+ return true;
2625
+ }
2626
+ // common inner loop (App start, scroll, Adapter.clip) with full fetch
2627
+ if (!fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2628
+ return true;
2629
+ }
2630
+ return false;
2631
+ };
2632
+ return End;
2633
+ }(BaseProcessFactory(CommonProcess.end)));
2634
+
2620
2635
  var Adjust = /** @class */ (function (_super) {
2621
2636
  __extends(Adjust, _super);
2622
2637
  function Adjust() {
2623
2638
  return _super !== null && _super.apply(this, arguments) || this;
2624
2639
  }
2625
2640
  Adjust.run = function (scroller) {
2626
- var workflow = scroller.workflow, viewport = scroller.viewport, scrollState = scroller.state.scrollState;
2627
- scrollState.positionBeforeAdjust = viewport.scrollPosition;
2641
+ var workflow = scroller.workflow, viewport = scroller.viewport, scroll = scroller.state.scroll;
2642
+ scroll.positionBeforeAdjust = viewport.scrollPosition;
2628
2643
  Adjust.setPaddings(scroller);
2629
- scrollState.positionAfterAdjust = viewport.scrollPosition;
2644
+ scroll.positionAfterAdjust = viewport.scrollPosition;
2630
2645
  // scroll position adjustments
2631
2646
  var position = Adjust.calculatePosition(scroller);
2647
+ // additional adjustment if the position can't be reached during the initial cycle
2648
+ Adjust.setAdditionalForwardPadding(scroller, position);
2632
2649
  // set new position using animation frame
2633
2650
  Adjust.setPosition(scroller, position, function () {
2634
2651
  return workflow.call({
@@ -2661,7 +2678,8 @@ var Adjust = /** @class */ (function (_super) {
2661
2678
  }
2662
2679
  // lack of items case
2663
2680
  var bufferSize = viewport.getScrollableSize() - forward.size - backward.size;
2664
- var viewportSizeDiff = viewport.getSize() - (bwdSize + bufferSize + fwdSize);
2681
+ var scrollSize = bwdSize + bufferSize + fwdSize;
2682
+ var viewportSizeDiff = viewport.getSize() - scrollSize;
2665
2683
  if (viewportSizeDiff > 0) {
2666
2684
  if (inverse) {
2667
2685
  bwdSize += viewportSizeDiff;
@@ -2678,7 +2696,7 @@ var Adjust = /** @class */ (function (_super) {
2678
2696
  scroller.logger.stat('after paddings adjustments');
2679
2697
  };
2680
2698
  Adjust.calculatePosition = function (scroller) {
2681
- var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scrollState = _a.scrollState;
2699
+ var viewport = scroller.viewport, buffer = scroller.buffer, _a = scroller.state, fetch = _a.fetch, render = _a.render, scroll = _a.scroll;
2682
2700
  var position = viewport.paddings.backward.size;
2683
2701
  // increase the position to meet the expectation of the first visible item
2684
2702
  if (!isNaN(fetch.firstVisible.index) && !isNaN(buffer.firstIndex)) {
@@ -2701,8 +2719,8 @@ var Adjust = /** @class */ (function (_super) {
2701
2719
  });
2702
2720
  }
2703
2721
  // slow fetch/render case
2704
- if (scrollState.positionBeforeAsync !== null) {
2705
- var diff = render.positionBefore - scrollState.positionBeforeAsync;
2722
+ if (scroll.positionBeforeAsync !== null) {
2723
+ var diff = render.positionBefore - scroll.positionBeforeAsync;
2706
2724
  if (diff !== 0) {
2707
2725
  scroller.logger.log("shift position due to fetch-render difference (" + diff + ")");
2708
2726
  position += diff;
@@ -2714,22 +2732,47 @@ var Adjust = /** @class */ (function (_super) {
2714
2732
  }
2715
2733
  return Math.round(position);
2716
2734
  };
2735
+ Adjust.setAdditionalForwardPadding = function (scroller, position) {
2736
+ var viewport = scroller.viewport, buffer = scroller.buffer, cycle = scroller.state.cycle;
2737
+ if (!cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
2738
+ return;
2739
+ }
2740
+ var diff = position - viewport.getMaxScrollPosition();
2741
+ if (diff <= 0) {
2742
+ return;
2743
+ }
2744
+ var last = buffer.getLastVisibleItem();
2745
+ if (!last) {
2746
+ return;
2747
+ }
2748
+ var size = 0;
2749
+ var index = last.$index + 1;
2750
+ while (size <= diff && index <= buffer.absMaxIndex) {
2751
+ size += buffer.getSizeByIndex(index++);
2752
+ }
2753
+ var shift = Math.min(size, diff);
2754
+ if (shift) {
2755
+ viewport.paddings.forward.size += shift;
2756
+ scroller.logger.log("increase fwd padding due to lack of items (" + diff + " -> " + shift + ")");
2757
+ }
2758
+ };
2717
2759
  Adjust.setPosition = function (scroller, position, done) {
2718
- var scrollState = scroller.state.scrollState, viewport = scroller.viewport;
2719
- if (!scrollState.hasPositionChanged(position)) {
2760
+ var scroll = scroller.state.scroll, viewport = scroller.viewport, routines = scroller.routines;
2761
+ if (!scroll.hasPositionChanged(position)) {
2720
2762
  return done();
2721
2763
  }
2722
- scrollState.syntheticPosition = position;
2723
- scrollState.syntheticFulfill = false;
2724
- scrollState.animationFrameId = requestAnimationFrame(function () {
2725
- var inertiaDiff = scrollState.positionAfterAdjust - viewport.scrollPosition;
2764
+ scroll.syntheticPosition = position;
2765
+ scroll.syntheticFulfill = false;
2766
+ scroll.cancelAnimation = routines.animate(function () {
2767
+ scroll.cancelAnimation = null;
2768
+ var inertiaDiff = scroll.positionAfterAdjust - viewport.scrollPosition;
2726
2769
  var diffLog = '';
2727
2770
  if (inertiaDiff > 0) {
2728
2771
  position -= inertiaDiff;
2729
- scrollState.syntheticPosition = position;
2772
+ scroll.syntheticPosition = position;
2730
2773
  diffLog = " (-" + inertiaDiff + ")";
2731
2774
  }
2732
- scrollState.syntheticFulfill = true;
2775
+ scroll.syntheticFulfill = true;
2733
2776
  viewport.scrollPosition = position;
2734
2777
  scroller.logger.stat('after scroll adjustment' + diffLog);
2735
2778
  done();
@@ -2886,76 +2929,6 @@ var Clip = /** @class */ (function (_super) {
2886
2929
  return Clip;
2887
2930
  }(BaseProcessFactory(CommonProcess.clip)));
2888
2931
 
2889
- var isInterrupted = function (_a) {
2890
- var call = _a.call;
2891
- return !!call.interrupted;
2892
- };
2893
- var End = /** @class */ (function (_super) {
2894
- __extends(End, _super);
2895
- function End() {
2896
- return _super !== null && _super.apply(this, arguments) || this;
2897
- }
2898
- End.run = function (scroller, _a) {
2899
- var _b = _a === void 0 ? {} : _a, error = _b.error;
2900
- var workflow = scroller.workflow, interrupter = scroller.state.cycle.interrupter;
2901
- if (!error && !interrupter) {
2902
- // set out params accessible via Adapter
2903
- End.calculateParams(scroller, workflow);
2904
- }
2905
- // explicit interruption for we don't want to go through the inner loop finalizing
2906
- if (isInterrupted(workflow)) {
2907
- workflow.call({ process: End.process, status: ProcessStatus.done });
2908
- return;
2909
- }
2910
- var next = End.finalizeInnerLoop(scroller, error);
2911
- workflow.call({
2912
- process: End.process,
2913
- status: next ? ProcessStatus.next : ProcessStatus.done,
2914
- payload: __assign({}, (interrupter ? { process: interrupter } : {}))
2915
- });
2916
- };
2917
- End.calculateParams = function (scroller, workflow) {
2918
- var adapter = scroller.adapter, viewport = scroller.viewport, items = scroller.buffer.items;
2919
- if (adapter.wanted.firstVisible) {
2920
- var item = viewport.getEdgeVisibleItem(items, Direction.backward).item;
2921
- if (!item || item.element !== adapter.firstVisible.element) {
2922
- adapter.firstVisible = item ? item.get() : EMPTY_ITEM;
2923
- }
2924
- }
2925
- // the workflow can be interrupter on firstVisible change
2926
- if (adapter.wanted.lastVisible && !isInterrupted(workflow)) {
2927
- var item = viewport.getEdgeVisibleItem(items, Direction.forward).item;
2928
- if (!item || item.element !== adapter.lastVisible.element) {
2929
- adapter.lastVisible = item ? item.get() : EMPTY_ITEM;
2930
- }
2931
- }
2932
- };
2933
- End.finalizeInnerLoop = function (scroller, error) {
2934
- var state = scroller.state, _a = scroller.state, cycle = _a.cycle, clip = _a.clip, fetch = _a.fetch;
2935
- var next = !!cycle.interrupter || (error ? false : End.getNext(scroller));
2936
- cycle.innerLoop.isInitial = false;
2937
- fetch.stopSimulate();
2938
- clip.reset(true);
2939
- state.endInnerLoop();
2940
- return next;
2941
- };
2942
- End.getNext = function (scroller) {
2943
- var _a = scroller.state, fetch = _a.fetch, render = _a.render;
2944
- if (fetch.simulate && fetch.isCheck && !render.noSize) { // Adapter.check
2945
- return true;
2946
- }
2947
- if (fetch.simulate && fetch.doRemove) { // Adapter.remove or Adapter.update with clip
2948
- return true;
2949
- }
2950
- if ( // common inner loop (App start, Scroll, Adapter.clip) accompanied by fetch
2951
- !fetch.simulate && ((fetch.hasNewItems && !render.noSize) || fetch.hasAnotherPack)) {
2952
- return true;
2953
- }
2954
- return false;
2955
- };
2956
- return End;
2957
- }(BaseProcessFactory(CommonProcess.end)));
2958
-
2959
2932
  var Logger = /** @class */ (function () {
2960
2933
  function Logger(scroller, packageInfo, adapter) {
2961
2934
  var _this = this;
@@ -3057,7 +3030,7 @@ var Logger = /** @class */ (function () {
3057
3030
  'color: #888; border: dashed #888 0; border-bottom-width: 0px',
3058
3031
  'color: #000; border-width: 0'
3059
3032
  ];
3060
- this.log(function () { return __spreadArray(['%cstat' + (str ? " " + str : '') + ',%c ' + _this.getStat()], __read(logStyles_1)); });
3033
+ this.log(function () { return __spreadArray(['%cstat' + (str ? " " + str : '') + ',%c ' + _this.getStat()], __read(logStyles_1), false); });
3061
3034
  }
3062
3035
  };
3063
3036
  Logger.prototype.fetch = function (str) {
@@ -3065,7 +3038,7 @@ var Logger = /** @class */ (function () {
3065
3038
  if (this.debug) {
3066
3039
  var _text_1 = 'fetch interval' + (str ? " " + str : '');
3067
3040
  var logStyles_2 = ['color: #888', 'color: #000'];
3068
- this.log(function () { return __spreadArray(["%c" + _text_1 + ": %c" + _this.getFetchRange()], __read(logStyles_2)); });
3041
+ this.log(function () { return __spreadArray(["%c" + _text_1 + ": %c" + _this.getFetchRange()], __read(logStyles_2), false); });
3069
3042
  }
3070
3043
  };
3071
3044
  Logger.prototype.prepareForLog = function (data) {
@@ -3091,7 +3064,7 @@ var Logger = /** @class */ (function () {
3091
3064
  }
3092
3065
  }
3093
3066
  if (loopLog.length) {
3094
- this.log(function () { return __spreadArray(__spreadArray([], __read(loopLog)), ['color: #006600;']); });
3067
+ this.log(function () { return __spreadArray(__spreadArray([], __read(loopLog), false), ['color: #006600;'], false); });
3095
3068
  }
3096
3069
  };
3097
3070
  Logger.prototype.logCycle = function (start) {
@@ -3105,7 +3078,7 @@ var Logger = /** @class */ (function () {
3105
3078
  var _this = this;
3106
3079
  if (this.debug) {
3107
3080
  var logStyles_3 = ['color: #a00;', 'color: #000'];
3108
- this.log(function () { return __spreadArray(['error:%c' + (str ? " " + str : '') + ("%c (loop " + _this.getLoopIdNext() + ")")], __read(logStyles_3)); });
3081
+ this.log(function () { return __spreadArray(['error:%c' + (str ? " " + str : '') + ("%c (loop " + _this.getLoopIdNext() + ")")], __read(logStyles_3), false); });
3109
3082
  }
3110
3083
  };
3111
3084
  Logger.prototype.log = function () {
@@ -3125,7 +3098,7 @@ var Logger = /** @class */ (function () {
3125
3098
  return;
3126
3099
  }
3127
3100
  if (this.logTime) {
3128
- args = __spreadArray(__spreadArray([], __read(args)), [this.getTime()]);
3101
+ args = __spreadArray(__spreadArray([], __read(args), false), [this.getTime()], false);
3129
3102
  }
3130
3103
  args = args.map(function (arg) { return _this.prepareForLog(arg); });
3131
3104
  if (this.immediateLog) {
@@ -3168,12 +3141,50 @@ var Routines = /** @class */ (function () {
3168
3141
  function Routines(settings) {
3169
3142
  this.horizontal = settings.horizontal;
3170
3143
  this.window = settings.windowViewport;
3144
+ this.viewport = settings.viewport;
3171
3145
  }
3172
3146
  Routines.prototype.checkElement = function (element) {
3173
3147
  if (!element) {
3174
3148
  throw new Error('HTML element is not defined');
3175
3149
  }
3176
3150
  };
3151
+ Routines.prototype.getHostElement = function (element) {
3152
+ if (this.window) {
3153
+ return document.documentElement;
3154
+ }
3155
+ if (this.viewport) {
3156
+ return this.viewport;
3157
+ }
3158
+ this.checkElement(element);
3159
+ var parent = element.parentElement;
3160
+ this.checkElement(parent);
3161
+ return parent;
3162
+ };
3163
+ Routines.prototype.getScrollEventReceiver = function (element) {
3164
+ if (this.window) {
3165
+ return window;
3166
+ }
3167
+ return this.getHostElement(element);
3168
+ };
3169
+ Routines.prototype.setupScrollRestoration = function () {
3170
+ if ('scrollRestoration' in history) {
3171
+ history.scrollRestoration = 'manual';
3172
+ }
3173
+ };
3174
+ Routines.prototype.dismissOverflowAnchor = function (element) {
3175
+ this.checkElement(element);
3176
+ element.style.overflowAnchor = 'none';
3177
+ };
3178
+ Routines.prototype.findElementBySelector = function (element, selector) {
3179
+ this.checkElement(element);
3180
+ return element.querySelector(selector);
3181
+ };
3182
+ Routines.prototype.findPaddingElement = function (element, direction) {
3183
+ return this.findElementBySelector(element, "[data-padding-" + direction + "]");
3184
+ };
3185
+ Routines.prototype.findItemElement = function (element, id) {
3186
+ return this.findElementBySelector(element, "[data-sid=\"" + id + "\"]");
3187
+ };
3177
3188
  Routines.prototype.getScrollPosition = function (element) {
3178
3189
  if (this.window) {
3179
3190
  return window.pageYOffset;
@@ -3236,6 +3247,12 @@ var Routines = /** @class */ (function () {
3236
3247
  return element.offsetTop - (relativeElement ? relativeElement.scrollTop : 0) +
3237
3248
  (direction === (!opposite ? Direction.forward : Direction.backward) ? this.getSize(element) : 0);
3238
3249
  };
3250
+ Routines.prototype.makeElementVisible = function (element) {
3251
+ this.checkElement(element);
3252
+ element.style.left = '';
3253
+ element.style.top = '';
3254
+ element.style.position = '';
3255
+ };
3239
3256
  Routines.prototype.hideElement = function (element) {
3240
3257
  this.checkElement(element);
3241
3258
  element.style.display = 'none';
@@ -3248,12 +3265,26 @@ var Routines = /** @class */ (function () {
3248
3265
  this.checkElement(element);
3249
3266
  element.scrollIntoView(argument);
3250
3267
  };
3268
+ Routines.prototype.render = function (cb) {
3269
+ var timeoutId = setTimeout(function () { return cb(); });
3270
+ return function () { return clearTimeout(timeoutId); };
3271
+ };
3272
+ Routines.prototype.animate = function (cb) {
3273
+ var animationFrameId = requestAnimationFrame(function () { return cb(); });
3274
+ return function () { return cancelAnimationFrame(animationFrameId); };
3275
+ };
3276
+ Routines.prototype.onScroll = function (element, handler) {
3277
+ element.addEventListener('scroll', handler);
3278
+ return function () { return element.removeEventListener('scroll', handler); };
3279
+ };
3251
3280
  return Routines;
3252
3281
  }());
3253
3282
 
3254
3283
  var Padding = /** @class */ (function () {
3255
3284
  function Padding(element, direction, routines) {
3256
- this.element = element.querySelector("[data-padding-" + direction + "]");
3285
+ var found = routines.findPaddingElement(element, direction);
3286
+ routines.checkElement(found);
3287
+ this.element = found;
3257
3288
  this.direction = direction;
3258
3289
  this.routines = routines;
3259
3290
  }
@@ -3334,28 +3365,21 @@ var Viewport = /** @class */ (function () {
3334
3365
  this.routines = routines;
3335
3366
  this.state = state;
3336
3367
  this.logger = logger;
3337
- this.disabled = false;
3368
+ this.hostElement = this.routines.getHostElement(this.element);
3369
+ this.scrollEventReceiver = this.routines.getScrollEventReceiver(this.element);
3338
3370
  if (settings.windowViewport) {
3339
- this.hostElement = document.documentElement;
3340
- this.scrollEventReceiver = window;
3341
- }
3342
- else {
3343
- this.hostElement = settings.viewport || this.element.parentElement;
3344
- this.scrollEventReceiver = this.hostElement;
3345
- }
3346
- this.paddings = new Paddings(this.element, this.routines, settings);
3347
- if (settings.windowViewport && 'scrollRestoration' in history) {
3348
- history.scrollRestoration = 'manual';
3371
+ this.routines.setupScrollRestoration();
3349
3372
  }
3350
3373
  if (settings.dismissOverflowAnchor) {
3351
- this.hostElement.style.overflowAnchor = 'none';
3374
+ this.routines.dismissOverflowAnchor(this.hostElement);
3352
3375
  }
3376
+ this.paddings = new Paddings(this.element, this.routines, settings);
3353
3377
  }
3354
3378
  Viewport.prototype.reset = function (startIndex) {
3355
3379
  this.setOffset();
3356
3380
  this.paddings.reset(this.getSize(), startIndex, this.offset);
3357
3381
  this.scrollPosition = this.paddings.backward.size || 0;
3358
- this.state.scrollState.reset();
3382
+ this.state.scroll.reset();
3359
3383
  };
3360
3384
  Viewport.prototype.setPosition = function (value) {
3361
3385
  var oldPosition = this.scrollPosition;
@@ -3367,7 +3391,7 @@ var Viewport = /** @class */ (function () {
3367
3391
  var position = this.scrollPosition;
3368
3392
  this.logger.log(function () { return __spreadArray([
3369
3393
  'setting scroll position at', position
3370
- ], __read((position !== value ? ["(" + value + ")"] : []))); });
3394
+ ], __read((position !== value ? ["(" + value + ")"] : [])), false); });
3371
3395
  return position;
3372
3396
  };
3373
3397
  Object.defineProperty(Viewport.prototype, "scrollPosition", {
@@ -3380,29 +3404,15 @@ var Viewport = /** @class */ (function () {
3380
3404
  enumerable: false,
3381
3405
  configurable: true
3382
3406
  });
3383
- Viewport.prototype.disableScrollForOneLoop = function () {
3384
- var _this = this;
3385
- if (this.disabled) {
3386
- return;
3387
- }
3388
- var style = this.hostElement.style;
3389
- if (style.overflowY === 'hidden') {
3390
- return;
3391
- }
3392
- this.disabled = true;
3393
- var overflow = style.overflowY;
3394
- setTimeout(function () {
3395
- _this.disabled = false;
3396
- style.overflowY = overflow;
3397
- });
3398
- style.overflowY = 'hidden';
3399
- };
3400
3407
  Viewport.prototype.getSize = function () {
3401
3408
  return this.routines.getSize(this.hostElement, true);
3402
3409
  };
3403
3410
  Viewport.prototype.getScrollableSize = function () {
3404
3411
  return this.routines.getSize(this.element);
3405
3412
  };
3413
+ Viewport.prototype.getMaxScrollPosition = function () {
3414
+ return this.getScrollableSize() - this.getSize();
3415
+ };
3406
3416
  Viewport.prototype.getBufferPadding = function () {
3407
3417
  return this.getSize() * this.settings.padding;
3408
3418
  };
@@ -3415,6 +3425,9 @@ var Viewport = /** @class */ (function () {
3415
3425
  this.offset -= this.routines.getOffset(this.hostElement);
3416
3426
  }
3417
3427
  };
3428
+ Viewport.prototype.findItemElementById = function (id) {
3429
+ return this.routines.findItemElement(this.element, id);
3430
+ };
3418
3431
  Viewport.prototype.getEdgeVisibleItem = function (items, direction) {
3419
3432
  var bwd = direction === Direction.backward;
3420
3433
  var opposite = bwd ? Direction.forward : Direction.backward;
@@ -3517,7 +3530,7 @@ var DefaultSize = /** @class */ (function () {
3517
3530
  return _this.sizeMap.set(size, Math.max((_this.sizeMap.get(size) || 0) - 1, 0));
3518
3531
  });
3519
3532
  }
3520
- var sorted = __spreadArray([], __read(this.sizeMap.entries())).sort(function (a, b) { return b[1] - a[1]; });
3533
+ var sorted = __spreadArray([], __read(this.sizeMap.entries()), false).sort(function (a, b) { return b[1] - a[1]; });
3521
3534
  var mostFrequentCount = sorted[0][1];
3522
3535
  var listEqual = sorted.filter(function (i) { return i[1] === mostFrequentCount; });
3523
3536
  if (listEqual.length > 1 && listEqual.find(function (i) { return i[0] === oldFrequentSizeCount; })) {
@@ -4065,13 +4078,13 @@ var Buffer = /** @class */ (function () {
4065
4078
  };
4066
4079
  Buffer.prototype.setItems = function (items) {
4067
4080
  if (!this.items.length) {
4068
- this.items = __spreadArray([], __read(items));
4081
+ this.items = __spreadArray([], __read(items), false);
4069
4082
  }
4070
4083
  else if (this.items[0].$index > items[items.length - 1].$index) {
4071
- this.items = __spreadArray(__spreadArray([], __read(items)), __read(this.items));
4084
+ this.items = __spreadArray(__spreadArray([], __read(items), false), __read(this.items), false);
4072
4085
  }
4073
4086
  else if (items[0].$index > this.items[this.items.length - 1].$index) {
4074
- this.items = __spreadArray(__spreadArray([], __read(this.items)), __read(items));
4087
+ this.items = __spreadArray(__spreadArray([], __read(this.items), false), __read(items), false);
4075
4088
  }
4076
4089
  else {
4077
4090
  return false;
@@ -4102,22 +4115,6 @@ var Buffer = /** @class */ (function () {
4102
4115
  this.startIndex = this.absMinIndex;
4103
4116
  }
4104
4117
  };
4105
- Buffer.prototype.appendVirtually = function (count, fixRight) {
4106
- if (fixRight) {
4107
- this.items.forEach(function (item) { return item.updateIndex(item.$index - count); });
4108
- this.cache.shiftIndexes(-count);
4109
- this.items = __spreadArray([], __read(this.items));
4110
- }
4111
- this.shiftExtremum(count, fixRight);
4112
- };
4113
- Buffer.prototype.prependVirtually = function (count, fixRight) {
4114
- if (!fixRight) {
4115
- this.items.forEach(function (item) { return item.updateIndex(item.$index + count); });
4116
- this.cache.shiftIndexes(count);
4117
- this.items = __spreadArray([], __read(this.items));
4118
- }
4119
- this.shiftExtremum(count, fixRight);
4120
- };
4121
4118
  Buffer.prototype.insertVirtually = function (items, index, direction, fixRight) {
4122
4119
  if (!this.checkCall.insertVirtual(items, index, direction)) {
4123
4120
  return false;
@@ -4132,7 +4129,7 @@ var Buffer = /** @class */ (function () {
4132
4129
  if (shift) {
4133
4130
  this.items.forEach(function (item) { return item.updateIndex(item.$index + shift); });
4134
4131
  this.cache.insertItems(items, index, direction, fixRight);
4135
- this.items = __spreadArray([], __read(this.items));
4132
+ this.items = __spreadArray([], __read(this.items), false);
4136
4133
  }
4137
4134
  this.shiftExtremum(items.length, fixRight);
4138
4135
  return true;
@@ -4154,7 +4151,7 @@ var Buffer = /** @class */ (function () {
4154
4151
  }
4155
4152
  this.shiftExtremum(-indexes.length, fixRight);
4156
4153
  if (shifted) {
4157
- this.items = __spreadArray([], __read(this.items));
4154
+ this.items = __spreadArray([], __read(this.items), false);
4158
4155
  }
4159
4156
  this.cache.removeItems(indexes, fixRight);
4160
4157
  };
@@ -4216,7 +4213,7 @@ var Buffer = /** @class */ (function () {
4216
4213
  }
4217
4214
  var toRemove_1 = true;
4218
4215
  var newItems = [];
4219
- (fixRight ? __spreadArray([], __read(result)).reverse() : result).forEach(function (data, i) {
4216
+ (fixRight ? __spreadArray([], __read(result), false).reverse() : result).forEach(function (data, i) {
4220
4217
  var newItem;
4221
4218
  if (item.data === data) {
4222
4219
  if (indexToTrack === item.$index) {
@@ -4233,7 +4230,7 @@ var Buffer = /** @class */ (function () {
4233
4230
  updateArray.call(newItems, newItem);
4234
4231
  });
4235
4232
  item.toRemove = toRemove_1;
4236
- updateArray.call.apply(updateArray, __spreadArray([items], __read(newItems)));
4233
+ updateArray.call.apply(updateArray, __spreadArray([items], __read(newItems), false));
4237
4234
  index += diff * result.length;
4238
4235
  if (result.length > 1) {
4239
4236
  this_2.shiftExtremum(result.length - 1, fixRight);
@@ -4325,6 +4322,7 @@ var InnerLoopModel = /** @class */ (function () {
4325
4322
  configurable: true
4326
4323
  });
4327
4324
  InnerLoopModel.prototype.done = function () {
4325
+ this.isInitial = false;
4328
4326
  this.count++;
4329
4327
  this.total++;
4330
4328
  this.busy.set(false);
@@ -4345,7 +4343,7 @@ var WorkflowCycleModel = /** @class */ (function () {
4345
4343
  this.innerLoop = new InnerLoopModel(loopCount);
4346
4344
  this.interrupter = null;
4347
4345
  this.busy = new Reactive(false);
4348
- this.done(cycleCount);
4346
+ this.end(cycleCount);
4349
4347
  }
4350
4348
  Object.defineProperty(WorkflowCycleModel.prototype, "loopId", {
4351
4349
  get: function () {
@@ -4361,11 +4359,6 @@ var WorkflowCycleModel = /** @class */ (function () {
4361
4359
  enumerable: false,
4362
4360
  configurable: true
4363
4361
  });
4364
- WorkflowCycleModel.prototype.done = function (count) {
4365
- this.count = count;
4366
- this.isInitial = false;
4367
- this.busy.set(false);
4368
- };
4369
4362
  WorkflowCycleModel.prototype.start = function (isInitial, initiator) {
4370
4363
  this.isInitial = isInitial;
4371
4364
  this.initiator = initiator;
@@ -4374,6 +4367,11 @@ var WorkflowCycleModel = /** @class */ (function () {
4374
4367
  this.interrupter = null;
4375
4368
  this.busy.set(true);
4376
4369
  };
4370
+ WorkflowCycleModel.prototype.end = function (count) {
4371
+ this.count = count;
4372
+ this.isInitial = false;
4373
+ this.busy.set(false);
4374
+ };
4377
4375
  WorkflowCycleModel.prototype.dispose = function (forever) {
4378
4376
  if (forever) {
4379
4377
  // otherwise the value will be persisted during re-instantiation
@@ -4516,18 +4514,6 @@ var FetchModel = /** @class */ (function () {
4516
4514
  this.firstVisible.index = start;
4517
4515
  this.firstVisible.delta = 0;
4518
4516
  };
4519
- FetchModel.prototype.append = function (items) {
4520
- this.startSimulate(items);
4521
- this.last.index = items[items.length - 1].$index;
4522
- this.first.index = items[0].$index;
4523
- this.direction = Direction.forward;
4524
- };
4525
- FetchModel.prototype.prepend = function (items) {
4526
- this.startSimulate(items);
4527
- this.last.index = items[0].$index;
4528
- this.first.index = items[items.length - 1].$index;
4529
- this.direction = Direction.backward;
4530
- };
4531
4517
  FetchModel.prototype.check = function (items) {
4532
4518
  this.startSimulate(items);
4533
4519
  this.last.index = items[0].$index;
@@ -4580,16 +4566,16 @@ var RenderModel = /** @class */ (function () {
4580
4566
  this.sizeBefore = 0;
4581
4567
  this.sizeAfter = 0;
4582
4568
  this.positionBefore = 0;
4583
- this.renderTimer = null;
4569
+ this.cancel = null;
4584
4570
  };
4585
4571
  return RenderModel;
4586
4572
  }());
4587
4573
 
4588
- var ScrollState = /** @class */ (function () {
4589
- function ScrollState() {
4574
+ var ScrollModel = /** @class */ (function () {
4575
+ function ScrollModel() {
4590
4576
  this.reset();
4591
4577
  }
4592
- ScrollState.prototype.reset = function () {
4578
+ ScrollModel.prototype.reset = function () {
4593
4579
  this.previous = null;
4594
4580
  this.current = null;
4595
4581
  this.syntheticPosition = null;
@@ -4597,24 +4583,24 @@ var ScrollState = /** @class */ (function () {
4597
4583
  this.positionBeforeAsync = null;
4598
4584
  this.positionBeforeAdjust = null;
4599
4585
  this.positionAfterAdjust = null;
4600
- this.cleanupTimers();
4586
+ this.stop();
4601
4587
  };
4602
- ScrollState.prototype.cleanupTimers = function () {
4588
+ ScrollModel.prototype.stop = function () {
4603
4589
  if (this.scrollTimer) {
4604
4590
  clearTimeout(this.scrollTimer);
4605
4591
  this.scrollTimer = null;
4606
4592
  }
4607
- if (this.animationFrameId) {
4608
- cancelAnimationFrame(this.animationFrameId);
4609
- this.animationFrameId = 0;
4593
+ if (this.cancelAnimation) {
4594
+ this.cancelAnimation();
4595
+ this.cancelAnimation = null;
4610
4596
  }
4611
4597
  };
4612
- ScrollState.prototype.hasPositionChanged = function (position) {
4598
+ ScrollModel.prototype.hasPositionChanged = function (position) {
4613
4599
  var before = this.positionBeforeAdjust;
4614
4600
  var after = this.positionAfterAdjust;
4615
4601
  return before === null || before !== position || after === null || after !== position;
4616
4602
  };
4617
- return ScrollState;
4603
+ return ScrollModel;
4618
4604
  }());
4619
4605
 
4620
4606
  var State = /** @class */ (function () {
@@ -4626,7 +4612,7 @@ var State = /** @class */ (function () {
4626
4612
  this.fetch = new FetchModel(settings.directionPriority);
4627
4613
  this.clip = new ClipModel();
4628
4614
  this.render = new RenderModel();
4629
- this.scrollState = new ScrollState();
4615
+ this.scroll = new ScrollModel();
4630
4616
  }
4631
4617
  Object.defineProperty(State.prototype, "time", {
4632
4618
  get: function () {
@@ -4635,20 +4621,14 @@ var State = /** @class */ (function () {
4635
4621
  enumerable: false,
4636
4622
  configurable: true
4637
4623
  });
4638
- State.prototype.endInnerLoop = function () {
4639
- var _a = this, fetch = _a.fetch, render = _a.render, cycle = _a.cycle;
4640
- if (fetch.cancel) {
4641
- fetch.cancel();
4642
- fetch.cancel = null;
4643
- }
4644
- if (render.renderTimer) {
4645
- clearTimeout(render.renderTimer);
4646
- render.renderTimer = null;
4647
- }
4648
- cycle.innerLoop.done();
4624
+ State.prototype.startWorkflowCycle = function (isInitial, initiator) {
4625
+ this.cycle.start(isInitial, initiator);
4626
+ };
4627
+ State.prototype.endWorkflowCycle = function (count) {
4628
+ this.cycle.end(count);
4649
4629
  };
4650
4630
  State.prototype.startInnerLoop = function () {
4651
- var _a = this, cycle = _a.cycle, scroll = _a.scrollState, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4631
+ var _a = this, cycle = _a.cycle, scroll = _a.scroll, fetch = _a.fetch, render = _a.render, clip = _a.clip;
4652
4632
  cycle.innerLoop.start();
4653
4633
  scroll.positionBeforeAsync = null;
4654
4634
  if (!fetch.simulate) {
@@ -4661,10 +4641,24 @@ var State = /** @class */ (function () {
4661
4641
  doRender: fetch.simulate && fetch.items.length > 0
4662
4642
  } : {}));
4663
4643
  };
4644
+ State.prototype.endInnerLoop = function () {
4645
+ var _a = this, fetch = _a.fetch, clip = _a.clip, render = _a.render, cycle = _a.cycle;
4646
+ fetch.stopSimulate();
4647
+ clip.reset(true);
4648
+ if (fetch.cancel) {
4649
+ fetch.cancel();
4650
+ fetch.cancel = null;
4651
+ }
4652
+ if (render.cancel) {
4653
+ render.cancel();
4654
+ render.cancel = null;
4655
+ }
4656
+ cycle.innerLoop.done();
4657
+ };
4664
4658
  State.prototype.dispose = function () {
4659
+ this.scroll.stop();
4665
4660
  this.cycle.dispose();
4666
4661
  this.endInnerLoop();
4667
- this.scrollState.cleanupTimers();
4668
4662
  };
4669
4663
  return State;
4670
4664
  }());
@@ -5404,7 +5398,7 @@ var Workflow = /** @class */ (function () {
5404
5398
  this.cyclesDone = 0;
5405
5399
  this.interruptionCount = 0;
5406
5400
  this.errors = [];
5407
- this.disposeScrollEventHandler = function () { return null; };
5401
+ this.offScroll = function () { return null; };
5408
5402
  this.propagateChanges = run;
5409
5403
  this.stateMachineMethods = {
5410
5404
  run: this.runProcess(),
@@ -5433,16 +5427,13 @@ var Workflow = /** @class */ (function () {
5433
5427
  status: ProcessStatus.start
5434
5428
  });
5435
5429
  // set up scroll event listener
5436
- var scrollEventReceiver = this.scroller.viewport.scrollEventReceiver;
5430
+ var _a = this.scroller, scrollEventReceiver = _a.viewport.scrollEventReceiver, routines = _a.routines;
5437
5431
  var onScrollHandler = function (event) { return _this.callWorkflow({
5438
5432
  process: CommonProcess.scroll,
5439
5433
  status: ProcessStatus.start,
5440
5434
  payload: { event: event }
5441
5435
  }); };
5442
- scrollEventReceiver.addEventListener('scroll', onScrollHandler);
5443
- this.disposeScrollEventHandler = function () {
5444
- return scrollEventReceiver.removeEventListener('scroll', onScrollHandler);
5445
- };
5436
+ this.offScroll = routines.onScroll(scrollEventReceiver, onScrollHandler);
5446
5437
  };
5447
5438
  Workflow.prototype.changeItems = function (items) {
5448
5439
  this.propagateChanges(items);
@@ -5468,10 +5459,10 @@ var Workflow = /** @class */ (function () {
5468
5459
  if (this.scroller.settings.logProcessRun) {
5469
5460
  this.scroller.logger.log(function () { return __spreadArray(__spreadArray(__spreadArray([
5470
5461
  '%cfire%c'
5471
- ], ['color: #cc7777;', 'color: #000000;']), [
5462
+ ], ['color: #cc7777;', 'color: #000000;'], false), [
5472
5463
  process,
5473
5464
  "\"" + status + "\""
5474
- ]), __read((payload !== void 0 ? [payload] : []))); });
5465
+ ], false), __read((payload !== void 0 ? [payload] : [])), false); });
5475
5466
  }
5476
5467
  this.scroller.logger.logProcess(data);
5477
5468
  if (process === CommonProcess.end) {
@@ -5494,11 +5485,11 @@ var Workflow = /** @class */ (function () {
5494
5485
  if (_this.scroller.settings.logProcessRun) {
5495
5486
  _this.scroller.logger.log(function () { return __spreadArray(__spreadArray(__spreadArray([
5496
5487
  '%crun%c'
5497
- ], ['color: #333399;', 'color: #000000;']), [
5488
+ ], ['color: #333399;', 'color: #000000;'], false), [
5498
5489
  process || name
5499
- ]), __read(args)); });
5490
+ ], false), __read(args), false); });
5500
5491
  }
5501
- run.apply(void 0, __spreadArray([_this.scroller], __read(args)));
5492
+ run.apply(void 0, __spreadArray([_this.scroller], __read(args), false));
5502
5493
  };
5503
5494
  };
5504
5495
  };
@@ -5542,7 +5533,7 @@ var Workflow = /** @class */ (function () {
5542
5533
  var _a = this.scroller, state = _a.state, logger = _a.logger;
5543
5534
  this.cyclesDone++;
5544
5535
  logger.logCycle(false);
5545
- state.cycle.done(this.cyclesDone + 1);
5536
+ state.endWorkflowCycle(this.cyclesDone + 1);
5546
5537
  this.finalize();
5547
5538
  };
5548
5539
  Workflow.prototype.dispose = function () {
@@ -5550,7 +5541,7 @@ var Workflow = /** @class */ (function () {
5550
5541
  if (this.initTimer) {
5551
5542
  clearTimeout(this.initTimer);
5552
5543
  }
5553
- this.disposeScrollEventHandler();
5544
+ this.offScroll();
5554
5545
  this.adapterRun$.dispose();
5555
5546
  this.scroller.dispose(true);
5556
5547
  Object.getOwnPropertyNames(this).forEach(function (prop) {