react-native-nitro-list 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +16 -44
  2. package/ios/HybridNitroList.swift +7 -5
  3. package/lib/commonjs/index.js +31 -3
  4. package/lib/commonjs/index.js.map +1 -1
  5. package/lib/commonjs/layout/MutableLinearLayout.js.map +1 -1
  6. package/lib/commonjs/native/NitroListView.js +20 -0
  7. package/lib/commonjs/native/NitroListView.js.map +1 -0
  8. package/lib/commonjs/recycler/CellPool.js +5 -18
  9. package/lib/commonjs/recycler/CellPool.js.map +1 -1
  10. package/lib/commonjs/recycler/{RecyclerList.js → NitroList.js} +91 -92
  11. package/lib/commonjs/recycler/NitroList.js.map +1 -0
  12. package/lib/commonjs/scroll/useScrollVelocity.js +20 -0
  13. package/lib/commonjs/scroll/useScrollVelocity.js.map +1 -0
  14. package/lib/commonjs/{native/NitroList.types.js → specs/NitroList.nitro.js} +1 -1
  15. package/lib/commonjs/{native/NitroList.types.js.map → specs/NitroList.nitro.js.map} +1 -1
  16. package/lib/commonjs/types/CellType.js +25 -0
  17. package/lib/commonjs/types/CellType.js.map +1 -1
  18. package/lib/commonjs/types/recycler/CellPool.js +42 -0
  19. package/lib/commonjs/types/recycler/CellPool.js.map +1 -0
  20. package/lib/commonjs/types/recycler/{RecyclerListProps.js → NitroListProps.js} +1 -1
  21. package/lib/commonjs/types/recycler/NitroListProps.js.map +1 -0
  22. package/lib/commonjs/types/recycler/{RecyclerCellInstance.js → RecyclerCell.js} +1 -1
  23. package/lib/commonjs/types/recycler/RecyclerCell.js.map +1 -0
  24. package/lib/commonjs/windowing/computeVisibleItemRange.js +22 -32
  25. package/lib/commonjs/windowing/computeVisibleItemRange.js.map +1 -1
  26. package/lib/module/index.js +5 -1
  27. package/lib/module/index.js.map +1 -1
  28. package/lib/module/layout/MutableLinearLayout.js.map +1 -1
  29. package/lib/module/native/NitroListView.js +17 -0
  30. package/lib/module/native/NitroListView.js.map +1 -0
  31. package/lib/module/recycler/CellPool.js +5 -18
  32. package/lib/module/recycler/CellPool.js.map +1 -1
  33. package/lib/module/recycler/NitroList.js +220 -0
  34. package/lib/module/recycler/NitroList.js.map +1 -0
  35. package/lib/module/scroll/useScrollVelocity.js +16 -0
  36. package/lib/module/scroll/useScrollVelocity.js.map +1 -0
  37. package/lib/module/specs/NitroList.nitro.js +4 -0
  38. package/lib/module/{native/NitroList.types.js.map → specs/NitroList.nitro.js.map} +1 -1
  39. package/lib/module/types/CellType.js +20 -0
  40. package/lib/module/types/CellType.js.map +1 -1
  41. package/lib/module/types/recycler/CellPool.js +37 -0
  42. package/lib/module/types/recycler/CellPool.js.map +1 -0
  43. package/lib/module/types/recycler/NitroListProps.js +4 -0
  44. package/lib/module/types/recycler/NitroListProps.js.map +1 -0
  45. package/lib/module/types/recycler/RecyclerCell.js +4 -0
  46. package/lib/module/types/recycler/RecyclerCell.js.map +1 -0
  47. package/lib/module/windowing/computeVisibleItemRange.js +22 -32
  48. package/lib/module/windowing/computeVisibleItemRange.js.map +1 -1
  49. package/lib/typescript/src/index.d.ts +3 -1
  50. package/lib/typescript/src/index.d.ts.map +1 -1
  51. package/lib/typescript/src/native/NitroListView.d.ts +20 -0
  52. package/lib/typescript/src/native/NitroListView.d.ts.map +1 -0
  53. package/lib/typescript/src/recycler/CellPool.d.ts +4 -7
  54. package/lib/typescript/src/recycler/CellPool.d.ts.map +1 -1
  55. package/lib/typescript/src/recycler/NitroList.d.ts +4 -0
  56. package/lib/typescript/src/recycler/NitroList.d.ts.map +1 -0
  57. package/lib/typescript/src/scroll/useScrollVelocity.d.ts +2 -0
  58. package/lib/typescript/src/scroll/useScrollVelocity.d.ts.map +1 -0
  59. package/lib/typescript/src/specs/NitroList.nitro.d.ts +26 -0
  60. package/lib/typescript/src/specs/NitroList.nitro.d.ts.map +1 -0
  61. package/lib/typescript/src/types/CellKey.d.ts +1 -9
  62. package/lib/typescript/src/types/CellKey.d.ts.map +1 -1
  63. package/lib/typescript/src/types/CellType.d.ts +12 -1
  64. package/lib/typescript/src/types/CellType.d.ts.map +1 -1
  65. package/lib/typescript/src/types/recycler/CellPool.d.ts +16 -0
  66. package/lib/typescript/src/types/recycler/CellPool.d.ts.map +1 -0
  67. package/lib/typescript/src/types/recycler/{RecyclerListProps.d.ts → NitroListProps.d.ts} +3 -3
  68. package/lib/typescript/src/types/recycler/NitroListProps.d.ts.map +1 -0
  69. package/lib/typescript/src/types/recycler/RecyclerCell.d.ts +12 -0
  70. package/lib/typescript/src/types/recycler/RecyclerCell.d.ts.map +1 -0
  71. package/lib/typescript/src/types/recycler/RecyclerItemRenderer.d.ts +6 -2
  72. package/lib/typescript/src/types/recycler/RecyclerItemRenderer.d.ts.map +1 -1
  73. package/lib/typescript/src/types/recycler/index.d.ts +2 -2
  74. package/lib/typescript/src/types/recycler/index.d.ts.map +1 -1
  75. package/lib/typescript/src/windowing/computeVisibleItemRange.d.ts +16 -12
  76. package/lib/typescript/src/windowing/computeVisibleItemRange.d.ts.map +1 -1
  77. package/nitro.json +5 -5
  78. package/nitrogen/generated/android/NitroList+autolinking.cmake +2 -2
  79. package/nitrogen/generated/android/NitroListOnLoad.cpp +2 -2
  80. package/nitrogen/generated/android/c++/{JHybridNitroLayoutEngineSpec.cpp → JHybridNitroListSpec.cpp} +15 -15
  81. package/nitrogen/generated/android/c++/{JHybridNitroLayoutEngineSpec.hpp → JHybridNitroListSpec.hpp} +11 -11
  82. package/nitrogen/generated/android/c++/{JLayoutRect.hpp → JItemLayout.hpp} +10 -10
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/{HybridNitroLayoutEngineSpec.kt → HybridNitroListSpec.kt} +7 -7
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrolist/{LayoutRect.kt → ItemLayout.kt} +5 -5
  85. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Bridge.cpp +9 -9
  86. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Bridge.hpp +27 -27
  87. package/nitrogen/generated/ios/NitroList-Swift-Cxx-Umbrella.hpp +8 -8
  88. package/nitrogen/generated/ios/c++/{HybridNitroLayoutEngineSpecSwift.cpp → HybridNitroListSpecSwift.cpp} +2 -2
  89. package/nitrogen/generated/ios/c++/{HybridNitroLayoutEngineSpecSwift.hpp → HybridNitroListSpecSwift.hpp} +16 -16
  90. package/nitrogen/generated/ios/swift/HybridNitroListSpec.swift +56 -0
  91. package/nitrogen/generated/ios/swift/{HybridNitroLayoutEngineSpec_cxx.swift → HybridNitroListSpec_cxx.swift} +23 -23
  92. package/nitrogen/generated/ios/swift/{LayoutRect.swift → ItemLayout.swift} +5 -5
  93. package/nitrogen/generated/shared/c++/{HybridNitroLayoutEngineSpec.cpp → HybridNitroListSpec.cpp} +4 -4
  94. package/nitrogen/generated/shared/c++/{HybridNitroLayoutEngineSpec.hpp → HybridNitroListSpec.hpp} +13 -13
  95. package/nitrogen/generated/shared/c++/{LayoutRect.hpp → ItemLayout.hpp} +11 -11
  96. package/package.json +5 -5
  97. package/src/index.ts +7 -1
  98. package/src/layout/MutableLinearLayout.ts +1 -1
  99. package/src/native/NitroListView.ts +22 -0
  100. package/src/recycler/CellPool.ts +10 -24
  101. package/src/recycler/NitroList.tsx +317 -0
  102. package/src/scroll/useScrollVelocity.ts +16 -0
  103. package/src/specs/NitroList.nitro.ts +29 -0
  104. package/src/types/CellKey.ts +2 -9
  105. package/src/types/CellType.ts +8 -9
  106. package/src/types/recycler/CellPool.ts +45 -0
  107. package/src/types/recycler/{RecyclerListProps.ts → NitroListProps.ts} +2 -2
  108. package/src/types/recycler/RecyclerCell.ts +12 -0
  109. package/src/types/recycler/RecyclerItemRenderer.ts +6 -2
  110. package/src/types/recycler/index.ts +2 -2
  111. package/src/windowing/computeVisibleItemRange.ts +42 -38
  112. package/lib/commonjs/NitroList.js +0 -9
  113. package/lib/commonjs/NitroList.js.map +0 -1
  114. package/lib/commonjs/native/NitroLayoutEngine.js +0 -9
  115. package/lib/commonjs/native/NitroLayoutEngine.js.map +0 -1
  116. package/lib/commonjs/native/NitroRecyclerView.js +0 -9
  117. package/lib/commonjs/native/NitroRecyclerView.js.map +0 -1
  118. package/lib/commonjs/recycler/RecyclerList.js.map +0 -1
  119. package/lib/commonjs/specs/nitro-layout-engine.nitro.js +0 -6
  120. package/lib/commonjs/specs/nitro-layout-engine.nitro.js.map +0 -1
  121. package/lib/commonjs/types/recycler/RecyclerCellInstance.js.map +0 -1
  122. package/lib/commonjs/types/recycler/RecyclerListProps.js.map +0 -1
  123. package/lib/module/NitroList.js +0 -5
  124. package/lib/module/NitroList.js.map +0 -1
  125. package/lib/module/native/NitroLayoutEngine.js +0 -5
  126. package/lib/module/native/NitroLayoutEngine.js.map +0 -1
  127. package/lib/module/native/NitroList.types.js +0 -4
  128. package/lib/module/native/NitroRecyclerView.js +0 -5
  129. package/lib/module/native/NitroRecyclerView.js.map +0 -1
  130. package/lib/module/recycler/RecyclerList.js +0 -221
  131. package/lib/module/recycler/RecyclerList.js.map +0 -1
  132. package/lib/module/specs/nitro-layout-engine.nitro.js +0 -4
  133. package/lib/module/specs/nitro-layout-engine.nitro.js.map +0 -1
  134. package/lib/module/types/recycler/RecyclerCellInstance.js +0 -4
  135. package/lib/module/types/recycler/RecyclerCellInstance.js.map +0 -1
  136. package/lib/module/types/recycler/RecyclerListProps.js +0 -4
  137. package/lib/module/types/recycler/RecyclerListProps.js.map +0 -1
  138. package/lib/typescript/src/NitroList.d.ts +0 -5
  139. package/lib/typescript/src/NitroList.d.ts.map +0 -1
  140. package/lib/typescript/src/native/NitroLayoutEngine.d.ts +0 -3
  141. package/lib/typescript/src/native/NitroLayoutEngine.d.ts.map +0 -1
  142. package/lib/typescript/src/native/NitroList.types.d.ts +0 -9
  143. package/lib/typescript/src/native/NitroList.types.d.ts.map +0 -1
  144. package/lib/typescript/src/native/NitroRecyclerView.d.ts +0 -5
  145. package/lib/typescript/src/native/NitroRecyclerView.d.ts.map +0 -1
  146. package/lib/typescript/src/recycler/RecyclerList.d.ts +0 -4
  147. package/lib/typescript/src/recycler/RecyclerList.d.ts.map +0 -1
  148. package/lib/typescript/src/specs/nitro-layout-engine.nitro.d.ts +0 -14
  149. package/lib/typescript/src/specs/nitro-layout-engine.nitro.d.ts.map +0 -1
  150. package/lib/typescript/src/types/recycler/RecyclerCellInstance.d.ts +0 -37
  151. package/lib/typescript/src/types/recycler/RecyclerCellInstance.d.ts.map +0 -1
  152. package/lib/typescript/src/types/recycler/RecyclerListProps.d.ts.map +0 -1
  153. package/nitrogen/generated/ios/swift/HybridNitroLayoutEngineSpec.swift +0 -56
  154. package/src/NitroList.ts +0 -8
  155. package/src/native/NitroLayoutEngine.ts +0 -7
  156. package/src/native/NitroList.types.ts +0 -13
  157. package/src/native/NitroRecyclerView.ts +0 -8
  158. package/src/recycler/RecyclerList.tsx +0 -304
  159. package/src/specs/nitro-layout-engine.nitro.ts +0 -17
  160. package/src/types/recycler/RecyclerCellInstance.ts +0 -40
