@fountain-ui/lab 2.0.0-beta.1 → 2.0.0-beta.12

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 (381) hide show
  1. package/build/commonjs/AnimatedY/AnimatedY.js +10 -14
  2. package/build/commonjs/AnimatedY/AnimatedY.js.map +1 -1
  3. package/build/commonjs/AnimatedY/AnimatedYProps.js.map +1 -1
  4. package/build/commonjs/AnimatedY/index.js.map +1 -1
  5. package/build/commonjs/BottomSheet/BottomSheetNative.js +1 -1
  6. package/build/commonjs/BottomSheet/BottomSheetNative.js.map +1 -1
  7. package/build/commonjs/BottomSheet/BottomSheetProps.js.map +1 -1
  8. package/build/commonjs/BottomSheet/BottomSheetWeb.js +2 -6
  9. package/build/commonjs/BottomSheet/BottomSheetWeb.js.map +1 -1
  10. package/build/commonjs/BottomSheet/TransparentBackdrop.js +1 -1
  11. package/build/commonjs/BottomSheet/TransparentBackdrop.js.map +1 -1
  12. package/build/commonjs/BottomSheet/index.js.map +1 -1
  13. package/build/commonjs/BottomSheet/index.native.js.map +1 -1
  14. package/build/commonjs/Carousel/Carousel.js +137 -0
  15. package/build/commonjs/Carousel/Carousel.js.map +1 -0
  16. package/build/commonjs/Carousel/CarouselProps.js.map +1 -1
  17. package/build/commonjs/Carousel/animation/animationUtils.js +9 -0
  18. package/build/commonjs/Carousel/animation/animationUtils.js.map +1 -0
  19. package/build/commonjs/Carousel/animation/createDefaultItemStyle.js +15 -0
  20. package/build/commonjs/Carousel/animation/createDefaultItemStyle.js.map +1 -0
  21. package/build/commonjs/Carousel/animation/createDefaultScrollAnimation.js +20 -0
  22. package/build/commonjs/Carousel/animation/createDefaultScrollAnimation.js.map +1 -0
  23. package/build/commonjs/Carousel/animation/index.js +40 -0
  24. package/build/commonjs/Carousel/animation/index.js.map +1 -0
  25. package/build/commonjs/Carousel/animation/normalItemStyleFactory.js +27 -0
  26. package/build/commonjs/Carousel/animation/normalItemStyleFactory.js.map +1 -0
  27. package/build/commonjs/Carousel/animation/parallaxItemStyleFactory.js +65 -0
  28. package/build/commonjs/Carousel/animation/parallaxItemStyleFactory.js.map +1 -0
  29. package/build/commonjs/Carousel/components/InternalContext.js +29 -0
  30. package/build/commonjs/Carousel/components/InternalContext.js.map +1 -0
  31. package/build/commonjs/Carousel/components/ItemView.js +64 -0
  32. package/build/commonjs/Carousel/components/ItemView.js.map +1 -0
  33. package/build/commonjs/Carousel/components/RootView.js +68 -0
  34. package/build/commonjs/Carousel/components/RootView.js.map +1 -0
  35. package/build/commonjs/Carousel/components/ScrollViewGesture.js +76 -0
  36. package/build/commonjs/Carousel/components/ScrollViewGesture.js.map +1 -0
  37. package/build/commonjs/Carousel/components/index.js +40 -0
  38. package/build/commonjs/Carousel/components/index.js.map +1 -0
  39. package/build/commonjs/Carousel/hooks/index.js +64 -0
  40. package/build/commonjs/Carousel/hooks/index.js.map +1 -0
  41. package/build/commonjs/Carousel/hooks/useAutoplayController.js +55 -0
  42. package/build/commonjs/Carousel/hooks/useAutoplayController.js.map +1 -0
  43. package/build/commonjs/Carousel/hooks/useDimensionChangeReaction.js +23 -0
  44. package/build/commonjs/Carousel/hooks/useDimensionChangeReaction.js.map +1 -0
  45. package/build/commonjs/Carousel/hooks/useIndexController.js +70 -0
  46. package/build/commonjs/Carousel/hooks/useIndexController.js.map +1 -0
  47. package/build/commonjs/Carousel/hooks/useItemInterpolation.js +63 -0
  48. package/build/commonjs/Carousel/hooks/useItemInterpolation.js.map +1 -0
  49. package/build/commonjs/Carousel/hooks/useItemVisibilityStore.js +95 -0
  50. package/build/commonjs/Carousel/hooks/useItemVisibilityStore.js.map +1 -0
  51. package/build/commonjs/Carousel/hooks/useLoopedData.js +33 -0
  52. package/build/commonjs/Carousel/hooks/useLoopedData.js.map +1 -0
  53. package/build/commonjs/Carousel/hooks/usePagingAnimation.js +124 -0
  54. package/build/commonjs/Carousel/hooks/usePagingAnimation.js.map +1 -0
  55. package/build/commonjs/Carousel/index.js +16 -2
  56. package/build/commonjs/Carousel/index.js.map +1 -1
  57. package/build/commonjs/Carousel/types.js +7 -0
  58. package/build/commonjs/Carousel/types.js.map +1 -0
  59. package/build/commonjs/ComicViewer/ComicViewer.js +16 -11
  60. package/build/commonjs/ComicViewer/ComicViewer.js.map +1 -1
  61. package/build/commonjs/ComicViewer/ComicViewerItemProps.js.map +1 -1
  62. package/build/commonjs/ComicViewer/ComicViewerProps.js.map +1 -1
  63. package/build/commonjs/ComicViewer/ViewerItem.js +4 -3
  64. package/build/commonjs/ComicViewer/ViewerItem.js.map +1 -1
  65. package/build/commonjs/ComicViewer/index.js.map +1 -1
  66. package/build/commonjs/DateTimePicker/DateTimePicker.js +2 -2
  67. package/build/commonjs/DateTimePicker/DateTimePicker.js.map +1 -1
  68. package/build/commonjs/DateTimePicker/DateTimePickerProps.js.map +1 -1
  69. package/build/commonjs/DateTimePicker/DateTimePickerProvider.js.map +1 -1
  70. package/build/commonjs/DateTimePicker/YearPicker.js +21 -17
  71. package/build/commonjs/DateTimePicker/YearPicker.js.map +1 -1
  72. package/build/commonjs/DateTimePicker/index.js +4 -4
  73. package/build/commonjs/DateTimePicker/index.js.map +1 -1
  74. package/build/commonjs/DateTimePicker/utils.js +2 -1
  75. package/build/commonjs/DateTimePicker/utils.js.map +1 -1
  76. package/build/commonjs/FlipCard/FlipCard.js +7 -13
  77. package/build/commonjs/FlipCard/FlipCard.js.map +1 -1
  78. package/build/commonjs/FlipCard/FlipCardProps.js.map +1 -1
  79. package/build/commonjs/FlipCard/index.js.map +1 -1
  80. package/build/commonjs/StatusBarProvider/Provider.js +1 -1
  81. package/build/commonjs/StatusBarProvider/Provider.js.map +1 -1
  82. package/build/commonjs/StatusBarProvider/StatusBarProvider.js.map +1 -1
  83. package/build/commonjs/StatusBarProvider/StatusBarProviderProps.js.map +1 -1
  84. package/build/commonjs/StatusBarProvider/index.js.map +1 -1
  85. package/build/commonjs/ViewPager/ChildrenMemoizedPage.js +86 -21
  86. package/build/commonjs/ViewPager/ChildrenMemoizedPage.js.map +1 -1
  87. package/build/commonjs/ViewPager/PageStateContext.js +22 -0
  88. package/build/commonjs/ViewPager/PageStateContext.js.map +1 -0
  89. package/build/commonjs/ViewPager/ViewPagerNative.js +61 -38
  90. package/build/commonjs/ViewPager/ViewPagerNative.js.map +1 -1
  91. package/build/commonjs/ViewPager/ViewPagerProps.js.map +1 -1
  92. package/build/commonjs/ViewPager/ViewPagerWeb.js +35 -26
  93. package/build/commonjs/ViewPager/ViewPagerWeb.js.map +1 -1
  94. package/build/commonjs/ViewPager/index.js +8 -0
  95. package/build/commonjs/ViewPager/index.js.map +1 -1
  96. package/build/commonjs/ViewPager/index.native.js +8 -0
  97. package/build/commonjs/ViewPager/index.native.js.map +1 -1
  98. package/build/commonjs/ViewPager/utils.js +5 -39
  99. package/build/commonjs/ViewPager/utils.js.map +1 -1
  100. package/build/commonjs/ViewabilityTrackerView/Viewability.js +2 -0
  101. package/build/commonjs/ViewabilityTrackerView/Viewability.js.map +1 -0
  102. package/build/commonjs/ViewabilityTrackerView/ViewabilityTrackerView.js +45 -0
  103. package/build/commonjs/ViewabilityTrackerView/ViewabilityTrackerView.js.map +1 -0
  104. package/build/commonjs/ViewabilityTrackerView/ViewabilityTrackerViewProps.js +2 -0
  105. package/build/commonjs/ViewabilityTrackerView/ViewabilityTrackerViewProps.js.map +1 -0
  106. package/build/commonjs/{Carousel/index.native.js → ViewabilityTrackerView/index.js} +3 -3
  107. package/build/commonjs/ViewabilityTrackerView/index.js.map +1 -0
  108. package/build/commonjs/ViewabilityTrackerView/measureViewability.js +42 -0
  109. package/build/commonjs/ViewabilityTrackerView/measureViewability.js.map +1 -0
  110. package/build/commonjs/ViewabilityTrackerView/useViewabilityTracker.js +88 -0
  111. package/build/commonjs/ViewabilityTrackerView/useViewabilityTracker.js.map +1 -0
  112. package/build/commonjs/hooks/index.js +16 -0
  113. package/build/commonjs/hooks/index.js.map +1 -1
  114. package/build/commonjs/hooks/useAppbarStyles.js.map +1 -1
  115. package/build/commonjs/hooks/useDeferredExecutor.js +45 -0
  116. package/build/commonjs/hooks/useDeferredExecutor.js.map +1 -0
  117. package/build/commonjs/hooks/useElevationStyle.js.map +1 -1
  118. package/build/commonjs/hooks/useHeight.js +5 -4
  119. package/build/commonjs/hooks/useHeight.js.map +1 -1
  120. package/build/commonjs/hooks/useIsMounted.js +22 -0
  121. package/build/commonjs/hooks/useIsMounted.js.map +1 -0
  122. package/build/commonjs/hooks/useUnstableCollapsibleAppBar.js +56 -57
  123. package/build/commonjs/hooks/useUnstableCollapsibleAppBar.js.map +1 -1
  124. package/build/commonjs/hooks/useUnstableToggleDisplayStyle.js +9 -11
  125. package/build/commonjs/hooks/useUnstableToggleDisplayStyle.js.map +1 -1
  126. package/build/commonjs/index.js +28 -7
  127. package/build/commonjs/index.js.map +1 -1
  128. package/build/module/AnimatedY/AnimatedY.js +11 -10
  129. package/build/module/AnimatedY/AnimatedY.js.map +1 -1
  130. package/build/module/AnimatedY/AnimatedYProps.js.map +1 -1
  131. package/build/module/AnimatedY/index.js.map +1 -1
  132. package/build/module/BottomSheet/BottomSheetNative.js +1 -1
  133. package/build/module/BottomSheet/BottomSheetNative.js.map +1 -1
  134. package/build/module/BottomSheet/BottomSheetProps.js.map +1 -1
  135. package/build/module/BottomSheet/BottomSheetWeb.js +2 -6
  136. package/build/module/BottomSheet/BottomSheetWeb.js.map +1 -1
  137. package/build/module/BottomSheet/TransparentBackdrop.js +1 -1
  138. package/build/module/BottomSheet/TransparentBackdrop.js.map +1 -1
  139. package/build/module/BottomSheet/index.js.map +1 -1
  140. package/build/module/BottomSheet/index.native.js.map +1 -1
  141. package/build/module/Carousel/Carousel.js +115 -0
  142. package/build/module/Carousel/Carousel.js.map +1 -0
  143. package/build/module/Carousel/CarouselProps.js.map +1 -1
  144. package/build/module/Carousel/animation/animationUtils.js +2 -0
  145. package/build/module/Carousel/animation/animationUtils.js.map +1 -0
  146. package/build/module/Carousel/animation/createDefaultItemStyle.js +3 -0
  147. package/build/module/Carousel/animation/createDefaultItemStyle.js.map +1 -0
  148. package/build/module/Carousel/animation/createDefaultScrollAnimation.js +11 -0
  149. package/build/module/Carousel/animation/createDefaultScrollAnimation.js.map +1 -0
  150. package/build/module/Carousel/animation/index.js +5 -0
  151. package/build/module/Carousel/animation/index.js.map +1 -0
  152. package/build/module/Carousel/animation/normalItemStyleFactory.js +18 -0
  153. package/build/module/Carousel/animation/normalItemStyleFactory.js.map +1 -0
  154. package/build/module/Carousel/animation/parallaxItemStyleFactory.js +55 -0
  155. package/build/module/Carousel/animation/parallaxItemStyleFactory.js.map +1 -0
  156. package/build/module/Carousel/components/InternalContext.js +19 -0
  157. package/build/module/Carousel/components/InternalContext.js.map +1 -0
  158. package/build/module/Carousel/components/ItemView.js +44 -0
  159. package/build/module/Carousel/components/ItemView.js.map +1 -0
  160. package/build/module/Carousel/components/RootView.js +47 -0
  161. package/build/module/Carousel/components/RootView.js.map +1 -0
  162. package/build/module/Carousel/components/ScrollViewGesture.js +62 -0
  163. package/build/module/Carousel/components/ScrollViewGesture.js.map +1 -0
  164. package/build/module/Carousel/components/index.js +5 -0
  165. package/build/module/Carousel/components/index.js.map +1 -0
  166. package/build/module/Carousel/hooks/index.js +8 -0
  167. package/build/module/Carousel/hooks/index.js.map +1 -0
  168. package/build/module/Carousel/hooks/useAutoplayController.js +45 -0
  169. package/build/module/Carousel/hooks/useAutoplayController.js.map +1 -0
  170. package/build/module/Carousel/hooks/useDimensionChangeReaction.js +14 -0
  171. package/build/module/Carousel/hooks/useDimensionChangeReaction.js.map +1 -0
  172. package/build/module/Carousel/hooks/useIndexController.js +54 -0
  173. package/build/module/Carousel/hooks/useIndexController.js.map +1 -0
  174. package/build/module/Carousel/hooks/useItemInterpolation.js +51 -0
  175. package/build/module/Carousel/hooks/useItemInterpolation.js.map +1 -0
  176. package/build/module/Carousel/hooks/useItemVisibilityStore.js +87 -0
  177. package/build/module/Carousel/hooks/useItemVisibilityStore.js.map +1 -0
  178. package/build/module/Carousel/hooks/useLoopedData.js +24 -0
  179. package/build/module/Carousel/hooks/useLoopedData.js.map +1 -0
  180. package/build/module/Carousel/hooks/usePagingAnimation.js +115 -0
  181. package/build/module/Carousel/hooks/usePagingAnimation.js.map +1 -0
  182. package/build/module/Carousel/index.js +2 -1
  183. package/build/module/Carousel/index.js.map +1 -1
  184. package/build/module/Carousel/types.js +3 -0
  185. package/build/module/Carousel/types.js.map +1 -0
  186. package/build/module/ComicViewer/ComicViewer.js +16 -11
  187. package/build/module/ComicViewer/ComicViewer.js.map +1 -1
  188. package/build/module/ComicViewer/ComicViewerItemProps.js.map +1 -1
  189. package/build/module/ComicViewer/ComicViewerProps.js.map +1 -1
  190. package/build/module/ComicViewer/ViewerItem.js +4 -3
  191. package/build/module/ComicViewer/ViewerItem.js.map +1 -1
  192. package/build/module/ComicViewer/index.js.map +1 -1
  193. package/build/module/DateTimePicker/DateTimePicker.js +2 -2
  194. package/build/module/DateTimePicker/DateTimePicker.js.map +1 -1
  195. package/build/module/DateTimePicker/DateTimePickerProps.js.map +1 -1
  196. package/build/module/DateTimePicker/DateTimePickerProvider.js.map +1 -1
  197. package/build/module/DateTimePicker/YearPicker.js +21 -17
  198. package/build/module/DateTimePicker/YearPicker.js.map +1 -1
  199. package/build/module/DateTimePicker/index.js.map +1 -1
  200. package/build/module/DateTimePicker/utils.js +2 -1
  201. package/build/module/DateTimePicker/utils.js.map +1 -1
  202. package/build/module/FlipCard/FlipCard.js +7 -7
  203. package/build/module/FlipCard/FlipCard.js.map +1 -1
  204. package/build/module/FlipCard/FlipCardProps.js.map +1 -1
  205. package/build/module/FlipCard/index.js.map +1 -1
  206. package/build/module/StatusBarProvider/Provider.js.map +1 -1
  207. package/build/module/StatusBarProvider/StatusBarProvider.js.map +1 -1
  208. package/build/module/StatusBarProvider/StatusBarProviderProps.js.map +1 -1
  209. package/build/module/StatusBarProvider/index.js.map +1 -1
  210. package/build/module/ViewPager/ChildrenMemoizedPage.js +80 -23
  211. package/build/module/ViewPager/ChildrenMemoizedPage.js.map +1 -1
  212. package/build/module/ViewPager/PageStateContext.js +10 -0
  213. package/build/module/ViewPager/PageStateContext.js.map +1 -0
  214. package/build/module/ViewPager/ViewPagerNative.js +57 -33
  215. package/build/module/ViewPager/ViewPagerNative.js.map +1 -1
  216. package/build/module/ViewPager/ViewPagerProps.js.map +1 -1
  217. package/build/module/ViewPager/ViewPagerWeb.js +29 -24
  218. package/build/module/ViewPager/ViewPagerWeb.js.map +1 -1
  219. package/build/module/ViewPager/index.js +1 -0
  220. package/build/module/ViewPager/index.js.map +1 -1
  221. package/build/module/ViewPager/index.native.js +1 -0
  222. package/build/module/ViewPager/index.native.js.map +1 -1
  223. package/build/module/ViewPager/utils.js +2 -31
  224. package/build/module/ViewPager/utils.js.map +1 -1
  225. package/build/module/ViewabilityTrackerView/Viewability.js +2 -0
  226. package/build/module/ViewabilityTrackerView/Viewability.js.map +1 -0
  227. package/build/module/ViewabilityTrackerView/ViewabilityTrackerView.js +28 -0
  228. package/build/module/ViewabilityTrackerView/ViewabilityTrackerView.js.map +1 -0
  229. package/build/module/ViewabilityTrackerView/ViewabilityTrackerViewProps.js +2 -0
  230. package/build/module/ViewabilityTrackerView/ViewabilityTrackerViewProps.js.map +1 -0
  231. package/build/module/ViewabilityTrackerView/index.js +2 -0
  232. package/build/module/ViewabilityTrackerView/index.js.map +1 -0
  233. package/build/module/ViewabilityTrackerView/measureViewability.js +34 -0
  234. package/build/module/ViewabilityTrackerView/measureViewability.js.map +1 -0
  235. package/build/module/ViewabilityTrackerView/useViewabilityTracker.js +73 -0
  236. package/build/module/ViewabilityTrackerView/useViewabilityTracker.js.map +1 -0
  237. package/build/module/hooks/index.js +2 -0
  238. package/build/module/hooks/index.js.map +1 -1
  239. package/build/module/hooks/useAppbarStyles.js.map +1 -1
  240. package/build/module/hooks/useDeferredExecutor.js +33 -0
  241. package/build/module/hooks/useDeferredExecutor.js.map +1 -0
  242. package/build/module/hooks/useElevationStyle.js.map +1 -1
  243. package/build/module/hooks/useHeight.js +4 -3
  244. package/build/module/hooks/useHeight.js.map +1 -1
  245. package/build/module/hooks/useIsMounted.js +13 -0
  246. package/build/module/hooks/useIsMounted.js.map +1 -0
  247. package/build/module/hooks/useUnstableCollapsibleAppBar.js +58 -43
  248. package/build/module/hooks/useUnstableCollapsibleAppBar.js.map +1 -1
  249. package/build/module/hooks/useUnstableToggleDisplayStyle.js +9 -7
  250. package/build/module/hooks/useUnstableToggleDisplayStyle.js.map +1 -1
  251. package/build/module/index.js +2 -0
  252. package/build/module/index.js.map +1 -1
  253. package/build/typescript/AnimatedY/AnimatedY.d.ts +0 -1
  254. package/build/typescript/BottomSheet/BottomSheetNative.d.ts +0 -1
  255. package/build/typescript/BottomSheet/BottomSheetWeb.d.ts +0 -1
  256. package/build/typescript/BottomSheet/TransparentBackdrop.d.ts +0 -1
  257. package/build/typescript/Carousel/Carousel.d.ts +5 -0
  258. package/build/typescript/Carousel/CarouselProps.d.ts +32 -48
  259. package/build/typescript/Carousel/animation/animationUtils.d.ts +1 -0
  260. package/build/typescript/Carousel/animation/createDefaultItemStyle.d.ts +2 -0
  261. package/build/typescript/Carousel/animation/createDefaultScrollAnimation.d.ts +2 -0
  262. package/build/typescript/Carousel/animation/index.d.ts +4 -0
  263. package/build/typescript/Carousel/animation/normalItemStyleFactory.d.ts +2 -0
  264. package/build/typescript/Carousel/animation/parallaxItemStyleFactory.d.ts +9 -0
  265. package/build/typescript/Carousel/components/InternalContext.d.ts +14 -0
  266. package/build/typescript/Carousel/components/ItemView.d.ts +7 -0
  267. package/build/typescript/Carousel/components/RootView.d.ts +16 -0
  268. package/build/typescript/Carousel/components/ScrollViewGesture.d.ts +12 -0
  269. package/build/typescript/Carousel/components/index.d.ts +4 -0
  270. package/build/typescript/Carousel/hooks/index.d.ts +7 -0
  271. package/build/typescript/Carousel/hooks/useAutoplayController.d.ts +7 -0
  272. package/build/typescript/Carousel/hooks/useDimensionChangeReaction.d.ts +7 -0
  273. package/build/typescript/Carousel/hooks/useIndexController.d.ts +10 -0
  274. package/build/typescript/Carousel/hooks/useItemInterpolation.d.ts +2 -0
  275. package/build/typescript/Carousel/hooks/useItemVisibilityStore.d.ts +7 -0
  276. package/build/typescript/Carousel/hooks/useLoopedData.d.ts +1 -0
  277. package/build/typescript/Carousel/hooks/usePagingAnimation.d.ts +18 -0
  278. package/build/typescript/Carousel/index.d.ts +3 -1
  279. package/build/typescript/Carousel/types.d.ts +57 -0
  280. package/build/typescript/ComicViewer/ComicViewer.d.ts +0 -1
  281. package/build/typescript/DateTimePicker/DateTimePicker.d.ts +0 -1
  282. package/build/typescript/DateTimePicker/YearPicker.d.ts +0 -1
  283. package/build/typescript/FlipCard/FlipCard.d.ts +0 -1
  284. package/build/typescript/StatusBarProvider/StatusBarProvider.d.ts +0 -1
  285. package/build/typescript/ViewPager/ChildrenMemoizedPage.d.ts +2 -1
  286. package/build/typescript/ViewPager/PageStateContext.d.ts +7 -0
  287. package/build/typescript/ViewPager/ViewPagerNative.d.ts +4 -2
  288. package/build/typescript/ViewPager/ViewPagerProps.d.ts +31 -19
  289. package/build/typescript/ViewPager/ViewPagerWeb.d.ts +4 -2
  290. package/build/typescript/ViewPager/index.d.ts +2 -1
  291. package/build/typescript/ViewPager/index.native.d.ts +1 -0
  292. package/build/typescript/ViewPager/utils.d.ts +3 -19
  293. package/build/typescript/ViewabilityTrackerView/Viewability.d.ts +3 -0
  294. package/build/typescript/ViewabilityTrackerView/ViewabilityTrackerView.d.ts +2 -0
  295. package/build/typescript/ViewabilityTrackerView/ViewabilityTrackerViewProps.d.ts +22 -0
  296. package/build/typescript/ViewabilityTrackerView/index.d.ts +2 -0
  297. package/build/typescript/ViewabilityTrackerView/measureViewability.d.ts +11 -0
  298. package/build/typescript/ViewabilityTrackerView/useViewabilityTracker.d.ts +11 -0
  299. package/build/typescript/hooks/index.d.ts +2 -0
  300. package/build/typescript/hooks/useDeferredExecutor.d.ts +11 -0
  301. package/build/typescript/hooks/useIsMounted.d.ts +4 -0
  302. package/build/typescript/hooks/useUnstableCollapsibleAppBar.d.ts +2 -3
  303. package/build/typescript/hooks/useUnstableToggleDisplayStyle.d.ts +2 -2
  304. package/build/typescript/index.d.ts +2 -0
  305. package/package.json +12 -27
  306. package/src/AnimatedY/AnimatedY.tsx +13 -10
  307. package/src/Carousel/Carousel.tsx +151 -0
  308. package/src/Carousel/CarouselProps.ts +34 -53
  309. package/src/Carousel/animation/animationUtils.ts +1 -0
  310. package/src/Carousel/animation/createDefaultItemStyle.ts +3 -0
  311. package/src/Carousel/animation/createDefaultScrollAnimation.ts +13 -0
  312. package/src/Carousel/animation/index.ts +4 -0
  313. package/src/Carousel/animation/normalItemStyleFactory.ts +19 -0
  314. package/src/Carousel/animation/parallaxItemStyleFactory.ts +79 -0
  315. package/src/Carousel/components/InternalContext.ts +33 -0
  316. package/src/Carousel/components/ItemView.tsx +56 -0
  317. package/src/Carousel/components/RootView.tsx +66 -0
  318. package/src/Carousel/components/ScrollViewGesture.tsx +80 -0
  319. package/src/Carousel/components/index.ts +4 -0
  320. package/src/Carousel/hooks/index.ts +7 -0
  321. package/src/Carousel/hooks/useAutoplayController.ts +54 -0
  322. package/src/Carousel/hooks/useDimensionChangeReaction.ts +25 -0
  323. package/src/Carousel/hooks/useIndexController.tsx +76 -0
  324. package/src/Carousel/hooks/useItemInterpolation.ts +107 -0
  325. package/src/Carousel/hooks/useItemVisibilityStore.ts +107 -0
  326. package/src/Carousel/hooks/useLoopedData.ts +26 -0
  327. package/src/Carousel/hooks/usePagingAnimation.ts +148 -0
  328. package/src/Carousel/index.ts +4 -2
  329. package/src/Carousel/types.ts +67 -0
  330. package/src/DateTimePicker/DateTimePicker.tsx +2 -2
  331. package/src/FlipCard/FlipCard.tsx +8 -8
  332. package/src/ViewPager/ChildrenMemoizedPage.tsx +97 -23
  333. package/src/ViewPager/PageStateContext.ts +15 -0
  334. package/src/ViewPager/ViewPagerNative.tsx +72 -36
  335. package/src/ViewPager/ViewPagerProps.ts +33 -19
  336. package/src/ViewPager/ViewPagerWeb.tsx +38 -29
  337. package/src/ViewPager/index.native.ts +1 -0
  338. package/src/ViewPager/index.ts +2 -1
  339. package/src/ViewPager/utils.tsx +4 -56
  340. package/src/ViewabilityTrackerView/Viewability.ts +3 -0
  341. package/src/ViewabilityTrackerView/ViewabilityTrackerView.tsx +33 -0
  342. package/src/ViewabilityTrackerView/ViewabilityTrackerViewProps.ts +25 -0
  343. package/src/ViewabilityTrackerView/index.ts +2 -0
  344. package/src/ViewabilityTrackerView/measureViewability.ts +56 -0
  345. package/src/ViewabilityTrackerView/useViewabilityTracker.ts +85 -0
  346. package/src/hooks/index.ts +2 -0
  347. package/src/hooks/useDeferredExecutor.ts +46 -0
  348. package/src/hooks/useHeight.ts +2 -2
  349. package/src/hooks/useIsMounted.ts +19 -0
  350. package/src/hooks/useUnstableCollapsibleAppBar.ts +59 -42
  351. package/src/hooks/useUnstableToggleDisplayStyle.ts +8 -6
  352. package/src/index.ts +3 -0
  353. package/build/commonjs/Carousel/CarouselNative.js +0 -72
  354. package/build/commonjs/Carousel/CarouselNative.js.map +0 -1
  355. package/build/commonjs/Carousel/CarouselWeb.js +0 -237
  356. package/build/commonjs/Carousel/CarouselWeb.js.map +0 -1
  357. package/build/commonjs/Carousel/index.native.js.map +0 -1
  358. package/build/commonjs/Carousel/utils.js +0 -19
  359. package/build/commonjs/Carousel/utils.js.map +0 -1
  360. package/build/commonjs/hooks/useWidth.js +0 -29
  361. package/build/commonjs/hooks/useWidth.js.map +0 -1
  362. package/build/module/Carousel/CarouselNative.js +0 -54
  363. package/build/module/Carousel/CarouselNative.js.map +0 -1
  364. package/build/module/Carousel/CarouselWeb.js +0 -215
  365. package/build/module/Carousel/CarouselWeb.js.map +0 -1
  366. package/build/module/Carousel/index.native.js +0 -2
  367. package/build/module/Carousel/index.native.js.map +0 -1
  368. package/build/module/Carousel/utils.js +0 -7
  369. package/build/module/Carousel/utils.js.map +0 -1
  370. package/build/module/hooks/useWidth.js +0 -15
  371. package/build/module/hooks/useWidth.js.map +0 -1
  372. package/build/typescript/Carousel/CarouselNative.d.ts +0 -3
  373. package/build/typescript/Carousel/CarouselWeb.d.ts +0 -4
  374. package/build/typescript/Carousel/index.native.d.ts +0 -1
  375. package/build/typescript/Carousel/utils.d.ts +0 -6
  376. package/build/typescript/hooks/useWidth.d.ts +0 -2
  377. package/src/Carousel/CarouselNative.tsx +0 -67
  378. package/src/Carousel/CarouselWeb.tsx +0 -222
  379. package/src/Carousel/index.native.ts +0 -1
  380. package/src/Carousel/utils.ts +0 -11
  381. package/src/hooks/useWidth.ts +0 -17
