react-native-nitro-list 0.0.1 → 0.1.1

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 (336) hide show
  1. package/README.md +250 -16
  2. package/android/build.gradle +5 -4
  3. package/android/src/main/java/com/nitrolist/HybridNitroRecyclerView.kt +26 -0
  4. package/android/src/main/java/com/nitrolist/HybridNitroRecyclerViewManager.kt +29 -0
  5. package/android/src/main/java/com/nitrolist/NitroListPackage.kt +13 -24
  6. package/android/src/main/java/com/nitrolist/NitroRecyclerAdapter.kt +32 -0
  7. package/android/src/main/java/com/nitrolist/NitroRecyclerViewHolder.kt +8 -0
  8. package/ios/HybridNitroList.swift +32 -15
  9. package/lib/commonjs/NitroList.js +9 -0
  10. package/lib/commonjs/NitroList.js.map +1 -0
  11. package/lib/commonjs/RecyclerList.internal.js +25 -0
  12. package/lib/commonjs/RecyclerList.internal.js.map +1 -0
  13. package/lib/commonjs/RecyclerList.js +171 -0
  14. package/lib/commonjs/RecyclerList.js.map +1 -0
  15. package/lib/commonjs/RecyclerList.types.js +6 -0
  16. package/lib/commonjs/RecyclerList.types.js.map +1 -0
  17. package/lib/commonjs/ReusableView.js +2 -0
  18. package/lib/commonjs/ReusableView.js.map +1 -0
  19. package/lib/commonjs/cell/Cell.js +2 -0
  20. package/lib/{module/specs/nitro-list.nitro.js.map → commonjs/cell/Cell.js.map} +1 -1
  21. package/lib/commonjs/cell/CellRecycler.js +62 -0
  22. package/lib/commonjs/cell/CellRecycler.js.map +1 -0
  23. package/lib/commonjs/cell/StableKey.js +10 -0
  24. package/lib/commonjs/cell/StableKey.js.map +1 -0
  25. package/lib/commonjs/debug/useDebugOverlay.js +15 -0
  26. package/lib/commonjs/debug/useDebugOverlay.js.map +1 -0
  27. package/lib/commonjs/getVisibleIndices.js +38 -0
  28. package/lib/commonjs/getVisibleIndices.js.map +1 -0
  29. package/lib/commonjs/hooks/useCellRenderer.js +62 -0
  30. package/lib/commonjs/hooks/useCellRenderer.js.map +1 -0
  31. package/lib/commonjs/hooks/useStableCallback.js +13 -0
  32. package/lib/commonjs/hooks/useStableCallback.js.map +1 -0
  33. package/lib/commonjs/index.js +7 -5
  34. package/lib/commonjs/index.js.map +1 -1
  35. package/lib/commonjs/layout/EstimatedLayoutProvider.js +30 -0
  36. package/lib/commonjs/layout/EstimatedLayoutProvider.js.map +1 -0
  37. package/lib/commonjs/layout/LayoutEngine.js +21 -0
  38. package/lib/commonjs/layout/LayoutEngine.js.map +1 -0
  39. package/lib/commonjs/{specs/nitro-list.nitro.js → layout/LayoutProvider.js} +1 -1
  40. package/lib/commonjs/{specs/nitro-list.nitro.js.map → layout/LayoutProvider.js.map} +1 -1
  41. package/lib/commonjs/layout/LayoutRectangle.js +2 -0
  42. package/lib/commonjs/layout/LayoutRectangle.js.map +1 -0
  43. package/lib/commonjs/layout/MutableLinearLayout.js +65 -0
  44. package/lib/commonjs/layout/MutableLinearLayout.js.map +1 -0
  45. package/lib/commonjs/layout/index.js +20 -0
  46. package/lib/commonjs/layout/index.js.map +1 -0
  47. package/lib/commonjs/measurement/MeasureLayout.js +20 -0
  48. package/lib/commonjs/measurement/MeasureLayout.js.map +1 -0
  49. package/lib/commonjs/measurement/useItemMeasurement.js +28 -0
  50. package/lib/commonjs/measurement/useItemMeasurement.js.map +1 -0
  51. package/lib/commonjs/native/NitroLayoutEngine.js +9 -0
  52. package/lib/commonjs/native/NitroLayoutEngine.js.map +1 -0
  53. package/lib/commonjs/native/NitroList.types.js +6 -0
  54. package/lib/commonjs/native/NitroList.types.js.map +1 -0
  55. package/lib/commonjs/native/NitroRecyclerView.js +9 -0
  56. package/lib/commonjs/native/NitroRecyclerView.js.map +1 -0
  57. package/lib/commonjs/prefetch/PrefetchHelper.js +39 -0
  58. package/lib/commonjs/prefetch/PrefetchHelper.js.map +1 -0
  59. package/lib/commonjs/specs/nitro-layout-engine.nitro.js +6 -0
  60. package/lib/commonjs/specs/nitro-layout-engine.nitro.js.map +1 -0
  61. package/lib/commonjs/utils/arrayEqual.js +15 -0
  62. package/lib/commonjs/utils/arrayEqual.js.map +1 -0
  63. package/lib/commonjs/utils/assertNever.js +10 -0
  64. package/lib/commonjs/utils/assertNever.js.map +1 -0
  65. package/lib/commonjs/utils/clamp.js +10 -0
  66. package/lib/commonjs/utils/clamp.js.map +1 -0
  67. package/lib/commonjs/utils/devAssert.js +12 -0
  68. package/lib/commonjs/utils/devAssert.js.map +1 -0
  69. package/lib/commonjs/utils/invariant.js +12 -0
  70. package/lib/commonjs/utils/invariant.js.map +1 -0
  71. package/lib/commonjs/utils/isDefined.js +10 -0
  72. package/lib/commonjs/utils/isDefined.js.map +1 -0
  73. package/lib/commonjs/utils/isNumber.js +10 -0
  74. package/lib/commonjs/utils/isNumber.js.map +1 -0
  75. package/lib/commonjs/utils/noop.js +10 -0
  76. package/lib/commonjs/utils/noop.js.map +1 -0
  77. package/lib/commonjs/utils/shallowEqual.js +22 -0
  78. package/lib/commonjs/utils/shallowEqual.js.map +1 -0
  79. package/lib/commonjs/utils/throttle.js +17 -0
  80. package/lib/commonjs/utils/throttle.js.map +1 -0
  81. package/lib/commonjs/viewability/ViewabilityHelper.js +121 -0
  82. package/lib/commonjs/viewability/ViewabilityHelper.js.map +1 -0
  83. package/lib/commonjs/windowing/ScrollMetrics.js +2 -0
  84. package/lib/commonjs/windowing/ScrollMetrics.js.map +1 -0
  85. package/lib/commonjs/windowing/findVisibleIndexRange.js +48 -0
  86. package/lib/commonjs/windowing/findVisibleIndexRange.js.map +1 -0
  87. package/lib/commonjs/windowing/index.js +20 -0
  88. package/lib/commonjs/windowing/index.js.map +1 -0
  89. package/lib/commonjs/windowing/useScrollMetrics.js +39 -0
  90. package/lib/commonjs/windowing/useScrollMetrics.js.map +1 -0
  91. package/lib/module/NitroList.js +5 -0
  92. package/lib/module/NitroList.js.map +1 -0
  93. package/lib/module/RecyclerList.internal.js +22 -0
  94. package/lib/module/RecyclerList.internal.js.map +1 -0
  95. package/lib/module/RecyclerList.js +166 -0
  96. package/lib/module/RecyclerList.js.map +1 -0
  97. package/lib/module/RecyclerList.types.js +4 -0
  98. package/lib/module/RecyclerList.types.js.map +1 -0
  99. package/lib/module/ReusableView.js +2 -0
  100. package/lib/module/ReusableView.js.map +1 -0
  101. package/lib/module/cell/Cell.js +2 -0
  102. package/lib/module/cell/Cell.js.map +1 -0
  103. package/lib/module/cell/CellRecycler.js +57 -0
  104. package/lib/module/cell/CellRecycler.js.map +1 -0
  105. package/lib/module/cell/StableKey.js +6 -0
  106. package/lib/module/cell/StableKey.js.map +1 -0
  107. package/lib/module/debug/useDebugOverlay.js +11 -0
  108. package/lib/module/debug/useDebugOverlay.js.map +1 -0
  109. package/lib/module/getVisibleIndices.js +34 -0
  110. package/lib/module/getVisibleIndices.js.map +1 -0
  111. package/lib/module/hooks/useCellRenderer.js +58 -0
  112. package/lib/module/hooks/useCellRenderer.js.map +1 -0
  113. package/lib/module/hooks/useStableCallback.js +9 -0
  114. package/lib/module/hooks/useStableCallback.js.map +1 -0
  115. package/lib/module/index.js +1 -3
  116. package/lib/module/index.js.map +1 -1
  117. package/lib/module/layout/EstimatedLayoutProvider.js +25 -0
  118. package/lib/module/layout/EstimatedLayoutProvider.js.map +1 -0
  119. package/lib/module/layout/LayoutEngine.js +17 -0
  120. package/lib/module/layout/LayoutEngine.js.map +1 -0
  121. package/lib/module/layout/LayoutProvider.js +4 -0
  122. package/lib/module/layout/LayoutProvider.js.map +1 -0
  123. package/lib/module/layout/LayoutRectangle.js +2 -0
  124. package/lib/module/layout/LayoutRectangle.js.map +1 -0
  125. package/lib/module/layout/MutableLinearLayout.js +60 -0
  126. package/lib/module/layout/MutableLinearLayout.js.map +1 -0
  127. package/lib/module/layout/index.js +5 -0
  128. package/lib/module/layout/index.js.map +1 -0
  129. package/lib/module/measurement/MeasureLayout.js +16 -0
  130. package/lib/module/measurement/MeasureLayout.js.map +1 -0
  131. package/lib/module/measurement/useItemMeasurement.js +24 -0
  132. package/lib/module/measurement/useItemMeasurement.js.map +1 -0
  133. package/lib/module/native/NitroLayoutEngine.js +5 -0
  134. package/lib/module/native/NitroLayoutEngine.js.map +1 -0
  135. package/lib/module/native/NitroList.types.js +4 -0
  136. package/lib/module/native/NitroList.types.js.map +1 -0
  137. package/lib/module/native/NitroRecyclerView.js +5 -0
  138. package/lib/module/native/NitroRecyclerView.js.map +1 -0
  139. package/lib/module/prefetch/PrefetchHelper.js +34 -0
  140. package/lib/module/prefetch/PrefetchHelper.js.map +1 -0
  141. package/lib/module/specs/nitro-layout-engine.nitro.js +4 -0
  142. package/lib/module/specs/nitro-layout-engine.nitro.js.map +1 -0
  143. package/lib/module/utils/arrayEqual.js +11 -0
  144. package/lib/module/utils/arrayEqual.js.map +1 -0
  145. package/lib/module/utils/assertNever.js +6 -0
  146. package/lib/module/utils/assertNever.js.map +1 -0
  147. package/lib/module/utils/clamp.js +6 -0
  148. package/lib/module/utils/clamp.js.map +1 -0
  149. package/lib/module/utils/devAssert.js +8 -0
  150. package/lib/module/utils/devAssert.js.map +1 -0
  151. package/lib/module/utils/invariant.js +8 -0
  152. package/lib/module/utils/invariant.js.map +1 -0
  153. package/lib/module/utils/isDefined.js +6 -0
  154. package/lib/module/utils/isDefined.js.map +1 -0
  155. package/lib/module/utils/isNumber.js +6 -0
  156. package/lib/module/utils/isNumber.js.map +1 -0
  157. package/lib/module/utils/noop.js +6 -0
  158. package/lib/module/utils/noop.js.map +1 -0
  159. package/lib/module/utils/shallowEqual.js +18 -0
  160. package/lib/module/utils/shallowEqual.js.map +1 -0
  161. package/lib/module/utils/throttle.js +13 -0
  162. package/lib/module/utils/throttle.js.map +1 -0
  163. package/lib/module/viewability/ViewabilityHelper.js +116 -0
  164. package/lib/module/viewability/ViewabilityHelper.js.map +1 -0
  165. package/lib/module/windowing/ScrollMetrics.js +2 -0
  166. package/lib/module/windowing/ScrollMetrics.js.map +1 -0
  167. package/lib/module/windowing/findVisibleIndexRange.js +44 -0
  168. package/lib/module/windowing/findVisibleIndexRange.js.map +1 -0
  169. package/lib/module/windowing/index.js +5 -0
  170. package/lib/module/windowing/index.js.map +1 -0
  171. package/lib/module/windowing/useScrollMetrics.js +35 -0
  172. package/lib/module/windowing/useScrollMetrics.js.map +1 -0
  173. package/lib/typescript/src/NitroList.d.ts +5 -0
  174. package/lib/typescript/src/NitroList.d.ts.map +1 -0
  175. package/lib/typescript/src/RecyclerList.d.ts +26 -0
  176. package/lib/typescript/src/RecyclerList.d.ts.map +1 -0
  177. package/lib/typescript/src/RecyclerList.internal.d.ts +9 -0
  178. package/lib/typescript/src/RecyclerList.internal.d.ts.map +1 -0
  179. package/lib/typescript/src/RecyclerList.types.d.ts +18 -0
  180. package/lib/typescript/src/RecyclerList.types.d.ts.map +1 -0
  181. package/lib/typescript/src/ReusableView.d.ts +9 -0
  182. package/lib/typescript/src/ReusableView.d.ts.map +1 -0
  183. package/lib/typescript/src/__tests__/windowing/findVisibleIndexRange.test.d.ts +2 -0
  184. package/lib/typescript/src/__tests__/windowing/findVisibleIndexRange.test.d.ts.map +1 -0
  185. package/lib/typescript/src/cell/Cell.d.ts +13 -0
  186. package/lib/typescript/src/cell/Cell.d.ts.map +1 -0
  187. package/lib/typescript/src/cell/CellRecycler.d.ts +19 -0
  188. package/lib/typescript/src/cell/CellRecycler.d.ts.map +1 -0
  189. package/lib/typescript/src/cell/StableKey.d.ts +2 -0
  190. package/lib/typescript/src/cell/StableKey.d.ts.map +1 -0
  191. package/lib/typescript/src/debug/useDebugOverlay.d.ts +2 -0
  192. package/lib/typescript/src/debug/useDebugOverlay.d.ts.map +1 -0
  193. package/lib/typescript/src/getVisibleIndices.d.ts +8 -0
  194. package/lib/typescript/src/getVisibleIndices.d.ts.map +1 -0
  195. package/lib/typescript/src/hooks/useCellRenderer.d.ts +19 -0
  196. package/lib/typescript/src/hooks/useCellRenderer.d.ts.map +1 -0
  197. package/lib/typescript/src/hooks/useStableCallback.d.ts +2 -0
  198. package/lib/typescript/src/hooks/useStableCallback.d.ts.map +1 -0
  199. package/lib/typescript/src/index.d.ts +2 -4
  200. package/lib/typescript/src/index.d.ts.map +1 -1
  201. package/lib/typescript/src/layout/EstimatedLayoutProvider.d.ts +15 -0
  202. package/lib/typescript/src/layout/EstimatedLayoutProvider.d.ts.map +1 -0
  203. package/lib/typescript/src/layout/LayoutEngine.d.ts +10 -0
  204. package/lib/typescript/src/layout/LayoutEngine.d.ts.map +1 -0
  205. package/lib/typescript/src/layout/LayoutProvider.d.ts +16 -0
  206. package/lib/typescript/src/layout/LayoutProvider.d.ts.map +1 -0
  207. package/lib/typescript/src/layout/LayoutRectangle.d.ts +11 -0
  208. package/lib/typescript/src/layout/LayoutRectangle.d.ts.map +1 -0
  209. package/lib/typescript/src/layout/MutableLinearLayout.d.ts +22 -0
  210. package/lib/typescript/src/layout/MutableLinearLayout.d.ts.map +1 -0
  211. package/lib/typescript/src/layout/index.d.ts +5 -0
  212. package/lib/typescript/src/layout/index.d.ts.map +1 -0
  213. package/lib/typescript/src/measurement/MeasureLayout.d.ts +10 -0
  214. package/lib/typescript/src/measurement/MeasureLayout.d.ts.map +1 -0
  215. package/lib/typescript/src/measurement/useItemMeasurement.d.ts +11 -0
  216. package/lib/typescript/src/measurement/useItemMeasurement.d.ts.map +1 -0
  217. package/lib/typescript/src/native/NitroLayoutEngine.d.ts +3 -0
  218. package/lib/typescript/src/native/NitroLayoutEngine.d.ts.map +1 -0
  219. package/lib/typescript/src/native/NitroList.types.d.ts +9 -0
  220. package/lib/typescript/src/native/NitroList.types.d.ts.map +1 -0
  221. package/lib/typescript/src/native/NitroRecyclerView.d.ts +5 -0
  222. package/lib/typescript/src/native/NitroRecyclerView.d.ts.map +1 -0
  223. package/lib/typescript/src/prefetch/PrefetchHelper.d.ts +17 -0
  224. package/lib/typescript/src/prefetch/PrefetchHelper.d.ts.map +1 -0
  225. package/lib/typescript/src/specs/nitro-layout-engine.nitro.d.ts +14 -0
  226. package/lib/typescript/src/specs/nitro-layout-engine.nitro.d.ts.map +1 -0
  227. package/lib/typescript/src/utils/arrayEqual.d.ts +2 -0
  228. package/lib/typescript/src/utils/arrayEqual.d.ts.map +1 -0
  229. package/lib/typescript/src/utils/assertNever.d.ts +2 -0
  230. package/lib/typescript/src/utils/assertNever.d.ts.map +1 -0
  231. package/lib/typescript/src/utils/clamp.d.ts +2 -0
  232. package/lib/typescript/src/utils/clamp.d.ts.map +1 -0
  233. package/lib/typescript/src/utils/devAssert.d.ts +2 -0
  234. package/lib/typescript/src/utils/devAssert.d.ts.map +1 -0
  235. package/lib/typescript/src/utils/invariant.d.ts +2 -0
  236. package/lib/typescript/src/utils/invariant.d.ts.map +1 -0
  237. package/lib/typescript/src/utils/isDefined.d.ts +2 -0
  238. package/lib/typescript/src/utils/isDefined.d.ts.map +1 -0
  239. package/lib/typescript/src/utils/isNumber.d.ts +2 -0
  240. package/lib/typescript/src/utils/isNumber.d.ts.map +1 -0
  241. package/lib/typescript/src/utils/noop.d.ts +2 -0
  242. package/lib/typescript/src/utils/noop.d.ts.map +1 -0
  243. package/lib/typescript/src/utils/shallowEqual.d.ts +2 -0
  244. package/lib/typescript/src/utils/shallowEqual.d.ts.map +1 -0
  245. package/lib/typescript/src/utils/throttle.d.ts +2 -0
  246. package/lib/typescript/src/utils/throttle.d.ts.map +1 -0
  247. package/lib/typescript/src/viewability/ViewabilityHelper.d.ts +50 -0
  248. package/lib/typescript/src/viewability/ViewabilityHelper.d.ts.map +1 -0
  249. package/lib/typescript/src/windowing/ScrollMetrics.d.ts +11 -0
  250. package/lib/typescript/src/windowing/ScrollMetrics.d.ts.map +1 -0
  251. package/lib/typescript/src/windowing/findVisibleIndexRange.d.ts +11 -0
  252. package/lib/typescript/src/windowing/findVisibleIndexRange.d.ts.map +1 -0
  253. package/lib/typescript/src/windowing/index.d.ts +4 -0
  254. package/lib/typescript/src/windowing/index.d.ts.map +1 -0
  255. package/lib/typescript/src/windowing/useScrollMetrics.d.ts +14 -0
  256. package/lib/typescript/src/windowing/useScrollMetrics.d.ts.map +1 -0
  257. package/nitro.json +20 -13
  258. package/nitrogen/generated/android/NitroList+autolinking.cmake +2 -4
  259. package/nitrogen/generated/android/NitroListOnLoad.cpp +3 -13
  260. package/nitrogen/generated/android/c++/JHybridNitroLayoutEngineSpec.cpp +69 -0
  261. package/nitrogen/generated/android/c++/{JHybridNitroListSpec.hpp → JHybridNitroLayoutEngineSpec.hpp} +12 -13
  262. package/nitrogen/generated/android/c++/JLayoutRectangle.hpp +69 -0
  263. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/{HybridNitroListSpec.kt → HybridNitroLayoutEngineSpec.kt} +11 -13
  264. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/LayoutRectangle.kt +47 -0
  265. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Bridge.cpp +9 -9
  266. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Bridge.hpp +50 -13
  267. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Umbrella.hpp +11 -5
  268. package/nitrogen/generated/ios/c++/{HybridNitroListSpecSwift.cpp → HybridNitroLayoutEngineSpecSwift.cpp} +2 -2
  269. package/nitrogen/generated/ios/c++/HybridNitroLayoutEngineSpecSwift.hpp +78 -0
  270. package/nitrogen/generated/ios/swift/HybridNitroLayoutEngineSpec.swift +56 -0
  271. package/nitrogen/generated/ios/swift/{HybridNitroListSpec_cxx.swift → HybridNitroLayoutEngineSpec_cxx.swift} +35 -38
  272. package/nitrogen/generated/ios/swift/LayoutRectangle.swift +45 -0
  273. package/nitrogen/generated/shared/c++/{HybridNitroListSpec.cpp → HybridNitroLayoutEngineSpec.cpp} +4 -5
  274. package/nitrogen/generated/shared/c++/{HybridNitroListSpec.hpp → HybridNitroLayoutEngineSpec.hpp} +15 -14
  275. package/nitrogen/generated/shared/c++/LayoutRectangle.hpp +95 -0
  276. package/package.json +12 -4
  277. package/src/NitroList.ts +8 -0
  278. package/src/RecyclerList.internal.ts +38 -0
  279. package/src/RecyclerList.tsx +252 -0
  280. package/src/RecyclerList.types.ts +24 -0
  281. package/src/ReusableView.ts +12 -0
  282. package/src/__tests__/windowing/findVisibleIndexRange.test.ts +55 -0
  283. package/src/cell/Cell.ts +14 -0
  284. package/src/cell/CellRecycler.ts +66 -0
  285. package/src/cell/StableKey.ts +6 -0
  286. package/src/debug/useDebugOverlay.ts +14 -0
  287. package/src/getVisibleIndices.ts +53 -0
  288. package/src/hooks/useCellRenderer.ts +86 -0
  289. package/src/hooks/useStableCallback.ts +13 -0
  290. package/src/index.ts +2 -14
  291. package/src/layout/EstimatedLayoutProvider.ts +35 -0
  292. package/src/layout/LayoutEngine.ts +21 -0
  293. package/src/layout/LayoutProvider.ts +17 -0
  294. package/src/layout/LayoutRectangle.ts +10 -0
  295. package/src/layout/MutableLinearLayout.ts +79 -0
  296. package/src/layout/index.ts +4 -0
  297. package/src/measurement/MeasureLayout.ts +20 -0
  298. package/src/measurement/useItemMeasurement.ts +32 -0
  299. package/src/native/NitroLayoutEngine.ts +7 -0
  300. package/src/native/NitroList.types.ts +12 -0
  301. package/src/native/NitroRecyclerView.ts +8 -0
  302. package/src/prefetch/PrefetchHelper.ts +47 -0
  303. package/src/specs/nitro-layout-engine.nitro.ts +17 -0
  304. package/src/utils/arrayEqual.ts +13 -0
  305. package/src/utils/assertNever.ts +3 -0
  306. package/src/utils/clamp.ts +7 -0
  307. package/src/utils/devAssert.ts +8 -0
  308. package/src/utils/invariant.ts +8 -0
  309. package/src/utils/isDefined.ts +5 -0
  310. package/src/utils/isNumber.ts +3 -0
  311. package/src/utils/noop.ts +3 -0
  312. package/src/utils/shallowEqual.ts +34 -0
  313. package/src/utils/throttle.ts +13 -0
  314. package/src/viewability/ViewabilityHelper.ts +130 -0
  315. package/src/windowing/ScrollMetrics.ts +11 -0
  316. package/src/windowing/findVisibleIndexRange.ts +60 -0
  317. package/src/windowing/index.ts +3 -0
  318. package/src/windowing/useScrollMetrics.ts +56 -0
  319. package/android/src/main/java/com/nitrolist/HybridNitroList.kt +0 -27
  320. package/lib/module/specs/nitro-list.nitro.js +0 -4
  321. package/lib/typescript/src/specs/nitro-list.nitro.d.ts +0 -11
  322. package/lib/typescript/src/specs/nitro-list.nitro.d.ts.map +0 -1
  323. package/nitrogen/generated/android/c++/JHybridNitroListSpec.cpp +0 -56
  324. package/nitrogen/generated/android/c++/views/JHybridNitroListStateUpdater.cpp +0 -56
  325. package/nitrogen/generated/android/c++/views/JHybridNitroListStateUpdater.hpp +0 -49
  326. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/views/HybridNitroListManager.kt +0 -50
  327. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/views/HybridNitroListStateUpdater.kt +0 -23
  328. package/nitrogen/generated/ios/NitroListAutolinking.mm +0 -33
  329. package/nitrogen/generated/ios/NitroListAutolinking.swift +0 -25
  330. package/nitrogen/generated/ios/c++/HybridNitroListSpecSwift.hpp +0 -74
  331. package/nitrogen/generated/ios/c++/views/HybridNitroListComponent.mm +0 -96
  332. package/nitrogen/generated/ios/swift/HybridNitroListSpec.swift +0 -56
  333. package/nitrogen/generated/shared/c++/views/HybridNitroListComponent.cpp +0 -88
  334. package/nitrogen/generated/shared/c++/views/HybridNitroListComponent.hpp +0 -107
  335. package/nitrogen/generated/shared/json/NitroListConfig.json +0 -10
  336. package/src/specs/nitro-list.nitro.ts +0 -13
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+
3
+ import React, { useMemo, useRef, useEffect } from 'react';
4
+ import { ScrollView, View, StyleSheet } from 'react-native';
5
+ import { useRecyclerListInternal } from './RecyclerList.internal';
6
+ import { useScrollMetrics } from './windowing';
7
+ import { MutableLinearLayout } from './layout/MutableLinearLayout';
8
+ import { ViewabilityHelper } from './viewability/ViewabilityHelper';
9
+ import { PrefetchHelper } from './prefetch/PrefetchHelper';
10
+
11
+ /**
12
+ * Public API — mirrors FlashList behavior, not internals.
13
+ */
14
+ import { jsx as _jsx } from "react/jsx-runtime";
15
+ /**
16
+ * FlashList invariant:
17
+ * Never allow viewport height = 0 to gate windowing.
18
+ */
19
+ const DEFAULT_VIEWPORT_HEIGHT = 800;
20
+ export function RecyclerList(props) {
21
+ const {
22
+ containerWidth,
23
+ itemCount,
24
+ itemHeights,
25
+ estimatedItemHeight = 80,
26
+ renderBufferRatio = 1.3,
27
+ getItemType = () => 'default',
28
+ renderItem,
29
+ onPrefetch,
30
+ onViewableItemsChanged
31
+ } = props;
32
+
33
+ /**
34
+ * 🚨 DEV WARNINGS ONLY (never throw in render!)
35
+ */
36
+ if (__DEV__) {
37
+ if (!itemHeights && itemCount == null) {
38
+ console.error('RecyclerList requires either itemCount or itemHeights.');
39
+ }
40
+ if (itemHeights && itemCount != null) {
41
+ console.error('Provide only one of itemCount or itemHeights.');
42
+ }
43
+ }
44
+
45
+ /**
46
+ * STEP 1: Resolve item count safely (props only).
47
+ * Never depend on hooks for structural decisions.
48
+ */
49
+ const itemLength = itemHeights?.length ?? itemCount ?? 0;
50
+
51
+ /**
52
+ * STEP 2: Resolve initial heights (always defined).
53
+ */
54
+ const resolvedHeights = useMemo(() => {
55
+ if (itemHeights) return itemHeights;
56
+ return Array.from({
57
+ length: itemLength
58
+ }, () => estimatedItemHeight);
59
+ }, [itemHeights, itemLength, estimatedItemHeight]);
60
+
61
+ /**
62
+ * STEP 3: Mutable layout lifecycle.
63
+ * Recreate layout only when shape changes.
64
+ */
65
+ const layoutRef = useRef(null);
66
+ const lastLayoutKeyRef = useRef(null);
67
+ const layoutKey = `${containerWidth}-${itemLength}`;
68
+ if (!layoutRef.current || lastLayoutKeyRef.current !== layoutKey) {
69
+ layoutRef.current = new MutableLinearLayout(resolvedHeights, containerWidth);
70
+ lastLayoutKeyRef.current = layoutKey;
71
+ }
72
+
73
+ /**
74
+ * STEP 4: Read layout snapshot.
75
+ */
76
+ const layouts = layoutRef.current.getLayouts();
77
+ const contentHeight = layoutRef.current.getContentHeight();
78
+
79
+ /**
80
+ * STEP 5: Scroll metrics.
81
+ */
82
+ const {
83
+ metrics,
84
+ onScroll,
85
+ onLayout
86
+ } = useScrollMetrics();
87
+
88
+ /**
89
+ * STEP 6: Guard initial windowing.
90
+ */
91
+ const effectiveViewportHeight = metrics.height > 0 ? metrics.height : DEFAULT_VIEWPORT_HEIGHT;
92
+ const bufferPx = effectiveViewportHeight * renderBufferRatio;
93
+
94
+ /**
95
+ * STEP 7: Windowing + recycling.
96
+ */
97
+ const cells = useRecyclerListInternal(layouts, metrics, bufferPx, getItemType);
98
+
99
+ /**
100
+ * STEP 8: Phase-1 observers.
101
+ */
102
+ const viewabilityRef = useRef(new ViewabilityHelper({
103
+ itemVisiblePercentThreshold: 50
104
+ }));
105
+ const prefetchRef = useRef(new PrefetchHelper());
106
+ useEffect(() => {
107
+ prefetchRef.current = new PrefetchHelper();
108
+ }, [itemLength]);
109
+ useEffect(() => {
110
+ if (metrics.height === 0) return;
111
+ if (onViewableItemsChanged) {
112
+ const visibleLayouts = [];
113
+ for (const cell of cells) {
114
+ const layout = layouts[cell.index];
115
+ if (layout) visibleLayouts.push(layout);
116
+ }
117
+ const info = viewabilityRef.current.computeViewableItems(visibleLayouts, metrics);
118
+ onViewableItemsChanged(info);
119
+ }
120
+ if (onPrefetch && itemLength > 0) {
121
+ prefetchRef.current.runPrefetch(cells.map(c => c.index), itemLength, 5, onPrefetch);
122
+ }
123
+ }, [cells, metrics.offsetY, metrics.height, onViewableItemsChanged, onPrefetch, itemLength, layouts]);
124
+
125
+ /**
126
+ * STEP 9: Render absolutely positioned cells.
127
+ */
128
+ return /*#__PURE__*/_jsx(ScrollView, {
129
+ style: styles.container,
130
+ onLayout: onLayout,
131
+ onScroll: onScroll,
132
+ scrollEventThrottle: 16,
133
+ removeClippedSubviews: true,
134
+ children: /*#__PURE__*/_jsx(View, {
135
+ style: [styles.content, {
136
+ height: contentHeight
137
+ }],
138
+ children: cells.map(cell => {
139
+ const layout = layouts[cell.index];
140
+ if (!layout) return null;
141
+ return /*#__PURE__*/_jsx(View, {
142
+ style: [styles.cell, {
143
+ top: layout.y,
144
+ width: layout.width,
145
+ height: layout.height
146
+ }],
147
+ children: renderItem(cell.index)
148
+ }, cell.key);
149
+ })
150
+ })
151
+ });
152
+ }
153
+ const styles = StyleSheet.create({
154
+ container: {
155
+ flex: 1
156
+ },
157
+ content: {
158
+ position: 'relative',
159
+ width: '100%'
160
+ },
161
+ cell: {
162
+ position: 'absolute',
163
+ left: 0
164
+ }
165
+ });
166
+ //# sourceMappingURL=RecyclerList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useMemo","useRef","useEffect","ScrollView","View","StyleSheet","useRecyclerListInternal","useScrollMetrics","MutableLinearLayout","ViewabilityHelper","PrefetchHelper","jsx","_jsx","DEFAULT_VIEWPORT_HEIGHT","RecyclerList","props","containerWidth","itemCount","itemHeights","estimatedItemHeight","renderBufferRatio","getItemType","renderItem","onPrefetch","onViewableItemsChanged","__DEV__","console","error","itemLength","length","resolvedHeights","Array","from","layoutRef","lastLayoutKeyRef","layoutKey","current","layouts","getLayouts","contentHeight","getContentHeight","metrics","onScroll","onLayout","effectiveViewportHeight","height","bufferPx","cells","viewabilityRef","itemVisiblePercentThreshold","prefetchRef","visibleLayouts","cell","layout","index","push","info","computeViewableItems","runPrefetch","map","c","offsetY","style","styles","container","scrollEventThrottle","removeClippedSubviews","children","content","top","y","width","key","create","flex","position","left"],"sourceRoot":"../../src","sources":["RecyclerList.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=RecyclerList.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["RecyclerList.types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=ReusableView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["ReusableView.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=Cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["cell/Cell.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ const MAX_CELLS = 40;
4
+
5
+ /**
6
+ * Owns physical cell reuse.
7
+ * Stateful, imperative, React-agnostic.
8
+ *
9
+ * FlashList equivalent: CellRecycler
10
+ */
11
+ export class CellRecycler {
12
+ activeCells = new Map();
13
+ reusableCellsByType = new Map();
14
+ orderedCells = [];
15
+ nextCellId = 0;
16
+
17
+ /**
18
+ * Reconcile visible indices against existing cells.
19
+ * Returns a stable ordered snapshot.
20
+ */
21
+ reconcile(visibleIndices, getCellType) {
22
+ const visibleSet = new Set(visibleIndices);
23
+
24
+ // 1️⃣ Release cells no longer visible
25
+ for (const [index, cell] of this.activeCells) {
26
+ if (visibleSet.has(index)) continue;
27
+ this.activeCells.delete(index);
28
+ const orderedIndex = this.orderedCells.indexOf(cell);
29
+ if (orderedIndex !== -1) {
30
+ this.orderedCells.splice(orderedIndex, 1);
31
+ }
32
+ const pool = this.reusableCellsByType.get(cell.type) ?? [];
33
+ if (pool.length < MAX_CELLS) pool.push(cell);
34
+ this.reusableCellsByType.set(cell.type, pool);
35
+ }
36
+
37
+ // 2️⃣ Acquire cells for newly visible indices
38
+ for (const index of visibleIndices) {
39
+ if (this.activeCells.has(index)) continue;
40
+ const type = getCellType(index);
41
+ const pool = this.reusableCellsByType.get(type);
42
+ let cell = pool?.pop();
43
+ if (!cell) {
44
+ cell = {
45
+ key: `cell-${this.nextCellId++}`,
46
+ type,
47
+ index
48
+ };
49
+ }
50
+ cell.index = index;
51
+ this.activeCells.set(index, cell);
52
+ this.orderedCells.push(cell);
53
+ }
54
+ return this.orderedCells;
55
+ }
56
+ }
57
+ //# sourceMappingURL=CellRecycler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAX_CELLS","CellRecycler","activeCells","Map","reusableCellsByType","orderedCells","nextCellId","reconcile","visibleIndices","getCellType","visibleSet","Set","index","cell","has","delete","orderedIndex","indexOf","splice","pool","get","type","length","push","set","pop","key"],"sourceRoot":"../../../src","sources":["cell/CellRecycler.ts"],"mappings":";;AAEA,MAAMA,SAAS,GAAG,EAAE;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,CAAC;EACPC,WAAW,GAAG,IAAIC,GAAG,CAAe,CAAC;EACrCC,mBAAmB,GAAG,IAAID,GAAG,CAAiB,CAAC;EAC/CE,YAAY,GAAW,EAAE;EAClCC,UAAU,GAAG,CAAC;;EAEtB;AACF;AACA;AACA;EACEC,SAASA,CACPC,cAAiC,EACjCC,WAAsC,EACrB;IACjB,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAACH,cAAc,CAAC;;IAE1C;IACA,KAAK,MAAM,CAACI,KAAK,EAAEC,IAAI,CAAC,IAAI,IAAI,CAACX,WAAW,EAAE;MAC5C,IAAIQ,UAAU,CAACI,GAAG,CAACF,KAAK,CAAC,EAAE;MAE3B,IAAI,CAACV,WAAW,CAACa,MAAM,CAACH,KAAK,CAAC;MAE9B,MAAMI,YAAY,GAAG,IAAI,CAACX,YAAY,CAACY,OAAO,CAACJ,IAAI,CAAC;MACpD,IAAIG,YAAY,KAAK,CAAC,CAAC,EAAE;QACvB,IAAI,CAACX,YAAY,CAACa,MAAM,CAACF,YAAY,EAAE,CAAC,CAAC;MAC3C;MAEA,MAAMG,IAAI,GAAG,IAAI,CAACf,mBAAmB,CAACgB,GAAG,CAACP,IAAI,CAACQ,IAAI,CAAC,IAAI,EAAE;MAC1D,IAAIF,IAAI,CAACG,MAAM,GAAGtB,SAAS,EAAEmB,IAAI,CAACI,IAAI,CAACV,IAAI,CAAC;MAC5C,IAAI,CAACT,mBAAmB,CAACoB,GAAG,CAACX,IAAI,CAACQ,IAAI,EAAEF,IAAI,CAAC;IAC/C;;IAEA;IACA,KAAK,MAAMP,KAAK,IAAIJ,cAAc,EAAE;MAClC,IAAI,IAAI,CAACN,WAAW,CAACY,GAAG,CAACF,KAAK,CAAC,EAAE;MAEjC,MAAMS,IAAI,GAAGZ,WAAW,CAACG,KAAK,CAAC;MAC/B,MAAMO,IAAI,GAAG,IAAI,CAACf,mBAAmB,CAACgB,GAAG,CAACC,IAAI,CAAC;MAC/C,IAAIR,IAAI,GAAGM,IAAI,EAAEM,GAAG,CAAC,CAAC;MAEtB,IAAI,CAACZ,IAAI,EAAE;QACTA,IAAI,GAAG;UACLa,GAAG,EAAE,QAAQ,IAAI,CAACpB,UAAU,EAAE,EAAE;UAChCe,IAAI;UACJT;QACF,CAAC;MACH;MAEAC,IAAI,CAACD,KAAK,GAAGA,KAAK;MAClB,IAAI,CAACV,WAAW,CAACsB,GAAG,CAACZ,KAAK,EAAEC,IAAI,CAAC;MACjC,IAAI,CAACR,YAAY,CAACkB,IAAI,CAACV,IAAI,CAAC;IAC9B;IAEA,OAAO,IAAI,CAACR,YAAY;EAC1B;AACF","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export function getStableKey(slotKey, index) {
4
+ return `${slotKey}:${index}`;
5
+ }
6
+ //# sourceMappingURL=StableKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getStableKey","slotKey","index"],"sourceRoot":"../../../src","sources":["cell/StableKey.ts"],"mappings":";;AAAA,OAAO,SAASA,YAAYA,CAC1BC,OAAe,EACfC,KAAa,EACL;EACR,OAAO,GAAGD,OAAO,IAAIC,KAAK,EAAE;AAC9B","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import { useEffect } from 'react';
4
+ export function useDebugOverlay(enabled, visibleCount) {
5
+ useEffect(() => {
6
+ if (__DEV__ && enabled) {
7
+ console.log(`[RecyclerList] visible items: ${visibleCount}`);
8
+ }
9
+ }, [enabled, visibleCount]);
10
+ }
11
+ //# sourceMappingURL=useDebugOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useDebugOverlay","enabled","visibleCount","__DEV__","console","log"],"sourceRoot":"../../../src","sources":["debug/useDebugOverlay.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,OAAO,SAASC,eAAeA,CAC7BC,OAAgB,EAChBC,YAAoB,EACd;EACNH,SAAS,CAAC,MAAM;IACd,IAAII,OAAO,IAAIF,OAAO,EAAE;MACtBG,OAAO,CAACC,GAAG,CACT,iCAAiCH,YAAY,EAC/C,CAAC;IACH;EACF,CAAC,EAAE,CAACD,OAAO,EAAEC,YAAY,CAAC,CAAC;AAC7B","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Binary-search based windowing.
5
+ * Returns indices intersecting viewport ± buffer.
6
+ */
7
+ export function getVisibleRange(layouts, metrics, bufferPx) {
8
+ if (layouts.length === 0 || metrics.height <= 0) {
9
+ return [];
10
+ }
11
+ const startY = Math.max(0, metrics.offsetY - bufferPx);
12
+ const endY = metrics.offsetY + metrics.height + bufferPx;
13
+ let low = 0;
14
+ let high = layouts.length - 1;
15
+ let first = layouts.length;
16
+ while (low <= high) {
17
+ const mid = low + high >> 1;
18
+ const rect = layouts[mid];
19
+ if (rect.y + rect.height >= startY) {
20
+ first = mid;
21
+ high = mid - 1;
22
+ } else {
23
+ low = mid + 1;
24
+ }
25
+ }
26
+ const visible = [];
27
+ for (let i = first; i < layouts.length; i++) {
28
+ const rect = layouts[i];
29
+ if (rect.y > endY) break;
30
+ visible.push(i);
31
+ }
32
+ return visible;
33
+ }
34
+ //# sourceMappingURL=getVisibleIndices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getVisibleRange","layouts","metrics","bufferPx","length","height","startY","Math","max","offsetY","endY","low","high","first","mid","rect","y","visible","i","push"],"sourceRoot":"../../src","sources":["getVisibleIndices.ts"],"mappings":";;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASA,eAAeA,CAC7BC,OAAmC,EACnCC,OAAsB,EACtBC,QAAgB,EACG;EACnB,IACEF,OAAO,CAACG,MAAM,KAAK,CAAC,IACpBF,OAAO,CAACG,MAAM,IAAI,CAAC,EACnB;IACA,OAAO,EAAE;EACX;EAEA,MAAMC,MAAM,GAAGC,IAAI,CAACC,GAAG,CACrB,CAAC,EACDN,OAAO,CAACO,OAAO,GAAGN,QACpB,CAAC;EAED,MAAMO,IAAI,GACRR,OAAO,CAACO,OAAO,GAAGP,OAAO,CAACG,MAAM,GAAGF,QAAQ;EAE7C,IAAIQ,GAAG,GAAG,CAAC;EACX,IAAIC,IAAI,GAAGX,OAAO,CAACG,MAAM,GAAG,CAAC;EAC7B,IAAIS,KAAK,GAAGZ,OAAO,CAACG,MAAM;EAE1B,OAAOO,GAAG,IAAIC,IAAI,EAAE;IAClB,MAAME,GAAG,GAAIH,GAAG,GAAGC,IAAI,IAAK,CAAC;IAC7B,MAAMG,IAAI,GAAGd,OAAO,CAACa,GAAG,CAAE;IAE1B,IAAIC,IAAI,CAACC,CAAC,GAAGD,IAAI,CAACV,MAAM,IAAIC,MAAM,EAAE;MAClCO,KAAK,GAAGC,GAAG;MACXF,IAAI,GAAGE,GAAG,GAAG,CAAC;IAChB,CAAC,MAAM;MACLH,GAAG,GAAGG,GAAG,GAAG,CAAC;IACf;EACF;EAEA,MAAMG,OAAiB,GAAG,EAAE;EAE5B,KAAK,IAAIC,CAAC,GAAGL,KAAK,EAAEK,CAAC,GAAGjB,OAAO,CAACG,MAAM,EAAEc,CAAC,EAAE,EAAE;IAC3C,MAAMH,IAAI,GAAGd,OAAO,CAACiB,CAAC,CAAE;IACxB,IAAIH,IAAI,CAACC,CAAC,GAAGN,IAAI,EAAE;IACnBO,OAAO,CAACE,IAAI,CAACD,CAAC,CAAC;EACjB;EAEA,OAAOD,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
+ import { CellRecycler } from '../cell/CellRecycler';
5
+ import { findVisibleIndexRange } from '../windowing/findVisibleIndexRange';
6
+ /**
7
+ * 🔒 Stable empty references (module-level)
8
+ * These MUST NOT be recreated per render.
9
+ */
10
+ const EMPTY_INDICES = [];
11
+
12
+ /**
13
+ * React bridge for CellRecycler.
14
+ * FlashList equivalent: useCellRenderer
15
+ *
16
+ * Responsibilities:
17
+ * - Translate scroll state → visible indices
18
+ * - Ask recycler for physical cells
19
+ * - Commit results with referential stability
20
+ *
21
+ * Responsibilities it does NOT have:
22
+ * ❌ Layout mutation
23
+ * ❌ Measurement
24
+ * ❌ Rendering
25
+ */
26
+ export function useCellRenderer(layouts, metrics, bufferPx, getCellType) {
27
+ /**
28
+ * Recycler instance is stable across renders.
29
+ */
30
+ const recyclerRef = useRef(new CellRecycler());
31
+
32
+ /**
33
+ * Compute visible indices.
34
+ * PURE + TOTAL:
35
+ * - Never throws
36
+ * - Always returns the same reference when empty
37
+ */
38
+ const visibleIndices = useMemo(() => layouts.length === 0 ? EMPTY_INDICES : findVisibleIndexRange(layouts, metrics, bufferPx), [layouts, metrics.offsetY, metrics.height, bufferPx]);
39
+
40
+ /**
41
+ * Physical cells to render.
42
+ */
43
+ const [cells, setCells] = useState([]);
44
+
45
+ /**
46
+ * Reconcile visible indices → physical cells.
47
+ *
48
+ * FlashList invariant:
49
+ * - Only update state if identity truly changed
50
+ * - Prevents pointless re-renders
51
+ */
52
+ useEffect(() => {
53
+ const next = recyclerRef.current.reconcile(visibleIndices, getCellType);
54
+ setCells(prev => prev.length === next.length && prev.every((c, i) => c === next[i]) ? prev : next);
55
+ }, [visibleIndices, getCellType]);
56
+ return cells;
57
+ }
58
+ //# sourceMappingURL=useCellRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useState","CellRecycler","findVisibleIndexRange","EMPTY_INDICES","useCellRenderer","layouts","metrics","bufferPx","getCellType","recyclerRef","visibleIndices","length","offsetY","height","cells","setCells","next","current","reconcile","prev","every","c","i"],"sourceRoot":"../../../src","sources":["hooks/useCellRenderer.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAE5D,SAASC,YAAY,QAAQ,sBAAsB;AACnD,SAASC,qBAAqB,QAAQ,oCAAoC;AAI1E;AACA;AACA;AACA;AACA,MAAMC,aAAgC,GAAG,EAAE;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,OAAmC,EACnCC,OAAsB,EACtBC,QAAgB,EAChBC,WAAsC,EACrB;EACjB;AACF;AACA;EACE,MAAMC,WAAW,GAAGV,MAAM,CAAe,IAAIE,YAAY,CAAC,CAAC,CAAC;;EAE5D;AACF;AACA;AACA;AACA;AACA;EACE,MAAMS,cAAc,GAAGZ,OAAO,CAC5B,MACEO,OAAO,CAACM,MAAM,KAAK,CAAC,GAChBR,aAAa,GACbD,qBAAqB,CACnBG,OAAO,EACPC,OAAO,EACPC,QACF,CAAC,EACP,CAACF,OAAO,EAAEC,OAAO,CAACM,OAAO,EAAEN,OAAO,CAACO,MAAM,EAAEN,QAAQ,CACrD,CAAC;;EAED;AACF;AACA;EACE,MAAM,CAACO,KAAK,EAAEC,QAAQ,CAAC,GACrBf,QAAQ,CAAkB,EAAE,CAAC;;EAE/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEH,SAAS,CAAC,MAAM;IACd,MAAMmB,IAAI,GACRP,WAAW,CAACQ,OAAO,CAACC,SAAS,CAC3BR,cAAc,EACdF,WACF,CAAC;IAEHO,QAAQ,CAACI,IAAI,IACXA,IAAI,CAACR,MAAM,KAAKK,IAAI,CAACL,MAAM,IAC3BQ,IAAI,CAACC,KAAK,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,KAAKL,IAAI,CAACM,CAAC,CAAC,CAAC,GAC/BH,IAAI,GACJH,IACN,CAAC;EACH,CAAC,EAAE,CAACN,cAAc,EAAEF,WAAW,CAAC,CAAC;EAEjC,OAAOM,KAAK;AACd","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import { useRef, useCallback } from 'react';
4
+ export function useStableCallback(fn) {
5
+ const ref = useRef(fn);
6
+ ref.current = fn;
7
+ return useCallback((...args) => ref.current(...args), []);
8
+ }
9
+ //# sourceMappingURL=useStableCallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useRef","useCallback","useStableCallback","fn","ref","current","args"],"sourceRoot":"../../../src","sources":["hooks/useStableCallback.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAE3C,OAAO,SAASC,iBAAiBA,CAC/BC,EAAK,EACF;EACH,MAAMC,GAAG,GAAGJ,MAAM,CAACG,EAAE,CAAC;EACtBC,GAAG,CAACC,OAAO,GAAGF,EAAE;EAEhB,OAAOF,WAAW,CACf,CAAC,GAAGK,IAAa,KAAKF,GAAG,CAACC,OAAO,CAAC,GAAGC,IAAI,CAAC,EAC3C,EACF,CAAC;AACH","ignoreList":[]}
@@ -1,6 +1,4 @@
1
1
  "use strict";
