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
@@ -0,0 +1,45 @@
1
+ import type { CellType } from "../CellType"
2
+ import type { RecyclerCell } from "./RecyclerCell"
3
+
4
+
5
+ /**
6
+ * Owns recycled physical cells.
7
+ * Enforces hard caps.
8
+ */
9
+ export class CellPool<T extends RecyclerCell> {
10
+ private readonly pools = new Map<CellType, T[]>()
11
+ private readonly maxPerType = new Map<CellType, number>()
12
+
13
+ hasType(type: CellType): boolean {
14
+ return this.pools.has(type)
15
+ }
16
+
17
+ registerType(type: CellType, maxCount: number): void {
18
+ if (this.pools.has(type)) return
19
+ this.pools.set(type, [])
20
+ this.maxPerType.set(type, maxCount)
21
+ }
22
+
23
+ acquire(type: CellType): T | null {
24
+ const bucket = this.pools.get(type)
25
+ if (!bucket || bucket.length === 0) return null
26
+ return bucket.pop() ?? null
27
+ }
28
+
29
+ release(cell: T): void {
30
+ const bucket = this.pools.get(cell.type)
31
+ const max = this.maxPerType.get(cell.type)
32
+ if (!bucket || max === undefined) return
33
+
34
+ cell.index = -1
35
+ if (bucket.length >= max) return
36
+
37
+ bucket.push(cell)
38
+ }
39
+
40
+ clear(): void {
41
+ for (const bucket of this.pools.values()) {
42
+ bucket.length = 0
43
+ }
44
+ }
45
+ }
@@ -4,12 +4,12 @@ import type { MainAxisPadding } from '../layout'
4
4
  import type { RecyclerItemRenderer } from './RecyclerItemRenderer'
5
5
 
6
6
  /**
7
- * Public props for RecyclerList.
7
+ * Public props for NitroList.
8
8
  *
9
9
  * Generic, data-driven, layout-deterministic API.
10
10
  * This surface is intentionally minimal and stable.
11
11
  */
