@qelos/aidev 1.2.0 → 1.3.0

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 (215) hide show
  1. package/.env.aidev.example +12 -1
  2. package/README.md +23 -6
  3. package/dist/ai/devin.d.ts +7 -0
  4. package/dist/ai/devin.d.ts.map +1 -0
  5. package/dist/ai/devin.js +91 -0
  6. package/dist/ai/devin.js.map +1 -0
  7. package/dist/ai/index.js +2 -2
  8. package/dist/ai/index.js.map +1 -1
  9. package/dist/cli.js +31 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/help.js +1 -1
  12. package/dist/commands/help.js.map +1 -1
  13. package/dist/commands/hooks.d.ts +5 -0
  14. package/dist/commands/hooks.d.ts.map +1 -0
  15. package/dist/commands/hooks.js +86 -0
  16. package/dist/commands/hooks.js.map +1 -0
  17. package/dist/commands/init.d.ts +1 -0
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +18 -109
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/run.d.ts +1 -1
  22. package/dist/commands/run.d.ts.map +1 -1
  23. package/dist/commands/run.js +78 -63
  24. package/dist/commands/run.js.map +1 -1
  25. package/dist/commands/schedule.js +2 -2
  26. package/dist/commands/schedule.js.map +1 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +8 -1
  29. package/dist/config.js.map +1 -1
  30. package/dist/diagnostics.d.ts.map +1 -1
  31. package/dist/diagnostics.js +1 -2
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/hooks.d.ts +18 -0
  34. package/dist/hooks.d.ts.map +1 -1
  35. package/dist/hooks.js +16 -0
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/hooksTemplate.d.ts +14 -0
  38. package/dist/hooksTemplate.d.ts.map +1 -0
  39. package/dist/hooksTemplate.js +274 -0
  40. package/dist/hooksTemplate.js.map +1 -0
  41. package/dist/logger.d.ts +1 -0
  42. package/dist/logger.d.ts.map +1 -1
  43. package/dist/logger.js +32 -0
  44. package/dist/logger.js.map +1 -1
  45. package/dist/platform.d.ts +2 -2
  46. package/dist/platform.js +2 -2
  47. package/dist/safeMode.d.ts +32 -0
  48. package/dist/safeMode.d.ts.map +1 -0
  49. package/dist/safeMode.js +192 -0
  50. package/dist/safeMode.js.map +1 -0
  51. package/dist/types.d.ts +3 -1
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +2 -2
  54. package/ui/.output/nitro.json +1 -1
  55. package/ui/.output/public/_nuxt/6wLLp9Nc.js +1 -0
  56. package/ui/.output/public/_nuxt/BGkU0f28.js +1 -0
  57. package/ui/.output/public/_nuxt/BOIhDy_l.js +4 -0
  58. package/ui/.output/public/_nuxt/BWJzzHTi.js +1 -0
  59. package/ui/.output/public/_nuxt/{3LZdFtk_.js → By4xSvKt.js} +3 -3
  60. package/ui/.output/public/_nuxt/ByAMJ0xS.js +1 -0
  61. package/ui/.output/public/_nuxt/C1xk3ymy.js +1 -0
  62. package/ui/.output/public/_nuxt/CBV5GuL6.js +11 -0
  63. package/ui/.output/public/_nuxt/CTtW-0zG.js +1 -0
  64. package/ui/.output/public/_nuxt/CX0vIr0s.js +131 -0
  65. package/ui/.output/public/_nuxt/{LzHPbXPK.js → CYm8nRCj.js} +1 -1
  66. package/ui/.output/public/_nuxt/CdHqKVo4.js +1 -0
  67. package/ui/.output/public/_nuxt/CnXdKLRd.js +16 -0
  68. package/ui/.output/public/_nuxt/Cz9dogwK.js +1 -0
  69. package/ui/.output/public/_nuxt/DGHfexQZ.js +1 -0
  70. package/ui/.output/public/_nuxt/{CWjftssB.js → DOoocm0F.js} +1 -1
  71. package/ui/.output/public/_nuxt/{DZd8Jv5H.js → D_gcbXK2.js} +1 -1
  72. package/ui/.output/public/_nuxt/{CO4XMBYO.js → Dfhp6TEA.js} +11 -11
  73. package/ui/.output/public/_nuxt/{BtD1YBwM.js → G5BjvTWO.js} +1 -1
  74. package/ui/.output/public/_nuxt/H73b_QUy.js +1 -0
  75. package/ui/.output/public/_nuxt/{BMTHyzVP.js → LCoCV2KL.js} +1 -1
  76. package/ui/.output/public/_nuxt/Zrl3Utak.js +1 -0
  77. package/ui/.output/public/_nuxt/config.CaB_F_OT.css +1 -0
  78. package/ui/.output/public/_nuxt/default.D13_FS9T.css +1 -0
  79. package/ui/.output/public/_nuxt/hooks.B03-GWTh.css +1 -0
  80. package/ui/.output/public/_nuxt/kPPYUzXr.js +2 -0
  81. package/ui/.output/public/_nuxt/logs.DLMkvOEl.css +1 -0
  82. package/ui/.output/public/_nuxt/mHp9eItY.js +1 -0
  83. package/ui/.output/public/_nuxt/{BTfAgCfF.js → tyaD1vVi.js} +1 -1
  84. package/ui/.output/public/_nuxt/{BGlShnpS.js → ynXKxjpn.js} +1 -1
  85. package/ui/.output/public/_nuxt/{B8sr5ZW-.js → yqBy-NAR.js} +2 -2
  86. package/ui/.output/server/chunks/_/hooksTemplate.mjs +365 -0
  87. package/ui/.output/server/chunks/_/hooksTemplate.mjs.map +1 -0
  88. package/ui/.output/server/chunks/build/{Badge-YPOjmkfv.mjs → Badge-nNgbDd8N.mjs} +2 -2
  89. package/ui/.output/server/chunks/build/{Badge-YPOjmkfv.mjs.map → Badge-nNgbDd8N.mjs.map} +1 -1
  90. package/ui/.output/server/chunks/build/{Button-CZHl6fpI.mjs → Button-CQZG7w2L.mjs} +117 -3
  91. package/ui/.output/server/chunks/build/Button-CQZG7w2L.mjs.map +1 -0
  92. package/ui/.output/server/chunks/build/{Card--ibiHV_r.mjs → Card-DdEnDTQW.mjs} +2 -2
  93. package/ui/.output/server/chunks/build/{Card--ibiHV_r.mjs.map → Card-DdEnDTQW.mjs.map} +1 -1
  94. package/ui/.output/server/chunks/build/{FormGroup-CX5VmH8y.mjs → FormGroup-BfYiVGgN.mjs} +2 -2
  95. package/ui/.output/server/chunks/build/{FormGroup-CX5VmH8y.mjs.map → FormGroup-BfYiVGgN.mjs.map} +1 -1
  96. package/ui/.output/server/chunks/build/{Input-kmqS1oY_.mjs → Input-Cnk3P_aB.mjs} +5 -60
  97. package/ui/.output/server/chunks/build/Input-Cnk3P_aB.mjs.map +1 -0
  98. package/ui/.output/server/chunks/build/{Modal-DmZs0Ekg.mjs → Modal-DfVO6DJD.mjs} +10 -5
  99. package/ui/.output/server/chunks/build/Modal-DfVO6DJD.mjs.map +1 -0
  100. package/ui/.output/server/chunks/build/{Select-n4_YfXfk.mjs → Select-Dc9_TJIR.mjs} +3 -3
  101. package/ui/.output/server/chunks/build/{Select-n4_YfXfk.mjs.map → Select-Dc9_TJIR.mjs.map} +1 -1
  102. package/ui/.output/server/chunks/build/client.precomputed.mjs +1 -1
  103. package/ui/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
  104. package/ui/.output/server/chunks/build/{config-Bkb2wy7R.mjs → config-BUokZPak.mjs} +78 -58
  105. package/ui/.output/server/chunks/build/config-BUokZPak.mjs.map +1 -0
  106. package/ui/.output/server/chunks/build/config-styles.irltMnuD.mjs +8 -0
  107. package/ui/.output/server/chunks/build/config-styles.irltMnuD.mjs.map +1 -0
  108. package/ui/.output/server/chunks/build/{default-DmD3qBXZ.mjs → default-6TcwTt3p.mjs} +10 -9
  109. package/ui/.output/server/chunks/build/default-6TcwTt3p.mjs.map +1 -0
  110. package/ui/.output/server/chunks/build/default-styles.BqL9zxh4.mjs +8 -0
  111. package/ui/.output/server/chunks/build/default-styles.BqL9zxh4.mjs.map +1 -0
  112. package/ui/.output/server/chunks/build/entry-styles.q-b4rEBh.mjs +11 -0
  113. package/ui/.output/server/chunks/build/entry-styles.q-b4rEBh.mjs.map +1 -0
  114. package/ui/.output/server/chunks/build/hooks-k2ZmlVpA.mjs +4181 -0
  115. package/ui/.output/server/chunks/build/hooks-k2ZmlVpA.mjs.map +1 -0
  116. package/ui/.output/server/chunks/build/hooks-styles.Ddk4F_Gj.mjs +8 -0
  117. package/ui/.output/server/chunks/build/hooks-styles.Ddk4F_Gj.mjs.map +1 -0
  118. package/ui/.output/server/chunks/build/{index-Dy4Tu7MB.mjs → index-DwMIJp2e.mjs} +7 -3
  119. package/ui/.output/server/chunks/build/index-DwMIJp2e.mjs.map +1 -0
  120. package/ui/.output/server/chunks/build/{index-BvfXQQ2n.mjs → index-JLPhao-C.mjs} +5 -5
  121. package/ui/.output/server/chunks/build/{index-BvfXQQ2n.mjs.map → index-JLPhao-C.mjs.map} +1 -1
  122. package/ui/.output/server/chunks/build/{interval-DHZqEf-n.mjs → interval-DPa3fpS0.mjs} +3 -3
  123. package/ui/.output/server/chunks/build/{interval-DHZqEf-n.mjs.map → interval-DPa3fpS0.mjs.map} +1 -1
  124. package/ui/.output/server/chunks/build/{login-B5YkLJCV.mjs → login-D9DpNq3o.mjs} +6 -5
  125. package/ui/.output/server/chunks/build/login-D9DpNq3o.mjs.map +1 -0
  126. package/ui/.output/server/chunks/build/{logs-BvD1Y3HI.mjs → logs-BVuWOSb6.mjs} +49 -31
  127. package/ui/.output/server/chunks/build/logs-BVuWOSb6.mjs.map +1 -0
  128. package/ui/.output/server/chunks/build/logs-styles.C2Mi0JvX.mjs +8 -0
  129. package/ui/.output/server/chunks/build/logs-styles.C2Mi0JvX.mjs.map +1 -0
  130. package/ui/.output/server/chunks/build/{run-BStPkbGg.mjs → run-BVQZSGcX.mjs} +5 -5
  131. package/ui/.output/server/chunks/build/{run-BStPkbGg.mjs.map → run-BVQZSGcX.mjs.map} +1 -1
  132. package/ui/.output/server/chunks/build/{schedule-B2UKsnRW.mjs → schedule-rRz2CwWh.mjs} +10 -9
  133. package/ui/.output/server/chunks/build/schedule-rRz2CwWh.mjs.map +1 -0
  134. package/ui/.output/server/chunks/build/server.mjs +14 -9
  135. package/ui/.output/server/chunks/build/server.mjs.map +1 -1
  136. package/ui/.output/server/chunks/build/styles.mjs +7 -6
  137. package/ui/.output/server/chunks/build/styles.mjs.map +1 -1
  138. package/ui/.output/server/chunks/build/{tasks-DBH3Z6lg.mjs → tasks-DJjZQWcq.mjs} +10 -9
  139. package/ui/.output/server/chunks/build/tasks-DJjZQWcq.mjs.map +1 -0
  140. package/ui/.output/server/chunks/build/{useApi-Bqajqsuz.mjs → useApi-Brbyp7hV.mjs} +3 -3
  141. package/ui/.output/server/chunks/build/useApi-Brbyp7hV.mjs.map +1 -0
  142. package/ui/.output/server/chunks/build/useFormGroup-DqE91r20.mjs +61 -0
  143. package/ui/.output/server/chunks/build/useFormGroup-DqE91r20.mjs.map +1 -0
  144. package/ui/.output/server/chunks/nitro/nitro.mjs +195 -157
  145. package/ui/.output/server/chunks/routes/api/config/test.post.mjs +1 -1
  146. package/ui/.output/server/chunks/routes/api/config/test.post.mjs.map +1 -1
  147. package/ui/.output/server/chunks/routes/api/hooks-execute.post.mjs +83 -0
  148. package/ui/.output/server/chunks/routes/api/hooks-execute.post.mjs.map +1 -0
  149. package/ui/.output/server/chunks/routes/api/hooks-regenerate.post.mjs +30 -0
  150. package/ui/.output/server/chunks/routes/api/hooks-regenerate.post.mjs.map +1 -0
  151. package/ui/.output/server/chunks/routes/api/hooks-update.post.mjs +31 -0
  152. package/ui/.output/server/chunks/routes/api/hooks-update.post.mjs.map +1 -0
  153. package/ui/.output/server/chunks/routes/api/hooks.get.mjs +28 -0
  154. package/ui/.output/server/chunks/routes/api/hooks.get.mjs.map +1 -0
  155. package/ui/.output/server/chunks/routes/api/hooks.put.mjs +32 -0
  156. package/ui/.output/server/chunks/routes/api/hooks.put.mjs.map +1 -0
  157. package/ui/.output/server/chunks/routes/api/logs.get.mjs +7 -2
  158. package/ui/.output/server/chunks/routes/api/logs.get.mjs.map +1 -1
  159. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/_virtual/_rollupPluginBabelHelpers.js +123 -0
  160. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/config/index.js +11 -0
  161. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/index.js +9 -0
  162. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/loader/index.js +175 -0
  163. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/utils/compose.js +16 -0
  164. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/utils/curry.js +20 -0
  165. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/utils/deepMerge.js +18 -0
  166. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/utils/isObject.js +9 -0
  167. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/utils/makeCancelable.js +25 -0
  168. package/ui/.output/server/node_modules/@monaco-editor/loader/lib/cjs/validators/index.js +49 -0
  169. package/ui/.output/server/node_modules/@monaco-editor/loader/package.json +51 -0
  170. package/ui/.output/server/node_modules/@tanstack/virtual-core/dist/esm/index.js +1197 -0
  171. package/ui/.output/server/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js +34 -0
  172. package/ui/.output/server/node_modules/@tanstack/virtual-core/dist/esm/utils.js +74 -0
  173. package/ui/.output/server/node_modules/@tanstack/virtual-core/package.json +56 -0
  174. package/ui/.output/server/node_modules/@tanstack/vue-virtual/dist/esm/index.js +66 -0
  175. package/ui/.output/server/node_modules/@tanstack/vue-virtual/package.json +68 -0
  176. package/ui/.output/server/node_modules/state-local/lib/cjs/state-local.js +195 -0
  177. package/ui/.output/server/node_modules/state-local/package.json +59 -0
  178. package/ui/.output/server/package.json +4 -0
  179. package/ui/package.json +1 -0
  180. package/ui/.output/public/_nuxt/B93YYUZf.js +0 -1
  181. package/ui/.output/public/_nuxt/BAs1isOw.js +0 -1
  182. package/ui/.output/public/_nuxt/BrZL2iQr.js +0 -1
  183. package/ui/.output/public/_nuxt/Bv6Ws9vz.js +0 -1
  184. package/ui/.output/public/_nuxt/C2WdrjFS.js +0 -1
  185. package/ui/.output/public/_nuxt/CVTgFccA.js +0 -2
  186. package/ui/.output/public/_nuxt/Ceb2855t.js +0 -1
  187. package/ui/.output/public/_nuxt/Cg55PjEy.js +0 -4
  188. package/ui/.output/public/_nuxt/D0ZgktSu.js +0 -1
  189. package/ui/.output/public/_nuxt/DZIUG6ZX.js +0 -1
  190. package/ui/.output/public/_nuxt/DihqGT4A.js +0 -1
  191. package/ui/.output/public/_nuxt/MzK2TZ-I.js +0 -16
  192. package/ui/.output/public/_nuxt/TJXLPQOj.js +0 -1
  193. package/ui/.output/public/_nuxt/VuiIFQtE.js +0 -1
  194. package/ui/.output/public/_nuxt/config.C19X1GwO.css +0 -1
  195. package/ui/.output/public/_nuxt/default.Dw-0Xw5D.css +0 -1
  196. package/ui/.output/public/_nuxt/logs.PK6CTQHM.css +0 -1
  197. package/ui/.output/server/chunks/build/Button-CZHl6fpI.mjs.map +0 -1
  198. package/ui/.output/server/chunks/build/Input-kmqS1oY_.mjs.map +0 -1
  199. package/ui/.output/server/chunks/build/Modal-DmZs0Ekg.mjs.map +0 -1
  200. package/ui/.output/server/chunks/build/config-Bkb2wy7R.mjs.map +0 -1
  201. package/ui/.output/server/chunks/build/config-styles.B4mTchgT.mjs +0 -8
  202. package/ui/.output/server/chunks/build/config-styles.B4mTchgT.mjs.map +0 -1
  203. package/ui/.output/server/chunks/build/default-DmD3qBXZ.mjs.map +0 -1
  204. package/ui/.output/server/chunks/build/default-styles.DmprFUrQ.mjs +0 -8
  205. package/ui/.output/server/chunks/build/default-styles.DmprFUrQ.mjs.map +0 -1
  206. package/ui/.output/server/chunks/build/entry-styles.Cg1Sndbr.mjs +0 -11
  207. package/ui/.output/server/chunks/build/entry-styles.Cg1Sndbr.mjs.map +0 -1
  208. package/ui/.output/server/chunks/build/index-Dy4Tu7MB.mjs.map +0 -1
  209. package/ui/.output/server/chunks/build/login-B5YkLJCV.mjs.map +0 -1
  210. package/ui/.output/server/chunks/build/logs-BvD1Y3HI.mjs.map +0 -1
  211. package/ui/.output/server/chunks/build/logs-styles.CU5b1wKf.mjs +0 -8
  212. package/ui/.output/server/chunks/build/logs-styles.CU5b1wKf.mjs.map +0 -1
  213. package/ui/.output/server/chunks/build/schedule-B2UKsnRW.mjs.map +0 -1
  214. package/ui/.output/server/chunks/build/tasks-DBH3Z6lg.mjs.map +0 -1
  215. package/ui/.output/server/chunks/build/useApi-Bqajqsuz.mjs.map +0 -1
