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
package/README.md CHANGED
@@ -1,29 +1,263 @@
1
- # react-native-nitro-list
1
+ # 🚀 NitroList (RecyclerList)
2
2
 
3
- react-native-nitro-list is a react native package built with Nitro
3
+ **Nitro-powered RecyclerList for React Native New Architecture**
4
4
 
5
- [![Version](https://img.shields.io/npm/v/react-native-nitro-list.svg)](https://www.npmjs.com/package/react-native-nitro-list)
6
- [![Downloads](https://img.shields.io/npm/dm/react-native-nitro-list.svg)](https://www.npmjs.com/package/react-native-nitro-list)
7
- [![License](https://img.shields.io/npm/l/react-native-nitro-list.svg)](https://github.com/patrickkabwe/react-native-nitro-list/LICENSE)
5
+ A high-performance, recycler-based list built from the ground up for
6
+ **Fabric + Nitro (JSI)** — no legacy bridge, no hidden overhead.
8
7
 
9
- ## Requirements
8
+ ---
10
9
 
11
- - React Native v0.76.0 or higher
12
- - Node 18.0.0 or higher
10
+ ## Preview
13
11
 
14
- > [!IMPORTANT]
15
- > To Support `Nitro Views` you need to install React Native version v0.78.0 or higher.
12
+ ![NitroList Preview](./NitroList.png)
16
13
 
17
- ## Installation
14
+ **Blazing-fast • Deterministic • Architecture-correct**
15
+
16
+ Built for teams that care about **FPS, memory stability, and correctness**.
17
+
18
+ ---
19
+
20
+ ## ✨ What is NitroList?
21
+
22
+ **NitroList** (public component: `RecyclerList`) is a **FlashList-class virtualized list**, designed with a stricter architectural philosophy:
23
+
24
+ - New Architecture only (Fabric)
25
+ - Nitro / JSI friendly
26
+ - True view recycling
27
+ - Explicit layout ownership
28
+ - Predictable memory usage
29
+
30
+ NitroList is **not a beginner abstraction**.
31
+ It is **infrastructure-level UI**, meant for performance-critical React Native apps.
32
+
33
+ ---
34
+
35
+ ## 🧠 Core Design Principles
36
+
37
+ NitroList enforces strict separation of responsibilities:
38
+
39
+ | Responsibility | Owner |
40
+ |----------------|------|
41
+ | Layout truth | MutableLinearLayout (outside React) |
42
+ | Windowing | Pure binary-search windowing |
43
+ | Recycling | Physical cell reuse |
44
+ | Rendering | React (placement only) |
45
+ | Observers | Viewability / Prefetch (read-only) |
46
+
47
+ ### Key invariants
48
+
49
+ - React never owns layout state
50
+ - React never decides what exists
51
+ - Layout is a mutable truth outside React
52
+
53
+ This separation is the foundation of stable performance.
54
+
55
+ ---
56
+
57
+ ## ⚡ Why NitroList over FlatList?
58
+
59
+ ### Problems with FlatList
60
+
61
+ - Recreates views instead of recycling
62
+ - Layout is implicit and fragile
63
+ - Memory grows with scroll depth
64
+ - Blank cells under pressure
65
+ - Designed for the legacy bridge
66
+
67
+ ### NitroList Advantages
68
+
69
+ - True view recycling
70
+ - Absolute positioning (no reflow)
71
+ - Deterministic windowing
72
+ - Stable memory footprint
73
+ - No legacy bridge usage
74
+ - Architecture designed for scale
75
+
76
+ ---
77
+
78
+ ## 🆚 NitroList vs FlashList
79
+
80
+ | Feature | FlashList v2 | NitroList |
81
+ |------|-------------|-----------|
82
+ | New Architecture | Yes | Yes |
83
+ | Legacy bridge | No | No |
84
+ | Recycler model | Yes | Yes |
85
+ | Layout ownership | Internal | Explicit & controllable |
86
+ | Nitro / JSI ready | No | Yes |
87
+ | Deterministic memory | Partial | Strict |
88
+ | Architecture clarity | Medium | Very high |
89
+
90
+ ### Why NitroList Exists
91
+
92
+ FlashList v2 is excellent — but:
93
+
94
+ - Layout is internal and opaque
95
+ - Hard to integrate with Nitro / JSI native logic
96
+ - Less control over measurement and relayout
97
+ - Harder to reason about invariants
98
+
99
+ NitroList is built for:
100
+
101
+ - Native-heavy apps
102
+ - Nitro / JSI pipelines
103
+ - Custom layout engines
104
+ - Predictable performance at scale
105
+
106
+ ---
107
+
108
+ ## 🧩 Features
109
+
110
+ ### Implemented
111
+
112
+ - Recycler-based rendering
113
+ - Binary-search windowing
114
+ - Adaptive render buffer
115
+ - Deterministic layout engine
116
+ - Viewability tracking
117
+ - Prefetch hooks
118
+ - Full TypeScript safety
119
+ - Unit-tested windowing logic
120
+
121
+ ### Partially Implemented
122
+
123
+ - Dynamic measurement pipeline
124
+ - Incremental relayout
125
+
126
+ ### Planned
127
+
128
+ - scrollToIndex
129
+ - Sticky headers
130
+ - Masonry layout
131
+ - Native measurement via Nitro
132
+ - Benchmark harness
133
+
134
+ ---
135
+
136
+ ## 📦 Installation
18
137
 
19
138
  ```bash
20
- npm install react-native-nitro-list react-native-nitro-modules
139
+ npm install react-native-nitro-list
21
140
  ```
22
141
 
23
- ## Credits
142
+ > Requires React Native New Architecture
143
+ > NitroList will not run on the legacy bridge.
144
+
145
+ ---
146
+
147
+ ## 🧑‍💻 Usage
148
+
149
+ ### Basic Usage
150
+
151
+ ```tsx
152
+ import { RecyclerList } from 'react-native-nitro-list'
153
+
154
+ <RecyclerList
155
+ containerWidth={width}
156
+ itemCount={10000}
157
+ estimatedItemHeight={80}
158
+ renderItem={(index) => <Row index={index} />}
159
+ />
160
+ ```
161
+
162
+ ### Fixed Heights
163
+
164
+ ```tsx
165
+ <RecyclerList
166
+ containerWidth={width}
167
+ itemHeights={heights}
168
+ renderItem={renderItem}
169
+ />
170
+ ```
171
+
172
+ ---
173
+
174
+ ## 👀 Viewability
175
+
176
+ ```tsx
177
+ <RecyclerList
178
+ onViewableItemsChanged={({ viewableItems, changed }) => {
179
+ console.log(viewableItems, changed)
180
+ }}
181
+ />
182
+ ```
183
+
184
+ - Percentage-based visibility
185
+ - Deterministic enter / exit events
186
+ - Zero layout mutation
187
+
188
+ ---
189
+
190
+ ## ⚡ Prefetching
191
+
192
+ ```tsx
193
+ <RecyclerList
194
+ onPrefetch={(indices) => {
195
+ preloadData(indices)
196
+ }}
197
+ />
198
+ ```
199
+
200
+ - Runs ahead of the visible window
201
+ - Deduplicated
202
+ - Safe and repeatable
203
+ - Observer-only (never mutates layout)
204
+
205
+ ---
206
+
207
+ ## 🧪 Testing Philosophy
208
+
209
+ NitroList focuses on pure logic tests:
210
+
211
+ - Windowing correctness
212
+ - Buffer expansion
213
+ - Boundary conditions
214
+ - Off-by-one safety
215
+
216
+ No flaky UI snapshot tests.
217
+ No renderer-dependent assertions.
218
+
219
+ ---
220
+
221
+ ## 🧠 When Should You Use NitroList?
222
+
223
+ ### Use NitroList if:
224
+
225
+ - You are on Fabric / New Architecture
226
+ - You care about memory stability
227
+ - You plan to integrate Nitro / JSI
228
+ - You want explicit control over layout
229
+ - You are building performance-critical screens
230
+
231
+ ### Don’t use NitroList if:
232
+
233
+ - You need legacy bridge support
234
+ - You want a beginner-friendly abstraction
235
+ - Your lists are small (less than 500 items)
236
+ - FlatList performance is already sufficient
237
+
238
+ ---
239
+
240
+ ## 🗺️ Roadmap
241
+
242
+ - v0.2 → measurement pipeline
243
+ - v0.3 → scrollToIndex
244
+ - v0.4 → native measurement (Nitro)
245
+ - v1.0 → production-hardened API
246
+
247
+ ---
248
+
249
+ ## 🤝 Philosophy
250
+
251
+ NitroList optimizes for:
252
+
253
+ - Correctness over magic
254
+ - Predictability over heuristics
255
+ - Architecture over convenience
256
+
257
+ This library is for engineers who value control.
24
258
 
25
- Bootstrapped with [create-nitro-module](https://github.com/patrickkabwe/create-nitro-module).
259
+ ---
26
260
 
27
- ## Contributing
261
+ ## 📄 License
28
262
 
29
- Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
263
+ MIT
@@ -130,13 +130,14 @@ repositories {
130
130
 
131
131
 
132
132
  dependencies {
133
- // For < 0.71, this will be from the local maven repo
134
- // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
135
- //noinspection GradleDynamicVersion
133
+ // React Native
136
134
  implementation "com.facebook.react:react-native:+"
137
135
 
138
- // Add a dependency on NitroModules
136
+ // Nitro JSI
139
137
  implementation project(":react-native-nitro-modules")
138
+
139
+ // ✅ REQUIRED: RecyclerView
140
+ implementation "androidx.recyclerview:recyclerview:1.3.2"
140
141
  }
141
142
 
142
143
  if (isNewArchitectureEnabled()) {
@@ -0,0 +1,26 @@
1
+ package com.nitrolist
2
+
3
+ import android.content.Context
4
+ import androidx.recyclerview.widget.LinearLayoutManager
5
+ import androidx.recyclerview.widget.RecyclerView
6
+
7
+ /**
8
+ * Native RecyclerView host.
9
+ * This is a real Android RecyclerView – no Nitro codegen involved.
10
+ */
11
+ class HybridNitroRecyclerView(context: Context) : RecyclerView(context) {
12
+
13
+ init {
14
+ layoutManager = LinearLayoutManager(context)
15
+ itemAnimator = null
16
+ setHasFixedSize(true)
17
+ }
18
+
19
+ fun setItemCount(count: Int) {
20
+ if (adapter == null) {
21
+ adapter = NitroRecyclerAdapter(count)
22
+ } else {
23
+ (adapter as NitroRecyclerAdapter).updateCount(count)
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,29 @@
1
+ package com.nitrolist
2
+
3
+ import com.facebook.react.uimanager.SimpleViewManager
4
+ import com.facebook.react.uimanager.ThemedReactContext
5
+ import com.facebook.react.uimanager.annotations.ReactProp
6
+
7
+ /**
8
+ * Standard ViewManager.
9
+ * Fabric compatible, handwritten.
10
+ */
11
+ class HybridNitroRecyclerViewManager :
12
+ SimpleViewManager<HybridNitroRecyclerView>() {
13
+
14
+ override fun getName(): String = "NitroRecyclerView"
15
+
16
+ override fun createViewInstance(
17
+ reactContext: ThemedReactContext
18
+ ): HybridNitroRecyclerView {
19
+ return HybridNitroRecyclerView(reactContext)
20
+ }
21
+
22
+ @ReactProp(name = "itemCount")
23
+ fun setItemCount(
24
+ view: HybridNitroRecyclerView,
25
+ count: Int
26
+ ) {
27
+ view.setItemCount(count)
28
+ }
29
+ }
@@ -1,29 +1,18 @@
1
- package com.nitrolist;
1
+ package com.nitrolist
2
2
 
3
- import com.facebook.react.bridge.NativeModule;
4
- import com.facebook.react.bridge.ReactApplicationContext;
5
- import com.facebook.react.module.model.ReactModuleInfoProvider;
6
- import com.facebook.react.TurboReactPackage;
7
- import com.facebook.react.uimanager.ViewManager;
8
- import com.margelo.nitro.nitrolist.*;
9
- import com.margelo.nitro.nitrolist.views.*;
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
10
7
 
8
+ class NitroListPackage : ReactPackage {
11
9
 
12
- public class NitroListPackage : TurboReactPackage() {
13
- override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? = null
10
+ override fun createNativeModules(
11
+ reactContext: ReactApplicationContext
12
+ ): List<NativeModule> = emptyList()
14
13
 
15
- override fun getReactModuleInfoProvider(): ReactModuleInfoProvider = ReactModuleInfoProvider { emptyMap() }
16
-
17
- override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
18
- val viewManagers = ArrayList<ViewManager<*, *>>()
19
- viewManagers.add(HybridNitroListManager())
20
- return viewManagers
21
- }
22
-
23
- companion object {
24
- init {
25
- NitroListOnLoad.initializeNative()
26
- }
27
- }
14
+ override fun createViewManagers(
15
+ reactContext: ReactApplicationContext
16
+ ): List<ViewManager<*, *>> =
17
+ listOf(HybridNitroRecyclerViewManager())
28
18
  }
29
-
@@ -0,0 +1,32 @@
1
+ package com.nitrolist
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import androidx.recyclerview.widget.RecyclerView
6
+
7
+ class NitroRecyclerAdapter(
8
+ private var itemCountInternal: Int
9
+ ) : RecyclerView.Adapter<NitroRecyclerViewHolder>() {
10
+
11
+ override fun onCreateViewHolder(
12
+ parent: ViewGroup,
13
+ viewType: Int
14
+ ): NitroRecyclerViewHolder {
15
+ val view = View(parent.context)
16
+ return NitroRecyclerViewHolder(view)
17
+ }
18
+
19
+ override fun onBindViewHolder(
20
+ holder: NitroRecyclerViewHolder,
21
+ position: Int
22
+ ) {
23
+ // JS/Fabric will manage children later
24
+ }
25
+
26
+ override fun getItemCount(): Int = itemCountInternal
27
+
28
+ fun updateCount(newCount: Int) {
29
+ itemCountInternal = newCount
30
+ notifyDataSetChanged()
31
+ }
32
+ }
@@ -0,0 +1,8 @@
1
+ package com.nitrolist
2
+
3
+ import android.view.View
4
+ import androidx.recyclerview.widget.RecyclerView
5
+
6
+ class NitroRecyclerViewHolder(
7
+ itemView: View
8
+ ) : RecyclerView.ViewHolder(itemView)
@@ -1,21 +1,38 @@
1
- //
2
- // HybridNitroList.swift
3
- // Pods
4
- //
5
- // Created by Shiv Shankar Tiwari on 25/12/2025.
6
- //
7
-
8
1
  import Foundation
9
- import UIKit
2
+ import NitroModules
3
+
4
+ /**
5
+ * Native layout engine for RecyclerList.
6
+ * Pure, deterministic, synchronous computation.
7
+ */
8
+ final class HybridNitroList: HybridNitroListSpec {
9
+
10
+ /**
11
+ * Computes absolute layout rectangles for all items.
12
+ * Called synchronously via JSI.
13
+ */
14
+ func computeLayout(
15
+ containerWidth: Double,
16
+ itemHeights: [Double]
17
+ ) -> [LayoutRectangle] {
10
18
 
11
- class HybridNitroList : HybridNitroListSpec {
12
- // UIView
13
- var view: UIView = UIView()
19
+ var layouts: [LayoutRectangle] = []
20
+ layouts.reserveCapacity(itemHeights.count)
14
21
 
15
- // Props
16
- var isRed: Bool = false {
17
- didSet {
18
- view.backgroundColor = isRed ? .red : .black
22
+ var currentY: Double = 0
23
+
24
+ for height in itemHeights {
25
+ let rect = LayoutRectangle(
26
+ x: 0,
27
+ y: currentY,
28
+ width: containerWidth,
29
+ height: height
30
+ )
31
+
32
+ layouts.append(rect)
33
+ currentY += height
19
34
  }
35
+
36
+ return layouts
20
37
  }
21
38
  }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NitroRecyclerView = void 0;
7
+ var _reactNative = require("react-native");
8
+ const NitroRecyclerView = exports.NitroRecyclerView = (0, _reactNative.requireNativeComponent)('NitroRecyclerView');
9
+ //# sourceMappingURL=NitroList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","NitroRecyclerView","exports","requireNativeComponent"],"sourceRoot":"../../src","sources":["NitroList.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAMO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5B,IAAAE,mCAAsB,EAAyB,mBAAmB,CAAC","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useRecyclerListInternal = useRecyclerListInternal;
7
+ var _useCellRenderer = require("./hooks/useCellRenderer");
8
+ /**
9
+ * INTERNAL hook.
10
+ * MUST ALWAYS CALL hooks in the same order.
11
+ */
12
+ function useRecyclerListInternal(layouts, metrics, bufferPx, getItemType) {
13
+ /**
14
+ * FlashList rule:
15
+ * Hooks are ALWAYS called.
16
+ * Inputs are guarded instead.
17
+ */
18
+ const safeLayouts = metrics.height > 0 ? layouts : EMPTY_LAYOUTS;
19
+ const safeBufferPx = metrics.height > 0 ? bufferPx : 0;
20
+ return (0, _useCellRenderer.useCellRenderer)(safeLayouts, metrics, safeBufferPx, getItemType);
21
+ }
22
+
23
+ /** Stable empty reference */
24
+ const EMPTY_LAYOUTS = [];
25
+ //# sourceMappingURL=RecyclerList.internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_useCellRenderer","require","useRecyclerListInternal","layouts","metrics","bufferPx","getItemType","safeLayouts","height","EMPTY_LAYOUTS","safeBufferPx","useCellRenderer"],"sourceRoot":"../../src","sources":["RecyclerList.internal.ts"],"mappings":";;;;;;AAIA,IAAAA,gBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,SAASC,uBAAuBA,CACrCC,OAAmC,EACnCC,OAAsB,EACtBC,QAAgB,EAChBC,WAAsC,EACrB;EAEjB;AACF;AACA;AACA;AACA;EACE,MAAMC,WAAW,GACfH,OAAO,CAACI,MAAM,GAAG,CAAC,GAAGL,OAAO,GAAGM,aAAa;EAE9C,MAAMC,YAAY,GAChBN,OAAO,CAACI,MAAM,GAAG,CAAC,GAAGH,QAAQ,GAAG,CAAC;EAEnC,OAAO,IAAAM,gCAAe,EACpBJ,WAAW,EACXH,OAAO,EACPM,YAAY,EACZJ,WACF,CAAC;AACH;;AAEA;AACA,MAAMG,aAAyC,GAAG,EAAE","ignoreList":[]}