12
- export interface RecyclerListProps<T> {
12
+ export interface NitroListProps<T> {
13
13
  /**
14
14
  * Scroll direction.
15
15
  * Defaults to 'vertical'.
@@ -0,0 +1,12 @@
1
+ import type { CellType } from '../CellType'
2
+ import type { CellKey } from '../CellKey'
3
+
4
+ /**
5
+ * Public contract for a physical recycler cell.
6
+ * Key type MUST be generic / opaque.
7
+ */
8
+ export interface RecyclerCell<K = CellKey> {
9
+ readonly key: K
10
+ readonly type: CellType
11
+ index: number
12
+ }
@@ -1,8 +1,12 @@
1
1
  import type { ReactNode } from 'react'
2
- import type { RecyclerCellInstance } from './RecyclerCellInstance'
2
+ import type { RecyclerCell } from './RecyclerCell'
3
3
 
4
+ /**
5
+ * Public renderItem signature for RecyclerList.
6
+ * Renderers receive a stable physical cell contract.
7
+ */
4
8
  export type RecyclerItemRenderer<T> = (params: {
5
9
  item: T
6
10
  index: number
7
- cell: RecyclerCellInstance
11
+ cell: RecyclerCell
8
12
  }) => ReactNode
@@ -1,3 +1,3 @@
1
- export type { RecyclerListProps } from './RecyclerListProps'
1
+ export type { NitroListProps } from './NitroListProps'
2
2
  export type { RecyclerItemRenderer } from './RecyclerItemRenderer'
3
- export type { RecyclerCellInstance } from './RecyclerCellInstance'
3
+ export type { RecyclerCell } from './RecyclerCell'
@@ -1,19 +1,25 @@
1
- import type { VisibleRange } from '../types/VisibleRange'
2
- import type { VisibleRangeInput } from '../types/VisibleRangeInput'
1
+ import type { LayoutRect } from "../types/layout"
2
+
3
+
4
+ export type VisibleRange = {
5
+ startIndex: number
6
+ endIndex: number
7
+ }
8
+
9
+ type Input = {
10
+ layouts: readonly LayoutRect[]
11
+ offset: number
12
+ viewportSize: number
13
+ buffer: number
14
+ isVertical: boolean
15
+ }
3
16
 
4
17
  /**
5
- * Computes the visible item index range using binary search.
6
- *
7
- * Responsibilities:
8
- * - Determine which items intersect the visible window
9
- * - Stay independent of rendering and recycling
10
- *
11
- * Performance:
12
- * - O(log n) to locate the first visible item
13
- * - O(k) to expand to the last visible item (k = visible count)
18
+ * Computes visible item range using binary search + forward scan.
19
+ * Type-safe and defensive against invalid indices.
14
20
  */
15
21
  export function computeVisibleItemRange(
16
- input: VisibleRangeInput
22
+ input: Input
17
23
  ): VisibleRange | null {
18
24
  const {
19
25
  layouts,
@@ -23,56 +29,54 @@ export function computeVisibleItemRange(
23
29
  isVertical,
24
30
  } = input
25
31
 
26
- const itemCount = layouts.length
27
- if (itemCount === 0) return null
32
+ const count = layouts.length
33
+ if (count === 0) return null
28
34
 
29
35
  const windowStart = Math.max(0, offset - buffer)
30
36
  const windowEnd = offset + viewportSize + buffer
31
37
 
32
- // --------------------------------------------------
33
- // Binary search:
34
- // First item whose END >= windowStart
35
- // --------------------------------------------------
38
+ // ------------------------------
39
+ // Binary search: first visible
40
+ // ------------------------------
36
41
  let low = 0
37
- let high = itemCount - 1
38
- let firstVisibleIndex = itemCount
42
+ let high = count - 1
43
+ let first = count
39
44
 
40
45
  while (low <= high) {
41
46
  const mid = (low + high) >>> 1
42
- const rect = layouts[mid]!
47
+ const rect = layouts[mid]
48
+ if (!rect) break
43
49
 
44
50
  const start = isVertical ? rect.y : rect.x
45
51
  const size = isVertical ? rect.height : rect.width
46
- const end = start + size
47
52
 
48
- if (end >= windowStart) {
49
- firstVisibleIndex = mid
53
+ if (start + size >= windowStart) {
54
+ first = mid
50
55
  high = mid - 1
51
56
  } else {
52
57
  low = mid + 1
53
58
  }
54
59
  }
55
60
 
56
- if (firstVisibleIndex === itemCount) {
57
- return null
58
- }
61
+ if (first === count) return null
59
62
 
60
- // --------------------------------------------------
61
- // Linear scan forward:
62
- // Last item whose START <= windowEnd
63
- // --------------------------------------------------
64
- let lastVisibleIndex = firstVisibleIndex
63
+ // ------------------------------
64
+ // Linear scan: last visible
65
+ // ------------------------------
66
+ let last = first
65
67
 
66
- for (let i = firstVisibleIndex + 1; i < itemCount; i++) {
67
- const rect = layouts[i]!
68
- const start = isVertical ? rect.y : rect.x
68
+ for (let i = first + 1; i < count; i++) {
69
+ const rect = layouts[i]
70
+ if (!rect) break
69
71
 
72
+ const start = isVertical ? rect.y : rect.x
70
73
  if (start > windowEnd) break
71
- lastVisibleIndex = i
74
+
75
+ last = i
72
76
  }
73
77
 
74
78
  return {
75
- startIndex: firstVisibleIndex,
76
- endIndex: lastVisibleIndex,
79
+ startIndex: first,
80
+ endIndex: last,
77
81
  }
78
82
  }
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}
@@ -1,9 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.NitroLayoutEngine = void 0;
7
- var _reactNativeNitroModules = require("react-native-nitro-modules");
8
- const NitroLayoutEngine = exports.NitroLayoutEngine = _reactNativeNitroModules.NitroModules.createHybridObject('NitroLayoutEngine');
9
- //# sourceMappingURL=NitroLayoutEngine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_reactNativeNitroModules","require","NitroLayoutEngine","exports","NitroModules","createHybridObject"],"sourceRoot":"../../../src","sources":["native/NitroLayoutEngine.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAGO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5BE,qCAAY,CAACC,kBAAkB,CAC7B,mBACF,CAAC","ignoreList":[]}
@@ -1,9 +0,0 @@
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=NitroRecyclerView.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_reactNative","require","NitroRecyclerView","exports","requireNativeComponent"],"sourceRoot":"../../../src","sources":["native/NitroRecyclerView.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAMO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5B,IAAAE,mCAAsB,EAAyB,mBAAmB,CAAC","ignoreList":[]}
@@ -1 +0,0 @@
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","RecyclerList","props","scrollDirection","containerCrossAxisSize","data","itemMainAxisSizes","padding","start","end","itemSpacing","bufferRatio","getCellType","renderItem","isVertical","itemCount","length","forceRender","useState","layoutEngineRef","useRef","layoutSignatureRef","layoutSignature","join","current","engine","MutableLinearLayout","compute","crossAxisSize","layouts","getLayouts","contentSize","getContentSize","scrollOffsetRef","viewportSizeRef","cellPoolRef","CellPool","activeCellsRef","nextCellKeyRef","createCell","type","key","index","MAX_CELLS","Math","ceil","updateVisibleCells","offset","viewportSize","buffer","range","computeVisibleItemRange","nextCells","used","Set","startIndex","endIndex","item","undefined","hasType","registerType","release","cell","acquire","reuseIndex","findIndex","c","splice","push","add","changed","v","frameScheduledRef","onScroll","nativeEvent","contentOffset","y","x","requestAnimationFrame","onLayout","layout","height","width","useEffect","jsx","ScrollView","horizontal","scrollEventThrottle","removeClippedSubviews","children","View","style","map","styles","top","left","StyleSheet","create","position"],"sourceRoot":"../../../src","sources":["recycler/RecyclerList.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,6 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- //# sourceMappingURL=nitro-layout-engine.nitro.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/nitro-layout-engine.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["types/recycler/RecyclerCellInstance.ts"],"mappings":"","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["types/recycler/RecyclerListProps.ts"],"mappings":"","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { requireNativeComponent } from 'react-native';
4
- export const NitroRecyclerView = requireNativeComponent('NitroRecyclerView');
5
- //# sourceMappingURL=NitroList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["requireNativeComponent","NitroRecyclerView"],"sourceRoot":"../../src","sources":["NitroList.ts"],"mappings":";;AAAA,SAASA,sBAAsB,QAAQ,cAAc;AAMrD,OAAO,MAAMC,iBAAiB,GAC5BD,sBAAsB,CAAyB,mBAAmB,CAAC","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { NitroModules } from 'react-native-nitro-modules';
4
- export const NitroLayoutEngine = NitroModules.createHybridObject('NitroLayoutEngine');
5
- //# sourceMappingURL=NitroLayoutEngine.js.map
@@ -1 +0,0 @@
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":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export {};
4
- //# sourceMappingURL=NitroList.types.js.map
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { requireNativeComponent } from 'react-native';
4
- export const NitroRecyclerView = requireNativeComponent('NitroRecyclerView');
5
- //# sourceMappingURL=NitroRecyclerView.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["requireNativeComponent","NitroRecyclerView"],"sourceRoot":"../../../src","sources":["native/NitroRecyclerView.ts"],"mappings":";;AAAA,SAASA,sBAAsB,QAAQ,cAAc;AAMrD,OAAO,MAAMC,iBAAiB,GAC5BD,sBAAsB,CAAyB,mBAAmB,CAAC","ignoreList":[]}
@@ -1,221 +0,0 @@
1
- "use strict";
2
-
3
- import React, { useRef, useEffect, useState } from 'react';
4
- import { ScrollView, View, StyleSheet } from 'react-native';
5
- import { MutableLinearLayout } from '../layout/MutableLinearLayout';
6
- import { computeVisibleItemRange } from '../windowing';
7
- import { CellPool } from './CellPool';
8
-
9
- /* =========================================================
10
- * Constants
11
- * =======================================================*/
12
- import { jsx as _jsx } from "react/jsx-runtime";
13
- const DEFAULT_VIEWPORT_SIZE = 800;
14
- const DEFAULT_ITEM_SIZE = 60;
15
- const SCROLL_EVENT_THROTTLE = 16;
16
-
17
- /* =========================================================
18
- * RecyclerList
19
- * =======================================================*/
20
-
21
- export function RecyclerList(props) {
22
- const {
23
- scrollDirection = 'vertical',
24
- containerCrossAxisSize,
25
- data,
26
- itemMainAxisSizes,
27
- padding = {
28
- start: 0,
29
- end: 0
30
- },
31
- itemSpacing,
32
- bufferRatio = 1.3,
33
- getCellType,
34
- renderItem
35
- } = props;
36
- const isVertical = scrollDirection === 'vertical';
37
- const itemCount = data.length;
38
-
39
- /* -------------------------------------------------------
40
- * Controlled render
41
- * -----------------------------------------------------*/
42
-
43
- const [, forceRender] = useState(0);
44
-
45
- /* -------------------------------------------------------
46
- * Layout engine
47
- * -----------------------------------------------------*/
48
-
49
- const layoutEngineRef = useRef(null);
50
- const layoutSignatureRef = useRef('');
51
- const layoutSignature = [scrollDirection, containerCrossAxisSize, itemCount, itemMainAxisSizes, padding.start, padding.end, itemSpacing ?? 'default'].join('|');
52
- if (!layoutEngineRef.current || layoutSignatureRef.current !== layoutSignature) {
53
- const engine = new MutableLinearLayout(scrollDirection);
54
- engine.compute({
55
- crossAxisSize: containerCrossAxisSize,
56
- itemMainAxisSizes,
57
- padding,
58
- itemSpacing
59
- });
60
- layoutEngineRef.current = engine;
61
- layoutSignatureRef.current = layoutSignature;
62
- }
63
- const layouts = layoutEngineRef.current.getLayouts();
64
- const contentSize = layoutEngineRef.current.getContentSize();
65
-
66
- /* -------------------------------------------------------
67
- * Scroll metrics
68
- * -----------------------------------------------------*/
69
-
70
- const scrollOffsetRef = useRef(0);
71
- const viewportSizeRef = useRef(DEFAULT_VIEWPORT_SIZE);
72
-
73
- /* -------------------------------------------------------
74
- * Cell pool + physical cells
75
- * -----------------------------------------------------*/
76
-
77
- const cellPoolRef = useRef(new CellPool());
78
- const activeCellsRef = useRef([]);
79
- const nextCellKeyRef = useRef(0);
80
- const createCell = type => ({
81
- key: nextCellKeyRef.current++,
82
- index: -1,
83
- type
84
- });
85
- const MAX_CELLS = Math.ceil(viewportSizeRef.current / DEFAULT_ITEM_SIZE * bufferRatio) + 2;
86
-
87
- /* -------------------------------------------------------
88
- * Visible cell coordinator
89
- * -----------------------------------------------------*/
90
-
91
- const updateVisibleCells = () => {
92
- const offset = scrollOffsetRef.current;
93
- const viewportSize = viewportSizeRef.current;
94
- const buffer = viewportSize * bufferRatio;
95
- const range = computeVisibleItemRange({
96
- layouts,
97
- offset,
98
- viewportSize,
99
- buffer,
100
- isVertical
101
- });
102
- if (!range) return;
103
- const nextCells = [];
104
- const used = new Set();
105
- for (let index = range.startIndex; index <= range.endIndex; index++) {
106
- const item = data[index];
107
- if (item === undefined) continue;
108
- const type = getCellType(item, index);
109
-
110
- // Register type once, with hard cap
111
- if (!cellPoolRef.current.hasType(type)) {
112
- cellPoolRef.current.registerType(type, MAX_CELLS);
113
- for (let i = 0; i < MAX_CELLS; i++) {
114
- cellPoolRef.current.release(createCell(type));
115
- }
116
- }
117
- let cell = cellPoolRef.current.acquire(type);
118
- if (!cell) {
119
- const reuseIndex = activeCellsRef.current.findIndex(c => c.type === type);
120
- if (reuseIndex === -1) continue;
121
- cell = activeCellsRef.current.splice(reuseIndex, 1)[0];
122
- }
123
- cell.index = index;
124
- nextCells.push(cell);
125
- used.add(cell);
126
- }
127
- for (const cell of activeCellsRef.current) {
128
- if (!used.has(cell)) {
129
- cellPoolRef.current.release(cell);
130
- }
131
- }
132
- let changed = nextCells.length !== activeCellsRef.current.length;
133
- if (!changed) {
134
- for (let i = 0; i < nextCells.length; i++) {
135
- if (nextCells[i] !== activeCellsRef.current[i]) {
136
- changed = true;
137
- break;
138
- }
139
- }
140
- }
141
- if (changed) {
142
- activeCellsRef.current = nextCells;
143
- forceRender(v => v + 1);
144
- }
145
- };
146
-
147
- /* -------------------------------------------------------
148
- * Scroll handlers
149
- * -----------------------------------------------------*/
150
-
151
- const frameScheduledRef = useRef(false);
152
- const onScroll = e => {
153
- scrollOffsetRef.current = isVertical ? e.nativeEvent.contentOffset.y : e.nativeEvent.contentOffset.x;
154
- if (frameScheduledRef.current) return;
155
- frameScheduledRef.current = true;
156
- requestAnimationFrame(() => {
157
- frameScheduledRef.current = false;
158
- updateVisibleCells();
159
- });
160
- };
161
- const onLayout = e => {
162
- viewportSizeRef.current = isVertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width;
163
- updateVisibleCells();
164
- };
165
- useEffect(() => {
166
- updateVisibleCells();
167
- // eslint-disable-next-line react-hooks/exhaustive-deps
168
- }, []);
169
-
170
- /* -------------------------------------------------------
171
- * Render
172
- * -----------------------------------------------------*/
173
-
174
- return /*#__PURE__*/_jsx(ScrollView, {
175
- onScroll: onScroll,
176
- onLayout: onLayout,
177
- horizontal: !isVertical,
178
- scrollEventThrottle: SCROLL_EVENT_THROTTLE,
179
- removeClippedSubviews: true,
180
- children: /*#__PURE__*/_jsx(View, {
181
- style: isVertical ? {
182
- height: contentSize
183
- } : {
184
- width: contentSize
185
- },
186
- children: activeCellsRef.current.map(cell => {
187
- const index = cell.index;
188
- const layout = layouts[index];
189
- const item = data[index];
190
- if (!layout || item === undefined) return null;
191
- return /*#__PURE__*/_jsx(View, {
192
- style: [styles.cell, isVertical ? {
193
- top: layout.y,
194
- height: layout.height,
195
- width: layout.width
196
- } : {
197
- left: layout.x,
198
- width: layout.width,
199
- height: layout.height
200
- }],
201
- children: renderItem({
202
- item,
203
- index,
204
- cell
205
- })
206
- }, cell.key);
207
- })
208
- })
209
- });
210
- }
211
-
212
- /* =========================================================
213
- * Styles
214
- * =======================================================*/
215
-
216
- const styles = StyleSheet.create({
217
- cell: {
218
- position: 'absolute'
219
- }
220
- });
221
- //# sourceMappingURL=RecyclerList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","useRef","useEffect","useState","ScrollView","View","StyleSheet","MutableLinearLayout","computeVisibleItemRange","CellPool","jsx","_jsx","DEFAULT_VIEWPORT_SIZE","DEFAULT_ITEM_SIZE","SCROLL_EVENT_THROTTLE","RecyclerList","props","scrollDirection","containerCrossAxisSize","data","itemMainAxisSizes","padding","start","end","itemSpacing","bufferRatio","getCellType","renderItem","isVertical","itemCount","length","forceRender","layoutEngineRef","layoutSignatureRef","layoutSignature","join","current","engine","compute","crossAxisSize","layouts","getLayouts","contentSize","getContentSize","scrollOffsetRef","viewportSizeRef","cellPoolRef","activeCellsRef","nextCellKeyRef","createCell","type","key","index","MAX_CELLS","Math","ceil","updateVisibleCells","offset","viewportSize","buffer","range","nextCells","used","Set","startIndex","endIndex","item","undefined","hasType","registerType","i","release","cell","acquire","reuseIndex","findIndex","c","splice","push","add","has","changed","v","frameScheduledRef","onScroll","e","nativeEvent","contentOffset","y","x","requestAnimationFrame","onLayout","layout","height","width","horizontal","scrollEventThrottle","removeClippedSubviews","children","style","map","styles","top","left","create","position"],"sourceRoot":"../../../src","sources":["recycler/RecyclerList.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export {};
4
- //# sourceMappingURL=nitro-layout-engine.nitro.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/nitro-layout-engine.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export {};
4
- //# sourceMappingURL=RecyclerCellInstance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["types/recycler/RecyclerCellInstance.ts"],"mappings":"","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- export {};
4
- //# sourceMappingURL=RecyclerListProps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["types/recycler/RecyclerListProps.ts"],"mappings":"","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- export type NitroRecyclerViewProps = {
2
- itemCount: number;
3
- };
4
- export declare const NitroRecyclerView: import("react-native").HostComponent<NitroRecyclerViewProps>;
5
- //# sourceMappingURL=NitroList.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NitroList.d.ts","sourceRoot":"","sources":["../../../src/NitroList.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,iBAAiB,8DACuC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { NitroLayoutEngine as NitroLayoutEngineSpec } from '../specs/nitro-layout-engine.nitro';
2
- export declare const NitroLayoutEngine: NitroLayoutEngineSpec;
3
- //# sourceMappingURL=NitroLayoutEngine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NitroLayoutEngine.d.ts","sourceRoot":"","sources":["../../../../src/native/NitroLayoutEngine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAEpG,eAAO,MAAM,iBAAiB,uBAG3B,CAAA"}
@@ -1,9 +0,0 @@
1
- import type { LayoutRect } from "../types/layout";
2
- /**
3
- * JS runtime interface backed by Nitro (JSI).
4
- * Must match native HybridNitroList exactly.
5
- */
6
- export interface NitroList {
7
- computeLayout(containerWidth: number, itemHeights: readonly number[]): readonly LayoutRect[];
8
- }
9
- //# sourceMappingURL=NitroList.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NitroList.types.d.ts","sourceRoot":"","sources":["../../../../src/native/NitroList.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,UAAU,EAAE,CAAA;CACzB"}
@@ -1,5 +0,0 @@
1
- export type NitroRecyclerViewProps = {
2
- itemCount: number;
3
- };
4
- export declare const NitroRecyclerView: import("react-native").HostComponent<NitroRecyclerViewProps>;
5
- //# sourceMappingURL=NitroRecyclerView.d.ts.map