@difizen/libro-virtualized 0.1.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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -0
  3. package/es/auto-sizer/auto-sizer.d.ts +56 -0
  4. package/es/auto-sizer/auto-sizer.d.ts.map +1 -0
  5. package/es/auto-sizer/auto-sizer.js +157 -0
  6. package/es/auto-sizer/index.d.ts +3 -0
  7. package/es/auto-sizer/index.d.ts.map +1 -0
  8. package/es/auto-sizer/index.js +2 -0
  9. package/es/cell-measurer/cell-measurer-cache.d.ts +52 -0
  10. package/es/cell-measurer/cell-measurer-cache.d.ts.map +1 -0
  11. package/es/cell-measurer/cell-measurer-cache.js +176 -0
  12. package/es/cell-measurer/cell-measurer.d.ts +39 -0
  13. package/es/cell-measurer/cell-measurer.d.ts.map +1 -0
  14. package/es/cell-measurer/cell-measurer.js +154 -0
  15. package/es/cell-measurer/index.d.ts +5 -0
  16. package/es/cell-measurer/index.d.ts.map +1 -0
  17. package/es/cell-measurer/index.js +4 -0
  18. package/es/cell-measurer/types.d.ts +9 -0
  19. package/es/cell-measurer/types.d.ts.map +1 -0
  20. package/es/cell-measurer/types.js +0 -0
  21. package/es/grid/accessibility-overscanIndices-getter.d.ts +11 -0
  22. package/es/grid/accessibility-overscanIndices-getter.d.ts.map +1 -0
  23. package/es/grid/accessibility-overscanIndices-getter.js +33 -0
  24. package/es/grid/default-cell-range-renderer.d.ts +10 -0
  25. package/es/grid/default-cell-range-renderer.d.ts.map +1 -0
  26. package/es/grid/default-cell-range-renderer.js +135 -0
  27. package/es/grid/default-overscanIndices-getter.d.ts +11 -0
  28. package/es/grid/default-overscanIndices-getter.d.ts.map +1 -0
  29. package/es/grid/default-overscanIndices-getter.js +28 -0
  30. package/es/grid/grid.d.ts +359 -0
  31. package/es/grid/grid.d.ts.map +1 -0
  32. package/es/grid/grid.js +1287 -0
  33. package/es/grid/index.d.ts +6 -0
  34. package/es/grid/index.d.ts.map +1 -0
  35. package/es/grid/index.js +4 -0
  36. package/es/grid/types.d.ts +87 -0
  37. package/es/grid/types.d.ts.map +1 -0
  38. package/es/grid/types.js +1 -0
  39. package/es/grid/utils/calculate-size-and-position-data-and-update-scroll-offset.d.ts +17 -0
  40. package/es/grid/utils/calculate-size-and-position-data-and-update-scroll-offset.d.ts.map +1 -0
  41. package/es/grid/utils/calculate-size-and-position-data-and-update-scroll-offset.js +25 -0
  42. package/es/grid/utils/cell-size-and-position-manager-row.d.ts +97 -0
  43. package/es/grid/utils/cell-size-and-position-manager-row.d.ts.map +1 -0
  44. package/es/grid/utils/cell-size-and-position-manager-row.js +297 -0
  45. package/es/grid/utils/cell-size-and-position-manager.d.ts +85 -0
  46. package/es/grid/utils/cell-size-and-position-manager.d.ts.map +1 -0
  47. package/es/grid/utils/cell-size-and-position-manager.js +268 -0
  48. package/es/grid/utils/max-element-size.d.ts +2 -0
  49. package/es/grid/utils/max-element-size.d.ts.map +1 -0
  50. package/es/grid/utils/max-element-size.js +17 -0
  51. package/es/grid/utils/scaling-cell-size-and-position-manager-row.d.ts +78 -0
  52. package/es/grid/utils/scaling-cell-size-and-position-manager-row.d.ts.map +1 -0
  53. package/es/grid/utils/scaling-cell-size-and-position-manager-row.js +187 -0
  54. package/es/grid/utils/scaling-cell-size-and-position-manager.d.ts +70 -0
  55. package/es/grid/utils/scaling-cell-size-and-position-manager.d.ts.map +1 -0
  56. package/es/grid/utils/scaling-cell-size-and-position-manager.js +187 -0
  57. package/es/grid/utils/update-scroll-index-helper.d.ts +24 -0
  58. package/es/grid/utils/update-scroll-index-helper.d.ts.map +1 -0
  59. package/es/grid/utils/update-scroll-index-helper.js +40 -0
  60. package/es/index.d.ts +5 -0
  61. package/es/index.d.ts.map +1 -0
  62. package/es/index.js +4 -0
  63. package/es/list/index.d.ts +3 -0
  64. package/es/list/index.d.ts.map +1 -0
  65. package/es/list/index.js +1 -0
  66. package/es/list/list.d.ts +109 -0
  67. package/es/list/list.d.ts.map +1 -0
  68. package/es/list/list.js +261 -0
  69. package/es/list/types.d.ts +22 -0
  70. package/es/list/types.d.ts.map +1 -0
  71. package/es/list/types.js +1 -0
  72. package/es/utils/animation-frame.d.ts +7 -0
  73. package/es/utils/animation-frame.d.ts.map +1 -0
  74. package/es/utils/animation-frame.js +20 -0
  75. package/es/utils/create-callback-memoizer.d.ts +5 -0
  76. package/es/utils/create-callback-memoizer.d.ts.map +1 -0
  77. package/es/utils/create-callback-memoizer.js +25 -0
  78. package/es/utils/get-updated-offset-for-index.d.ts +14 -0
  79. package/es/utils/get-updated-offset-for-index.d.ts.map +1 -0
  80. package/es/utils/get-updated-offset-for-index.js +32 -0
  81. package/es/utils/init-cell-metadata.d.ts +13 -0
  82. package/es/utils/init-cell-metadata.d.ts.map +1 -0
  83. package/es/utils/init-cell-metadata.js +32 -0
  84. package/es/utils/request-animation-timeout.d.ts +12 -0
  85. package/es/utils/request-animation-timeout.d.ts.map +1 -0
  86. package/es/utils/request-animation-timeout.js +33 -0
  87. package/es/utils/test-helper.d.ts +5 -0
  88. package/es/utils/test-helper.d.ts.map +1 -0
  89. package/es/utils/test-helper.js +31 -0
  90. package/es/vendor/binary-search-bounds.d.ts +22 -0
  91. package/es/vendor/binary-search-bounds.d.ts.map +1 -0
  92. package/es/vendor/binary-search-bounds.js +198 -0
  93. package/es/vendor/detect-element-resize.d.ts +16 -0
  94. package/es/vendor/detect-element-resize.d.ts.map +1 -0
  95. package/es/vendor/detect-element-resize.js +184 -0
  96. package/es/vendor/interval-tree.d.ts +10 -0
  97. package/es/vendor/interval-tree.d.ts.map +1 -0
  98. package/es/vendor/interval-tree.js +359 -0
  99. package/package.json +59 -0
  100. package/src/auto-sizer/auto-sizer.tsx +187 -0
  101. package/src/auto-sizer/index.ts +4 -0
  102. package/src/cell-measurer/cell-measurer-cache.ts +220 -0
  103. package/src/cell-measurer/cell-measurer.ts +151 -0
  104. package/src/cell-measurer/index.ts +5 -0
  105. package/src/cell-measurer/types.ts +8 -0
  106. package/src/grid/accessibility-overscanIndices-getter.ts +38 -0
  107. package/src/grid/default-cell-range-renderer.ts +166 -0
  108. package/src/grid/default-overscanIndices-getter.ts +32 -0
  109. package/src/grid/grid.tsx +1672 -0
  110. package/src/grid/index.ts +14 -0
  111. package/src/grid/types.ts +112 -0
  112. package/src/grid/utils/calculate-size-and-position-data-and-update-scroll-offset.ts +62 -0
  113. package/src/grid/utils/cell-size-and-position-manager-row.ts +365 -0
  114. package/src/grid/utils/cell-size-and-position-manager.ts +309 -0
  115. package/src/grid/utils/max-element-size.ts +18 -0
  116. package/src/grid/utils/scaling-cell-size-and-position-manager-row.ts +206 -0
  117. package/src/grid/utils/scaling-cell-size-and-position-manager.ts +198 -0
  118. package/src/grid/utils/update-scroll-index-helper.ts +96 -0
  119. package/src/index.spec.ts +10 -0
  120. package/src/index.ts +4 -0
  121. package/src/list/index.ts +2 -0
  122. package/src/list/list.tsx +292 -0
  123. package/src/list/types.ts +25 -0
  124. package/src/utils/animation-frame.ts +38 -0
  125. package/src/utils/create-callback-memoizer.ts +32 -0
  126. package/src/utils/get-updated-offset-for-index.ts +33 -0
  127. package/src/utils/init-cell-metadata.ts +32 -0
  128. package/src/utils/request-animation-timeout.ts +44 -0
  129. package/src/utils/test-helper.ts +20 -0
  130. package/src/vendor/binary-search-bounds.ts +203 -0
  131. package/src/vendor/detect-element-resize.ts +241 -0
  132. package/src/vendor/interval-tree.ts +406 -0