@@ -1,66 +1,102 @@
1
- import React from 'react';
2
- import RNViewPager, { ViewPagerOnPageSelectedEvent } from '@react-native-community/viewpager';
1
+ import React, { Children, forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from 'react';
2
+ import type { ViewPagerOnPageSelectedEvent } from 'react-native-pager-view';
3
+ import RNViewPager from 'react-native-pager-view';
4
+ import { runOnJS, useAnimatedReaction, useSharedValue } from 'react-native-reanimated';
3
5
  import type ViewPagerProps from './ViewPagerProps';
4
- import {
5
- defaultEnableNeighborPageRerender,
6
- defaultEnableVisibleHint,
7
- defaultLoading,
8
- defaultPageComponent,
9
- usePageRenderer,
10
- } from './utils';
11
-
12
- export default function ViewPager(props: ViewPagerProps) {
6
+ import type { ViewPagerInstance } from './ViewPagerProps';
7
+ import { defaultInitialPage, defaultLoading, defaultOffscreenPageRerenderLimit, defaultPageComponent } from './utils';
8
+
9
+ const ViewPager = forwardRef<ViewPagerInstance, ViewPagerProps>(function ViewPager(props, ref) {
13
10
  const {
14
11
  children,
15
- enableVisibleHint = defaultEnableVisibleHint,
16
- index,
12
+ initialPage = defaultInitialPage,
17
13
  keyboardDismissMode = 'on-drag',
18
14
  loading = defaultLoading,
15
+ offscreenPageRerenderLimit = defaultOffscreenPageRerenderLimit,
19
16
  onChange,
20
17
  pageComponent = defaultPageComponent,
21
- enableNeighborPageRerender = defaultEnableNeighborPageRerender,
22
18
  pageForceRerenderKey,
23
19
  scrollEnabled = true,
24
20
  style,
21
+ UNSTABLE_sharedIndex,
25
22
  } = props;
26
23
 
27
- const indexRef = React.useRef<number>(index);
28
- const pagerRef = React.useRef<RNViewPager | null>(null);
24
+ const fallbackSharedIndex = useSharedValue<number>(initialPage);
29
25
 
30
- const renderer = usePageRenderer({
31
- enableVisibleHint,
32
- index,
33
- loading,
34
- pageComponent,
35
- pageForceRerenderKey,
36
- enableNeighborPageRerender,
37
- });
26
+ const sharedIndex = UNSTABLE_sharedIndex ?? fallbackSharedIndex;
27
+
28
+ const pagerRef = useRef<RNViewPager | null>(null);
29
+
30
+ const animationFrameRef = useRef<number>(NaN);
31
+
32
+ const setPage = useCallback((newIndex: number) => {
33
+ animationFrameRef.current = requestAnimationFrame(() => {
34
+ pagerRef.current?.setPage(newIndex);
35
+ });
36
+ }, []);
38
37
 
39
- const handlePageSelected = React.useCallback((e: ViewPagerOnPageSelectedEvent) => {
40
- indexRef.current = e.nativeEvent.position;
38
+ useEffect(() => {
39
+ return () => {
40
+ if (animationFrameRef.current) {
41
+ cancelAnimationFrame(animationFrameRef.current);
42
+ }
43
+ };
44
+ }, []);
45
+
46
+ useAnimatedReaction(
47
+ () => sharedIndex.value,
48
+ (result) => {
49
+ runOnJS(setPage)(result);
50
+ },
51
+ [setPage],
52
+ );
53
+
54
+ const handlePageSelected = useCallback((e: ViewPagerOnPageSelectedEvent) => {
55
+ const currentIndex = sharedIndex.value;
56
+ const nextIndex = e.nativeEvent.position;
57
+
58
+ if (currentIndex === nextIndex) {
59
+ return;
60
+ }
61
+
62
+ sharedIndex.value = nextIndex;
41
63
 
42
64
  if (onChange) {
43
- onChange(indexRef.current);
65
+ onChange(nextIndex);
44
66
  }
45
67
  }, [onChange]);
46
68
 
47
- React.useEffect(() => {
48
- if (index !== indexRef.current) {
49
- pagerRef.current?.setPage(index);
50
- }
51
- }, [index]);
69
+ useImperativeHandle(
70
+ ref,
71
+ () => ({ setPage }),
72
+ [setPage],
73
+ );
74
+
75
+ const PageComponent = pageComponent;
52
76
 
53
77
  return (
54
78
  <RNViewPager
55
- initialPage={index}
79
+ ref={pagerRef}
80
+ initialPage={initialPage}
56
81
  keyboardDismissMode={keyboardDismissMode}
57
82
  onPageSelected={handlePageSelected}
58
83
  pageMargin={8}
59
- ref={pagerRef}
60
84
  scrollEnabled={scrollEnabled}
61
85
  style={style}
62
86
  >
63
- {renderer(children)}
87
+ {Children.map(children, (child, index) => (
88
+ <PageComponent
89
+ key={index}
90
+ children={child}
91
+ index={index}
92
+ loading={loading}
93
+ offscreenPageRerenderLimit={offscreenPageRerenderLimit}
94
+ rerenderKey={pageForceRerenderKey}
95
+ sharedIndex={sharedIndex}
96
+ />
97
+ ))}
64
98
  </RNViewPager>
65
99
  );
66
- };
100
+ });
101
+
102
+ export default ViewPager;
@@ -1,41 +1,43 @@
1
- import React from 'react';
1
+ import type { ComponentType, PropsWithChildren, ReactNode, Ref } from 'react';
2
2
  import type { ViewProps } from 'react-native';
3
+ import type { SharedValue } from 'react-native-reanimated';
3
4
  import type { ComponentProps } from '@fountain-ui/core';
4
5
 
5
6
  export type KeyboardDismissMode = 'none' | 'on-drag';
6
7
 
7
- export type PageProps = React.PropsWithChildren<ViewProps> & {
8
- isNeighbor: boolean;
9
- isVisible: boolean;
10
- rerenderKey?: any;
8
+ export type PageProps = PropsWithChildren<ViewProps> & {
9
+ index: number;
10
+ loading: ViewPagerProps['loading'];
11
+ offscreenPageRerenderLimit: number;
12
+ sharedIndex: SharedValue<number>;
13
+ rerenderKey?: ViewPagerProps['pageForceRerenderKey'];
11
14
  };
12
15
 
13
- export type PageComponent = React.ComponentType<PageProps>;
16
+ export type PageComponent = ComponentType<PageProps>;
14
17
 
15
18
  export type Loading = 'lazy' | 'eager';
16
19
 
17
- export default interface ViewPagerProps extends ComponentProps<{
20
+ export interface ViewPagerInstance {
18
21
  /**
19
- * Collection of ViewPager components.
22
+ * Function to scroll to a specific page in the ViewPager. Invalid index is ignored.
23
+ * @param index
20
24
  */
21
- children?: React.ReactNode;
25
+ setPage: (index: number) => void;
26
+ }
22
27
 
23
- /**
24
- * If `true`, enable page visible hint.
25
- * @default false
26
- */
27
- enableVisibleHint?: boolean;
28
+ export default interface ViewPagerProps extends ComponentProps<{
29
+ ref?: Ref<ViewPagerInstance>;
28
30
 
29
31
  /**
30
- * If `true`, Based on the current index, the pages on the left and right are also rerender.
31
- * @default false
32
+ * Collection of ViewPager components.
32
33
  */
33
- enableNeighborPageRerender?: boolean;
34
+ children?: ReactNode;
34
35
 
35
36
  /**
36
- * A number representing the index of the active page.
37
+ * Index of initial page that should be selected.
38
+ * @default 0
37
39
  */
38
- index: number,
40
+ initialPage?: number;
39
41
 
40
42
  /**
41
43
  * Whether to load the page immediately (`eager`) or on an as-needed basis (`lazy`).
@@ -43,6 +45,13 @@ export default interface ViewPagerProps extends ComponentProps<{
43
45
  */
44
46
  loading?: Loading;
45
47
 
48
+ /**
49
+ * Mobile only. The number of pages that should be re-rendered to either side of the current page.
50
+ * Changing this value after the component mount has no effect.
51
+ * @default 0
52
+ */
53
+ offscreenPageRerenderLimit?: number;
54
+
46
55
  /**
47
56
  * Callback fired when an index is changed.
48
57
  */
@@ -70,4 +79,9 @@ export default interface ViewPagerProps extends ComponentProps<{
70
79
  * @default 'on-drag'
71
80
  */
72
81
  keyboardDismissMode?: KeyboardDismissMode;
82
+
83
+ /**
84
+ * Unstable API.
85
+ */
86
+ UNSTABLE_sharedIndex?: SharedValue<number>;
73
87
  }> {}
@@ -1,13 +1,10 @@
1
- import React from 'react';
2
- import { StyleSheet, View } from 'react-native';
1
+ import React, { Children, forwardRef, useImperativeHandle, useCallback } from 'react';
2
+ import { View } from 'react-native';
3
+ import { useSharedValue } from 'react-native-reanimated';
4
+ import { StyleSheet } from '@fountain-ui/core';
3
5
  import type ViewPagerProps from './ViewPagerProps';
4
- import {
5
- defaultEnableNeighborPageRerender,
6
- defaultEnableVisibleHint,
7
- defaultLoading,
8
- defaultPageComponent,
9
- usePageRenderer,
10
- } from './utils';
6
+ import type { ViewPagerInstance } from './ViewPagerProps';
7
+ import { defaultInitialPage, defaultLoading, defaultPageComponent } from './utils';
11
8
 
12
9
  const styles = StyleSheet.create({
13
10
  root: {
@@ -15,38 +12,50 @@ const styles = StyleSheet.create({
15
12
  overflow: 'auto',
16
13
  position: 'relative',
17
14
  },
18
- none: { display: 'none' },
19
15
  });
20
16
 
21
- export default function ViewPager(props: ViewPagerProps) {
17
+ const ViewPager = forwardRef<ViewPagerInstance, ViewPagerProps>(function ViewPager(props, ref) {
22
18
  const {
23
19
  children,
24
- enableVisibleHint = defaultEnableVisibleHint,
25
- enableNeighborPageRerender = defaultEnableNeighborPageRerender,
26
- index,
20
+ initialPage = defaultInitialPage,
27
21
  loading = defaultLoading,
28
22
  pageComponent = defaultPageComponent,
29
23
  pageForceRerenderKey,
30
24
  style,
25
+ UNSTABLE_sharedIndex,
31
26
  } = props;
32
27
 
33
- const renderer = usePageRenderer({
34
- enableVisibleHint,
35
- enableNeighborPageRerender,
36
- index,
37
- loading,
38
- pageComponent,
39
- pageForceRerenderKey,
40
- });
28
+ const fallbackSharedIndex = useSharedValue<number>(initialPage);
29
+
30
+ const sharedIndex = UNSTABLE_sharedIndex ?? fallbackSharedIndex;
31
+
32
+ const setPage = useCallback((newIndex: number) => {
33
+ sharedIndex.value = newIndex;
34
+ }, [sharedIndex]);
35
+
36
+ useImperativeHandle(
37
+ ref,
38
+ () => ({ setPage }),
39
+ [setPage],
40
+ );
41
+
42
+ const PageComponent = pageComponent;
41
43
 
42
44
  return (
43
45
  <View style={[styles.root, style]}>
44
- {React.Children.map(renderer(children), (child, i) =>
45
- React.cloneElement(child as React.ReactElement, {
46
- isVisible: i === index,
47
- style: i !== index ? styles.none : StyleSheet.absoluteFill,
48
- }),
49
- )}
46
+ {Children.map(children, (child, index) => (
47
+ <PageComponent
48
+ key={index}
49
+ children={child}
50
+ index={index}
51
+ loading={loading}
52
+ offscreenPageRerenderLimit={0} // All offscreen pages will not be re-rendered
53
+ rerenderKey={pageForceRerenderKey}
54
+ sharedIndex={sharedIndex}
55
+ />
56
+ ))}
50
57
  </View>
51
58
  );
52
- };
59
+ });
60
+
61
+ export default ViewPager;
@@ -1 +1,2 @@
1
1
  export { default } from './ViewPagerNative';
2
+ export { useViewPagerPageState } from './PageStateContext';
@@ -1,2 +1,3 @@
1
1
  export { default } from './ViewPagerWeb';
2
- export type { default as ViewPagerProps } from './ViewPagerProps';
2
+ export type { default as ViewPagerProps, ViewPagerInstance } from './ViewPagerProps';
3
+ export { useViewPagerPageState } from './PageStateContext';
@@ -1,62 +1,10 @@
1
- import React from 'react';
2
- import ViewPagerProps, { Loading, PageComponent } from './ViewPagerProps';
1
+ import { Loading, PageComponent } from './ViewPagerProps';
3
2
  import ChildrenMemoizedPage from './ChildrenMemoizedPage';
4
3
 
5
- export interface PageState {
6
- visited?: boolean;
7
- }
8
-
9
- export interface PageRenderOption {
10
- enableVisibleHint: boolean;
11
- enableNeighborPageRerender: boolean;
12
- index: number;
13
- loading: Loading;
14
- pageComponent: PageComponent;
15
- pageForceRerenderKey?: any;
16
- }
17
-
18
- export interface PageRenderer {
19
- (children: ViewPagerProps['children']): React.ReactNode;
20
- }
21
-
22
- export const defaultEnableVisibleHint: boolean = false;
23
-
24
- export const defaultEnableNeighborPageRerender: boolean = false;
4
+ export const defaultInitialPage: number = 0;
25
5
 
26
6
  export const defaultLoading: Loading = 'lazy';
27
7
 
28
- export const defaultPageComponent: PageComponent = ChildrenMemoizedPage;
29
-
30
- export const usePageRenderer = ({
31
- enableVisibleHint,
32
- index: currentIndex,
33
- loading,
34
- pageComponent: PageComponent,
35
- pageForceRerenderKey,
36
- enableNeighborPageRerender,
37
- }: PageRenderOption): PageRenderer => {
38
- const pagesStateRef = React.useRef<Array<PageState>>([]);
39
-
40
- pagesStateRef.current[currentIndex] = {
41
- ...pagesStateRef.current[currentIndex],
42
- visited: true,
43
- };
44
-
45
- return (children => React.Children.map(children, (child, index) => {
46
- const visited = pagesStateRef.current[index]?.visited ?? false;
47
- const content = (loading === 'eager' || visited) ? child : null;
8
+ export const defaultOffscreenPageRerenderLimit: number = 0;
48
9
 
49
- const isVisible = enableVisibleHint ? (index === currentIndex) : false;
50
- const isNeighborIndex = index === currentIndex - 1 || index === currentIndex + 1;
51
-
52
- return (
53
- <PageComponent
54
- key={index}
55
- children={content}
56
- isNeighbor={enableNeighborPageRerender && isNeighborIndex}
57
- isVisible={isVisible}
58
- rerenderKey={pageForceRerenderKey}
59
- />
60
- );
61
- }));
62
- };
10
+ export const defaultPageComponent: PageComponent = ChildrenMemoizedPage;
@@ -0,0 +1,3 @@
1
+ export default interface Viewability {
2
+ visible: boolean;
3
+ }
@@ -0,0 +1,33 @@
1
+ import React, { useRef } from 'react';
2
+ import { View } from 'react-native';
3
+ import useViewabilityTracker from './useViewabilityTracker';
4
+ import type ViewabilityTrackerViewProps from './ViewabilityTrackerViewProps';
5
+
6
+
7
+ export default function ViewabilityTrackerView(props: ViewabilityTrackerViewProps) {
8
+ const {
9
+ enabled = true,
10
+ measurementIntervalMillis = 1000,
11
+ onViewabilityChange,
12
+ visiblePercentThreshold = 50,
13
+ ...otherProps
14
+ } = props;
15
+
16
+ const viewRef = useRef<View>(null);
17
+
18
+ useViewabilityTracker({
19
+ enabled,
20
+ measurementIntervalMillis,
21
+ onViewabilityChange,
22
+ viewRef,
23
+ visiblePercentThreshold,
24
+ });
25
+
26
+ return (
27
+ <View
28
+ {...otherProps}
29
+ ref={viewRef}
30
+ collapsable={false}
31
+ />
32
+ );
33
+ };
@@ -0,0 +1,25 @@
1
+ import type { ViewProps } from 'react-native';
2
+ import type { OverridableComponentProps } from '@fountain-ui/core';
3
+ import type Viewability from './Viewability';
4
+
5
+ export default interface ViewabilityTrackerViewProps extends OverridableComponentProps<ViewProps, {
6
+ /**
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+
11
+ /**
12
+ * @default 1000
13
+ */
14
+ measurementIntervalMillis?: number;
15
+
16
+ /**
17
+ *
18
+ */
19
+ onViewabilityChange?: (viewability: Viewability) => void;
20
+
21
+ /**
22
+ * @default 50
23
+ */
24
+ visiblePercentThreshold?: number;
25
+ }> {}
@@ -0,0 +1,2 @@
1
+ export { default } from './ViewabilityTrackerView';
2
+ export type { default as ViewabilityTrackerViewProps } from './ViewabilityTrackerViewProps';
@@ -0,0 +1,56 @@
1
+ import type { View } from 'react-native';
2
+
3
+ interface Rect {
4
+ top: number,
5
+ bottom: number;
6
+ left: number;
7
+ right: number;
8
+ }
9
+
10
+ export interface ViewabilityDetail {
11
+ visiblePercent: number;
12
+ }
13
+
14
+ export interface MeasureViewabilityParameters {
15
+ view: View;
16
+ windowWidth: number;
17
+ windowHeight: number;
18
+ onViewabilityDetailMeasured: (detail: ViewabilityDetail) => void;
19
+ }
20
+
21
+ const computeRectSize = (rect: Rect): number =>
22
+ (rect.bottom - rect.top) * (rect.right - rect.left);
23
+
24
+ const normalizePagePosition = (value?: number): number =>
25
+ (value != null && Number.isFinite(value)) ? value : Number.MAX_SAFE_INTEGER;
26
+
27
+ const normalizeViewSize = (size: number): number =>
28
+ Number.isFinite(size) && size > 0 ? size : Number.MAX_SAFE_INTEGER;
29
+
30
+ const clamp = (value: number, min: number, max: number): number =>
31
+ Math.min(Math.max(value, min), max);
32
+
33
+ export default function measureViewability({
34
+ view,
35
+ windowWidth,
36
+ windowHeight,
37
+ onViewabilityDetailMeasured,
38
+ }: MeasureViewabilityParameters) {
39
+ view.measure((x, y, width, height, pageX?: number, pageY?: number) => {
40
+ const safePageX = normalizePagePosition(pageX);
41
+ const safePageY = normalizePagePosition(pageY);
42
+
43
+ const visibleRect: Rect = {
44
+ top: clamp(safePageY, 0, windowHeight),
45
+ bottom: clamp(safePageY + height, 0, windowHeight),
46
+ left: clamp(safePageX, 0, windowWidth),
47
+ right: clamp(safePageX + width, 0, windowWidth),
48
+ };
49
+
50
+ const visibleRectSize = computeRectSize(visibleRect);
51
+ const viewSize = normalizeViewSize(width * height);
52
+ const visiblePercent = Math.round(visibleRectSize / viewSize * 100);
53
+
54
+ onViewabilityDetailMeasured?.({ visiblePercent });
55
+ });
56
+ };
@@ -0,0 +1,85 @@
1
+ import type { RefObject } from 'react';
2
+ import { useEffect, useRef } from 'react';
3
+ import type { View } from 'react-native';
4
+ import { useValidWindowDimensions } from '@fountain-ui/core';
5
+ import { useDeferredExecutor } from '../hooks';
6
+ import type { ViewabilityDetail } from './measureViewability';
7
+ import measureViewability from './measureViewability';
8
+ import type Viewability from './Viewability';
9
+
10
+ export interface ViewabilityTrackerConfig {
11
+ enabled: boolean;
12
+ measurementIntervalMillis: number;
13
+ onViewabilityChange?: (viewability: Viewability) => void;
14
+ viewRef: RefObject<View>;
15
+ visiblePercentThreshold: number;
16
+ }
17
+
18
+ const initialViewability: Readonly<Viewability> = { visible: false };
19
+
20
+ export default function useViewabilityTracker(config: ViewabilityTrackerConfig) {
21
+ const {
22
+ enabled,
23
+ measurementIntervalMillis,
24
+ onViewabilityChange,
25
+ viewRef,
26
+ visiblePercentThreshold,
27
+ } = config;
28
+
29
+ const viewabilityRef = useRef<Viewability>(initialViewability);
30
+
31
+ const executor = useDeferredExecutor();
32
+
33
+ const window = useValidWindowDimensions();
34
+
35
+ const maybeMeasureRecursive = () => {
36
+ if (!enabled) {
37
+ return;
38
+ }
39
+
40
+ const mapViewabilityDetailToViewability = (detail: ViewabilityDetail): Viewability => {
41
+ return { visible: detail.visiblePercent >= visiblePercentThreshold };
42
+ };
43
+
44
+ const isViewabilityEquals = (a: Viewability, b: Viewability): boolean => {
45
+ return a.visible === b.visible;
46
+ };
47
+
48
+ const dispatchViewabilityChanged = (viewability: Viewability) => {
49
+ executor.execute(() => onViewabilityChange?.(viewability));
50
+ };
51
+
52
+ const onViewabilityDetailMeasured = (detail: ViewabilityDetail) => {
53
+ const nextViewability = mapViewabilityDetailToViewability(detail);
54
+
55
+ if (!isViewabilityEquals(viewabilityRef.current, nextViewability)) {
56
+ viewabilityRef.current = nextViewability;
57
+
58
+ dispatchViewabilityChanged(nextViewability);
59
+ }
60
+
61
+ maybeMeasureRecursive();
62
+ };
63
+
64
+ const maybeMeasure = () => {
65
+ if (viewRef.current) {
66
+ measureViewability({
67
+ view: viewRef.current,
68
+ windowWidth: window.width,
69
+ windowHeight: window.height,
70
+ onViewabilityDetailMeasured,
71
+ });
72
+ }
73
+ };
74
+
75
+ executor.execute(maybeMeasure, measurementIntervalMillis);
76
+ };
77
+
78
+ useEffect(() => {
79
+ if (enabled) {
80
+ maybeMeasureRecursive();
81
+ } else {
82
+ executor.cancel();
83
+ }
84
+ }, [enabled]);
85
+ };
@@ -1,3 +1,5 @@
1
+ export { default as useDeferredExecutor } from './useDeferredExecutor';
2
+ export { default as useIsMounted } from './useIsMounted';
1
3
  export { default as useUnstableCollapsibleAppBar } from './useUnstableCollapsibleAppBar';
2
4
  export { default as useUnstableToggleDisplayStyle } from './useUnstableToggleDisplayStyle';
3
5
 
@@ -0,0 +1,46 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ import useIsMounted from './useIsMounted';
3
+
4
+ export interface Runnable {
5
+ (): void;
6
+ }
7
+
8
+ export interface DeferredExecute {
9
+ (runnable: Runnable, delay?: number): void;
10
+ }
11
+
12
+ export interface DeferredExecutor {
13
+ cancel: () => void;
14
+ execute: DeferredExecute;
15
+ }
16
+
17
+ export default function useDeferredExecutor(): DeferredExecutor {
18
+ const isMounted = useIsMounted();
19
+ const timeoutIdRef = useRef<NodeJS.Timer | null>(null);
20
+
21
+ const cancel = useCallback(() => {
22
+ if (timeoutIdRef.current) {
23
+ clearTimeout(timeoutIdRef.current);
24
+ }
25
+ }, []);
26
+
27
+ useEffect(() => {
28
+ return cancel;
29
+ }, []);
30
+
31
+ const execute = useCallback<DeferredExecute>((runnable, delay) => {
32
+ if (!isMounted()) {
33
+ return;
34
+ }
35
+
36
+ cancel();
37
+
38
+ if (Number.isFinite(delay)) {
39
+ timeoutIdRef.current = setTimeout(() => runnable(), delay);
40
+ } else {
41
+ runnable();
42
+ }
43
+ }, []);
44
+
45
+ return { cancel, execute };
46
+ };
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import { ViewProps } from 'react-native';
3
- import Animated from 'react-native-reanimated';
3
+ import { useWorkletCallback } from 'react-native-reanimated';
4
4
 
5
5
  type OnLayoutCallback = ViewProps['onLayout'];
6
6
 
7
7
  export default function useHeight(initialHeight = 0): [number, OnLayoutCallback] {
8
8
  const [height, setHeight] = React.useState<number>(initialHeight);
9
9
 
10
- const onLayout = Animated.useWorkletCallback((e) => {
10
+ const onLayout = useWorkletCallback((e) => {
11
11
  setHeight(e.nativeEvent.layout.height);
12
12
  }, []);
13
13