@react-native-ohos/flash-list 1.8.3 → 2.1.1-rc.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 (455) hide show
  1. package/LICENSE +1 -1
  2. package/README.OpenSource +1 -1
  3. package/dist/AnimatedFlashList.d.ts +4 -28
  4. package/dist/AnimatedFlashList.d.ts.map +1 -1
  5. package/dist/AnimatedFlashList.js +5 -30
  6. package/dist/AnimatedFlashList.js.map +1 -1
  7. package/dist/FlashList.d.ts +1 -179
  8. package/dist/FlashList.d.ts.map +1 -1
  9. package/dist/FlashList.js +1 -599
  10. package/dist/FlashList.js.map +1 -1
  11. package/dist/FlashListProps.d.ts +285 -278
  12. package/dist/FlashListProps.d.ts.map +1 -1
  13. package/dist/FlashListProps.js +5 -31
  14. package/dist/FlashListProps.js.map +1 -1
  15. package/dist/FlashListRef.d.ts +305 -0
  16. package/dist/FlashListRef.d.ts.map +1 -0
  17. package/dist/FlashListRef.js +2 -0
  18. package/dist/FlashListRef.js.map +1 -0
  19. package/dist/benchmark/AutoScrollHelper.d.ts +17 -40
  20. package/dist/benchmark/AutoScrollHelper.d.ts.map +1 -1
  21. package/dist/benchmark/AutoScrollHelper.js +59 -90
  22. package/dist/benchmark/AutoScrollHelper.js.map +1 -1
  23. package/dist/benchmark/JSFPSMonitor.d.ts +22 -45
  24. package/dist/benchmark/JSFPSMonitor.d.ts.map +1 -1
  25. package/dist/benchmark/JSFPSMonitor.js +59 -87
  26. package/dist/benchmark/JSFPSMonitor.js.map +1 -1
  27. package/dist/benchmark/roundToDecimalPlaces.d.ts +1 -24
  28. package/dist/benchmark/roundToDecimalPlaces.d.ts.map +1 -1
  29. package/dist/benchmark/roundToDecimalPlaces.js +4 -31
  30. package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
  31. package/dist/benchmark/useBenchmark.d.ts +40 -57
  32. package/dist/benchmark/useBenchmark.d.ts.map +1 -1
  33. package/dist/benchmark/useBenchmark.js +119 -189
  34. package/dist/benchmark/useBenchmark.js.map +1 -1
  35. package/dist/benchmark/useDataMultiplier.d.ts +8 -31
  36. package/dist/benchmark/useDataMultiplier.d.ts.map +1 -1
  37. package/dist/benchmark/useDataMultiplier.js +19 -47
  38. package/dist/benchmark/useDataMultiplier.js.map +1 -1
  39. package/dist/benchmark/useFlatListBenchmark.d.ts +14 -35
  40. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
  41. package/dist/benchmark/useFlatListBenchmark.js +92 -122
  42. package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
  43. package/dist/errors/ErrorMessages.d.ts +16 -0
  44. package/dist/errors/ErrorMessages.d.ts.map +1 -0
  45. package/dist/errors/ErrorMessages.js +16 -0
  46. package/dist/errors/ErrorMessages.js.map +1 -0
  47. package/dist/errors/WarningMessages.d.ts +6 -0
  48. package/dist/errors/WarningMessages.d.ts.map +1 -0
  49. package/dist/errors/WarningMessages.js +7 -0
  50. package/dist/errors/WarningMessages.js.map +1 -0
  51. package/dist/index.d.ts +15 -36
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +19 -54
  54. package/dist/index.js.map +1 -1
  55. package/dist/isNewArch.d.ts +2 -0
  56. package/dist/isNewArch.d.ts.map +1 -0
  57. package/dist/isNewArch.js +22 -0
  58. package/dist/isNewArch.js.map +1 -0
  59. package/dist/native/config/PlatformHelper.android.d.ts +6 -48
  60. package/dist/native/config/PlatformHelper.android.d.ts.map +1 -1
  61. package/dist/native/config/PlatformHelper.android.js +6 -45
  62. package/dist/native/config/PlatformHelper.android.js.map +1 -1
  63. package/dist/native/config/PlatformHelper.d.ts +6 -48
  64. package/dist/native/config/PlatformHelper.d.ts.map +1 -1
  65. package/dist/native/config/PlatformHelper.harmony.d.ts +29 -48
  66. package/dist/native/config/PlatformHelper.harmony.d.ts.map +1 -1
  67. package/dist/native/config/PlatformHelper.harmony.js +29 -44
  68. package/dist/native/config/PlatformHelper.harmony.js.map +1 -1
  69. package/dist/native/config/PlatformHelper.ios.d.ts +6 -48
  70. package/dist/native/config/PlatformHelper.ios.d.ts.map +1 -1
  71. package/dist/native/config/PlatformHelper.ios.js +6 -44
  72. package/dist/native/config/PlatformHelper.ios.js.map +1 -1
  73. package/dist/native/config/PlatformHelper.js +6 -45
  74. package/dist/native/config/PlatformHelper.js.map +1 -1
  75. package/dist/native/config/PlatformHelper.web.d.ts +6 -49
  76. package/dist/native/config/PlatformHelper.web.d.ts.map +1 -1
  77. package/dist/native/config/PlatformHelper.web.js +6 -47
  78. package/dist/native/config/PlatformHelper.web.js.map +1 -1
  79. package/dist/recyclerview/LayoutCommitObserver.d.ts +12 -0
  80. package/dist/recyclerview/LayoutCommitObserver.d.ts.map +1 -0
  81. package/dist/recyclerview/LayoutCommitObserver.js +58 -0
  82. package/dist/recyclerview/LayoutCommitObserver.js.map +1 -0
  83. package/dist/recyclerview/RecyclerView.d.ts +13 -0
  84. package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
  85. package/dist/recyclerview/RecyclerView.js +368 -0
  86. package/dist/recyclerview/RecyclerView.js.map +1 -0
  87. package/dist/recyclerview/RecyclerViewContextProvider.d.ts +46 -0
  88. package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
  89. package/dist/recyclerview/RecyclerViewContextProvider.js +10 -0
  90. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
  91. package/dist/recyclerview/RecyclerViewManager.d.ts +78 -0
  92. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
  93. package/dist/recyclerview/RecyclerViewManager.js +343 -0
  94. package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
  95. package/dist/recyclerview/RecyclerViewProps.d.ts +2 -0
  96. package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
  97. package/dist/recyclerview/RecyclerViewProps.js +2 -0
  98. package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
  99. package/dist/recyclerview/RenderStackManager.d.ts +86 -0
  100. package/dist/recyclerview/RenderStackManager.d.ts.map +1 -0
  101. package/dist/recyclerview/RenderStackManager.js +252 -0
  102. package/dist/recyclerview/RenderStackManager.js.map +1 -0
  103. package/dist/recyclerview/ViewHolder.d.ts +45 -0
  104. package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
  105. package/dist/recyclerview/ViewHolder.js +94 -0
  106. package/dist/recyclerview/ViewHolder.js.map +1 -0
  107. package/dist/recyclerview/ViewHolderCollection.d.ts +63 -0
  108. package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
  109. package/dist/recyclerview/ViewHolderCollection.js +87 -0
  110. package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
  111. package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
  112. package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
  113. package/dist/recyclerview/components/CompatScroller.js +7 -0
  114. package/dist/recyclerview/components/CompatScroller.js.map +1 -0
  115. package/dist/recyclerview/components/CompatView.d.ts +7 -0
  116. package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
  117. package/dist/recyclerview/components/CompatView.js +7 -0
  118. package/dist/recyclerview/components/CompatView.js.map +1 -0
  119. package/dist/recyclerview/components/ScrollAnchor.d.ts +29 -0
  120. package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
  121. package/dist/recyclerview/components/ScrollAnchor.js +33 -0
  122. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
  123. package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
  124. package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
  125. package/dist/recyclerview/components/StickyHeaders.js +112 -0
  126. package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
  127. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
  128. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
  129. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +95 -0
  130. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
  131. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +105 -0
  132. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
  133. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +202 -0
  134. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
  135. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts +14 -0
  136. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts.map +1 -0
  137. package/dist/recyclerview/helpers/RenderTimeTracker.js +44 -0
  138. package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -0
  139. package/dist/recyclerview/helpers/VelocityTracker.d.ts +29 -0
  140. package/dist/recyclerview/helpers/VelocityTracker.d.ts.map +1 -0
  141. package/dist/recyclerview/helpers/VelocityTracker.js +64 -0
  142. package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -0
  143. package/dist/recyclerview/hooks/useBoundDetection.d.ts +17 -0
  144. package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
  145. package/dist/recyclerview/hooks/useBoundDetection.js +132 -0
  146. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
  147. package/dist/recyclerview/hooks/useLayoutState.d.ts +14 -0
  148. package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
  149. package/dist/recyclerview/hooks/useLayoutState.js +38 -0
  150. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
  151. package/dist/recyclerview/hooks/useMappingHelper.d.ts +9 -0
  152. package/dist/recyclerview/hooks/useMappingHelper.d.ts.map +1 -0
  153. package/dist/recyclerview/hooks/useMappingHelper.js +15 -0
  154. package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -0
  155. package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
  156. package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
  157. package/dist/recyclerview/hooks/useOnLoad.js +67 -0
  158. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
  159. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +28 -0
  160. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
  161. package/dist/recyclerview/hooks/useRecyclerViewController.js +507 -0
  162. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
  163. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +8 -0
  164. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
  165. package/dist/recyclerview/hooks/useRecyclerViewManager.js +32 -0
  166. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
  167. package/dist/recyclerview/hooks/useRecyclingState.d.ts +18 -0
  168. package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
  169. package/dist/recyclerview/hooks/useRecyclingState.js +49 -0
  170. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
  171. package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
  172. package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
  173. package/dist/recyclerview/hooks/useSecondaryProps.js +90 -0
  174. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
  175. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts +15 -0
  176. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts.map +1 -0
  177. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +58 -0
  178. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -0
  179. package/dist/recyclerview/hooks/useUnmountFlag.d.ts +10 -0
  180. package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
  181. package/dist/recyclerview/hooks/useUnmountFlag.js +25 -0
  182. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
  183. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +79 -0
  184. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
  185. package/dist/recyclerview/layout-managers/GridLayoutManager.js +221 -0
  186. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
  187. package/dist/recyclerview/layout-managers/LayoutManager.d.ts +296 -0
  188. package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
  189. package/dist/recyclerview/layout-managers/LayoutManager.js +279 -0
  190. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
  191. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +51 -0
  192. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
  193. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +151 -0
  194. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
  195. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +81 -0
  196. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
  197. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +269 -0
  198. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
  199. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
  200. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
  201. package/dist/recyclerview/utils/adjustOffsetForRTL.js +14 -0
  202. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
  203. package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
  204. package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
  205. package/dist/recyclerview/utils/componentUtils.js +27 -0
  206. package/dist/recyclerview/utils/componentUtils.js.map +1 -0
  207. package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
  208. package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
  209. package/dist/recyclerview/utils/findVisibleIndex.js +76 -0
  210. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
  211. package/dist/recyclerview/utils/measureLayout.d.ts +52 -0
  212. package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
  213. package/dist/recyclerview/utils/measureLayout.js +99 -0
  214. package/dist/recyclerview/utils/measureLayout.js.map +1 -0
  215. package/dist/recyclerview/utils/measureLayout.web.d.ts +29 -0
  216. package/dist/recyclerview/utils/measureLayout.web.d.ts.map +1 -0
  217. package/dist/recyclerview/utils/measureLayout.web.js +79 -0
  218. package/dist/recyclerview/utils/measureLayout.web.js.map +1 -0
  219. package/dist/recyclerview/viewability/ViewToken.d.ts +8 -0
  220. package/dist/recyclerview/viewability/ViewToken.d.ts.map +1 -0
  221. package/dist/recyclerview/viewability/ViewToken.js +2 -0
  222. package/dist/recyclerview/viewability/ViewToken.js.map +1 -0
  223. package/dist/recyclerview/viewability/ViewabilityHelper.d.ts +26 -0
  224. package/dist/recyclerview/viewability/ViewabilityHelper.d.ts.map +1 -0
  225. package/dist/recyclerview/viewability/ViewabilityHelper.js +98 -0
  226. package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -0
  227. package/dist/recyclerview/viewability/ViewabilityManager.d.ts +25 -0
  228. package/dist/recyclerview/viewability/ViewabilityManager.d.ts.map +1 -0
  229. package/dist/recyclerview/viewability/ViewabilityManager.js +94 -0
  230. package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -0
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/dist/utils/AverageWindow.d.ts +33 -43
  233. package/dist/utils/AverageWindow.d.ts.map +1 -1
  234. package/dist/utils/AverageWindow.js +66 -71
  235. package/dist/utils/AverageWindow.js.map +1 -1
  236. package/jestSetup.js +23 -37
  237. package/package.json +15 -24
  238. package/src/AnimatedFlashList.ts +2 -25
  239. package/src/FlashList.ts +1 -0
  240. package/src/FlashListProps.ts +109 -100
  241. package/src/FlashListRef.ts +320 -0
  242. package/src/benchmark/AutoScrollHelper.ts +0 -24
  243. package/src/benchmark/JSFPSMonitor.ts +2 -26
  244. package/src/benchmark/roundToDecimalPlaces.ts +0 -24
  245. package/src/benchmark/useBenchmark.ts +59 -105
  246. package/src/benchmark/useDataMultiplier.ts +0 -24
  247. package/src/benchmark/useFlatListBenchmark.ts +43 -32
  248. package/src/errors/ErrorMessages.ts +26 -0
  249. package/src/errors/WarningMessages.ts +9 -0
  250. package/src/index.ts +18 -46
  251. package/src/isNewArch.ts +25 -0
  252. package/src/native/config/PlatformHelper.android.ts +3 -49
  253. package/src/native/config/PlatformHelper.harmony.ts +3 -24
  254. package/src/native/config/PlatformHelper.ios.ts +3 -48
  255. package/src/native/config/PlatformHelper.ts +3 -49
  256. package/src/native/config/PlatformHelper.web.ts +4 -55
  257. package/src/recyclerview/LayoutCommitObserver.tsx +74 -0
  258. package/src/recyclerview/RecyclerView.tsx +616 -0
  259. package/src/recyclerview/RecyclerViewContextProvider.ts +65 -0
  260. package/src/recyclerview/RecyclerViewManager.ts +461 -0
  261. package/src/recyclerview/RecyclerViewProps.ts +1 -0
  262. package/src/recyclerview/RenderStackManager.ts +317 -0
  263. package/src/recyclerview/ViewHolder.tsx +180 -0
  264. package/src/recyclerview/ViewHolderCollection.tsx +193 -0
  265. package/src/recyclerview/components/CompatScroller.ts +9 -0
  266. package/src/recyclerview/components/CompatView.ts +9 -0
  267. package/src/recyclerview/components/ScrollAnchor.tsx +66 -0
  268. package/src/recyclerview/components/StickyHeaders.tsx +222 -0
  269. package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
  270. package/src/recyclerview/helpers/EngagedIndicesTracker.ts +301 -0
  271. package/src/recyclerview/helpers/RenderTimeTracker.ts +50 -0
  272. package/src/recyclerview/helpers/VelocityTracker.ts +77 -0
  273. package/src/recyclerview/hooks/useBoundDetection.ts +176 -0
  274. package/src/recyclerview/hooks/useLayoutState.ts +55 -0
  275. package/src/recyclerview/hooks/useMappingHelper.ts +20 -0
  276. package/src/recyclerview/hooks/useOnLoad.ts +80 -0
  277. package/src/recyclerview/hooks/useRecyclerViewController.tsx +633 -0
  278. package/src/recyclerview/hooks/useRecyclerViewManager.ts +42 -0
  279. package/src/recyclerview/hooks/useRecyclingState.ts +67 -0
  280. package/src/recyclerview/hooks/useSecondaryProps.tsx +124 -0
  281. package/src/recyclerview/hooks/useUnmountAwareCallbacks.ts +73 -0
  282. package/src/recyclerview/hooks/useUnmountFlag.ts +27 -0
  283. package/src/recyclerview/layout-managers/GridLayoutManager.ts +256 -0
  284. package/src/recyclerview/layout-managers/LayoutManager.ts +568 -0
  285. package/src/recyclerview/layout-managers/LinearLayoutManager.ts +171 -0
  286. package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +323 -0
  287. package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
  288. package/src/recyclerview/utils/componentUtils.ts +28 -0
  289. package/src/recyclerview/utils/findVisibleIndex.ts +93 -0
  290. package/src/recyclerview/utils/measureLayout.ts +128 -0
  291. package/src/recyclerview/utils/measureLayout.web.ts +102 -0
  292. package/src/recyclerview/viewability/ViewToken.ts +7 -0
  293. package/src/{viewability → recyclerview/viewability}/ViewabilityHelper.ts +8 -33
  294. package/src/{viewability → recyclerview/viewability}/ViewabilityManager.ts +23 -46
  295. package/src/utils/AverageWindow.ts +33 -24
  296. package/dist/GridLayoutProviderWithProps.d.ts +0 -65
  297. package/dist/GridLayoutProviderWithProps.d.ts.map +0 -1
  298. package/dist/GridLayoutProviderWithProps.js +0 -138
  299. package/dist/GridLayoutProviderWithProps.js.map +0 -1
  300. package/dist/MasonryFlashList.d.ts +0 -74
  301. package/dist/MasonryFlashList.d.ts.map +0 -1
  302. package/dist/MasonryFlashList.js +0 -275
  303. package/dist/MasonryFlashList.js.map +0 -1
  304. package/dist/PureComponentWrapper.d.ts +0 -45
  305. package/dist/PureComponentWrapper.d.ts.map +0 -1
  306. package/dist/PureComponentWrapper.js +0 -60
  307. package/dist/PureComponentWrapper.js.map +0 -1
  308. package/dist/benchmark/useBlankAreaTracker.d.ts +0 -57
  309. package/dist/benchmark/useBlankAreaTracker.d.ts.map +0 -1
  310. package/dist/benchmark/useBlankAreaTracker.js +0 -90
  311. package/dist/benchmark/useBlankAreaTracker.js.map +0 -1
  312. package/dist/errors/CustomError.d.ts +0 -31
  313. package/dist/errors/CustomError.d.ts.map +0 -1
  314. package/dist/errors/CustomError.js +0 -37
  315. package/dist/errors/CustomError.js.map +0 -1
  316. package/dist/errors/ExceptionList.d.ts +0 -47
  317. package/dist/errors/ExceptionList.d.ts.map +0 -1
  318. package/dist/errors/ExceptionList.js +0 -49
  319. package/dist/errors/ExceptionList.js.map +0 -1
  320. package/dist/errors/Warnings.d.ts +0 -32
  321. package/dist/errors/Warnings.d.ts.map +0 -1
  322. package/dist/errors/Warnings.js +0 -36
  323. package/dist/errors/Warnings.js.map +0 -1
  324. package/dist/fabric/AutoLayoutNativeComponent.d.ts +0 -42
  325. package/dist/fabric/AutoLayoutNativeComponent.d.ts.map +0 -1
  326. package/dist/fabric/AutoLayoutNativeComponent.js +0 -29
  327. package/dist/fabric/AutoLayoutNativeComponent.js.map +0 -1
  328. package/dist/fabric/CellContainerNativeComponent.d.ts +0 -31
  329. package/dist/fabric/CellContainerNativeComponent.d.ts.map +0 -1
  330. package/dist/fabric/CellContainerNativeComponent.js +0 -29
  331. package/dist/fabric/CellContainerNativeComponent.js.map +0 -1
  332. package/dist/native/auto-layout/AutoLayoutView.d.ts +0 -45
  333. package/dist/native/auto-layout/AutoLayoutView.d.ts.map +0 -1
  334. package/dist/native/auto-layout/AutoLayoutView.js +0 -71
  335. package/dist/native/auto-layout/AutoLayoutView.js.map +0 -1
  336. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts +0 -27
  337. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts.map +0 -1
  338. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js +0 -29
  339. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js.map +0 -1
  340. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts +0 -28
  341. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +0 -1
  342. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts +0 -27
  343. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts.map +0 -1
  344. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js +0 -29
  345. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js.map +0 -1
  346. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts +0 -27
  347. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts.map +0 -1
  348. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js +0 -29
  349. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js.map +0 -1
  350. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +0 -29
  351. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +0 -1
  352. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +0 -39
  353. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +0 -1
  354. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +0 -26
  355. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +0 -1
  356. package/dist/native/cell-container/CellContainer.android.d.ts +0 -29
  357. package/dist/native/cell-container/CellContainer.android.d.ts.map +0 -1
  358. package/dist/native/cell-container/CellContainer.android.js +0 -32
  359. package/dist/native/cell-container/CellContainer.android.js.map +0 -1
  360. package/dist/native/cell-container/CellContainer.d.ts +0 -31
  361. package/dist/native/cell-container/CellContainer.d.ts.map +0 -1
  362. package/dist/native/cell-container/CellContainer.harmony.d.ts +0 -29
  363. package/dist/native/cell-container/CellContainer.harmony.d.ts.map +0 -1
  364. package/dist/native/cell-container/CellContainer.harmony.js +0 -32
  365. package/dist/native/cell-container/CellContainer.harmony.js.map +0 -1
  366. package/dist/native/cell-container/CellContainer.ios.d.ts +0 -29
  367. package/dist/native/cell-container/CellContainer.ios.d.ts.map +0 -1
  368. package/dist/native/cell-container/CellContainer.ios.js +0 -32
  369. package/dist/native/cell-container/CellContainer.ios.js.map +0 -1
  370. package/dist/native/cell-container/CellContainer.js +0 -34
  371. package/dist/native/cell-container/CellContainer.js.map +0 -1
  372. package/dist/native/cell-container/CellContainer.web.d.ts +0 -30
  373. package/dist/native/cell-container/CellContainer.web.d.ts.map +0 -1
  374. package/dist/native/cell-container/CellContainer.web.js +0 -36
  375. package/dist/native/cell-container/CellContainer.web.js.map +0 -1
  376. package/dist/utils/ContentContainerUtils.d.ts +0 -50
  377. package/dist/utils/ContentContainerUtils.d.ts.map +0 -1
  378. package/dist/utils/ContentContainerUtils.js +0 -71
  379. package/dist/utils/ContentContainerUtils.js.map +0 -1
  380. package/dist/viewability/ViewToken.d.ts +0 -31
  381. package/dist/viewability/ViewToken.d.ts.map +0 -1
  382. package/dist/viewability/ViewToken.js +0 -26
  383. package/dist/viewability/ViewToken.js.map +0 -1
  384. package/dist/viewability/ViewabilityHelper.d.ts +0 -49
  385. package/dist/viewability/ViewabilityHelper.d.ts.map +0 -1
  386. package/dist/viewability/ViewabilityHelper.js +0 -130
  387. package/dist/viewability/ViewabilityHelper.js.map +0 -1
  388. package/dist/viewability/ViewabilityManager.d.ts +0 -48
  389. package/dist/viewability/ViewabilityManager.d.ts.map +0 -1
  390. package/dist/viewability/ViewabilityManager.js +0 -131
  391. package/dist/viewability/ViewabilityManager.js.map +0 -1
  392. package/harmony/flash_list/BuildProfile.ets +0 -17
  393. package/harmony/flash_list/LICENSE +0 -7
  394. package/harmony/flash_list/build-profile.json5 +0 -8
  395. package/harmony/flash_list/hvigorfile.ts +0 -1
  396. package/harmony/flash_list/index.ets +0 -27
  397. package/harmony/flash_list/obfuscation-rules.txt +0 -18
  398. package/harmony/flash_list/oh-package.json5 +0 -24
  399. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.cpp +0 -63
  400. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.h +0 -54
  401. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.cpp +0 -140
  402. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.h +0 -66
  403. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.cpp +0 -208
  404. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.h +0 -78
  405. package/harmony/flash_list/src/main/cpp/AutoLayoutViewEventEmitRequestHandler.h +0 -53
  406. package/harmony/flash_list/src/main/cpp/AutoLayoutViewJSIBinder.h +0 -50
  407. package/harmony/flash_list/src/main/cpp/CMakeLists.txt +0 -12
  408. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.cpp +0 -80
  409. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.h +0 -64
  410. package/harmony/flash_list/src/main/cpp/CellContainerJSIBinder.h +0 -39
  411. package/harmony/flash_list/src/main/cpp/ComponentDescriptors.h +0 -40
  412. package/harmony/flash_list/src/main/cpp/EventEmitters.cpp +0 -40
  413. package/harmony/flash_list/src/main/cpp/EventEmitters.h +0 -48
  414. package/harmony/flash_list/src/main/cpp/FlashListPackage.h +0 -85
  415. package/harmony/flash_list/src/main/cpp/FlashListStackNode.cpp +0 -87
  416. package/harmony/flash_list/src/main/cpp/FlashListStackNode.h +0 -57
  417. package/harmony/flash_list/src/main/cpp/Props.cpp +0 -52
  418. package/harmony/flash_list/src/main/cpp/Props.h +0 -64
  419. package/harmony/flash_list/src/main/cpp/ShadowNodes.cpp +0 -34
  420. package/harmony/flash_list/src/main/cpp/ShadowNodes.h +0 -48
  421. package/harmony/flash_list/src/main/ets/Logger.ets +0 -64
  422. package/harmony/flash_list/src/main/ets/RNAutoLayoutShadow.ets +0 -154
  423. package/harmony/flash_list/src/main/ets/RNAutoLayoutView.ets +0 -277
  424. package/harmony/flash_list/src/main/ets/RNCellContainer.ets +0 -113
  425. package/harmony/flash_list/src/main/module.json5 +0 -9
  426. package/harmony/flash_list/src/main/resources/base/element/color.json +0 -8
  427. package/harmony/flash_list/src/main/resources/base/element/string.json +0 -16
  428. package/harmony/flash_list/src/main/resources/base/media/icon.png +0 -0
  429. package/harmony/flash_list/src/main/resources/base/profile/main_pages.json +0 -5
  430. package/harmony/flash_list/src/main/resources/en_US/element/string.json +0 -16
  431. package/harmony/flash_list/src/main/resources/zh_CN/element/string.json +0 -16
  432. package/harmony/flash_list.har +0 -0
  433. package/src/FlashList.tsx +0 -949
  434. package/src/GridLayoutProviderWithProps.ts +0 -204
  435. package/src/MasonryFlashList.tsx +0 -499
  436. package/src/PureComponentWrapper.tsx +0 -65
  437. package/src/benchmark/useBlankAreaTracker.ts +0 -141
  438. package/src/errors/CustomError.ts +0 -34
  439. package/src/errors/ExceptionList.ts +0 -52
  440. package/src/errors/Warnings.ts +0 -39
  441. package/src/fabric/AutoLayoutNativeComponent.ts +0 -52
  442. package/src/fabric/CellContainerNativeComponent.ts +0 -35
  443. package/src/native/auto-layout/AutoLayoutView.tsx +0 -97
  444. package/src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts +0 -31
  445. package/src/native/auto-layout/AutoLayoutViewNativeComponent.harmony.ts +0 -31
  446. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts +0 -31
  447. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +0 -31
  448. package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +0 -41
  449. package/src/native/cell-container/CellContainer.android.ts +0 -31
  450. package/src/native/cell-container/CellContainer.harmony.ts +0 -31
  451. package/src/native/cell-container/CellContainer.ios.ts +0 -31
  452. package/src/native/cell-container/CellContainer.tsx +0 -38
  453. package/src/native/cell-container/CellContainer.web.tsx +0 -33
  454. package/src/utils/ContentContainerUtils.ts +0 -116
  455. package/src/viewability/ViewToken.ts +0 -31