@@ -0,0 +1,184 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
+ /* eslint-disable @typescript-eslint/no-this-alias */
3
+ /* eslint-disable no-var */
4
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
5
+ /* eslint-disable no-param-reassign */
6
+ // @ts-nocheck
7
+
8
+ /**
9
+ * Detect Element Resize.
10
+ * https://github.com/sdecima/javascript-detect-element-resize
11
+ * Sebastian Decima
12
+ *
13
+ * Forked from version 0.5.3; includes the following modifications:
14
+ * 1) Guard against unsafe 'window' and 'document' references (to support SSR).
15
+ * 2) Defer initialization code via a top-level function wrapper (to support SSR).
16
+ * 3) Avoid unnecessary reflows by not measuring size for scroll events bubbling from children.
17
+ * 4) Add nonce for style element.
18
+ **/
19
+
20
+ export default function createDetectElementResize(nonce) {
21
+ // Check `document` and `window` in case of server-side rendering
22
+ var _window;
23
+ if (typeof window !== 'undefined') {
24
+ _window = window;
25
+ } else if (typeof self !== 'undefined') {
26
+ _window = self;
27
+ } else {
28
+ _window = global;
29
+ }
30
+ var attachEvent = typeof document !== 'undefined' && document.attachEvent;
31
+ if (!attachEvent) {
32
+ var requestFrame = function () {
33
+ var raf = _window.requestAnimationFrame || _window.mozRequestAnimationFrame || _window.webkitRequestAnimationFrame || function (fn) {
34
+ return _window.setTimeout(fn, 20);
35
+ };
36
+ return function (fn) {
37
+ return raf(fn);
38
+ };
39
+ }();
40
+ var cancelFrame = function () {
41
+ var cancel = _window.cancelAnimationFrame || _window.mozCancelAnimationFrame || _window.webkitCancelAnimationFrame || _window.clearTimeout;
42
+ return function (id) {
43
+ return cancel(id);
44
+ };
45
+ }();
46
+ var resetTriggers = function resetTriggers(element) {
47
+ var triggers = element.__resizeTriggers__,
48
+ expand = triggers.firstElementChild,
49
+ contract = triggers.lastElementChild,
50
+ expandChild = expand.firstElementChild;
51
+ contract.scrollLeft = contract.scrollWidth;
52
+ contract.scrollTop = contract.scrollHeight;
53
+ expandChild.style.width = expand.offsetWidth + 1 + 'px';
54
+ expandChild.style.height = expand.offsetHeight + 1 + 'px';
55
+ expand.scrollLeft = expand.scrollWidth;
56
+ expand.scrollTop = expand.scrollHeight;
57
+ };
58
+ var checkTriggers = function checkTriggers(element) {
59
+ return element.offsetWidth !== element.__resizeLast__.width || element.offsetHeight !== element.__resizeLast__.height;
60
+ };
61
+ var scrollListener = function scrollListener(e) {
62
+ // Don't measure (which forces) reflow for scrolls that happen inside of children!
63
+ if (e.target.className && typeof e.target.className.indexOf === 'function' && e.target.className.indexOf('contract-trigger') < 0 && e.target.className.indexOf('expand-trigger') < 0) {
64
+ return;
65
+ }
66
+ var element = this;
67
+ resetTriggers(this);
68
+ if (this.__resizeRAF__) {
69
+ cancelFrame(this.__resizeRAF__);
70
+ }
71
+ this.__resizeRAF__ = requestFrame(function () {
72
+ if (checkTriggers(element)) {
73
+ element.__resizeLast__.width = element.offsetWidth;
74
+ element.__resizeLast__.height = element.offsetHeight;
75
+ element.__resizeListeners__.forEach(function (fn) {
76
+ fn.call(element, e);
77
+ });
78
+ }
79
+ });
80
+ };
81
+
82
+ /* Detect CSS Animations support to detect element display/re-attach */
83
+ var animation = false,
84
+ keyframeprefix = '',
85
+ animationstartevent = 'animationstart',
86
+ domPrefixes = 'Webkit Moz O ms'.split(' '),
87
+ startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' '),
88
+ pfx = '';
89
+ {
90
+ var elm = document.createElement('fakeelement');
91
+ if (elm.style.animationName !== undefined) {
92
+ animation = true;
93
+ }
94
+ if (animation === false) {
95
+ for (var i = 0; i < domPrefixes.length; i++) {
96
+ if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
97
+ pfx = domPrefixes[i];
98
+ keyframeprefix = '-' + pfx.toLowerCase() + '-';
99
+ animationstartevent = startEvents[i];
100
+ animation = true;
101
+ break;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ var animationName = 'resizeanim';
107
+ var animationKeyframes = '@' + keyframeprefix + 'keyframes ' + animationName + ' { from { opacity: 0; } to { opacity: 0; } } ';
108
+ var animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; ';
109
+ }
110
+ var createStyles = function createStyles(doc) {
111
+ if (!doc.getElementById('detectElementResize')) {
112
+ //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360
113
+ var css = (animationKeyframes ? animationKeyframes : '') + '.resize-triggers { ' + (animationStyle ? animationStyle : '') + 'visibility: hidden; opacity: 0; } ' + '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: " "; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; z-index: -1; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',
114
+ head = doc.head || doc.getElementsByTagName('head')[0],
115
+ style = doc.createElement('style');
116
+ style.id = 'detectElementResize';
117
+ style.type = 'text/css';
118
+ if (nonce !== null) {
119
+ style.setAttribute('nonce', nonce);
120
+ }
121
+ if (style.styleSheet) {
122
+ style.styleSheet.cssText = css;
123
+ } else {
124
+ style.appendChild(doc.createTextNode(css));
125
+ }
126
+ head.appendChild(style);
127
+ }
128
+ };
129
+ var addResizeListener = function addResizeListener(element, fn) {
130
+ if (attachEvent) {
131
+ element.attachEvent('onresize', fn);
132
+ } else {
133
+ if (!element.__resizeTriggers__) {
134
+ var doc = element.ownerDocument;
135
+ var elementStyle = _window.getComputedStyle(element);
136
+ if (elementStyle && elementStyle.position === 'static') {
137
+ element.style.position = 'relative';
138
+ }
139
+ createStyles(doc);
140
+ element.__resizeLast__ = {};
141
+ element.__resizeListeners__ = [];
142
+ (element.__resizeTriggers__ = doc.createElement('div')).className = 'resize-triggers';
143
+ element.__resizeTriggers__.innerHTML = '<div class="expand-trigger"><div></div></div>' + '<div class="contract-trigger"></div>';
144
+ element.appendChild(element.__resizeTriggers__);
145
+ resetTriggers(element);
146
+ element.addEventListener('scroll', scrollListener, true);
147
+
148
+ /* Listen for a css animation to detect element display/re-attach */
149
+ if (animationstartevent) {
150
+ element.__resizeTriggers__.__animationListener__ = function animationListener(e) {
151
+ if (e.animationName === animationName) {
152
+ resetTriggers(element);
153
+ }
154
+ };
155
+ element.__resizeTriggers__.addEventListener(animationstartevent, element.__resizeTriggers__.__animationListener__);
156
+ }
157
+ }
158
+ element.__resizeListeners__.push(fn);
159
+ }
160
+ };
161
+ var removeResizeListener = function removeResizeListener(element, fn) {
162
+ if (attachEvent) {
163
+ element.detachEvent('onresize', fn);
164
+ } else {
165
+ element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
166
+ if (!element.__resizeListeners__.length) {
167
+ element.removeEventListener('scroll', scrollListener, true);
168
+ if (element.__resizeTriggers__.__animationListener__) {
169
+ element.__resizeTriggers__.removeEventListener(animationstartevent, element.__resizeTriggers__.__animationListener__);
170
+ element.__resizeTriggers__.__animationListener__ = null;
171
+ }
172
+ try {
173
+ element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);
174
+ } catch (e) {
175
+ // Preact compat; see developit/preact-compat/issues/228
176
+ }
177
+ }
178
+ }
179
+ };
180
+ return {
181
+ addResizeListener: addResizeListener,
182
+ removeResizeListener: removeResizeListener
183
+ };
184
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Binary Search Bounds
3
+ * https://github.com/mikolalysenko/interval-tree-1d
4
+ * Mikola Lysenko
5
+ *
6
+ * Inlined because of Content Security Policy issue caused by the use of `new Function(...)` syntax in an upstream dependency.
7
+ * Issue reported here: https://github.com/mikolalysenko/binary-search-bounds/issues/5
8
+ **/
9
+ export default function createWrapper(intervals: any): any;
10
+ //# sourceMappingURL=interval-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interval-tree.d.ts","sourceRoot":"","sources":["../../src/vendor/interval-tree.ts"],"names":[],"mappings":"AAKA;;;;;;;IAOI;AAoYJ,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,SAAS,KAAA,OAK9C"}
@@ -0,0 +1,359 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
+ /* eslint-disable @typescript-eslint/no-this-alias */
3
+ /* eslint-disable no-var */
4
+ /* eslint-disable prefer-spread */
5
+ // @ts-nocheck
6
+ /**
7
+ * Binary Search Bounds
8
+ * https://github.com/mikolalysenko/interval-tree-1d
9
+ * Mikola Lysenko
10
+ *
11
+ * Inlined because of Content Security Policy issue caused by the use of `new Function(...)` syntax in an upstream dependency.
12
+ * Issue reported here: https://github.com/mikolalysenko/binary-search-bounds/issues/5
13
+ **/
14
+
15
+ import bounds from "./binary-search-bounds.js";
16
+ var NOT_FOUND = 0;
17
+ var SUCCESS = 1;
18
+ var EMPTY = 2;
19
+ function IntervalTreeNode(mid, left, right, leftPoints, rightPoints) {
20
+ this.mid = mid;
21
+ this.left = left;
22
+ this.right = right;
23
+ this.leftPoints = leftPoints;
24
+ this.rightPoints = rightPoints;
25
+ this.count = (left ? left.count : 0) + (right ? right.count : 0) + leftPoints.length;
26
+ }
27
+ var proto = IntervalTreeNode.prototype;
28
+ function copy(a, b) {
29
+ a.mid = b.mid;
30
+ a.left = b.left;
31
+ a.right = b.right;
32
+ a.leftPoints = b.leftPoints;
33
+ a.rightPoints = b.rightPoints;
34
+ a.count = b.count;
35
+ }
36
+ function rebuild(node, intervals) {
37
+ var ntree = createIntervalTree(intervals);
38
+ node.mid = ntree.mid;
39
+ node.left = ntree.left;
40
+ node.right = ntree.right;
41
+ node.leftPoints = ntree.leftPoints;
42
+ node.rightPoints = ntree.rightPoints;
43
+ node.count = ntree.count;
44
+ }
45
+ function rebuildWithInterval(node, interval) {
46
+ var intervals = node.intervals([]);
47
+ intervals.push(interval);
48
+ rebuild(node, intervals);
49
+ }
50
+ function rebuildWithoutInterval(node, interval) {
51
+ var intervals = node.intervals([]);
52
+ var idx = intervals.indexOf(interval);
53
+ if (idx < 0) {
54
+ return NOT_FOUND;
55
+ }
56
+ intervals.splice(idx, 1);
57
+ rebuild(node, intervals);
58
+ return SUCCESS;
59
+ }
60
+ proto.intervals = function (result) {
61
+ result.push.apply(result, this.leftPoints);
62
+ if (this.left) {
63
+ this.left.intervals(result);
64
+ }
65
+ if (this.right) {
66
+ this.right.intervals(result);
67
+ }
68
+ return result;
69
+ };
70
+ proto.insert = function (interval) {
71
+ var weight = this.count - this.leftPoints.length;
72
+ this.count += 1;
73
+ if (interval[1] < this.mid) {
74
+ if (this.left) {
75
+ if (4 * (this.left.count + 1) > 3 * (weight + 1)) {
76
+ rebuildWithInterval(this, interval);
77
+ } else {
78
+ this.left.insert(interval);
79
+ }
80
+ } else {
81
+ this.left = createIntervalTree([interval]);
82
+ }
83
+ } else if (interval[0] > this.mid) {
84
+ if (this.right) {
85
+ if (4 * (this.right.count + 1) > 3 * (weight + 1)) {
86
+ rebuildWithInterval(this, interval);
87
+ } else {
88
+ this.right.insert(interval);
89
+ }
90
+ } else {
91
+ this.right = createIntervalTree([interval]);
92
+ }
93
+ } else {
94
+ var l = bounds.ge(this.leftPoints, interval, compareBegin);
95
+ var r = bounds.ge(this.rightPoints, interval, compareEnd);
96
+ this.leftPoints.splice(l, 0, interval);
97
+ this.rightPoints.splice(r, 0, interval);
98
+ }
99
+ };
100
+ proto.remove = function (interval) {
101
+ var weight = this.count - this.leftPoints;
102
+ if (interval[1] < this.mid) {
103
+ if (!this.left) {
104
+ return NOT_FOUND;
105
+ }
106
+ var rw = this.right ? this.right.count : 0;
107
+ if (4 * rw > 3 * (weight - 1)) {
108
+ return rebuildWithoutInterval(this, interval);
109
+ }
110
+ var r = this.left.remove(interval);
111
+ if (r === EMPTY) {
112
+ this.left = null;
113
+ this.count -= 1;
114
+ return SUCCESS;
115
+ } else if (r === SUCCESS) {
116
+ this.count -= 1;
117
+ }
118
+ return r;
119
+ } else if (interval[0] > this.mid) {
120
+ if (!this.right) {
121
+ return NOT_FOUND;
122
+ }
123
+ var lw = this.left ? this.left.count : 0;
124
+ if (4 * lw > 3 * (weight - 1)) {
125
+ return rebuildWithoutInterval(this, interval);
126
+ }
127
+ var r = this.right.remove(interval);
128
+ if (r === EMPTY) {
129
+ this.right = null;
130
+ this.count -= 1;
131
+ return SUCCESS;
132
+ } else if (r === SUCCESS) {
133
+ this.count -= 1;
134
+ }
135
+ return r;
136
+ } else {
137
+ if (this.count === 1) {
138
+ if (this.leftPoints[0] === interval) {
139
+ return EMPTY;
140
+ } else {
141
+ return NOT_FOUND;
142
+ }
143
+ }
144
+ if (this.leftPoints.length === 1 && this.leftPoints[0] === interval) {
145
+ if (this.left && this.right) {
146
+ var p = this;
147
+ var n = this.left;
148
+ while (n.right) {
149
+ p = n;
150
+ n = n.right;
151
+ }
152
+ if (p === this) {
153
+ n.right = this.right;
154
+ } else {
155
+ var l = this.left;
156
+ var r = this.right;
157
+ p.count -= n.count;
158
+ p.right = n.left;
159
+ n.left = l;
160
+ n.right = r;
161
+ }
162
+ copy(this, n);
163
+ this.count = (this.left ? this.left.count : 0) + (this.right ? this.right.count : 0) + this.leftPoints.length;
164
+ } else if (this.left) {
165
+ copy(this, this.left);
166
+ } else {
167
+ copy(this, this.right);
168
+ }
169
+ return SUCCESS;
170
+ }
171
+ for (var l = bounds.ge(this.leftPoints, interval, compareBegin); l < this.leftPoints.length; ++l) {
172
+ if (this.leftPoints[l][0] !== interval[0]) {
173
+ break;
174
+ }
175
+ if (this.leftPoints[l] === interval) {
176
+ this.count -= 1;
177
+ this.leftPoints.splice(l, 1);
178
+ for (var r = bounds.ge(this.rightPoints, interval, compareEnd); r < this.rightPoints.length; ++r) {
179
+ if (this.rightPoints[r][1] !== interval[1]) {
180
+ break;
181
+ } else if (this.rightPoints[r] === interval) {
182
+ this.rightPoints.splice(r, 1);
183
+ return SUCCESS;
184
+ }
185
+ }
186
+ }
187
+ }
188
+ return NOT_FOUND;
189
+ }
190
+ };
191
+ function reportLeftRange(arr, hi, cb) {
192
+ for (var i = 0; i < arr.length && arr[i][0] <= hi; ++i) {
193
+ var r = cb(arr[i]);
194
+ if (r) {
195
+ return r;
196
+ }
197
+ }
198
+ }
199
+ function reportRightRange(arr, lo, cb) {
200
+ for (var i = arr.length - 1; i >= 0 && arr[i][1] >= lo; --i) {
201
+ var r = cb(arr[i]);
202
+ if (r) {
203
+ return r;
204
+ }
205
+ }
206
+ }
207
+ function reportRange(arr, cb) {
208
+ for (var i = 0; i < arr.length; ++i) {
209
+ var r = cb(arr[i]);
210
+ if (r) {
211
+ return r;
212
+ }
213
+ }
214
+ }
215
+ proto.queryPoint = function (x, cb) {
216
+ if (x < this.mid) {
217
+ if (this.left) {
218
+ var r = this.left.queryPoint(x, cb);
219
+ if (r) {
220
+ return r;
221
+ }
222
+ }
223
+ return reportLeftRange(this.leftPoints, x, cb);
224
+ } else if (x > this.mid) {
225
+ if (this.right) {
226
+ var r = this.right.queryPoint(x, cb);
227
+ if (r) {
228
+ return r;
229
+ }
230
+ }
231
+ return reportRightRange(this.rightPoints, x, cb);
232
+ } else {
233
+ return reportRange(this.leftPoints, cb);
234
+ }
235
+ };
236
+ proto.queryInterval = function (lo, hi, cb) {
237
+ if (lo < this.mid && this.left) {
238
+ var r = this.left.queryInterval(lo, hi, cb);
239
+ if (r) {
240
+ return r;
241
+ }
242
+ }
243
+ if (hi > this.mid && this.right) {
244
+ var r = this.right.queryInterval(lo, hi, cb);
245
+ if (r) {
246
+ return r;
247
+ }
248
+ }
249
+ if (hi < this.mid) {
250
+ return reportLeftRange(this.leftPoints, hi, cb);
251
+ } else if (lo > this.mid) {
252
+ return reportRightRange(this.rightPoints, lo, cb);
253
+ } else {
254
+ return reportRange(this.leftPoints, cb);
255
+ }
256
+ };
257
+ function compareNumbers(a, b) {
258
+ return a - b;
259
+ }
260
+ function compareBegin(a, b) {
261
+ var d = a[0] - b[0];
262
+ if (d) {
263
+ return d;
264
+ }
265
+ return a[1] - b[1];
266
+ }
267
+ function compareEnd(a, b) {
268
+ var d = a[1] - b[1];
269
+ if (d) {
270
+ return d;
271
+ }
272
+ return a[0] - b[0];
273
+ }
274
+ function createIntervalTree(intervals) {
275
+ if (intervals.length === 0) {
276
+ return null;
277
+ }
278
+ var pts = [];
279
+ for (var i = 0; i < intervals.length; ++i) {
280
+ pts.push(intervals[i][0], intervals[i][1]);
281
+ }
282
+ pts.sort(compareNumbers);
283
+ var mid = pts[pts.length >> 1];
284
+ var leftIntervals = [];
285
+ var rightIntervals = [];
286
+ var centerIntervals = [];
287
+ for (var i = 0; i < intervals.length; ++i) {
288
+ var s = intervals[i];
289
+ if (s[1] < mid) {
290
+ leftIntervals.push(s);
291
+ } else if (mid < s[0]) {
292
+ rightIntervals.push(s);
293
+ } else {
294
+ centerIntervals.push(s);
295
+ }
296
+ }
297
+
298
+ //Split center intervals
299
+ var leftPoints = centerIntervals;
300
+ var rightPoints = centerIntervals.slice();
301
+ leftPoints.sort(compareBegin);
302
+ rightPoints.sort(compareEnd);
303
+ return new IntervalTreeNode(mid, createIntervalTree(leftIntervals), createIntervalTree(rightIntervals), leftPoints, rightPoints);
304
+ }
305
+
306
+ //User friendly wrapper that makes it possible to support empty trees
307
+ function IntervalTree(root) {
308
+ this.root = root;
309
+ }
310
+ var tproto = IntervalTree.prototype;
311
+ tproto.insert = function (interval) {
312
+ if (this.root) {
313
+ this.root.insert(interval);
314
+ } else {
315
+ this.root = new IntervalTreeNode(interval[0], null, null, [interval], [interval]);
316
+ }
317
+ };
318
+ tproto.remove = function (interval) {
319
+ if (this.root) {
320
+ var r = this.root.remove(interval);
321
+ if (r === EMPTY) {
322
+ this.root = null;
323
+ }
324
+ return r !== NOT_FOUND;
325
+ }
326
+ return false;
327
+ };
328
+ tproto.queryPoint = function (p, cb) {
329
+ if (this.root) {
330
+ return this.root.queryPoint(p, cb);
331
+ }
332
+ };
333
+ tproto.queryInterval = function (lo, hi, cb) {
334
+ if (lo <= hi && this.root) {
335
+ return this.root.queryInterval(lo, hi, cb);
336
+ }
337
+ };
338
+ Object.defineProperty(tproto, 'count', {
339
+ get: function get() {
340
+ if (this.root) {
341
+ return this.root.count;
342
+ }
343
+ return 0;
344
+ }
345
+ });
346
+ Object.defineProperty(tproto, 'intervals', {
347
+ get: function get() {
348
+ if (this.root) {
349
+ return this.root.intervals([]);
350
+ }
351
+ return [];
352
+ }
353
+ });
354
+ export default function createWrapper(intervals) {
355
+ if (!intervals || intervals.length === 0) {
356
+ return new IntervalTree(null);
357
+ }
358
+ return new IntervalTree(createIntervalTree(intervals));
359
+ }
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@difizen/libro-virtualized",
3
+ "version": "0.1.2",
4
+ "description": "",
5
+ "keywords": [
6
+ "libro",
7
+ "notebook"
8
+ ],
9
+ "repository": "git@github.com:difizen/libro.git",
10
+ "license": "MIT",
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "typings": "./es/index.d.ts",
15
+ "default": "./es/index.js"
16
+ },
17
+ "./mock": {
18
+ "typings": "./es/mock/index.d.ts",
19
+ "default": "./es/mock/index.js"
20
+ },
21
+ "./es/mock": {
22
+ "typings": "./es/mock/index.d.ts",
23
+ "default": "./es/mock/index.js"
24
+ },
25
+ "./package.json": "./package.json"
26
+ },
27
+ "main": "es/index.js",
28
+ "module": "es/index.js",
29
+ "typings": "es/index.d.ts",
30
+ "files": [
31
+ "es",
32
+ "src"
33
+ ],
34
+ "peerDependencies": {
35
+ "react": "^18.2.0",
36
+ "react-dom": "^18.2.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/react": "^18.2.25",
40
+ "@types/react-dom": "^18.2.4"
41
+ },
42
+ "dependencies": {
43
+ "classnames": "^2.3.2",
44
+ "dom-helpers": "^5.2.1"
45
+ },
46
+ "scripts": {
47
+ "setup": "father build",
48
+ "build": "father build",
49
+ "test": ": Note: lint task is delegated to test:* scripts",
50
+ "test:vitest": "vitest run",
51
+ "test:jest": "jest",
52
+ "coverage": ": Note: lint task is delegated to coverage:* scripts",
53
+ "coverage:vitest": "vitest run --coverage",
54
+ "coverage:jest": "jest --coverage",
55
+ "lint": ": Note: lint task is delegated to lint:* scripts",
56
+ "lint:eslint": "eslint src",
57
+ "lint:tsc": "tsc --noEmit"
58
+ }
59
+ }