@@ -0,0 +1,1197 @@
1
+ import { createLazyMeasurementsView } from "./lazy-measurements.js";
2
+ import { memo, approxEqual, notUndefined, debounce } from "./utils.js";
3
+ let _isIOSResult;
4
+ const isIOSWebKit = () => {
5
+ if (_isIOSResult !== void 0) return _isIOSResult;
6
+ if (typeof navigator === "undefined") return _isIOSResult = false;
7
+ if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;
8
+ const mtp = navigator.maxTouchPoints;
9
+ return _isIOSResult = navigator.platform === "MacIntel" && mtp !== void 0 && mtp > 0;
10
+ };
11
+ const _resetIOSDetectionForTests = () => {
12
+ _isIOSResult = void 0;
13
+ };
14
+ const getRect = (element) => {
15
+ const { offsetWidth, offsetHeight } = element;
16
+ return { width: offsetWidth, height: offsetHeight };
17
+ };
18
+ const defaultKeyExtractor = (index) => index;
19
+ const defaultRangeExtractor = (range) => {
20
+ const start = Math.max(range.startIndex - range.overscan, 0);
21
+ const end = Math.min(range.endIndex + range.overscan, range.count - 1);
22
+ const len = end - start + 1;
23
+ const arr = new Array(len);
24
+ for (let i = 0; i < len; i++) {
25
+ arr[i] = start + i;
26
+ }
27
+ return arr;
28
+ };
29
+ const observeElementRect = (instance, cb) => {
30
+ const element = instance.scrollElement;
31
+ if (!element) {
32
+ return;
33
+ }
34
+ const targetWindow = instance.targetWindow;
35
+ if (!targetWindow) {
36
+ return;
37
+ }
38
+ const handler = (rect) => {
39
+ const { width, height } = rect;
40
+ cb({ width: Math.round(width), height: Math.round(height) });
41
+ };
42
+ handler(getRect(element));
43
+ if (!targetWindow.ResizeObserver) {
44
+ return () => {
45
+ };
46
+ }
47
+ const observer = new targetWindow.ResizeObserver((entries) => {
48
+ const run = () => {
49
+ const entry = entries[0];
50
+ if (entry == null ? void 0 : entry.borderBoxSize) {
51
+ const box = entry.borderBoxSize[0];
52
+ if (box) {
53
+ handler({ width: box.inlineSize, height: box.blockSize });
54
+ return;
55
+ }
56
+ }
57
+ handler(getRect(element));
58
+ };
59
+ instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
60
+ });
61
+ observer.observe(element, { box: "border-box" });
62
+ return () => {
63
+ observer.unobserve(element);
64
+ };
65
+ };
66
+ const addEventListenerOptions = {
67
+ passive: true
68
+ };
69
+ const observeWindowRect = (instance, cb) => {
70
+ const element = instance.scrollElement;
71
+ if (!element) {
72
+ return;
73
+ }
74
+ const handler = () => {
75
+ cb({ width: element.innerWidth, height: element.innerHeight });
76
+ };
77
+ handler();
78
+ element.addEventListener("resize", handler, addEventListenerOptions);
79
+ return () => {
80
+ element.removeEventListener("resize", handler);
81
+ };
82
+ };
83
+ const supportsScrollend = typeof window == "undefined" ? true : "onscrollend" in window;
84
+ const observeOffset = (instance, cb, readOffset) => {
85
+ const element = instance.scrollElement;
86
+ if (!element) {
87
+ return;
88
+ }
89
+ const targetWindow = instance.targetWindow;
90
+ if (!targetWindow) {
91
+ return;
92
+ }
93
+ const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;
94
+ let offset = 0;
95
+ const fallback = registerScrollendEvent ? null : debounce(
96
+ targetWindow,
97
+ () => cb(offset, false),
98
+ instance.options.isScrollingResetDelay
99
+ );
100
+ const createHandler = (isScrolling) => () => {
101
+ offset = readOffset(element);
102
+ fallback == null ? void 0 : fallback();
103
+ cb(offset, isScrolling);
104
+ };
105
+ const handler = createHandler(true);
106
+ const endHandler = createHandler(false);
107
+ element.addEventListener("scroll", handler, addEventListenerOptions);
108
+ if (registerScrollendEvent) {
109
+ element.addEventListener("scrollend", endHandler, addEventListenerOptions);
110
+ }
111
+ return () => {
112
+ element.removeEventListener("scroll", handler);
113
+ if (registerScrollendEvent) {
114
+ element.removeEventListener("scrollend", endHandler);
115
+ }
116
+ };
117
+ };
118
+ const observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {
119
+ const { horizontal, isRtl } = instance.options;
120
+ return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;
121
+ });
122
+ const observeWindowOffset = (instance, cb) => observeOffset(
123
+ instance,
124
+ cb,
125
+ (win) => instance.options.horizontal ? win.scrollX : win.scrollY
126
+ );
127
+ const measureElement = (element, entry, instance) => {
128
+ if (entry == null ? void 0 : entry.borderBoxSize) {
129
+ const box = entry.borderBoxSize[0];
130
+ if (box) {
131
+ const size = Math.round(
132
+ box[instance.options.horizontal ? "inlineSize" : "blockSize"]
133
+ );
134
+ return size;
135
+ }
136
+ }
137
+ return element[instance.options.horizontal ? "offsetWidth" : "offsetHeight"];
138
+ };
139
+ const scrollWithAdjustments = (offset, {
140
+ adjustments = 0,
141
+ behavior
142
+ }, instance) => {
143
+ var _a, _b;
144
+ (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {
145
+ [instance.options.horizontal ? "left" : "top"]: offset + adjustments,
146
+ behavior
147
+ });
148
+ };
149
+ const windowScroll = scrollWithAdjustments;
150
+ const elementScroll = scrollWithAdjustments;
151
+ class Virtualizer {
152
+ constructor(opts) {
153
+ this.unsubs = [];
154
+ this.scrollElement = null;
155
+ this.targetWindow = null;
156
+ this.isScrolling = false;
157
+ this.scrollState = null;
158
+ this.measurementsCache = [];
159
+ this._flatMeasurements = null;
160
+ this.itemSizeCache = /* @__PURE__ */ new Map();
161
+ this.itemSizeCacheVersion = 0;
162
+ this.laneAssignments = /* @__PURE__ */ new Map();
163
+ this.pendingMin = null;
164
+ this.prevLanes = void 0;
165
+ this.lanesChangedFlag = false;
166
+ this.lanesSettling = false;
167
+ this.pendingScrollAnchor = null;
168
+ this.scrollRect = null;
169
+ this.scrollOffset = null;
170
+ this.scrollDirection = null;
171
+ this.scrollAdjustments = 0;
172
+ this._iosDeferredAdjustment = 0;
173
+ this._iosTouching = false;
174
+ this._iosJustTouchEnded = false;
175
+ this._iosTouchEndTimerId = null;
176
+ this._intendedScrollOffset = null;
177
+ this.elementsCache = /* @__PURE__ */ new Map();
178
+ this.now = () => {
179
+ var _a, _b, _c;
180
+ return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();
181
+ };
182
+ this.observer = /* @__PURE__ */ (() => {
183
+ let _ro = null;
184
+ const get = () => {
185
+ if (_ro) {
186
+ return _ro;
187
+ }
188
+ if (!this.targetWindow || !this.targetWindow.ResizeObserver) {
189
+ return null;
190
+ }
191
+ return _ro = new this.targetWindow.ResizeObserver((entries) => {
192
+ entries.forEach((entry) => {
193
+ const run = () => {
194
+ const node = entry.target;
195
+ const index = this.indexFromElement(node);
196
+ if (!node.isConnected) {
197
+ this.observer.unobserve(node);
198
+ for (const [cacheKey, cachedNode] of this.elementsCache) {
199
+ if (cachedNode === node) {
200
+ this.elementsCache.delete(cacheKey);
201
+ break;
202
+ }
203
+ }
204
+ return;
205
+ }
206
+ if (this.shouldMeasureDuringScroll(index)) {
207
+ this.resizeItem(
208
+ index,
209
+ this.options.measureElement(node, entry, this)
210
+ );
211
+ }
212
+ };
213
+ this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
214
+ });
215
+ });
216
+ };
217
+ return {
218
+ disconnect: () => {
219
+ var _a;
220
+ (_a = get()) == null ? void 0 : _a.disconnect();
221
+ _ro = null;
222
+ },
223
+ observe: (target) => {
224
+ var _a;
225
+ return (_a = get()) == null ? void 0 : _a.observe(target, { box: "border-box" });
226
+ },
227
+ unobserve: (target) => {
228
+ var _a;
229
+ return (_a = get()) == null ? void 0 : _a.unobserve(target);
230
+ }
231
+ };
232
+ })();
233
+ this.range = null;
234
+ this.setOptions = (opts2) => {
235
+ var _a, _b;
236
+ const merged = {
237
+ debug: false,
238
+ initialOffset: 0,
239
+ overscan: 1,
240
+ paddingStart: 0,
241
+ paddingEnd: 0,
242
+ scrollPaddingStart: 0,
243
+ scrollPaddingEnd: 0,
244
+ horizontal: false,
245
+ getItemKey: defaultKeyExtractor,
246
+ rangeExtractor: defaultRangeExtractor,
247
+ onChange: () => {
248
+ },
249
+ measureElement,
250
+ initialRect: { width: 0, height: 0 },
251
+ scrollMargin: 0,
252
+ gap: 0,
253
+ indexAttribute: "data-index",
254
+ initialMeasurementsCache: [],
255
+ lanes: 1,
256
+ anchorTo: "start",
257
+ followOnAppend: false,
258
+ scrollEndThreshold: 1,
259
+ isScrollingResetDelay: 150,
260
+ enabled: true,
261
+ isRtl: false,
262
+ useScrollendEvent: false,
263
+ useAnimationFrameWithResizeObserver: false,
264
+ laneAssignmentMode: "estimate"
265
+ };
266
+ for (const key in opts2) {
267
+ const v = opts2[key];
268
+ if (v !== void 0) merged[key] = v;
269
+ }
270
+ const prevOptions = this.options;
271
+ let anchor = null;
272
+ let followOnAppend = null;
273
+ if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === "end" && this.scrollElement !== null) {
274
+ const prevCount = prevOptions.count;
275
+ const nextCount = merged.count;
276
+ const measurements = this.getMeasurements();
277
+ const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;
278
+ const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;
279
+ const didCountChange = nextCount !== prevCount;
280
+ const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);
281
+ if (didEdgeKeysChange) {
282
+ const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;
283
+ if (item) {
284
+ anchor = [item.key, this.getScrollOffset() - item.start];
285
+ }
286
+ const behavior = merged.followOnAppend === true ? "auto" : merged.followOnAppend || null;
287
+ if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {
288
+ followOnAppend = behavior;
289
+ }
290
+ }
291
+ }
292
+ this.options = merged;
293
+ if (anchor || followOnAppend) {
294
+ this.pendingScrollAnchor = [
295
+ (anchor == null ? void 0 : anchor[0]) ?? null,
296
+ (anchor == null ? void 0 : anchor[1]) ?? 0,
297
+ followOnAppend
298
+ ];
299
+ }
300
+ };
301
+ this.notify = (sync) => {
302
+ var _a, _b;
303
+ (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);
304
+ };
305
+ this.maybeNotify = memo(
306
+ () => {
307
+ this.calculateRange();
308
+ return [
309
+ this.isScrolling,
310
+ this.range ? this.range.startIndex : null,
311
+ this.range ? this.range.endIndex : null
312
+ ];
313
+ },
314
+ (isScrolling) => {
315
+ this.notify(isScrolling);
316
+ },
317
+ {
318
+ key: process.env.NODE_ENV !== "production" && "maybeNotify",
319
+ debug: () => this.options.debug,
320
+ initialDeps: [
321
+ this.isScrolling,
322
+ this.range ? this.range.startIndex : null,
323
+ this.range ? this.range.endIndex : null
324
+ ]
325
+ }
326
+ );
327
+ this.cleanup = () => {
328
+ this.unsubs.filter(Boolean).forEach((d) => d());
329
+ this.unsubs = [];
330
+ this.observer.disconnect();
331
+ if (this.rafId != null && this.targetWindow) {
332
+ this.targetWindow.cancelAnimationFrame(this.rafId);
333
+ this.rafId = null;
334
+ }
335
+ this.scrollState = null;
336
+ this.scrollElement = null;
337
+ this.targetWindow = null;
338
+ };
339
+ this._didMount = () => {
340
+ return () => {
341
+ this.cleanup();
342
+ };
343
+ };
344
+ this._willUpdate = () => {
345
+ var _a;
346
+ const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;
347
+ if (this.scrollElement !== scrollElement) {
348
+ this.cleanup();
349
+ if (!scrollElement) {
350
+ this.maybeNotify();
351
+ return;
352
+ }
353
+ this.scrollElement = scrollElement;
354
+ if (this.scrollElement && "ownerDocument" in this.scrollElement) {
355
+ this.targetWindow = this.scrollElement.ownerDocument.defaultView;
356
+ } else {
357
+ this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;
358
+ }
359
+ this.elementsCache.forEach((cached) => {
360
+ this.observer.observe(cached);
361
+ });
362
+ this.unsubs.push(
363
+ this.options.observeElementRect(this, (rect) => {
364
+ this.scrollRect = rect;
365
+ this.maybeNotify();
366
+ })
367
+ );
368
+ this.unsubs.push(
369
+ this.options.observeElementOffset(this, (offset, isScrolling) => {
370
+ if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {
371
+ offset = this._intendedScrollOffset;
372
+ }
373
+ this._intendedScrollOffset = null;
374
+ this.scrollAdjustments = 0;
375
+ this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? "forward" : "backward" : null;
376
+ this.scrollOffset = offset;
377
+ this.isScrolling = isScrolling;
378
+ this._flushIosDeferredIfReady();
379
+ if (this.scrollState) {
380
+ this.scheduleScrollReconcile();
381
+ }
382
+ this.maybeNotify();
383
+ })
384
+ );
385
+ if ("addEventListener" in this.scrollElement) {
386
+ const scrollEl = this.scrollElement;
387
+ const onTouchStart = () => {
388
+ this._iosTouching = true;
389
+ this._iosJustTouchEnded = false;
390
+ if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {
391
+ this.targetWindow.clearTimeout(this._iosTouchEndTimerId);
392
+ this._iosTouchEndTimerId = null;
393
+ }
394
+ };
395
+ const onTouchEnd = () => {
396
+ this._iosTouching = false;
397
+ if (!isIOSWebKit() || this.targetWindow == null) {
398
+ return;
399
+ }
400
+ this._iosJustTouchEnded = true;
401
+ this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {
402
+ this._iosJustTouchEnded = false;
403
+ this._iosTouchEndTimerId = null;
404
+ this._flushIosDeferredIfReady();
405
+ }, 150);
406
+ };
407
+ scrollEl.addEventListener(
408
+ "touchstart",
409
+ onTouchStart,
410
+ addEventListenerOptions
411
+ );
412
+ scrollEl.addEventListener(
413
+ "touchend",
414
+ onTouchEnd,
415
+ addEventListenerOptions
416
+ );
417
+ this.unsubs.push(() => {
418
+ scrollEl.removeEventListener("touchstart", onTouchStart);
419
+ scrollEl.removeEventListener("touchend", onTouchEnd);
420
+ if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {
421
+ this.targetWindow.clearTimeout(this._iosTouchEndTimerId);
422
+ this._iosTouchEndTimerId = null;
423
+ }
424
+ });
425
+ }
426
+ this._scrollToOffset(this.getScrollOffset(), {
427
+ adjustments: void 0,
428
+ behavior: void 0
429
+ });
430
+ }
431
+ const anchor = this.pendingScrollAnchor;
432
+ this.pendingScrollAnchor = null;
433
+ if (anchor && this.scrollElement && this.options.enabled) {
434
+ const [key, offset, followOnAppend] = anchor;
435
+ if (key !== null) {
436
+ const { count, getItemKey } = this.options;
437
+ let index = 0;
438
+ while (index < count && getItemKey(index) !== key) {
439
+ index++;
440
+ }
441
+ const item = index < count ? this.getMeasurements()[index] : void 0;
442
+ if (item) {
443
+ const delta = item.start + offset - this.getScrollOffset();
444
+ if (!approxEqual(delta, 0)) {
445
+ this.applyScrollAdjustment(delta);
446
+ }
447
+ }
448
+ }
449
+ if (followOnAppend) {
450
+ this.scrollToEnd({ behavior: followOnAppend });
451
+ }
452
+ }
453
+ };
454
+ this._flushIosDeferredIfReady = () => {
455
+ if (this._iosDeferredAdjustment === 0) return;
456
+ if (this.isScrolling) return;
457
+ if (this._iosTouching) return;
458
+ if (this._iosJustTouchEnded) return;
459
+ const cur = this.getScrollOffset();
460
+ const max = this.getMaxScrollOffset();
461
+ if (cur < 0 || cur > max) return;
462
+ const delta = this._iosDeferredAdjustment;
463
+ this._iosDeferredAdjustment = 0;
464
+ this._scrollToOffset(cur, {
465
+ adjustments: this.scrollAdjustments += delta,
466
+ behavior: void 0
467
+ });
468
+ };
469
+ this.rafId = null;
470
+ this.getSize = () => {
471
+ if (!this.options.enabled) {
472
+ this.scrollRect = null;
473
+ return 0;
474
+ }
475
+ this.scrollRect = this.scrollRect ?? this.options.initialRect;
476
+ return this.scrollRect[this.options.horizontal ? "width" : "height"];
477
+ };
478
+ this.getScrollOffset = () => {
479
+ if (!this.options.enabled) {
480
+ this.scrollOffset = null;
481
+ return 0;
482
+ }
483
+ this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === "function" ? this.options.initialOffset() : this.options.initialOffset);
484
+ return this.scrollOffset;
485
+ };
486
+ this.getFurthestMeasurement = (measurements, index) => {
487
+ const furthestMeasurementsFound = /* @__PURE__ */ new Map();
488
+ const furthestMeasurements = /* @__PURE__ */ new Map();
489
+ for (let m = index - 1; m >= 0; m--) {
490
+ const measurement = measurements[m];
491
+ if (furthestMeasurementsFound.has(measurement.lane)) {
492
+ continue;
493
+ }
494
+ const previousFurthestMeasurement = furthestMeasurements.get(
495
+ measurement.lane
496
+ );
497
+ if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {
498
+ furthestMeasurements.set(measurement.lane, measurement);
499
+ } else if (measurement.end < previousFurthestMeasurement.end) {
500
+ furthestMeasurementsFound.set(measurement.lane, true);
501
+ }
502
+ if (furthestMeasurementsFound.size === this.options.lanes) {
503
+ break;
504
+ }
505
+ }
506
+ return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {
507
+ if (a.end === b.end) {
508
+ return a.index - b.index;
509
+ }
510
+ return a.end - b.end;
511
+ })[0] : void 0;
512
+ };
513
+ this.getMeasurementOptions = memo(
514
+ () => [
515
+ this.options.count,
516
+ this.options.paddingStart,
517
+ this.options.scrollMargin,
518
+ this.options.getItemKey,
519
+ this.options.enabled,
520
+ this.options.lanes,
521
+ this.options.laneAssignmentMode
522
+ ],
523
+ (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode) => {
524
+ const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;
525
+ if (lanesChanged) {
526
+ this.lanesChangedFlag = true;
527
+ }
528
+ this.prevLanes = lanes;
529
+ this.pendingMin = null;
530
+ return {
531
+ count,
532
+ paddingStart,
533
+ scrollMargin,
534
+ getItemKey,
535
+ enabled,
536
+ lanes,
537
+ laneAssignmentMode
538
+ };
539
+ },
540
+ {
541
+ key: false
542
+ }
543
+ );
544
+ this.getMeasurements = memo(
545
+ () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],
546
+ ({
547
+ count,
548
+ paddingStart,
549
+ scrollMargin,
550
+ getItemKey,
551
+ enabled,
552
+ lanes,
553
+ laneAssignmentMode
554
+ }, _itemSizeCacheVersion) => {
555
+ const itemSizeCache = this.itemSizeCache;
556
+ if (!enabled) {
557
+ this.measurementsCache = [];
558
+ this.itemSizeCache.clear();
559
+ this.laneAssignments.clear();
560
+ return [];
561
+ }
562
+ if (this.laneAssignments.size > count) {
563
+ for (const index of this.laneAssignments.keys()) {
564
+ if (index >= count) {
565
+ this.laneAssignments.delete(index);
566
+ }
567
+ }
568
+ }
569
+ if (this.lanesChangedFlag) {
570
+ this.lanesChangedFlag = false;
571
+ this.lanesSettling = true;
572
+ this.measurementsCache = [];
573
+ this.itemSizeCache.clear();
574
+ this.laneAssignments.clear();
575
+ this.pendingMin = null;
576
+ }
577
+ if (this.measurementsCache.length === 0 && !this.lanesSettling) {
578
+ this.measurementsCache = this.options.initialMeasurementsCache;
579
+ this.measurementsCache.forEach((item) => {
580
+ this.itemSizeCache.set(item.key, item.size);
581
+ });
582
+ }
583
+ const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;
584
+ this.pendingMin = null;
585
+ if (this.lanesSettling && this.measurementsCache.length === count) {
586
+ this.lanesSettling = false;
587
+ }
588
+ if (lanes === 1) {
589
+ const gap = this.options.gap;
590
+ const need = count * 2;
591
+ let flat = this._flatMeasurements;
592
+ if (!flat || flat.length < need) {
593
+ const next = new Float64Array(need);
594
+ if (flat && min > 0) next.set(flat.subarray(0, min * 2));
595
+ flat = next;
596
+ this._flatMeasurements = flat;
597
+ }
598
+ let runningStart;
599
+ if (min === 0) {
600
+ runningStart = paddingStart + scrollMargin;
601
+ } else {
602
+ const prevIdx = min - 1;
603
+ runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;
604
+ }
605
+ for (let i = min; i < count; i++) {
606
+ const key = getItemKey(i);
607
+ const measuredSize = itemSizeCache.get(key);
608
+ const size = typeof measuredSize === "number" ? measuredSize : this.options.estimateSize(i);
609
+ flat[i * 2] = runningStart;
610
+ flat[i * 2 + 1] = size;
611
+ runningStart += size + gap;
612
+ }
613
+ const view = createLazyMeasurementsView(count, flat, getItemKey);
614
+ this.measurementsCache = view;
615
+ return view;
616
+ }
617
+ const measurements = this.measurementsCache.slice(0, min);
618
+ const laneLastIndex = new Array(lanes).fill(
619
+ void 0
620
+ );
621
+ for (let m = 0; m < min; m++) {
622
+ const item = measurements[m];
623
+ if (item) {
624
+ laneLastIndex[item.lane] = m;
625
+ }
626
+ }
627
+ for (let i = min; i < count; i++) {
628
+ const key = getItemKey(i);
629
+ const cachedLane = this.laneAssignments.get(i);
630
+ let lane;
631
+ let start;
632
+ const shouldCacheLane = laneAssignmentMode === "estimate" || itemSizeCache.has(key);
633
+ if (cachedLane !== void 0 && this.options.lanes > 1) {
634
+ lane = cachedLane;
635
+ const prevIndex = laneLastIndex[lane];
636
+ const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;
637
+ start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;
638
+ } else {
639
+ const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);
640
+ start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;
641
+ lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;
642
+ if (this.options.lanes > 1 && shouldCacheLane) {
643
+ this.laneAssignments.set(i, lane);
644
+ }
645
+ }
646
+ const measuredSize = itemSizeCache.get(key);
647
+ const size = typeof measuredSize === "number" ? measuredSize : this.options.estimateSize(i);
648
+ const end = start + size;
649
+ measurements[i] = {
650
+ index: i,
651
+ start,
652
+ size,
653
+ end,
654
+ key,
655
+ lane
656
+ };
657
+ laneLastIndex[lane] = i;
658
+ }
659
+ this.measurementsCache = measurements;
660
+ return measurements;
661
+ },
662
+ {
663
+ key: process.env.NODE_ENV !== "production" && "getMeasurements",
664
+ debug: () => this.options.debug
665
+ }
666
+ );
667
+ this.calculateRange = memo(
668
+ () => [
669
+ this.getMeasurements(),
670
+ this.getSize(),
671
+ this.getScrollOffset(),
672
+ this.options.lanes
673
+ ],
674
+ (measurements, outerSize, scrollOffset, lanes) => {
675
+ return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({
676
+ measurements,
677
+ outerSize,
678
+ scrollOffset,
679
+ lanes,
680
+ // Pass the typed array so binary search + forward-walk can
681
+ // read start/end directly from Float64Array, skipping the
682
+ // Proxy traps that materialize a full VirtualItem per probe.
683
+ flat: lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null
684
+ }) : null;
685
+ },
686
+ {
687
+ key: process.env.NODE_ENV !== "production" && "calculateRange",
688
+ debug: () => this.options.debug
689
+ }
690
+ );
691
+ this.getVirtualIndexes = memo(
692
+ () => {
693
+ let startIndex = null;
694
+ let endIndex = null;
695
+ const range = this.calculateRange();
696
+ if (range) {
697
+ startIndex = range.startIndex;
698
+ endIndex = range.endIndex;
699
+ }
700
+ this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);
701
+ return [
702
+ this.options.rangeExtractor,
703
+ this.options.overscan,
704
+ this.options.count,
705
+ startIndex,
706
+ endIndex
707
+ ];
708
+ },
709
+ (rangeExtractor, overscan, count, startIndex, endIndex) => {
710
+ return startIndex === null || endIndex === null ? [] : rangeExtractor({
711
+ startIndex,
712
+ endIndex,
713
+ overscan,
714
+ count
715
+ });
716
+ },
717
+ {
718
+ key: process.env.NODE_ENV !== "production" && "getVirtualIndexes",
719
+ debug: () => this.options.debug
720
+ }
721
+ );
722
+ this.indexFromElement = (node) => {
723
+ const attributeName = this.options.indexAttribute;
724
+ const indexStr = node.getAttribute(attributeName);
725
+ if (!indexStr) {
726
+ console.warn(
727
+ `Missing attribute name '${attributeName}={index}' on measured element.`
728
+ );
729
+ return -1;
730
+ }
731
+ return parseInt(indexStr, 10);
732
+ };
733
+ this.shouldMeasureDuringScroll = (index) => {
734
+ var _a;
735
+ if (!this.scrollState || this.scrollState.behavior !== "smooth") {
736
+ return true;
737
+ }
738
+ const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);
739
+ if (scrollIndex !== void 0 && this.range) {
740
+ const bufferSize = Math.max(
741
+ this.options.overscan,
742
+ Math.ceil((this.range.endIndex - this.range.startIndex) / 2)
743
+ );
744
+ const minIndex = Math.max(0, scrollIndex - bufferSize);
745
+ const maxIndex = Math.min(
746
+ this.options.count - 1,
747
+ scrollIndex + bufferSize
748
+ );
749
+ return index >= minIndex && index <= maxIndex;
750
+ }
751
+ return true;
752
+ };
753
+ this.measureElement = (node) => {
754
+ if (!node) {
755
+ this.elementsCache.forEach((cached, key2) => {
756
+ if (!cached.isConnected) {
757
+ this.observer.unobserve(cached);
758
+ this.elementsCache.delete(key2);
759
+ }
760
+ });
761
+ return;
762
+ }
763
+ const index = this.indexFromElement(node);
764
+ const key = this.options.getItemKey(index);
765
+ const prevNode = this.elementsCache.get(key);
766
+ if (prevNode !== node) {
767
+ if (prevNode) {
768
+ this.observer.unobserve(prevNode);
769
+ }
770
+ this.observer.observe(node);
771
+ this.elementsCache.set(key, node);
772
+ }
773
+ if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {
774
+ this.resizeItem(index, this.options.measureElement(node, void 0, this));
775
+ }
776
+ };
777
+ this.resizeItem = (index, size) => {
778
+ var _a, _b;
779
+ if (index < 0 || index >= this.options.count) return;
780
+ let cachedSize;
781
+ let itemStart;
782
+ let key;
783
+ const flat = this._flatMeasurements;
784
+ if (this.options.lanes === 1 && flat !== null) {
785
+ key = this.options.getItemKey(index);
786
+ itemStart = flat[index * 2];
787
+ cachedSize = flat[index * 2 + 1];
788
+ } else {
789
+ const item = this.measurementsCache[index];
790
+ if (!item) return;
791
+ key = item.key;
792
+ itemStart = item.start;
793
+ cachedSize = item.size;
794
+ }
795
+ const itemSize = this.itemSizeCache.get(key) ?? cachedSize;
796
+ const delta = size - itemSize;
797
+ if (delta !== 0) {
798
+ const wasAtEnd = this.options.anchorTo === "end" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== "smooth" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;
799
+ const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;
800
+ const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== "smooth" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(
801
+ // The callback expects a VirtualItem; build one lazily only
802
+ // when the consumer actually supplied a custom predicate.
803
+ this.measurementsCache[index] ?? {
804
+ index,
805
+ key,
806
+ start: itemStart,
807
+ size: cachedSize,
808
+ end: itemStart + cachedSize,
809
+ lane: 0
810
+ },
811
+ delta,
812
+ this
813
+ ) : (
814
+ // Default: adjust scrollTop only when the resize is an above-
815
+ // viewport item AND we're not actively scrolling backward.
816
+ // Adjusting during backward scroll fights the user's scroll
817
+ // direction and produces the "items jump while scrolling up"
818
+ // jank reported across many issues. Users who want the old
819
+ // behavior can pass shouldAdjustScrollPositionOnItemSizeChange.
820
+ itemStart < this.getScrollOffset() + this.scrollAdjustments && this.scrollDirection !== "backward"
821
+ ));
822
+ if (this.pendingMin === null || index < this.pendingMin) {
823
+ this.pendingMin = index;
824
+ }
825
+ this.itemSizeCache.set(key, size);
826
+ this.itemSizeCacheVersion++;
827
+ if (wasAtEnd) {
828
+ this.applyScrollAdjustment(this.getTotalSize() - prevTotalSize);
829
+ } else if (shouldAdjustScroll) {
830
+ this.applyScrollAdjustment(delta);
831
+ }
832
+ this.notify(false);
833
+ }
834
+ };
835
+ this.getVirtualItems = memo(
836
+ () => [this.getVirtualIndexes(), this.getMeasurements()],
837
+ (indexes, measurements) => {
838
+ const virtualItems = [];
839
+ for (let k = 0, len = indexes.length; k < len; k++) {
840
+ const i = indexes[k];
841
+ const measurement = measurements[i];
842
+ virtualItems.push(measurement);
843
+ }
844
+ return virtualItems;
845
+ },
846
+ {
847
+ key: process.env.NODE_ENV !== "production" && "getVirtualItems",
848
+ debug: () => this.options.debug
849
+ }
850
+ );
851
+ this.getVirtualItemForOffset = (offset) => {
852
+ const measurements = this.getMeasurements();
853
+ if (measurements.length === 0) {
854
+ return void 0;
855
+ }
856
+ const flat = this._flatMeasurements;
857
+ const useFlat = this.options.lanes === 1 && flat != null;
858
+ const idx = findNearestBinarySearch(
859
+ 0,
860
+ measurements.length - 1,
861
+ useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,
862
+ offset
863
+ );
864
+ return notUndefined(measurements[idx]);
865
+ };
866
+ this.getMaxScrollOffset = () => {
867
+ if (!this.scrollElement) return 0;
868
+ if ("scrollHeight" in this.scrollElement) {
869
+ return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;
870
+ } else {
871
+ const doc = this.scrollElement.document.documentElement;
872
+ return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;
873
+ }
874
+ };
875
+ this.getVirtualDistanceFromEnd = () => {
876
+ return Math.max(
877
+ this.getTotalSize() - this.getSize() - this.getScrollOffset(),
878
+ 0
879
+ );
880
+ };
881
+ this.getDistanceFromEnd = () => {
882
+ return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);
883
+ };
884
+ this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {
885
+ return this.getDistanceFromEnd() <= threshold;
886
+ };
887
+ this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {
888
+ if (!this.scrollElement) return 0;
889
+ const size = this.getSize();
890
+ const scrollOffset = this.getScrollOffset();
891
+ if (align === "auto") {
892
+ align = toOffset >= scrollOffset + size ? "end" : "start";
893
+ }
894
+ if (align === "center") {
895
+ toOffset += (itemSize - size) / 2;
896
+ } else if (align === "end") {
897
+ toOffset -= size;
898
+ }
899
+ const maxOffset = this.getMaxScrollOffset();
900
+ return Math.max(Math.min(maxOffset, toOffset), 0);
901
+ };
902
+ this.getOffsetForIndex = (index, align = "auto") => {
903
+ index = Math.max(0, Math.min(index, this.options.count - 1));
904
+ const size = this.getSize();
905
+ const scrollOffset = this.getScrollOffset();
906
+ const item = this.measurementsCache[index];
907
+ if (!item) return;
908
+ if (align === "auto") {
909
+ if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {
910
+ align = "end";
911
+ } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {
912
+ align = "start";
913
+ } else {
914
+ return [scrollOffset, align];
915
+ }
916
+ }
917
+ if (align === "end" && index === this.options.count - 1) {
918
+ return [this.getMaxScrollOffset(), align];
919
+ }
920
+ const toOffset = align === "end" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;
921
+ return [
922
+ this.getOffsetForAlignment(toOffset, align, item.size),
923
+ align
924
+ ];
925
+ };
926
+ this.scrollToOffset = (toOffset, { align = "start", behavior = "auto" } = {}) => {
927
+ const offset = this.getOffsetForAlignment(toOffset, align);
928
+ const now = this.now();
929
+ this.scrollState = {
930
+ index: null,
931
+ align,
932
+ behavior,
933
+ startedAt: now,
934
+ lastTargetOffset: offset,
935
+ stableFrames: 0
936
+ };
937
+ this._scrollToOffset(offset, { adjustments: void 0, behavior });
938
+ this.scheduleScrollReconcile();
939
+ };
940
+ this.scrollToIndex = (index, {
941
+ align: initialAlign = "auto",
942
+ behavior = "auto"
943
+ } = {}) => {
944
+ index = Math.max(0, Math.min(index, this.options.count - 1));
945
+ const offsetInfo = this.getOffsetForIndex(index, initialAlign);
946
+ if (!offsetInfo) {
947
+ return;
948
+ }
949
+ const [offset, align] = offsetInfo;
950
+ const now = this.now();
951
+ this.scrollState = {
952
+ index,
953
+ align,
954
+ behavior,
955
+ startedAt: now,
956
+ lastTargetOffset: offset,
957
+ stableFrames: 0
958
+ };
959
+ this._scrollToOffset(offset, { adjustments: void 0, behavior });
960
+ this.scheduleScrollReconcile();
961
+ };
962
+ this.scrollBy = (delta, { behavior = "auto" } = {}) => {
963
+ const offset = this.getScrollOffset() + delta;
964
+ const now = this.now();
965
+ this.scrollState = {
966
+ index: null,
967
+ align: "start",
968
+ behavior,
969
+ startedAt: now,
970
+ lastTargetOffset: offset,
971
+ stableFrames: 0
972
+ };
973
+ this._scrollToOffset(offset, { adjustments: void 0, behavior });
974
+ this.scheduleScrollReconcile();
975
+ };
976
+ this.scrollToEnd = ({ behavior = "auto" } = {}) => {
977
+ if (this.options.count > 0) {
978
+ this.scrollToIndex(this.options.count - 1, {
979
+ align: "end",
980
+ behavior
981
+ });
982
+ return;
983
+ }
984
+ this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {
985
+ behavior
986
+ });
987
+ };
988
+ this.getTotalSize = () => {
989
+ var _a;
990
+ const measurements = this.getMeasurements();
991
+ let end;
992
+ if (measurements.length === 0) {
993
+ end = this.options.paddingStart;
994
+ } else if (this.options.lanes === 1) {
995
+ const lastIdx = measurements.length - 1;
996
+ const flat = this._flatMeasurements;
997
+ if (flat != null) {
998
+ end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];
999
+ } else {
1000
+ end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;
1001
+ }
1002
+ } else {
1003
+ const endByLane = Array(this.options.lanes).fill(null);
1004
+ let endIndex = measurements.length - 1;
1005
+ while (endIndex >= 0 && endByLane.some((val) => val === null)) {
1006
+ const item = measurements[endIndex];
1007
+ if (endByLane[item.lane] === null) {
1008
+ endByLane[item.lane] = item.end;
1009
+ }
1010
+ endIndex--;
1011
+ }
1012
+ end = Math.max(...endByLane.filter((val) => val !== null));
1013
+ }
1014
+ return Math.max(
1015
+ end - this.options.scrollMargin + this.options.paddingEnd,
1016
+ 0
1017
+ );
1018
+ };
1019
+ this.takeSnapshot = () => {
1020
+ const snapshot = [];
1021
+ if (this.itemSizeCache.size === 0) return snapshot;
1022
+ const m = this.getMeasurements();
1023
+ for (const item of m) {
1024
+ if (item && this.itemSizeCache.has(item.key)) {
1025
+ snapshot.push({
1026
+ index: item.index,
1027
+ key: item.key,
1028
+ start: item.start,
1029
+ size: item.size,
1030
+ end: item.end,
1031
+ lane: item.lane
1032
+ });
1033
+ }
1034
+ }
1035
+ return snapshot;
1036
+ };
1037
+ this._scrollToOffset = (offset, {
1038
+ adjustments,
1039
+ behavior
1040
+ }) => {
1041
+ this._intendedScrollOffset = offset + (adjustments ?? 0);
1042
+ this.options.scrollToFn(offset, { behavior, adjustments }, this);
1043
+ };
1044
+ this.measure = () => {
1045
+ this.pendingMin = null;
1046
+ this.itemSizeCache.clear();
1047
+ this.laneAssignments.clear();
1048
+ this.itemSizeCacheVersion++;
1049
+ this.notify(false);
1050
+ };
1051
+ this.setOptions(opts);
1052
+ }
1053
+ applyScrollAdjustment(delta, behavior) {
1054
+ if (delta === 0) return;
1055
+ if (process.env.NODE_ENV !== "production" && this.options.debug) {
1056
+ console.info("correction", delta);
1057
+ }
1058
+ if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {
1059
+ this._iosDeferredAdjustment += delta;
1060
+ } else {
1061
+ this._scrollToOffset(this.getScrollOffset(), {
1062
+ adjustments: this.scrollAdjustments += delta,
1063
+ behavior
1064
+ });
1065
+ }
1066
+ }
1067
+ scheduleScrollReconcile() {
1068
+ if (!this.targetWindow) {
1069
+ this.scrollState = null;
1070
+ return;
1071
+ }
1072
+ if (this.rafId != null) return;
1073
+ this.rafId = this.targetWindow.requestAnimationFrame(() => {
1074
+ this.rafId = null;
1075
+ this.reconcileScroll();
1076
+ });
1077
+ }
1078
+ reconcileScroll() {
1079
+ if (!this.scrollState) return;
1080
+ const el = this.scrollElement;
1081
+ if (!el) return;
1082
+ const MAX_RECONCILE_MS = 5e3;
1083
+ if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {
1084
+ this.scrollState = null;
1085
+ return;
1086
+ }
1087
+ const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;
1088
+ const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;
1089
+ const STABLE_FRAMES = 1;
1090
+ const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;
1091
+ if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {
1092
+ this.scrollState.stableFrames++;
1093
+ if (this.scrollState.stableFrames >= STABLE_FRAMES) {
1094
+ if (this.getScrollOffset() !== targetOffset) {
1095
+ this._scrollToOffset(targetOffset, {
1096
+ adjustments: void 0,
1097
+ behavior: "auto"
1098
+ });
1099
+ }
1100
+ this.scrollState = null;
1101
+ return;
1102
+ }
1103
+ } else {
1104
+ this.scrollState.stableFrames = 0;
1105
+ if (targetChanged) {
1106
+ const viewport = this.getSize() || 600;
1107
+ const distance = Math.abs(targetOffset - this.getScrollOffset());
1108
+ const keepSmooth = this.scrollState.behavior === "smooth" && distance > viewport;
1109
+ this.scrollState.lastTargetOffset = targetOffset;
1110
+ if (!keepSmooth) {
1111
+ this.scrollState.behavior = "auto";
1112
+ }
1113
+ this._scrollToOffset(targetOffset, {
1114
+ adjustments: void 0,
1115
+ behavior: keepSmooth ? "smooth" : "auto"
1116
+ });
1117
+ }
1118
+ }
1119
+ this.scheduleScrollReconcile();
1120
+ }
1121
+ }
1122
+ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
1123
+ while (low <= high) {
1124
+ const middle = (low + high) / 2 | 0;
1125
+ const currentValue = getCurrentValue(middle);
1126
+ if (currentValue < value) {
1127
+ low = middle + 1;
1128
+ } else if (currentValue > value) {
1129
+ high = middle - 1;
1130
+ } else {
1131
+ return middle;
1132
+ }
1133
+ }
1134
+ if (low > 0) {
1135
+ return low - 1;
1136
+ } else {
1137
+ return 0;
1138
+ }
1139
+ };
1140
+ function calculateRange({
1141
+ measurements,
1142
+ outerSize,
1143
+ scrollOffset,
1144
+ lanes,
1145
+ flat
1146
+ }) {
1147
+ const lastIndex = measurements.length - 1;
1148
+ const getStart = flat ? (index) => flat[index * 2] : (index) => measurements[index].start;
1149
+ const getEnd = flat ? (index) => flat[index * 2] + flat[index * 2 + 1] : (index) => measurements[index].end;
1150
+ if (measurements.length <= lanes) {
1151
+ return {
1152
+ startIndex: 0,
1153
+ endIndex: lastIndex
1154
+ };
1155
+ }
1156
+ let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);
1157
+ let endIndex = startIndex;
1158
+ if (lanes === 1) {
1159
+ while (endIndex < lastIndex && getEnd(endIndex) < scrollOffset + outerSize) {
1160
+ endIndex++;
1161
+ }
1162
+ } else if (lanes > 1) {
1163
+ const endPerLane = Array(lanes).fill(0);
1164
+ while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {
1165
+ const item = measurements[endIndex];
1166
+ endPerLane[item.lane] = item.end;
1167
+ endIndex++;
1168
+ }
1169
+ const startPerLane = Array(lanes).fill(scrollOffset + outerSize);
1170
+ while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {
1171
+ const item = measurements[startIndex];
1172
+ startPerLane[item.lane] = item.start;
1173
+ startIndex--;
1174
+ }
1175
+ startIndex = Math.max(0, startIndex - startIndex % lanes);
1176
+ endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));
1177
+ }
1178
+ return { startIndex, endIndex };
1179
+ }
1180
+ export {
1181
+ Virtualizer,
1182
+ _resetIOSDetectionForTests,
1183
+ approxEqual,
1184
+ debounce,
1185
+ defaultKeyExtractor,
1186
+ defaultRangeExtractor,
1187
+ elementScroll,
1188
+ measureElement,
1189
+ memo,
1190
+ notUndefined,
1191
+ observeElementOffset,
1192
+ observeElementRect,
1193
+ observeWindowOffset,
1194
+ observeWindowRect,
1195
+ windowScroll
1196
+ };
1197
+ //# sourceMappingURL=index.js.map