2
2
 
3
- import { getHostComponent } from 'react-native-nitro-modules';
4
- import NitroListConfig from '../nitrogen/generated/shared/json/NitroListConfig.json';
5
- export const NitroList = getHostComponent('NitroList', () => NitroListConfig);
3
+ export { RecyclerList } from './RecyclerList';
6
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getHostComponent","NitroListConfig","NitroList"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAwB,4BAA4B;AAC7E,OAAOC,eAAe,MAAM,wDAAwD;AAOpF,OAAO,MAAMC,SAAS,GAAGF,gBAAgB,CACvC,WAAW,EACX,MAAMC,eACR,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["RecyclerList"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,gBAAgB","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Layout provider using estimated item heights.
5
+ * Used before real measurements are available.
6
+ */
7
+ export class EstimatedLayoutProvider {
8
+ constructor(itemCount, itemHeight, width) {
9
+ this.itemCount = itemCount;
10
+ this.itemHeight = itemHeight;
11
+ this.width = width;
12
+ }
13
+ getItemCount() {
14
+ return this.itemCount;
15
+ }
16
+ getLayout(index) {
17
+ return {
18
+ x: 0,
19
+ y: index * this.itemHeight,
20
+ width: this.width,
21
+ height: this.itemHeight
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=EstimatedLayoutProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EstimatedLayoutProvider","constructor","itemCount","itemHeight","width","getItemCount","getLayout","index","x","y","height"],"sourceRoot":"../../../src","sources":["layout/EstimatedLayoutProvider.ts"],"mappings":";;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMA,uBAAuB,CAA2B;EAK7DC,WAAWA,CACTC,SAAiB,EACjBC,UAAkB,EAClBC,KAAa,EACb;IACA,IAAI,CAACF,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACC,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,KAAK,GAAGA,KAAK;EACpB;EAEAC,YAAYA,CAAA,EAAW;IACrB,OAAO,IAAI,CAACH,SAAS;EACvB;EAEAI,SAASA,CAACC,KAAa,EAAmB;IACxC,OAAO;MACLC,CAAC,EAAE,CAAC;MACJC,CAAC,EAAEF,KAAK,GAAG,IAAI,CAACJ,UAAU;MAC1BC,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBM,MAAM,EAAE,IAAI,CAACP;IACf,CAAC;EACH;AACF","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Resolves layouts eagerly into a contiguous array.
5
+ * Pure, deterministic, and reusable.
6
+ *
7
+ * FlashList equivalent: internal layout resolver.
8
+ */
9
+ export function computeLayouts(provider) {
10
+ const count = provider.getItemCount();
11
+ const layouts = new Array(count);
12
+ for (let i = 0; i < count; i++) {
13
+ layouts[i] = provider.getLayout(i);
14
+ }
15
+ return layouts;
16
+ }
17
+ //# sourceMappingURL=LayoutEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["computeLayouts","provider","count","getItemCount","layouts","Array","i","getLayout"],"sourceRoot":"../../../src","sources":["layout/LayoutEngine.ts"],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,cAAcA,CAC5BC,QAAwB,EACI;EAC5B,MAAMC,KAAK,GAAGD,QAAQ,CAACE,YAAY,CAAC,CAAC;EACrC,MAAMC,OAA0B,GAAG,IAAIC,KAAK,CAACH,KAAK,CAAC;EAEnD,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,KAAK,EAAEI,CAAC,EAAE,EAAE;IAC9BF,OAAO,CAACE,CAAC,CAAC,GAAGL,QAAQ,CAACM,SAAS,CAACD,CAAC,CAAC;EACpC;EAEA,OAAOF,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=LayoutProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["layout/LayoutProvider.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=LayoutRectangle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["layout/LayoutRectangle.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * INTERNAL mutable layout record.
5
+ * This is intentionally mutable and never exposed publicly.
6
+ */
7
+
8
+ /**
9
+ * Mutable linear layout store.
10
+ * FlashList-style incremental relayout.
11
+ */
12
+ export class MutableLinearLayout {
13
+ constructor(initialHeights, width) {
14
+ this.layouts = [];
15
+ let y = 0;
16
+ for (const height of initialHeights) {
17
+ this.layouts.push({
18
+ x: 0,
19
+ y,
20
+ width,
21
+ height
22
+ });
23
+ y += height;
24
+ }
25
+ this.totalHeight = y;
26
+ }
27
+
28
+ /**
29
+ * Read-only snapshot for consumers.
30
+ * Returned type is immutable.
31
+ */
32
+ getLayouts() {
33
+ return this.layouts;
34
+ }
35
+ getContentHeight() {
36
+ return this.totalHeight;
37
+ }
38
+
39
+ /**
40
+ * Update height of one item and shift following items.
41
+ * Returns true if layout changed.
42
+ */
43
+ updateItemHeight(index, newHeight) {
44
+ const layout = this.layouts[index];
45
+ if (!layout) return false;
46
+ const delta = newHeight - layout.height;
47
+ if (delta === 0) return false;
48
+
49
+ // Update this item
50
+ layout.height = newHeight;
51
+
52
+ // Shift all items after this index
53
+ for (let i = index + 1; i < this.layouts.length; i++) {
54
+ this.layouts[i].y += delta;
55
+ }
56
+ this.totalHeight += delta;
57
+ return true;
58
+ }
59
+ }
60
+ //# sourceMappingURL=MutableLinearLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MutableLinearLayout","constructor","initialHeights","width","layouts","y","height","push","x","totalHeight","getLayouts","getContentHeight","updateItemHeight","index","newHeight","layout","delta","i","length"],"sourceRoot":"../../../src","sources":["layout/MutableLinearLayout.ts"],"mappings":";;AAEA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA,OAAO,MAAMA,mBAAmB,CAAC;EAI/BC,WAAWA,CACTC,cAAiC,EACjCC,KAAa,EACb;IACA,IAAI,CAACC,OAAO,GAAG,EAAE;IACjB,IAAIC,CAAC,GAAG,CAAC;IAET,KAAK,MAAMC,MAAM,IAAIJ,cAAc,EAAE;MACnC,IAAI,CAACE,OAAO,CAACG,IAAI,CAAC;QAChBC,CAAC,EAAE,CAAC;QACJH,CAAC;QACDF,KAAK;QACLG;MACF,CAAC,CAAC;MACFD,CAAC,IAAIC,MAAM;IACb;IAEA,IAAI,CAACG,WAAW,GAAGJ,CAAC;EACtB;;EAEA;AACF;AACA;AACA;EACEK,UAAUA,CAAA,EAA+B;IACvC,OAAO,IAAI,CAACN,OAAO;EACrB;EAEAO,gBAAgBA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACF,WAAW;EACzB;;EAEA;AACF;AACA;AACA;EACEG,gBAAgBA,CACdC,KAAa,EACbC,SAAiB,EACR;IACT,MAAMC,MAAM,GAAG,IAAI,CAACX,OAAO,CAACS,KAAK,CAAC;IAClC,IAAI,CAACE,MAAM,EAAE,OAAO,KAAK;IAEzB,MAAMC,KAAK,GAAGF,SAAS,GAAGC,MAAM,CAACT,MAAM;IACvC,IAAIU,KAAK,KAAK,CAAC,EAAE,OAAO,KAAK;;IAE7B;IACAD,MAAM,CAACT,MAAM,GAAGQ,SAAS;;IAEzB;IACA,KAAK,IAAIG,CAAC,GAAGJ,KAAK,GAAG,CAAC,EAAEI,CAAC,GAAG,IAAI,CAACb,OAAO,CAACc,MAAM,EAAED,CAAC,EAAE,EAAE;MACpD,IAAI,CAACb,OAAO,CAACa,CAAC,CAAC,CAAEZ,CAAC,IAAIW,KAAK;IAC7B;IAEA,IAAI,CAACP,WAAW,IAAIO,KAAK;IACzB,OAAO,IAAI;EACb;AACF","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { EstimatedLayoutProvider } from './EstimatedLayoutProvider';
4
+ export { computeLayouts } from './LayoutEngine';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EstimatedLayoutProvider","computeLayouts"],"sourceRoot":"../../../src","sources":["layout/index.ts"],"mappings":";;AAEA,SAASA,uBAAuB,QAAQ,2BAA2B;AACnE,SAASC,cAAc,QAAQ,gBAAgB","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Extracts stable layout measurements from RN onLayout event.
5
+ */
6
+ export function measureLayout(event) {
7
+ const {
8
+ width,
9
+ height
10
+ } = event.nativeEvent.layout;
11
+ return {
12
+ width,
13
+ height
14
+ };
15
+ }
16
+ //# sourceMappingURL=MeasureLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["measureLayout","event","width","height","nativeEvent","layout"],"sourceRoot":"../../../src","sources":["measurement/MeasureLayout.ts"],"mappings":";;AAOA;AACA;AACA;AACA,OAAO,SAASA,aAAaA,CAC3BC,KAAwB,EACR;EAChB,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,KAAK,CAACG,WAAW,CAACC,MAAM;EAElD,OAAO;IACLH,KAAK;IACLC;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef } from 'react';
4
+ /**
5
+ * Hook to measure a rendered item safely.
6
+ *
7
+ * Guarantees:
8
+ * - No duplicate height reports
9
+ * - No render loops
10
+ * - Stable callback identity
11
+ */
12
+ export function useItemMeasurement(index, onMeasured) {
13
+ const lastHeightRef = useRef(null);
14
+ const onLayout = useCallback(e => {
15
+ const height = e.nativeEvent.layout.height;
16
+
17
+ // Ignore identical measurements
18
+ if (lastHeightRef.current === height) return;
19
+ lastHeightRef.current = height;
20
+ onMeasured(index, height);
21
+ }, [index, onMeasured]);
22
+ return onLayout;
23
+ }
24
+ //# sourceMappingURL=useItemMeasurement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","useItemMeasurement","index","onMeasured","lastHeightRef","onLayout","e","height","nativeEvent","layout","current"],"sourceRoot":"../../../src","sources":["measurement/useItemMeasurement.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAG3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAAa,EACbC,UAAmD,EACnD;EACA,MAAMC,aAAa,GAAGJ,MAAM,CAAgB,IAAI,CAAC;EAEjD,MAAMK,QAAQ,GAAGN,WAAW,CACzBO,CAAoB,IAAK;IACxB,MAAMC,MAAM,GAAGD,CAAC,CAACE,WAAW,CAACC,MAAM,CAACF,MAAM;;IAE1C;IACA,IAAIH,aAAa,CAACM,OAAO,KAAKH,MAAM,EAAE;IAEtCH,aAAa,CAACM,OAAO,GAAGH,MAAM;IAC9BJ,UAAU,CAACD,KAAK,EAAEK,MAAM,CAAC;EAC3B,CAAC,EACD,CAACL,KAAK,EAAEC,UAAU,CACpB,CAAC;EAED,OAAOE,QAAQ;AACjB","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ export const NitroLayoutEngine = NitroModules.createHybridObject('NitroLayoutEngine');
5
+ //# sourceMappingURL=NitroLayoutEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","NitroLayoutEngine","createHybridObject"],"sourceRoot":"../../../src","sources":["native/NitroLayoutEngine.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,OAAO,MAAMC,iBAAiB,GAC5BD,YAAY,CAACE,kBAAkB,CAC7B,mBACF,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=NitroList.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["native/NitroList.types.ts"],"mappings":"","ignoreList":[]}