@@ -0,0 +1,171 @@
1
+ import {
2
+ LayoutParams,
3
+ RVDimension,
4
+ RVLayoutInfo,
5
+ RVLayout,
6
+ RVLayoutManager,
7
+ } from "./LayoutManager";
8
+
9
+ /**
10
+ * LinearLayoutManager implementation that arranges items in a single row or column.
11
+ * Supports both horizontal and vertical layouts with dynamic item sizing.
12
+ */
13
+ export class RVLinearLayoutManagerImpl extends RVLayoutManager {
14
+ /** The bounded size (width for vertical, height for horizontal) */
15
+ private boundedSize: number;
16
+ /** Whether the bounded size has been set */
17
+ private hasSize = false;
18
+
19
+ /** Reference to the tallest item in the layout */
20
+ private tallestItem?: RVLayout;
21
+ /** Height of the tallest item */
22
+ private tallestItemHeight = 0;
23
+
24
+ constructor(params: LayoutParams, previousLayoutManager?: RVLayoutManager) {
25
+ super(params, previousLayoutManager);
26
+ this.boundedSize = this.horizontal
27
+ ? params.windowSize.height
28
+ : params.windowSize.width;
29
+ this.hasSize = this.boundedSize > 0;
30
+ }
31
+
32
+ /**
33
+ * Updates layout parameters and triggers recomputation if necessary.
34
+ * @param params New layout parameters
35
+ */
36
+ updateLayoutParams(params: LayoutParams): void {
37
+ const prevHorizontal = this.horizontal;
38
+ super.updateLayoutParams(params);
39
+ const oldBoundedSize = this.boundedSize;
40
+ this.boundedSize = this.horizontal
41
+ ? params.windowSize.height
42
+ : params.windowSize.width;
43
+ if (
44
+ oldBoundedSize !== this.boundedSize ||
45
+ prevHorizontal !== this.horizontal
46
+ ) {
47
+ if (this.layouts.length > 0) {
48
+ // console.log("-----> recomputeLayouts", this.horizontal);
49
+ this.recomputeLayouts(0, this.layouts.length - 1);
50
+ this.requiresRepaint = true;
51
+ }
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Processes layout information for items, updating their dimensions.
57
+ * For horizontal layouts, also normalizes heights of items.
58
+ * @param layoutInfo Array of layout information for items
59
+ * @param itemCount Total number of items in the list
60
+ */
61
+ processLayoutInfo(layoutInfo: RVLayoutInfo[], itemCount: number) {
62
+ // Update layout information
63
+ for (const info of layoutInfo) {
64
+ const { index, dimensions } = info;
65
+ const layout = this.layouts[index];
66
+ layout.width = this.horizontal ? dimensions.width : this.boundedSize;
67
+ layout.isHeightMeasured = true;
68
+ layout.isWidthMeasured = true;
69
+ layout.height = dimensions.height;
70
+ }
71
+
72
+ if (this.horizontal && !this.hasSize) {
73
+ this.normalizeLayoutHeights(layoutInfo);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Estimates layout dimensions for an item at the given index.
79
+ * @param index Index of the item to estimate layout for
80
+ */
81
+ estimateLayout(index: number) {
82
+ const layout = this.layouts[index];
83
+ layout.width = this.horizontal
84
+ ? this.getEstimatedWidth(index)
85
+ : this.boundedSize;
86
+ layout.height = this.getEstimatedHeight(index);
87
+ layout.isWidthMeasured = !this.horizontal;
88
+ layout.enforcedWidth = !this.horizontal;
89
+ }
90
+
91
+ /**
92
+ * Returns the total size of the layout area.
93
+ * @returns RVDimension containing width and height of the layout
94
+ */
95
+ getLayoutSize(): RVDimension {
96
+ if (this.layouts.length === 0) return { width: 0, height: 0 };
97
+ const lastLayout = this.layouts[this.layouts.length - 1];
98
+ return {
99
+ width: this.horizontal
100
+ ? lastLayout.x + lastLayout.width
101
+ : this.boundedSize,
102
+ height: this.horizontal
103
+ ? this.tallestItem?.height ?? this.boundedSize
104
+ : lastLayout.y + lastLayout.height,
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Normalizes heights of items in horizontal layout to match the tallest item.
110
+ * @param layoutInfo Array of layout information for items
111
+ */
112
+ private normalizeLayoutHeights(layoutInfo: RVLayoutInfo[]) {
113
+ let newTallestItem: RVLayout | undefined;
114
+ for (const info of layoutInfo) {
115
+ const { index } = info;
116
+ const layout = this.layouts[index];
117
+ if (
118
+ layout.height > (layout.minHeight ?? 0) &&
119
+ layout.height > (newTallestItem?.height ?? 0)
120
+ ) {
121
+ newTallestItem = layout;
122
+ }
123
+ }
124
+ if (newTallestItem && newTallestItem.height !== this.tallestItemHeight) {
125
+ let targetMinHeight = newTallestItem.height;
126
+ if (newTallestItem.height < this.tallestItemHeight) {
127
+ this.requiresRepaint = true;
128
+ targetMinHeight = 0;
129
+ }
130
+ // set minHeight for all layouts
131
+ for (const layout of this.layouts) {
132
+ if (targetMinHeight > 0) {
133
+ layout.height = newTallestItem.height;
134
+ }
135
+ layout.minHeight = targetMinHeight;
136
+ }
137
+ newTallestItem.minHeight = 0;
138
+ this.tallestItem = newTallestItem;
139
+ this.tallestItemHeight = newTallestItem.height;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Recomputes layouts for items in the given range.
145
+ * Positions items sequentially based on layout direction.
146
+ * @param startIndex Starting index of items to recompute
147
+ * @param endIndex Ending index of items to recompute
148
+ */
149
+ recomputeLayouts(startIndex: number, endIndex: number): void {
150
+ for (let i = startIndex; i <= endIndex; i++) {
151
+ const layout = this.getLayout(i);
152
+
153
+ // Set positions based on whether this is the first item or not
154
+ if (i === 0) {
155
+ layout.x = 0;
156
+ layout.y = 0;
157
+ } else {
158
+ const prevLayout = this.getLayout(i - 1);
159
+ layout.x = this.horizontal ? prevLayout.x + prevLayout.width : 0;
160
+ layout.y = this.horizontal ? 0 : prevLayout.y + prevLayout.height;
161
+ }
162
+
163
+ // Set width for vertical layouts
164
+ if (!this.horizontal) {
165
+ layout.width = this.boundedSize;
166
+ } else if (this.hasSize) {
167
+ layout.minHeight = this.boundedSize;
168
+ }
169
+ }
170
+ }
171
+ }
@@ -0,0 +1,323 @@
1
+ import {
2
+ LayoutParams,
3
+ RVDimension,
4
+ RVLayout,
5
+ RVLayoutInfo,
6
+ RVLayoutManager,
7
+ } from "./LayoutManager";
8
+
9
+ /**
10
+ * MasonryLayoutManager implementation that arranges items in a masonry/pinterest-style layout.
11
+ * Items are placed in columns, with support for items spanning multiple columns.
12
+ * Can optimize item placement to minimize column height differences.
13
+ */
14
+ export class RVMasonryLayoutManagerImpl extends RVLayoutManager {
15
+ /** The width of the bounded area for the masonry layout */
16
+ private boundedSize: number;
17
+ /** Array tracking the current height of each column */
18
+ private columnHeights: number[];
19
+ /** Current column index for sequential placement */
20
+ private currentColumn = 0;
21
+
22
+ /** If there's a span change for masonry layout, we need to recompute all the widths */
23
+ private fullRelayoutRequired = false;
24
+
25
+ constructor(params: LayoutParams, previousLayoutManager?: RVLayoutManager) {
26
+ super(params, previousLayoutManager);
27
+ this.boundedSize = params.windowSize.width;
28
+ this.optimizeItemArrangement = params.optimizeItemArrangement;
29
+ this.columnHeights = this.columnHeights ?? Array(this.maxColumns).fill(0);
30
+ }
31
+
32
+ /**
33
+ * Updates layout parameters and triggers recomputation if necessary.
34
+ * @param params New layout parameters
35
+ */
36
+ updateLayoutParams(params: LayoutParams) {
37
+ const prevMaxColumns = this.maxColumns;
38
+ const prevOptimizeItemArrangement = this.optimizeItemArrangement;
39
+ super.updateLayoutParams(params);
40
+ if (
41
+ this.boundedSize !== params.windowSize.width ||
42
+ prevMaxColumns !== params.maxColumns ||
43
+ prevOptimizeItemArrangement !== params.optimizeItemArrangement
44
+ ) {
45
+ this.boundedSize = params.windowSize.width;
46
+ if (this.layouts.length > 0) {
47
+ // console.log("-----> recomputeLayouts");
48
+
49
+ // update all widths
50
+ this.updateAllWidths();
51
+ this.recomputeLayouts(0, this.layouts.length - 1);
52
+ this.requiresRepaint = true;
53
+ }
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Processes layout information for items, updating their dimensions.
59
+ * @param layoutInfo Array of layout information for items (real measurements)
60
+ * @param itemCount Total number of items in the list
61
+ */
62
+ processLayoutInfo(layoutInfo: RVLayoutInfo[], itemCount: number) {
63
+ // Update layout information
64
+ for (const info of layoutInfo) {
65
+ const { index, dimensions } = info;
66
+ const layout = this.layouts[index];
67
+ layout.height = dimensions.height;
68
+ layout.isHeightMeasured = true;
69
+ layout.isWidthMeasured = true;
70
+ this.layouts[index] = layout;
71
+ }
72
+
73
+ // TODO: Can be optimized
74
+ if (this.fullRelayoutRequired) {
75
+ this.updateAllWidths();
76
+ this.fullRelayoutRequired = false;
77
+ return 0;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Estimates layout dimensions for an item at the given index.
83
+ * Can be called by base class if estimate is required.
84
+ * @param index Index of the item to estimate layout for
85
+ */
86
+ estimateLayout(index: number) {
87
+ const layout = this.layouts[index];
88
+
89
+ // Set width based on columns and span
90
+ layout.width = this.getWidth(index);
91
+ layout.height = this.getEstimatedHeight(index);
92
+
93
+ layout.isWidthMeasured = true;
94
+ layout.enforcedWidth = true;
95
+ }
96
+
97
+ /**
98
+ * Handles span change for an item.
99
+ * @param index Index of the item
100
+ */
101
+ handleSpanChange(index: number) {
102
+ this.fullRelayoutRequired = true;
103
+ }
104
+
105
+ /**
106
+ * Returns the total size of the layout area.
107
+ * @returns RVDimension containing width and height of the layout
108
+ */
109
+ getLayoutSize(): RVDimension {
110
+ if (this.layouts.length === 0) return { width: 0, height: 0 };
111
+
112
+ // Find the tallest column
113
+ const maxHeight = Math.max(...this.columnHeights);
114
+
115
+ return {
116
+ width: this.boundedSize,
117
+ height: maxHeight,
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Recomputes layouts for items in the given range.
123
+ * Uses different placement strategies based on optimization settings.
124
+ * @param startIndex Starting index of items to recompute
125
+ * @param endIndex Ending index of items to recompute
126
+ */
127
+ recomputeLayouts(startIndex: number, endIndex: number): void {
128
+ // Reset column heights if starting from the beginning
129
+ if (startIndex === 0) {
130
+ this.columnHeights = Array(this.maxColumns).fill(0);
131
+ this.currentColumn = 0;
132
+ } else {
133
+ // Find the y-position of the first item to recompute
134
+ // and adjust column heights accordingly
135
+ this.updateColumnHeightsToIndex(startIndex);
136
+ }
137
+
138
+ const itemCount = this.layouts.length;
139
+
140
+ for (let i = startIndex; i < itemCount; i++) {
141
+ const layout = this.getLayout(i);
142
+ // Skip tracking span because we're not changing widths
143
+ const span = this.getSpan(i, true);
144
+
145
+ if (this.optimizeItemArrangement) {
146
+ if (span === 1) {
147
+ // For single column items, place in the shortest column
148
+ this.placeSingleColumnItem(layout);
149
+ } else {
150
+ // For multi-column items, find the best position
151
+ this.placeOptimizedMultiColumnItem(layout, span);
152
+ }
153
+ } else {
154
+ // No optimization - place items sequentially
155
+ this.placeItemSequentially(layout, span);
156
+ }
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Calculates the width of an item based on its span.
162
+ * @param index Index of the item
163
+ * @returns Width of the item
164
+ */
165
+ private getWidth(index: number): number {
166
+ return (this.boundedSize / this.maxColumns) * this.getSpan(index);
167
+ }
168
+
169
+ private updateAllWidths() {
170
+ for (let i = 0; i < this.layouts.length; i++) {
171
+ this.layouts[i].width = this.getWidth(i);
172
+ this.layouts[i].minHeight = undefined;
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Places an item sequentially in the next available position.
178
+ * @param layout Layout information for the item
179
+ * @param span Number of columns the item spans
180
+ */
181
+ private placeItemSequentially(layout: RVLayout, span: number): void {
182
+ // Check if the item can fit in the current row
183
+ if (this.currentColumn + span > this.maxColumns) {
184
+ // Move to the next row
185
+ this.currentColumn = 0;
186
+ }
187
+
188
+ // Find the maximum height of the columns this item will span
189
+ let maxHeight = this.columnHeights[this.currentColumn];
190
+ for (
191
+ let col = this.currentColumn + 1;
192
+ col < this.currentColumn + span;
193
+ col++
194
+ ) {
195
+ if (col < this.maxColumns) {
196
+ maxHeight = Math.max(maxHeight, this.columnHeights[col]);
197
+ }
198
+ }
199
+
200
+ // Place the item
201
+ layout.x = (this.boundedSize / this.maxColumns) * this.currentColumn;
202
+ layout.y = maxHeight;
203
+
204
+ // Update column heights
205
+ for (let col = this.currentColumn; col < this.currentColumn + span; col++) {
206
+ if (col < this.maxColumns) {
207
+ this.columnHeights[col] = maxHeight + layout.height;
208
+ }
209
+ }
210
+
211
+ // Move to the next column
212
+ this.currentColumn += span;
213
+ if (this.currentColumn >= this.maxColumns) {
214
+ this.currentColumn = 0;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Places a single-column item in the shortest available column.
220
+ * @param layout Layout information for the item
221
+ */
222
+ private placeSingleColumnItem(layout: RVLayout): void {
223
+ // Find the shortest column
224
+ let shortestColumnIndex = 0;
225
+ let minHeight = this.columnHeights[0];
226
+
227
+ for (let i = 1; i < this.maxColumns; i++) {
228
+ if (this.columnHeights[i] < minHeight) {
229
+ minHeight = this.columnHeights[i];
230
+ shortestColumnIndex = i;
231
+ }
232
+ }
233
+
234
+ // Place the item in the shortest column
235
+ layout.x = (this.boundedSize / this.maxColumns) * shortestColumnIndex;
236
+ layout.y = this.columnHeights[shortestColumnIndex];
237
+
238
+ // Update the column height
239
+ this.columnHeights[shortestColumnIndex] += layout.height;
240
+ }
241
+
242
+ /**
243
+ * Places a multi-column item in the position that minimizes total column heights.
244
+ * @param layout Layout information for the item
245
+ * @param span Number of columns the item spans
246
+ */
247
+ private placeOptimizedMultiColumnItem(layout: RVLayout, span: number): void {
248
+ let bestStartColumn = 0;
249
+ let minTotalHeight = Number.MAX_VALUE;
250
+
251
+ // Try all possible positions
252
+ for (let startCol = 0; startCol <= this.maxColumns - span; startCol++) {
253
+ // Find the maximum height among the columns this item would span
254
+ let maxHeight = this.columnHeights[startCol];
255
+ for (let col = startCol + 1; col < startCol + span; col++) {
256
+ maxHeight = Math.max(maxHeight, this.columnHeights[col]);
257
+ }
258
+
259
+ // Calculate the total height after placing the item
260
+ let totalHeight = 0;
261
+ for (let col = 0; col < this.maxColumns; col++) {
262
+ if (col >= startCol && col < startCol + span) {
263
+ totalHeight += maxHeight + layout.height;
264
+ } else {
265
+ totalHeight += this.columnHeights[col];
266
+ }
267
+ }
268
+
269
+ // Update best position if this is better
270
+ if (totalHeight < minTotalHeight) {
271
+ minTotalHeight = totalHeight;
272
+ bestStartColumn = startCol;
273
+ }
274
+ }
275
+
276
+ // Place the item at the best position
277
+ const maxHeight = Math.max(
278
+ ...this.columnHeights.slice(bestStartColumn, bestStartColumn + span)
279
+ );
280
+ layout.x = (this.boundedSize / this.maxColumns) * bestStartColumn;
281
+ layout.y = maxHeight;
282
+
283
+ // Update column heights
284
+ for (let col = bestStartColumn; col < bestStartColumn + span; col++) {
285
+ this.columnHeights[col] = maxHeight + layout.height;
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Updates column heights up to a given index by recalculating item positions.
291
+ * @param index Index to update column heights up to
292
+ */
293
+ private updateColumnHeightsToIndex(index: number): void {
294
+ // Reset column heights
295
+ this.columnHeights = Array(this.maxColumns).fill(0);
296
+ this.currentColumn = 0;
297
+
298
+ // Recalculate column heights up to the given index
299
+ for (let i = 0; i < index; i++) {
300
+ const layout = this.layouts[i];
301
+ const itemWidth = layout.width;
302
+ const columnWidth = this.boundedSize / this.maxColumns;
303
+ const span = Math.round(itemWidth / columnWidth);
304
+
305
+ // Find which columns this item spans
306
+ const startColumn = Math.round(layout.x / columnWidth);
307
+ const endColumn = Math.min(startColumn + span, this.maxColumns);
308
+
309
+ // Update column heights
310
+ for (let col = startColumn; col < endColumn; col++) {
311
+ this.columnHeights[col] = Math.max(
312
+ this.columnHeights[col],
313
+ layout.y + layout.height
314
+ );
315
+ }
316
+
317
+ // Update current column for non-optimized layout
318
+ if (!this.optimizeItemArrangement) {
319
+ this.currentColumn = (startColumn + span) % this.maxColumns;
320
+ }
321
+ }
322
+ }
323
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Adjusts the scroll offset for Right-to-Left (RTL) layouts.
3
+ * offset it flipped when RTL is enabled.
4
+ * This function converts a left-to-right offset to its RTL equivalent.
5
+ *
6
+ * @param offset - The original scroll offset in LTR layout
7
+ * @param contentSize - The total size of the scrollable content
8
+ * @param windowSize - The size of the visible window/viewport
9
+ * @returns The adjusted offset for RTL layout
10
+ */
11
+ export function adjustOffsetForRTL(
12
+ offset: number,
13
+ contentSize: number,
14
+ windowSize: number
15
+ ) {
16
+ return contentSize - offset - windowSize;
17
+ }
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * Helper function to handle both React components and React elements.
5
+ * This utility ensures proper rendering of components whether they are passed as
6
+ * component types or pre-rendered elements.
7
+ *
8
+ * @param component - Can be a React component type, React element, null, or undefined
9
+ * @returns A valid React element if the input is valid, null otherwise
10
+ *
11
+ * @example
12
+ * // With a component type
13
+ * getValidComponent(MyComponent)
14
+ *
15
+ * @example
16
+ * // With a pre-rendered element
17
+ * getValidComponent(<MyComponent />)
18
+ */
19
+ export const getValidComponent = (
20
+ component: React.ComponentType | React.ReactElement | null | undefined
21
+ ): React.ReactElement | null => {
22
+ if (React.isValidElement(component)) {
23
+ return component;
24
+ } else if (typeof component === "function") {
25
+ return React.createElement(component);
26
+ }
27
+ return null;
28
+ };
@@ -0,0 +1,93 @@
1
+ import { RVLayout } from "../layout-managers/LayoutManager";
2
+
3
+ /**
4
+ * A helper function to perform binary search for the first or last visible index.
5
+ * This function efficiently finds items that are visible within a viewport by using
6
+ * a binary search algorithm on sorted layouts.
7
+ *
8
+ * @param layouts - The sorted array of RVLayout objects, sorted by either x or y position
9
+ * @param threshold - The threshold value to determine visibility (viewport boundary)
10
+ * @param isSortedByX - A boolean indicating if the array is sorted by x (true) or y (false)
11
+ * @param findFirst - A boolean indicating whether to find the first (true) or last (false) visible index
12
+ * @returns The index of the visible layout or -1 if none are visible
13
+ *
14
+ * @remarks
15
+ * The binary search implementation ensures O(log n) time complexity for finding visible items.
16
+ * The function assumes the layouts array is pre-sorted by the relevant dimension (x or y).
17
+ */
18
+ function binarySearchVisibleIndex(
19
+ layouts: RVLayout[],
20
+ threshold: number,
21
+ isSortedByX: boolean,
22
+ findFirst: boolean
23
+ ): number {
24
+ let left = 0;
25
+ let right = layouts.length - 1;
26
+ let visibleIndex = -1;
27
+
28
+ while (left <= right) {
29
+ const mid = Math.floor((left + right) / 2);
30
+ const layout = layouts[mid];
31
+
32
+ // Check visibility based on the sorting criteria
33
+ const position = isSortedByX ? layout.x : layout.y;
34
+ const size = isSortedByX ? layout.width : layout.height;
35
+
36
+ if (findFirst) {
37
+ // Logic for finding the first visible index
38
+ if (position >= threshold || position + size > threshold) {
39
+ // Potential visible index found, continue searching left for earlier visible items
40
+ visibleIndex = mid;
41
+ right = mid - 1;
42
+ } else {
43
+ // Search in the right half for visible items
44
+ left = mid + 1;
45
+ }
46
+ } else if (position <= threshold) {
47
+ // Potential visible index found, continue searching right for later visible items
48
+ visibleIndex = mid;
49
+ left = mid + 1;
50
+ } else {
51
+ // Search in the left half for visible items
52
+ right = mid - 1;
53
+ }
54
+ }
55
+
56
+ return visibleIndex;
57
+ }
58
+
59
+ /**
60
+ * Finds the first visible index in a sorted array of RVLayout objects.
61
+ * This is a wrapper around binarySearchVisibleIndex that specifically finds
62
+ * the first item that becomes visible in the viewport.
63
+ *
64
+ * @param layouts - The sorted array of RVLayout objects
65
+ * @param threshold - The threshold value to determine visibility
66
+ * @param isSortedByX - A boolean indicating if the array is sorted by x (true) or y (false)
67
+ * @returns The index of the first visible layout or -1 if none are visible
68
+ */
69
+ export function findFirstVisibleIndex(
70
+ layouts: RVLayout[],
71
+ threshold: number,
72
+ isSortedByX: boolean
73
+ ): number {
74
+ return binarySearchVisibleIndex(layouts, threshold, isSortedByX, true);
75
+ }
76
+
77
+ /**
78
+ * Finds the last visible index in a sorted array of RVLayout objects.
79
+ * This is a wrapper around binarySearchVisibleIndex that specifically finds
80
+ * the last item that remains visible in the viewport.
81
+ *
82
+ * @param layouts - The sorted array of RVLayout objects
83
+ * @param threshold - The threshold value to determine visibility
84
+ * @param isSortedByX - A boolean indicating if the array is sorted by x (true) or y (false)
85
+ * @returns The index of the last visible layout or -1 if none are visible
86
+ */
87
+ export function findLastVisibleIndex(
88
+ layouts: RVLayout[],
89
+ threshold: number,
90
+ isSortedByX: boolean
91
+ ): number {
92
+ return binarySearchVisibleIndex(layouts, threshold, isSortedByX, false);
93
+ }