package/README.md CHANGED
@@ -150,51 +150,23 @@ npm install react-native-nitro-list
150
150
 
151
151
  ```tsx
152
152
  import { RecyclerList } from 'react-native-nitro-list'
153
+ import { NitroList } from 'react-native-nitro-list'
154
+
155
+ export default function App() {
156
+ const data = useMemo(() => generateData(10000), []);
157
+ const heights = useMemo(() => data.map(() => 80), [data]);
158
+
159
+ return (
160
+ <NitroList
161
+ data={data}
162
+ containerCrossAxisSize={width}
163
+ itemMainAxisSizes={heights}
164
+ getCellType={() => 'row'}
165
+ renderItem={({ item }) => <YourComponent data={item} />}
166
+ />
167
+ );
168
+ }
153
169
 
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
170
  ```
199
171
 
200
172
  - Runs ahead of the visible window
@@ -5,21 +5,21 @@ import NitroModules
5
5
  * Native layout engine for RecyclerList.
6
6
  * Pure, deterministic, synchronous computation.
7
7
  */
8
- final class HybridNitroLayoutEngine: HybridNitroLayoutEngineSpec {
8
+ final class HybridNitroList: HybridNitroListSpec {
9
9
 
10
10
  func computeLayout(
11
11
  containerWidth: Double,
12
12
  itemHeights: [Double]
13
- ) -> [LayoutRect] {
13
+ ) -> [ItemLayout] { // Changed from LayoutRect to ItemLayout
14
14
 
15
- var layouts: [LayoutRect] = []
15
+ var layouts: [ItemLayout] = [] // Changed from LayoutRect to ItemLayout
16
16
  layouts.reserveCapacity(itemHeights.count)
17
17
 
18
18
  var currentY: Double = 0
19
19
 
20
20
  for height in itemHeights {
21
21
  layouts.append(
22
- LayoutRect(
22
+ ItemLayout( // This now matches the generated struct name
23
23
  x: 0,
24
24
  y: currentY,
25
25
  width: containerWidth,
@@ -31,4 +31,6 @@ final class HybridNitroLayoutEngine: HybridNitroLayoutEngineSpec {
31
31
 
32
32
  return layouts
33
33
  }
34
- }
34
+
35
+ // Don't forget to update getVisibleRange to use ItemLayout if it references it!
36
+ }
@@ -3,11 +3,39 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "RecyclerList", {
6
+ var _exportNames = {
7
+ NitroList: true
8
+ };
9
+ Object.defineProperty(exports, "NitroList", {
7
10
  enumerable: true,
8
11
  get: function () {
9
- return _RecyclerList.RecyclerList;
12
+ return _NitroList2.default;
10
13
  }
11
14
  });
12
- var _RecyclerList = require("./recycler/RecyclerList");
15
+ var _NitroListView = require("./native/NitroListView");
16
+ Object.keys(_NitroListView).forEach(function (key) {
17
+ if (key === "default" || key === "__esModule") return;
18
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
19
+ if (key in exports && exports[key] === _NitroListView[key]) return;
20
+ Object.defineProperty(exports, key, {
21
+ enumerable: true,
22
+ get: function () {
23
+ return _NitroListView[key];
24
+ }
25
+ });
26
+ });
27
+ var _NitroList = require("./specs/NitroList.nitro");
28
+ Object.keys(_NitroList).forEach(function (key) {
29
+ if (key === "default" || key === "__esModule") return;
30
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
31
+ if (key in exports && exports[key] === _NitroList[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _NitroList[key];
36
+ }
37
+ });
38
+ });
39
+ var _NitroList2 = _interopRequireDefault(require("./recycler/NitroList"));
40
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_RecyclerList","require"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_NitroListView","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_NitroList","_NitroList2","_interopRequireDefault","e","__esModule","default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;AAEA,IAAAA,cAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,cAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,cAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,cAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AAEA,IAAAS,UAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,UAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,UAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,UAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AAEA,IAAAU,WAAA,GAAAC,sBAAA,CAAAf,OAAA;AAA4D,SAAAe,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_layoutDefaults","require","MutableLinearLayout","layouts","contentSize","constructor","axis","isVertical","compute","input","crossAxisSize","itemMainAxisSizes","padding","itemSpacing","DEFAULT_ITEM_SPACING","itemCount","length","Array","cursor","start","i","mainAxisSize","x","y","width","height","end","getLayouts","getContentSize","reset","exports"],"sourceRoot":"../../../src","sources":["layout/MutableLinearLayout.ts"],"mappings":";;;;;;AAIA,IAAAA,eAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,CAAC;EAG/B;EACQC,OAAO,GAAiB,EAAE;;EAElC;EACQC,WAAW,GAAG,CAAC;EAEvBC,WAAWA,CAACC,IAAU,EAAE;IACtB,IAAI,CAACC,UAAU,GAAGD,IAAI,KAAK,UAAU;EACvC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,OAAOA,CAACC,KAAwB,EAAQ;IACtC,MAAM;MACJC,aAAa;MACbC,iBAAiB;MACjBC,OAAO;MACPC,WAAW,GAAGC;IAChB,CAAC,GAAGL,KAAK;IAET,MAAMM,SAAS,GAAGJ,iBAAiB,CAACK,MAAM;IAC1C,MAAMb,OAAqB,GAAG,IAAIc,KAAK,CAACF,SAAS,CAAC;IAElD,IAAIG,MAAM,GAAGN,OAAO,CAACO,KAAK;IAE1B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,SAAS,EAAEK,CAAC,EAAE,EAAE;MAClC,MAAMC,YAAY,GAAGV,iBAAiB,CAACS,CAAC,CAAE;MAE1CjB,OAAO,CAACiB,CAAC,CAAC,GAAG,IAAI,CAACb,UAAU,GACxB;QACEe,CAAC,EAAE,CAAC;QACJC,CAAC,EAAEL,MAAM;QACTM,KAAK,EAAEd,aAAa;QACpBe,MAAM,EAAEJ;MACV,CAAC,GACD;QACEC,CAAC,EAAEJ,MAAM;QACTK,CAAC,EAAE,CAAC;QACJC,KAAK,EAAEH,YAAY;QACnBI,MAAM,EAAEf;MACV,CAAC;MAELQ,MAAM,IAAIG,YAAY;;MAEtB;MACA,IAAID,CAAC,GAAGL,SAAS,GAAG,CAAC,EAAE;QACrBG,MAAM,IAAIL,WAAW;MACvB;IACF;IAEA,IAAI,CAACV,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGc,MAAM,GAAGN,OAAO,CAACc,GAAG;EACzC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEC,UAAUA,CAAA,EAA0B;IAClC,OAAO,IAAI,CAACxB,OAAO;EACrB;;EAEA;AACF;AACA;AACA;EACEyB,cAAcA,CAAA,EAAW;IACvB,OAAO,IAAI,CAACxB,WAAW;EACzB;;EAEA;AACF;AACA;AACA;EACEyB,KAAKA,CAAA,EAAS;IACZ,IAAI,CAAC1B,OAAO,GAAG,EAAE;IACjB,IAAI,CAACC,WAAW,GAAG,CAAC;EACtB;AACF;AAAC0B,OAAA,CAAA5B,mBAAA,GAAAA,mBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_layoutDefaults","require","MutableLinearLayout","layouts","contentSize","constructor","axis","isVertical","compute","input","crossAxisSize","itemMainAxisSizes","padding","itemSpacing","DEFAULT_ITEM_SPACING","itemCount","length","Array","cursor","start","i","mainAxisSize","x","y","width","height","end","getLayouts","getContentSize","reset","exports"],"sourceRoot":"../../../src","sources":["layout/MutableLinearLayout.ts"],"mappings":";;;;;;AAGA,IAAAA,eAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,CAAC;EAG/B;EACQC,OAAO,GAAiB,EAAE;;EAElC;EACQC,WAAW,GAAG,CAAC;EAEvBC,WAAWA,CAACC,IAAU,EAAE;IACtB,IAAI,CAACC,UAAU,GAAGD,IAAI,KAAK,UAAU;EACvC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,OAAOA,CAACC,KAAwB,EAAQ;IACtC,MAAM;MACJC,aAAa;MACbC,iBAAiB;MACjBC,OAAO;MACPC,WAAW,GAAGC;IAChB,CAAC,GAAGL,KAAK;IAET,MAAMM,SAAS,GAAGJ,iBAAiB,CAACK,MAAM;IAC1C,MAAMb,OAAqB,GAAG,IAAIc,KAAK,CAACF,SAAS,CAAC;IAElD,IAAIG,MAAM,GAAGN,OAAO,CAACO,KAAK;IAE1B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,SAAS,EAAEK,CAAC,EAAE,EAAE;MAClC,MAAMC,YAAY,GAAGV,iBAAiB,CAACS,CAAC,CAAE;MAE1CjB,OAAO,CAACiB,CAAC,CAAC,GAAG,IAAI,CAACb,UAAU,GACxB;QACEe,CAAC,EAAE,CAAC;QACJC,CAAC,EAAEL,MAAM;QACTM,KAAK,EAAEd,aAAa;QACpBe,MAAM,EAAEJ;MACV,CAAC,GACD;QACEC,CAAC,EAAEJ,MAAM;QACTK,CAAC,EAAE,CAAC;QACJC,KAAK,EAAEH,YAAY;QACnBI,MAAM,EAAEf;MACV,CAAC;MAELQ,MAAM,IAAIG,YAAY;;MAEtB;MACA,IAAID,CAAC,GAAGL,SAAS,GAAG,CAAC,EAAE;QACrBG,MAAM,IAAIL,WAAW;MACvB;IACF;IAEA,IAAI,CAACV,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGc,MAAM,GAAGN,OAAO,CAACc,GAAG;EACzC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEC,UAAUA,CAAA,EAA0B;IAClC,OAAO,IAAI,CAACxB,OAAO;EACrB;;EAEA;AACF;AACA;AACA;EACEyB,cAAcA,CAAA,EAAW;IACvB,OAAO,IAAI,CAACxB,WAAW;EACzB;;EAEA;AACF;AACA;AACA;EACEyB,KAAKA,CAAA,EAAS;IACZ,IAAI,CAAC1B,OAAO,GAAG,EAAE;IACjB,IAAI,CAACC,WAAW,GAAG,CAAC;EACtB;AACF;AAAC0B,OAAA,CAAA5B,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NitroListView = void 0;
7
+ var _reactNative = require("react-native");
8
+ /**
9
+ * Props for the NitroListView.
10
+ * * We extend ViewProps so that developers can use standard styles
11
+ * like 'flex: 1' or 'backgroundColor' on the list.
12
+ */
13
+
14
+ /**
15
+ * The Native Component that maps to the physical view in Swift/Kotlin.
16
+ * * 'NitroListView' is the "Secret Handshake" name. It must match
17
+ * the name exported by your Native ViewManagers.
18
+ */
19
+ const NitroListView = exports.NitroListView = (0, _reactNative.requireNativeComponent)('NitroListView');
20
+ //# sourceMappingURL=NitroListView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","NitroListView","exports","requireNativeComponent"],"sourceRoot":"../../../src","sources":["native/NitroListView.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,GAAAC,OAAA,CAAAD,aAAA,GACxB,IAAAE,mCAAsB,EAAqB,eAAe,CAAC","ignoreList":[]}
@@ -7,40 +7,27 @@ exports.CellPool = void 0;
7
7
  class CellPool {
8
8
  pools = new Map();
9
9
  maxPerType = new Map();
10
-
11
- /** ✅ NEW: check if a type is registered */
12
10
  hasType(type) {
13
11
  return this.pools.has(type);
14
12
  }
15
13
  registerType(type, maxCount) {
16
- if (this.maxPerType.has(type)) return;
17
- this.maxPerType.set(type, maxCount);
14
+ if (this.pools.has(type)) return;
18
15
  this.pools.set(type, []);
16
+ this.maxPerType.set(type, maxCount);
19
17
  }
20
18
  acquire(type) {
21
19
  const bucket = this.pools.get(type);
22
20
  if (!bucket || bucket.length === 0) return null;
23
- return bucket.pop();
21
+ return bucket.pop() ?? null;
24
22
  }
25
23
  release(cell) {
26
- const {
27
- type
28
- } = cell;
29
- const bucket = this.pools.get(type);
30
- const max = this.maxPerType.get(type);
24
+ const bucket = this.pools.get(cell.type);
25
+ const max = this.maxPerType.get(cell.type);
31
26
  if (!bucket || max === undefined) return;
32
27
  cell.index = -1;
33
28
  if (bucket.length >= max) return;
34
29
  bucket.push(cell);
35
30
  }
36
- clear() {
37
- for (const bucket of this.pools.values()) {
38
- bucket.length = 0;
39
- }
40
- }
41
- getPoolSize(type) {
42
- return this.pools.get(type)?.length ?? 0;
43
- }
44
31
  }
45
32
  exports.CellPool = CellPool;
46
33
  //# sourceMappingURL=CellPool.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CellPool","pools","Map","maxPerType","hasType","type","has","registerType","maxCount","set","acquire","bucket","get","length","pop","release","cell","max","undefined","index","push","clear","values","getPoolSize","exports"],"sourceRoot":"../../../src","sources":["recycler/CellPool.ts"],"mappings":";;;;;;AAGO,MAAMA,QAAQ,CAAC;EACHC,KAAK,GAAG,IAAIC,GAAG,CAAmC,CAAC;EACnDC,UAAU,GAAG,IAAID,GAAG,CAAmB,CAAC;;EAEzD;EACAE,OAAOA,CAACC,IAAc,EAAW;IAC/B,OAAO,IAAI,CAACJ,KAAK,CAACK,GAAG,CAACD,IAAI,CAAC;EAC7B;EAEAE,YAAYA,CAACF,IAAc,EAAEG,QAAgB,EAAQ;IACnD,IAAI,IAAI,CAACL,UAAU,CAACG,GAAG,CAACD,IAAI,CAAC,EAAE;IAC/B,IAAI,CAACF,UAAU,CAACM,GAAG,CAACJ,IAAI,EAAEG,QAAQ,CAAC;IACnC,IAAI,CAACP,KAAK,CAACQ,GAAG,CAACJ,IAAI,EAAE,EAAE,CAAC;EAC1B;EAEAK,OAAOA,CAACL,IAAc,EAA+B;IACnD,MAAMM,MAAM,GAAG,IAAI,CAACV,KAAK,CAACW,GAAG,CAACP,IAAI,CAAC;IACnC,IAAI,CAACM,MAAM,IAAIA,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IAC/C,OAAOF,MAAM,CAACG,GAAG,CAAC,CAAC;EACrB;EAEAC,OAAOA,CAACC,IAA0B,EAAQ;IACxC,MAAM;MAAEX;IAAK,CAAC,GAAGW,IAAI;IACrB,MAAML,MAAM,GAAG,IAAI,CAACV,KAAK,CAACW,GAAG,CAACP,IAAI,CAAC;IACnC,MAAMY,GAAG,GAAG,IAAI,CAACd,UAAU,CAACS,GAAG,CAACP,IAAI,CAAC;IAErC,IAAI,CAACM,MAAM,IAAIM,GAAG,KAAKC,SAAS,EAAE;IAElCF,IAAI,CAACG,KAAK,GAAG,CAAC,CAAC;IAEf,IAAIR,MAAM,CAACE,MAAM,IAAII,GAAG,EAAE;IAC1BN,MAAM,CAACS,IAAI,CAACJ,IAAI,CAAC;EACnB;EAEAK,KAAKA,CAAA,EAAS;IACZ,KAAK,MAAMV,MAAM,IAAI,IAAI,CAACV,KAAK,CAACqB,MAAM,CAAC,CAAC,EAAE;MACxCX,MAAM,CAACE,MAAM,GAAG,CAAC;IACnB;EACF;EAEAU,WAAWA,CAAClB,IAAc,EAAU;IAClC,OAAO,IAAI,CAACJ,KAAK,CAACW,GAAG,CAACP,IAAI,CAAC,EAAEQ,MAAM,IAAI,CAAC;EAC1C;AACF;AAACW,OAAA,CAAAxB,QAAA,GAAAA,QAAA","ignoreList":[]}
1
+ {"version":3,"names":["CellPool","pools","Map","maxPerType","hasType","type","has","registerType","maxCount","set","acquire","bucket","get","length","pop","release","cell","max","undefined","index","push","exports"],"sourceRoot":"../../../src","sources":["recycler/CellPool.ts"],"mappings":";;;;;;AAGO,MAAMA,QAAQ,CAA8B;EAChCC,KAAK,GAAG,IAAIC,GAAG,CAAgB,CAAC;EAChCC,UAAU,GAAG,IAAID,GAAG,CAAmB,CAAC;EAEzDE,OAAOA,CAACC,IAAc,EAAW;IAC/B,OAAO,IAAI,CAACJ,KAAK,CAACK,GAAG,CAACD,IAAI,CAAC;EAC7B;EAEAE,YAAYA,CAACF,IAAc,EAAEG,QAAgB,EAAQ;IACnD,IAAI,IAAI,CAACP,KAAK,CAACK,GAAG,CAACD,IAAI,CAAC,EAAE;IAC1B,IAAI,CAACJ,KAAK,CAACQ,GAAG,CAACJ,IAAI,EAAE,EAAE,CAAC;IACxB,IAAI,CAACF,UAAU,CAACM,GAAG,CAACJ,IAAI,EAAEG,QAAQ,CAAC;EACrC;EAEAE,OAAOA,CAACL,IAAc,EAAY;IAChC,MAAMM,MAAM,GAAG,IAAI,CAACV,KAAK,CAACW,GAAG,CAACP,IAAI,CAAC;IACnC,IAAI,CAACM,MAAM,IAAIA,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IAC/C,OAAOF,MAAM,CAACG,GAAG,CAAC,CAAC,IAAI,IAAI;EAC7B;EAEAC,OAAOA,CAACC,IAAO,EAAQ;IACrB,MAAML,MAAM,GAAG,IAAI,CAACV,KAAK,CAACW,GAAG,CAACI,IAAI,CAACX,IAAI,CAAC;IACxC,MAAMY,GAAG,GAAG,IAAI,CAACd,UAAU,CAACS,GAAG,CAACI,IAAI,CAACX,IAAI,CAAC;IAC1C,IAAI,CAACM,MAAM,IAAIM,GAAG,KAAKC,SAAS,EAAE;IAElCF,IAAI,CAACG,KAAK,GAAG,CAAC,CAAC;IACf,IAAIR,MAAM,CAACE,MAAM,IAAII,GAAG,EAAE;IAC1BN,MAAM,CAACS,IAAI,CAACJ,IAAI,CAAC;EACnB;AACF;AAACK,OAAA,CAAArB,QAAA,GAAAA,QAAA","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RecyclerList = RecyclerList;
6
+ exports.default = NitroList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
9
  var _MutableLinearLayout = require("../layout/MutableLinearLayout");
@@ -11,48 +11,45 @@ var _windowing = require("../windowing");
11
11
  var _CellPool = require("./CellPool");
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
- /* =========================================================
15
- * Constants
16
- * =======================================================*/const DEFAULT_VIEWPORT_SIZE = 800;
14
+ /* ========================================================= */const DEFAULT_VIEWPORT_SIZE = 800;
17
15
  const DEFAULT_ITEM_SIZE = 60;
18
16
  const SCROLL_EVENT_THROTTLE = 16;
19
17
 
20
- /* =========================================================
21
- * RecyclerList
22
- * =======================================================*/
18
+ /* ========================================================= */
19
+ /* Internal (mutable) cell */
20
+ /* ========================================================= */
23
21
 
24
- function RecyclerList(props) {
22
+ /* ========================================================= */
23
+ /* NitroList */
24
+ /* ========================================================= */
25
+
26
+ function NitroList(props) {
25
27
  const {
28
+ data,
29
+ renderItem,
30
+ getCellType,
26
31
  scrollDirection = 'vertical',
32
+ bufferRatio = 1.3,
27
33
  containerCrossAxisSize,
28
- data,
29
34
  itemMainAxisSizes,
30
35
  padding = {
31
36
  start: 0,
32
37
  end: 0
33
38
  },
34
- itemSpacing,
35
- bufferRatio = 1.3,
36
- getCellType,
37
- renderItem
39
+ itemSpacing
38
40
  } = props;
39
41
  const isVertical = scrollDirection === 'vertical';
40
- const itemCount = data.length;
41
-
42
- /* -------------------------------------------------------
43
- * Controlled render
44
- * -----------------------------------------------------*/
45
-
46
42
  const [, forceRender] = (0, _react.useState)(0);
43
+ const DEBUG = true;
47
44
 
48
- /* -------------------------------------------------------
49
- * Layout engine
50
- * -----------------------------------------------------*/
45
+ /* ======================================================= */
46
+ /* Layout engine (recomputed when signature changes) */
47
+ /* ======================================================= */
51
48
 
52
49
  const layoutEngineRef = (0, _react.useRef)(null);
53
50
  const layoutSignatureRef = (0, _react.useRef)('');
54
- const layoutSignature = [scrollDirection, containerCrossAxisSize, itemCount, itemMainAxisSizes, padding.start, padding.end, itemSpacing ?? 'default'].join('|');
55
- if (!layoutEngineRef.current || layoutSignatureRef.current !== layoutSignature) {
51
+ const layoutSignature = [scrollDirection, containerCrossAxisSize, data.length, itemMainAxisSizes, padding.start, padding.end, itemSpacing ?? 'none'].join('|');
52
+ if (layoutEngineRef.current === null || layoutSignatureRef.current !== layoutSignature) {
56
53
  const engine = new _MutableLinearLayout.MutableLinearLayout(scrollDirection);
57
54
  engine.compute({
58
55
  crossAxisSize: containerCrossAxisSize,
@@ -66,100 +63,98 @@ function RecyclerList(props) {
66
63
  const layouts = layoutEngineRef.current.getLayouts();
67
64
  const contentSize = layoutEngineRef.current.getContentSize();
68
65
 
69
- /* -------------------------------------------------------
70
- * Scroll metrics
71
- * -----------------------------------------------------*/
66
+ /* ======================================================= */
67
+ /* Scroll metrics */
68
+ /* ======================================================= */
72
69
 
73
70
  const scrollOffsetRef = (0, _react.useRef)(0);
74
71
  const viewportSizeRef = (0, _react.useRef)(DEFAULT_VIEWPORT_SIZE);
75
72
 
76
- /* -------------------------------------------------------
77
- * Cell pool + physical cells
78
- * -----------------------------------------------------*/
73
+ /* ======================================================= */
74
+ /* Cell pool */
75
+ /* ======================================================= */
79
76
 
80
77
  const cellPoolRef = (0, _react.useRef)(new _CellPool.CellPool());
81
78
  const activeCellsRef = (0, _react.useRef)([]);
82
- const nextCellKeyRef = (0, _react.useRef)(0);
79
+ const nextKeyRef = (0, _react.useRef)(0);
83
80
  const createCell = type => ({
84
- key: nextCellKeyRef.current++,
81
+ key: nextKeyRef.current++,
82
+ type,
85
83
  index: -1,
86
- type
84
+ active: false
87
85
  });
88
- const MAX_CELLS = Math.ceil(viewportSizeRef.current / DEFAULT_ITEM_SIZE * bufferRatio) + 2;
89
86
 
90
- /* -------------------------------------------------------
91
- * Visible cell coordinator
92
- * -----------------------------------------------------*/
87
+ /* ======================================================= */
88
+ /* Visible window coordination */
89
+ /* ======================================================= */
93
90
 
94
91
  const updateVisibleCells = () => {
95
- const offset = scrollOffsetRef.current;
96
- const viewportSize = viewportSizeRef.current;
97
- const buffer = viewportSize * bufferRatio;
98
92
  const range = (0, _windowing.computeVisibleItemRange)({
99
93
  layouts,
100
- offset,
101
- viewportSize,
102
- buffer,
94
+ offset: scrollOffsetRef.current,
95
+ viewportSize: viewportSizeRef.current,
96
+ buffer: viewportSizeRef.current * bufferRatio,
103
97
  isVertical
104
98
  });
105
- if (!range) return;
106
- const nextCells = [];
107
- const used = new Set();
99
+ if (range === null) return;
100
+ if (DEBUG) {
101
+ console.log('[NitroList] range:', range.startIndex, range.endIndex);
102
+ }
103
+ const active = activeCellsRef.current;
104
+
105
+ // 1. Mark all inactive
106
+ for (const cell of active) {
107
+ cell.active = false;
108
+ }
109
+ let writeIndex = 0;
110
+
111
+ // 2. Activate visible range
108
112
  for (let index = range.startIndex; index <= range.endIndex; index++) {
109
113
  const item = data[index];
110
114
  if (item === undefined) continue;
111
115
  const type = getCellType(item, index);
112
116
 
113
- // Register type once, with hard cap
117
+ // Seed pool once per type
114
118
  if (!cellPoolRef.current.hasType(type)) {
115
- cellPoolRef.current.registerType(type, MAX_CELLS);
116
- for (let i = 0; i < MAX_CELLS; i++) {
119
+ const maxCells = Math.ceil(viewportSizeRef.current / DEFAULT_ITEM_SIZE * bufferRatio) + 2;
120
+ cellPoolRef.current.registerType(type, maxCells);
121
+ for (let i = 0; i < maxCells; i++) {
117
122
  cellPoolRef.current.release(createCell(type));
118
123
  }
119
124
  }
120
125
  let cell = cellPoolRef.current.acquire(type);
121
- if (!cell) {
122
- const reuseIndex = activeCellsRef.current.findIndex(c => c.type === type);
123
- if (reuseIndex === -1) continue;
124
- cell = activeCellsRef.current.splice(reuseIndex, 1)[0];
126
+ if (cell === null) {
127
+ const reusable = active.find(c => !c.active && c.type === type);
128
+ cell = reusable ?? createCell(type);
125
129
  }
126
130
  cell.index = index;
127
- nextCells.push(cell);
128
- used.add(cell);
129
- }
130
- for (const cell of activeCellsRef.current) {
131
- if (!used.has(cell)) {
132
- cellPoolRef.current.release(cell);
133
- }
131
+ cell.active = true;
132
+ active[writeIndex++] = cell;
134
133
  }
135
- let changed = nextCells.length !== activeCellsRef.current.length;
136
- if (!changed) {
137
- for (let i = 0; i < nextCells.length; i++) {
138
- if (nextCells[i] !== activeCellsRef.current[i]) {
139
- changed = true;
140
- break;
141
- }
142
- }
134
+
135
+ // 3. Recycle unused cells
136
+ for (let i = writeIndex; i < active.length; i++) {
137
+ const cell = active[i];
138
+ if (cell === undefined) continue;
139
+ cell.index = -1;
140
+ cell.active = false;
141
+ cellPoolRef.current.release(cell);
143
142
  }
144
- if (changed) {
145
- activeCellsRef.current = nextCells;
143
+
144
+ // 4. Compact once
145
+ if (active.length !== writeIndex) {
146
+ active.length = writeIndex;
146
147
  forceRender(v => v + 1);
147
148
  }
148
149
  };
149
150
 
150
- /* -------------------------------------------------------
151
- * Scroll handlers
152
- * -----------------------------------------------------*/
151
+ /* ======================================================= */
152
+ /* Handlers */
153
+ /* ======================================================= */
153
154
 
154
- const frameScheduledRef = (0, _react.useRef)(false);
155
155
  const onScroll = e => {
156
156
  scrollOffsetRef.current = isVertical ? e.nativeEvent.contentOffset.y : e.nativeEvent.contentOffset.x;
157
- if (frameScheduledRef.current) return;
158
- frameScheduledRef.current = true;
159
- requestAnimationFrame(() => {
160
- frameScheduledRef.current = false;
161
- updateVisibleCells();
162
- });
157
+ updateVisibleCells();
163
158
  };
164
159
  const onLayout = e => {
165
160
  viewportSizeRef.current = isVertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width;
@@ -169,10 +164,15 @@ function RecyclerList(props) {
169
164
  updateVisibleCells();
170
165
  // eslint-disable-next-line react-hooks/exhaustive-deps
171
166
  }, []);
167
+ if (DEBUG) {
168
+ console.log('[NitroList] layouts:', layouts.length);
169
+ console.log('[NitroList] contentSize:', contentSize);
170
+ console.log('[NitroList] data.length:', data.length);
171
+ }
172
172
 
173
- /* -------------------------------------------------------
174
- * Render
175
- * -----------------------------------------------------*/
173
+ /* ======================================================= */
174
+ /* Render */
175
+ /* ======================================================= */
176
176
 
177
177
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
178
178
  onScroll: onScroll,
@@ -187,10 +187,11 @@ function RecyclerList(props) {
187
187
  width: contentSize
188
188
  },
189
189
  children: activeCellsRef.current.map(cell => {
190
- const index = cell.index;
191
- const layout = layouts[index];
192
- const item = data[index];
193
- if (!layout || item === undefined) return null;
190
+ const layout = layouts[cell.index];
191
+ const item = data[cell.index];
192
+ if (layout === undefined || item === undefined) {
193
+ return null;
194
+ }
194
195
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
195
196
  style: [styles.cell, isVertical ? {
196
197
  top: layout.y,
@@ -203,7 +204,7 @@ function RecyclerList(props) {
203
204
  }],
204
205
  children: renderItem({
205
206
  item,
206
- index,
207
+ index: cell.index,
207
208
  cell
208
209
  })
209
210
  }, cell.key);
@@ -212,13 +213,11 @@ function RecyclerList(props) {
212
213
  });
213
214
  }
214
215
 
215
- /* =========================================================
216
- * Styles
217
- * =======================================================*/
216
+ /* ========================================================= */
218
217
 
219
218
  const styles = _reactNative.StyleSheet.create({
220
219
  cell: {
221
220
  position: 'absolute'
222
221
  }
223
222
  });
224
- //# sourceMappingURL=RecyclerList.js.map
223
+ //# sourceMappingURL=NitroList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_MutableLinearLayout","_windowing","_CellPool","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_VIEWPORT_SIZE","DEFAULT_ITEM_SIZE","SCROLL_EVENT_THROTTLE","NitroList","props","data","renderItem","getCellType","scrollDirection","bufferRatio","containerCrossAxisSize","itemMainAxisSizes","padding","start","end","itemSpacing","isVertical","forceRender","useState","DEBUG","layoutEngineRef","useRef","layoutSignatureRef","layoutSignature","length","join","current","engine","MutableLinearLayout","compute","crossAxisSize","layouts","getLayouts","contentSize","getContentSize","scrollOffsetRef","viewportSizeRef","cellPoolRef","CellPool","activeCellsRef","nextKeyRef","createCell","type","key","index","active","updateVisibleCells","range","computeVisibleItemRange","offset","viewportSize","buffer","console","log","startIndex","endIndex","cell","writeIndex","item","undefined","hasType","maxCells","Math","ceil","registerType","release","acquire","reusable","find","c","v","onScroll","nativeEvent","contentOffset","y","x","onLayout","layout","height","width","useEffect","jsx","ScrollView","horizontal","scrollEventThrottle","removeClippedSubviews","children","View","style","map","styles","top","left","StyleSheet","create","position"],"sourceRoot":"../../../src","sources":["recycler/NitroList.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAcA,IAAAE,oBAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAAqC,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAD,wBAAAO,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAT,uBAAA,YAAAA,CAAAO,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAErC,+DAEA,MAAMkB,qBAAqB,GAAG,GAAG;AACjC,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,qBAAqB,GAAG,EAAE;;AAEhC;AACA;AACA;;AAMA;AACA;AACA;;AAEe,SAASC,SAASA,CAC/BC,KAAwB,EACJ;EACpB,MAAM;IACJC,IAAI;IACJC,UAAU;IACVC,WAAW;IACXC,eAAe,GAAG,UAAU;IAC5BC,WAAW,GAAG,GAAG;IACjBC,sBAAsB;IACtBC,iBAAiB;IACjBC,OAAO,GAAG;MAAEC,KAAK,EAAE,CAAC;MAAEC,GAAG,EAAE;IAAE,CAAC;IAC9BC;EACF,CAAC,GAAGX,KAAK;EAET,MAAMY,UAAU,GAAGR,eAAe,KAAK,UAAU;EACjD,MAAM,GAAGS,WAAW,CAAC,GAAG,IAAAC,eAAQ,EAAC,CAAC,CAAC;EAEnC,MAAMC,KAAK,GAAG,IAAI;;EAGlB;EACA;EACA;;EAEA,MAAMC,eAAe,GAAG,IAAAC,aAAM,EAA6B,IAAI,CAAC;EAChE,MAAMC,kBAAkB,GAAG,IAAAD,aAAM,EAAS,EAAE,CAAC;EAE7C,MAAME,eAAe,GAAG,CACtBf,eAAe,EACfE,sBAAsB,EACtBL,IAAI,CAACmB,MAAM,EACXb,iBAAiB,EACjBC,OAAO,CAACC,KAAK,EACbD,OAAO,CAACE,GAAG,EACXC,WAAW,IAAI,MAAM,CACtB,CAACU,IAAI,CAAC,GAAG,CAAC;EAEX,IACEL,eAAe,CAACM,OAAO,KAAK,IAAI,IAChCJ,kBAAkB,CAACI,OAAO,KAAKH,eAAe,EAC9C;IACA,MAAMI,MAAM,GAAG,IAAIC,wCAAmB,CAACpB,eAAe,CAAC;IACvDmB,MAAM,CAACE,OAAO,CAAC;MACbC,aAAa,EAAEpB,sBAAsB;MACrCC,iBAAiB;MACjBC,OAAO;MACPG;IACF,CAAC,CAAC;IAEFK,eAAe,CAACM,OAAO,GAAGC,MAAM;IAChCL,kBAAkB,CAACI,OAAO,GAAGH,eAAe;EAC9C;EAEA,MAAMQ,OAA8B,GAClCX,eAAe,CAACM,OAAO,CAACM,UAAU,CAAC,CAAC;EAEtC,MAAMC,WAAmB,GACvBb,eAAe,CAACM,OAAO,CAACQ,cAAc,CAAC,CAAC;;EAE1C;EACA;EACA;;EAEA,MAAMC,eAAe,GAAG,IAAAd,aAAM,EAAS,CAAC,CAAC;EACzC,MAAMe,eAAe,GAAG,IAAAf,aAAM,EAASrB,qBAAqB,CAAC;;EAE7D;EACA;EACA;;EAEA,MAAMqC,WAAW,GAAG,IAAAhB,aAAM,EACxB,IAAIiB,kBAAQ,CAAuB,CACrC,CAAC;EAED,MAAMC,cAAc,GAAG,IAAAlB,aAAM,EAAyB,EAAE,CAAC;EACzD,MAAMmB,UAAU,GAAG,IAAAnB,aAAM,EAAS,CAAC,CAAC;EAEpC,MAAMoB,UAAU,GAAIC,IAAc,KAA4B;IAC5DC,GAAG,EAAEH,UAAU,CAACd,OAAO,EAAE;IACzBgB,IAAI;IACJE,KAAK,EAAE,CAAC,CAAC;IACTC,MAAM,EAAE;EACV,CAAC,CAAC;;EAEF;EACA;EACA;;EAEA,MAAMC,kBAAkB,GAAGA,CAAA,KAAY;IACrC,MAAMC,KAA0B,GAC9B,IAAAC,kCAAuB,EAAC;MACtBjB,OAAO;MACPkB,MAAM,EAAEd,eAAe,CAACT,OAAO;MAC/BwB,YAAY,EAAEd,eAAe,CAACV,OAAO;MACrCyB,MAAM,EAAEf,eAAe,CAACV,OAAO,GAAGjB,WAAW;MAC7CO;IACF,CAAC,CAAC;IAIJ,IAAI+B,KAAK,KAAK,IAAI,EAAE;IAEpB,IAAI5B,KAAK,EAAE;MACbiC,OAAO,CAACC,GAAG,CACT,oBAAoB,EACpBN,KAAK,CAACO,UAAU,EAChBP,KAAK,CAACQ,QACR,CAAC;IACH;IAGI,MAAMV,MAAM,GAAGN,cAAc,CAACb,OAAO;;IAErC;IACA,KAAK,MAAM8B,IAAI,IAAIX,MAAM,EAAE;MACzBW,IAAI,CAACX,MAAM,GAAG,KAAK;IACrB;IAEA,IAAIY,UAAU,GAAG,CAAC;;IAElB;IACA,KACE,IAAIb,KAAK,GAAGG,KAAK,CAACO,UAAU,EAC5BV,KAAK,IAAIG,KAAK,CAACQ,QAAQ,EACvBX,KAAK,EAAE,EACP;MACA,MAAMc,IAAI,GAAGrD,IAAI,CAACuC,KAAK,CAAC;MACxB,IAAIc,IAAI,KAAKC,SAAS,EAAE;MAExB,MAAMjB,IAAI,GAAGnC,WAAW,CAACmD,IAAI,EAAEd,KAAK,CAAC;;MAErC;MACA,IAAI,CAACP,WAAW,CAACX,OAAO,CAACkC,OAAO,CAAClB,IAAI,CAAC,EAAE;QACtC,MAAMmB,QAAQ,GACZC,IAAI,CAACC,IAAI,CACN3B,eAAe,CAACV,OAAO,GAAGzB,iBAAiB,GAC1CQ,WACJ,CAAC,GAAG,CAAC;QAEP4B,WAAW,CAACX,OAAO,CAACsC,YAAY,CAACtB,IAAI,EAAEmB,QAAQ,CAAC;QAChD,KAAK,IAAIzE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyE,QAAQ,EAAEzE,CAAC,EAAE,EAAE;UACjCiD,WAAW,CAACX,OAAO,CAACuC,OAAO,CAACxB,UAAU,CAACC,IAAI,CAAC,CAAC;QAC/C;MACF;MAEA,IAAIc,IAAiC,GACnCnB,WAAW,CAACX,OAAO,CAACwC,OAAO,CAACxB,IAAI,CAAC;MAEzC,IAAIc,IAAI,KAAK,IAAI,EAAE;QACjB,MAAMW,QAAQ,GAAGtB,MAAM,CAACuB,IAAI,CAC1BC,CAAC,IAAI,CAACA,CAAC,CAACxB,MAAM,IAAIwB,CAAC,CAAC3B,IAAI,KAAKA,IAC/B,CAAC;QAEDc,IAAI,GAAGW,QAAQ,IAAI1B,UAAU,CAACC,IAAI,CAAC;MACrC;MAGMc,IAAI,CAACZ,KAAK,GAAGA,KAAK;MAClBY,IAAI,CAACX,MAAM,GAAG,IAAI;MAClBA,MAAM,CAACY,UAAU,EAAE,CAAC,GAAGD,IAAI;IAC7B;;IAEA;IACA,KAAK,IAAIpE,CAAC,GAAGqE,UAAU,EAAErE,CAAC,GAAGyD,MAAM,CAACrB,MAAM,EAAEpC,CAAC,EAAE,EAAE;MAC/C,MAAMoE,IAAI,GAAGX,MAAM,CAACzD,CAAC,CAAC;MACtB,IAAIoE,IAAI,KAAKG,SAAS,EAAE;MAExBH,IAAI,CAACZ,KAAK,GAAG,CAAC,CAAC;MACfY,IAAI,CAACX,MAAM,GAAG,KAAK;MACnBR,WAAW,CAACX,OAAO,CAACuC,OAAO,CAACT,IAAI,CAAC;IACnC;;IAEA;IACA,IAAIX,MAAM,CAACrB,MAAM,KAAKiC,UAAU,EAAE;MAChCZ,MAAM,CAACrB,MAAM,GAAGiC,UAAU;MAC1BxC,WAAW,CAACqD,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;IACzB;EACF,CAAC;;EAED;EACA;EACA;;EAEA,MAAMC,QAAQ,GACZ1F,CAA0C,IACjC;IACTsD,eAAe,CAACT,OAAO,GAAGV,UAAU,GAChCnC,CAAC,CAAC2F,WAAW,CAACC,aAAa,CAACC,CAAC,GAC7B7F,CAAC,CAAC2F,WAAW,CAACC,aAAa,CAACE,CAAC;IAEjC7B,kBAAkB,CAAC,CAAC;EACtB,CAAC;EAED,MAAM8B,QAAQ,GAAI/F,CAAoB,IAAW;IAC/CuD,eAAe,CAACV,OAAO,GAAGV,UAAU,GAChCnC,CAAC,CAAC2F,WAAW,CAACK,MAAM,CAACC,MAAM,GAC3BjG,CAAC,CAAC2F,WAAW,CAACK,MAAM,CAACE,KAAK;IAE9BjC,kBAAkB,CAAC,CAAC;EACtB,CAAC;EAED,IAAAkC,gBAAS,EAAC,MAAM;IACdlC,kBAAkB,CAAC,CAAC;IACpB;EACF,CAAC,EAAE,EAAE,CAAC;EAGR,IAAI3B,KAAK,EAAE;IACTiC,OAAO,CAACC,GAAG,CAAC,sBAAsB,EAAEtB,OAAO,CAACP,MAAM,CAAC;IACnD4B,OAAO,CAACC,GAAG,CAAC,0BAA0B,EAAEpB,WAAW,CAAC;IACpDmB,OAAO,CAACC,GAAG,CAAC,0BAA0B,EAAEhD,IAAI,CAACmB,MAAM,CAAC;EACtD;;EAEE;EACA;EACA;;EAEA,oBACE,IAAA5C,WAAA,CAAAqG,GAAA,EAACzG,YAAA,CAAA0G,UAAU;IACTX,QAAQ,EAAEA,QAAS;IACnBK,QAAQ,EAAEA,QAAS;IACnBO,UAAU,EAAE,CAACnE,UAAW;IACxBoE,mBAAmB,EAAElF,qBAAsB;IAC3CmF,qBAAqB;IAAAC,QAAA,eAGrB,IAAA1G,WAAA,CAAAqG,GAAA,EAACzG,YAAA,CAAA+G,IAAI;MACHC,KAAK,EACHxE,UAAU,GACN;QAAE8D,MAAM,EAAE7C;MAAY,CAAC,GACvB;QAAE8C,KAAK,EAAE9C;MAAY,CAC1B;MAAAqD,QAAA,EAEA/C,cAAc,CAACb,OAAO,CAAC+D,GAAG,CAACjC,IAAI,IAAI;QAClC,MAAMqB,MAAM,GAAG9C,OAAO,CAACyB,IAAI,CAACZ,KAAK,CAAC;QAClC,MAAMc,IAAI,GAAGrD,IAAI,CAACmD,IAAI,CAACZ,KAAK,CAAC;QAE7B,IAAIiC,MAAM,KAAKlB,SAAS,IAAID,IAAI,KAAKC,SAAS,EAAE;UAC9C,OAAO,IAAI;QACb;QAEA,oBACE,IAAA/E,WAAA,CAAAqG,GAAA,EAACzG,YAAA,CAAA+G,IAAI;UAEHC,KAAK,EAAE,CACLE,MAAM,CAAClC,IAAI,EACXxC,UAAU,GACN;YACE2E,GAAG,EAAEd,MAAM,CAACH,CAAC;YACbI,MAAM,EAAED,MAAM,CAACC,MAAM;YACrBC,KAAK,EAAEF,MAAM,CAACE;UAChB,CAAC,GACD;YACEa,IAAI,EAAEf,MAAM,CAACF,CAAC;YACdI,KAAK,EAAEF,MAAM,CAACE,KAAK;YACnBD,MAAM,EAAED,MAAM,CAACC;UACjB,CAAC,CACL;UAAAQ,QAAA,EAEDhF,UAAU,CAAC;YACVoD,IAAI;YACJd,KAAK,EAAEY,IAAI,CAACZ,KAAK;YACjBY;UACF,CAAC;QAAC,GApBGA,IAAI,CAACb,GAqBN,CAAC;MAEX,CAAC;IAAC,CACE;EAAC,CACG,CAAC;AAEjB;;AAEA;;AAEA,MAAM+C,MAAM,GAAGG,uBAAU,CAACC,MAAM,CAAC;EAC/BtC,IAAI,EAAE;IACJuC,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createScrollVelocityTracker = createScrollVelocityTracker;
7
+ function createScrollVelocityTracker() {
8
+ let lastOffset = 0;
9
+ let lastTime = Date.now();
10
+ return function getVelocity(offset) {
11
+ const now = Date.now();
12
+ const dt = now - lastTime;
13
+ const dy = Math.abs(offset - lastOffset);
14
+ lastOffset = offset;
15
+ lastTime = now;
16
+ if (dt === 0) return 0;
17
+ return dy / dt; // px per ms
18
+ };
19
+ }
20
+ //# sourceMappingURL=useScrollVelocity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createScrollVelocityTracker","lastOffset","lastTime","Date","now","getVelocity","offset","dt","dy","Math","abs"],"sourceRoot":"../../../src","sources":["scroll/useScrollVelocity.ts"],"mappings":";;;;;;AAAO,SAASA,2BAA2BA,CAAA,EAAG;EAC5C,IAAIC,UAAU,GAAG,CAAC;EAClB,IAAIC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EAEzB,OAAO,SAASC,WAAWA,CAACC,MAAc,EAAU;IAClD,MAAMF,GAAG,GAAGD,IAAI,CAACC,GAAG,CAAC,CAAC;IACtB,MAAMG,EAAE,GAAGH,GAAG,GAAGF,QAAQ;IACzB,MAAMM,EAAE,GAAGC,IAAI,CAACC,GAAG,CAACJ,MAAM,GAAGL,UAAU,CAAC;IAExCA,UAAU,GAAGK,MAAM;IACnBJ,QAAQ,GAAGE,GAAG;IAEd,IAAIG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IACtB,OAAOC,EAAE,GAAGD,EAAE,EAAC;EACjB,CAAC;AACH","ignoreList":[]}
@@ -3,4 +3,4 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- //# sourceMappingURL=NitroList.types.js.map
6
+ //# sourceMappingURL=NitroList.nitro.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["native/NitroList.types.ts"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/NitroList.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -1,2 +1,27 @@
1
1
  "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCellType = void 0;
7
+ /**
8
+ * Logical cell type.
9
+ *
10
+ * Used to group compatible cells for recycling.
11
+ *
12
+ * Cross-platform equivalent:
13
+ * - Android: viewType
14
+ * - iOS: reuseIdentifier
15
+ *
16
+ * NOTE:
17
+ * This is a branded type to prevent accidental mixing
18
+ * with keys, indexes, or other strings/numbers.
19
+ */
20
+
21
+ /**
22
+ * Helper to create a CellType safely.
23
+ * Keeps ergonomics simple for users.
24
+ */
25
+ const createCellType = value => value;
26
+ exports.createCellType = createCellType;
2
27
  //# sourceMappingURL=CellType.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/CellType.ts"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":["createCellType","value","exports"],"sourceRoot":"../../../src","sources":["types/CellType.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACO,MAAMA,cAAc,GACzBC,KAAa,IACAA,KAAiB;AAAAC,OAAA,CAAAF,cAAA,GAAAA,cAAA","ignoreList":[]}