react-nitro-renderer 0.0.0-stage → 0.0.1-alpha.7

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/Package.swift +104 -0
  3. package/README.md +111 -2
  4. package/Sources/ReactNitroRenderer/Animations/AnimationCurve+toUIAnimationCurve.swift +31 -0
  5. package/Sources/ReactNitroRenderer/Animations/HybridAnimator.swift +36 -0
  6. package/Sources/ReactNitroRenderer/Animations/View+Animations.swift +39 -0
  7. package/Sources/ReactNitroRenderer/Components/HybridLabel.swift +89 -0
  8. package/Sources/ReactNitroRenderer/Components/HybridScrollView.swift +21 -0
  9. package/Sources/ReactNitroRenderer/Components/HybridScrollViewContent.swift +36 -0
  10. package/Sources/ReactNitroRenderer/Components/HybridView.swift +22 -0
  11. package/Sources/ReactNitroRenderer/Components/View.swift +267 -0
  12. package/Sources/ReactNitroRenderer/CustomViewController.swift +36 -0
  13. package/Sources/ReactNitroRenderer/Extensions/Corner+toCACornerMask.swift +16 -0
  14. package/Sources/ReactNitroRenderer/Extensions/CornerCurve+toUICornerCurve.swift +23 -0
  15. package/Sources/ReactNitroRenderer/Extensions/EdgeInsets+UIEdgeInsets.swift +7 -0
  16. package/Sources/ReactNitroRenderer/Extensions/ModifierKey+toUIKeyModifierFlags.swift +31 -0
  17. package/Sources/ReactNitroRenderer/Extensions/Point+CGPoint.swift +15 -0
  18. package/Sources/ReactNitroRenderer/Extensions/UIGestureRecognizerState+toUIGestureRecognizerState.swift +39 -0
  19. package/Sources/ReactNitroRenderer/Gestures/HybridGestureRecognizer.swift +40 -0
  20. package/Sources/ReactNitroRenderer/Gestures/HybridLongPressGestureRecognizer.swift +53 -0
  21. package/Sources/ReactNitroRenderer/Gestures/HybridPanGestureRecognizer.swift +52 -0
  22. package/Sources/ReactNitroRenderer/Gestures/HybridTapGestureRecognizer.swift +42 -0
  23. package/Sources/ReactNitroRenderer/HybridApplication.swift +19 -0
  24. package/Sources/ReactNitroRenderer/HybridScreen.swift +22 -0
  25. package/Sources/ReactNitroRenderer/HybridViewController.swift +66 -0
  26. package/Sources/ReactNitroRenderer/HybridWindow.swift +25 -0
  27. package/Sources/ReactNitroRenderer/HybridWindowScene.swift +16 -0
  28. package/Sources/ReactNitroRenderer/RegisterRootCallback.swift +28 -0
  29. package/Sources/ReactNitroRenderer/RuntimeReloadableAppDelegate.swift +14 -0
  30. package/Sources/ReactNitroRenderer/SafeAreaInsetsListeners.swift +22 -0
  31. package/Sources/ReactNitroRenderer/UIColor+initRGBA.swift +10 -0
  32. package/Sources/ReactNitroRenderer/UIColor+rgba.swift +20 -0
  33. package/Sources/ReactNitroRenderer/ViewController.swift +13 -0
  34. package/Sources/ReactNitroRenderer/Window.swift +12 -0
  35. package/Sources/ReactNitroRenderer/WindowScene.swift +12 -0
  36. package/Sources/ReactNitroRenderer/YGNode.swift +46 -0
  37. package/nitrogen/generated/.gitattributes +1 -0
  38. package/nitrogen/generated/apple/ReactNitroRenderer-Swift-Cxx-Bridge.cpp +376 -0
  39. package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.cpp +9 -0
  40. package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/include/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.h +245 -0
  41. package/nitrogen/generated/apple/ReactNitroRendererAutolinking.cpp +46 -0
  42. package/nitrogen/generated/apple/ReactNitroRendererAutolinking.mm +24 -0
  43. package/nitrogen/generated/apple/c++/AnimationCurve-Swift.cpp +42 -0
  44. package/nitrogen/generated/apple/c++/Corner-Swift.cpp +52 -0
  45. package/nitrogen/generated/apple/c++/CornerCurve-Swift.cpp +46 -0
  46. package/nitrogen/generated/apple/c++/EdgeInsets-Swift.cpp +35 -0
  47. package/nitrogen/generated/apple/c++/Frame-Swift.cpp +35 -0
  48. package/nitrogen/generated/apple/c++/GestureRecognizerState-Swift.cpp +44 -0
  49. package/nitrogen/generated/apple/c++/HybridAnimatorSpecSwift.cpp +53 -0
  50. package/nitrogen/generated/apple/c++/HybridAnimatorSpec_cxx-Swift.cpp +28 -0
  51. package/nitrogen/generated/apple/c++/HybridApplicationSpecSwift.cpp +58 -0
  52. package/nitrogen/generated/apple/c++/HybridApplicationSpec_cxx-Swift.cpp +28 -0
  53. package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpecSwift.cpp +48 -0
  54. package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpec_cxx-Swift.cpp +28 -0
  55. package/nitrogen/generated/apple/c++/HybridLabelSpecSwift.cpp +49 -0
  56. package/nitrogen/generated/apple/c++/HybridLabelSpec_cxx-Swift.cpp +28 -0
  57. package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpecSwift.cpp +85 -0
  58. package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpec_cxx-Swift.cpp +28 -0
  59. package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpecSwift.cpp +89 -0
  60. package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpec_cxx-Swift.cpp +28 -0
  61. package/nitrogen/generated/apple/c++/HybridScreenSpecSwift.cpp +44 -0
  62. package/nitrogen/generated/apple/c++/HybridScreenSpec_cxx-Swift.cpp +28 -0
  63. package/nitrogen/generated/apple/c++/HybridScrollViewContentSpecSwift.cpp +40 -0
  64. package/nitrogen/generated/apple/c++/HybridScrollViewContentSpec_cxx-Swift.cpp +28 -0
  65. package/nitrogen/generated/apple/c++/HybridScrollViewSpecSwift.cpp +40 -0
  66. package/nitrogen/generated/apple/c++/HybridScrollViewSpec_cxx-Swift.cpp +28 -0
  67. package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpecSwift.cpp +67 -0
  68. package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpec_cxx-Swift.cpp +28 -0
  69. package/nitrogen/generated/apple/c++/HybridViewControllerSpecSwift.cpp +91 -0
  70. package/nitrogen/generated/apple/c++/HybridViewControllerSpec_cxx-Swift.cpp +28 -0
  71. package/nitrogen/generated/apple/c++/HybridViewSpecSwift.cpp +231 -0
  72. package/nitrogen/generated/apple/c++/HybridViewSpec_cxx-Swift.cpp +28 -0
  73. package/nitrogen/generated/apple/c++/HybridWindowSceneSpecSwift.cpp +34 -0
  74. package/nitrogen/generated/apple/c++/HybridWindowSceneSpec_cxx-Swift.cpp +28 -0
  75. package/nitrogen/generated/apple/c++/HybridWindowSpecSwift.cpp +53 -0
  76. package/nitrogen/generated/apple/c++/HybridWindowSpec_cxx-Swift.cpp +28 -0
  77. package/nitrogen/generated/apple/c++/ListenerSubscription-Swift.cpp +37 -0
  78. package/nitrogen/generated/apple/c++/ModifierKey-Swift.cpp +52 -0
  79. package/nitrogen/generated/apple/c++/Point-Swift.cpp +33 -0
  80. package/nitrogen/generated/apple/c++/Point3D-Swift.cpp +34 -0
  81. package/nitrogen/generated/apple/c++/Size-Swift.cpp +33 -0
  82. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/ReactNitroRendererAutolinking.hpp +13 -0
  83. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/AnimationCurve-Swift.hpp +23 -0
  84. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Corner-Swift.hpp +23 -0
  85. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/CornerCurve-Swift.hpp +23 -0
  86. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/EdgeInsets-Swift.hpp +23 -0
  87. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Frame-Swift.hpp +23 -0
  88. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/GestureRecognizerState-Swift.hpp +23 -0
  89. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpecSwift.hpp +73 -0
  90. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpec_cxx-Swift.hpp +23 -0
  91. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpecSwift.hpp +74 -0
  92. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpec_cxx-Swift.hpp +23 -0
  93. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpecSwift.hpp +74 -0
  94. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpec_cxx-Swift.hpp +23 -0
  95. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpecSwift.hpp +74 -0
  96. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpec_cxx-Swift.hpp +23 -0
  97. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpecSwift.hpp +82 -0
  98. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpec_cxx-Swift.hpp +23 -0
  99. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpecSwift.hpp +80 -0
  100. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpec_cxx-Swift.hpp +23 -0
  101. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpecSwift.hpp +73 -0
  102. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpec_cxx-Swift.hpp +23 -0
  103. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpecSwift.hpp +72 -0
  104. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpec_cxx-Swift.hpp +23 -0
  105. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpecSwift.hpp +72 -0
  106. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpec_cxx-Swift.hpp +23 -0
  107. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpecSwift.hpp +78 -0
  108. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpec_cxx-Swift.hpp +23 -0
  109. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpecSwift.hpp +77 -0
  110. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpec_cxx-Swift.hpp +23 -0
  111. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpecSwift.hpp +102 -0
  112. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpec_cxx-Swift.hpp +23 -0
  113. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpecSwift.hpp +71 -0
  114. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpec_cxx-Swift.hpp +23 -0
  115. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpecSwift.hpp +74 -0
  116. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpec_cxx-Swift.hpp +23 -0
  117. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ListenerSubscription-Swift.hpp +23 -0
  118. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ModifierKey-Swift.hpp +23 -0
  119. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point-Swift.hpp +23 -0
  120. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point3D-Swift.hpp +23 -0
  121. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ReactNitroRenderer-Swift-Cxx-Umbrella.hpp +69 -0
  122. package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Size-Swift.hpp +23 -0
  123. package/nitrogen/generated/apple/c++/include/module.modulemap +12 -0
  124. package/nitrogen/generated/apple/swift/AnimationCurve.swift +64 -0
  125. package/nitrogen/generated/apple/swift/Callback___ReactNitroRenderer__HybridWindowSpec_cxx___ReactNitroRenderer__HybridWindowSceneSpec_cxx.swift +71 -0
  126. package/nitrogen/generated/apple/swift/Callback_void.swift +60 -0
  127. package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__EdgeInsets.swift +66 -0
  128. package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridLongPressGestureRecognizerSpec_cxx.swift +66 -0
  129. package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridPanGestureRecognizerSpec_cxx.swift +66 -0
  130. package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridTapGestureRecognizerSpec_cxx.swift +66 -0
  131. package/nitrogen/generated/apple/swift/Corner.swift +64 -0
  132. package/nitrogen/generated/apple/swift/CornerCurve.swift +54 -0
  133. package/nitrogen/generated/apple/swift/EdgeInsets.swift +49 -0
  134. package/nitrogen/generated/apple/swift/Frame.swift +49 -0
  135. package/nitrogen/generated/apple/swift/GestureRecognizerState.swift +74 -0
  136. package/nitrogen/generated/apple/swift/HybridAnimatorSpec.swift +67 -0
  137. package/nitrogen/generated/apple/swift/HybridAnimatorSpec_cxx.swift +158 -0
  138. package/nitrogen/generated/apple/swift/HybridApplicationSpec.swift +67 -0
  139. package/nitrogen/generated/apple/swift/HybridApplicationSpec_cxx.swift +160 -0
  140. package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec.swift +67 -0
  141. package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec_cxx.swift +147 -0
  142. package/nitrogen/generated/apple/swift/HybridLabelSpec.swift +66 -0
  143. package/nitrogen/generated/apple/swift/HybridLabelSpec_cxx.swift +157 -0
  144. package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec.swift +70 -0
  145. package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec_cxx.swift +193 -0
  146. package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec.swift +69 -0
  147. package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec_cxx.swift +195 -0
  148. package/nitrogen/generated/apple/swift/HybridScreenSpec.swift +67 -0
  149. package/nitrogen/generated/apple/swift/HybridScreenSpec_cxx.swift +146 -0
  150. package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec.swift +66 -0
  151. package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec_cxx.swift +148 -0
  152. package/nitrogen/generated/apple/swift/HybridScrollViewSpec.swift +66 -0
  153. package/nitrogen/generated/apple/swift/HybridScrollViewSpec_cxx.swift +148 -0
  154. package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec.swift +68 -0
  155. package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec_cxx.swift +175 -0
  156. package/nitrogen/generated/apple/swift/HybridViewControllerSpec.swift +68 -0
  157. package/nitrogen/generated/apple/swift/HybridViewControllerSpec_cxx.swift +185 -0
  158. package/nitrogen/generated/apple/swift/HybridViewSpec.swift +89 -0
  159. package/nitrogen/generated/apple/swift/HybridViewSpec_cxx.swift +335 -0
  160. package/nitrogen/generated/apple/swift/HybridWindowSceneSpec.swift +65 -0
  161. package/nitrogen/generated/apple/swift/HybridWindowSceneSpec_cxx.swift +136 -0
  162. package/nitrogen/generated/apple/swift/HybridWindowSpec.swift +65 -0
  163. package/nitrogen/generated/apple/swift/HybridWindowSpec_cxx.swift +156 -0
  164. package/nitrogen/generated/apple/swift/ListenerSubscription.swift +29 -0
  165. package/nitrogen/generated/apple/swift/ModifierKey.swift +64 -0
  166. package/nitrogen/generated/apple/swift/Point.swift +35 -0
  167. package/nitrogen/generated/apple/swift/Point3D.swift +42 -0
  168. package/nitrogen/generated/apple/swift/Promise___ReactNitroRenderer__HybridWindowSpec_cxx.swift +102 -0
  169. package/nitrogen/generated/apple/swift/Promise_void.swift +100 -0
  170. package/nitrogen/generated/apple/swift/ReactNitroRenderer+ForeignTypeMetadata.swift +34 -0
  171. package/nitrogen/generated/apple/swift/Size.swift +35 -0
  172. package/nitrogen/generated/hybrid-classes.json +144 -0
  173. package/nitrogen/generated/shared/c++/ReactNitroRendererCxxModule.cpp +2 -0
  174. package/nitrogen/generated/shared/c++/include/ReactNitroRenderer/ReactNitroRendererCxxModule.hpp +2 -0
  175. package/nitrogen/generated/shared/javascript/Animator.cjs +19 -0
  176. package/nitrogen/generated/shared/javascript/Animator.d.cts +9 -0
  177. package/nitrogen/generated/shared/javascript/Application.cjs +19 -0
  178. package/nitrogen/generated/shared/javascript/Application.d.cts +9 -0
  179. package/nitrogen/generated/shared/javascript/GestureRecognizer.cjs +19 -0
  180. package/nitrogen/generated/shared/javascript/GestureRecognizer.d.cts +9 -0
  181. package/nitrogen/generated/shared/javascript/Label.cjs +19 -0
  182. package/nitrogen/generated/shared/javascript/Label.d.cts +9 -0
  183. package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.cjs +19 -0
  184. package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.d.cts +9 -0
  185. package/nitrogen/generated/shared/javascript/PanGestureRecognizer.cjs +19 -0
  186. package/nitrogen/generated/shared/javascript/PanGestureRecognizer.d.cts +9 -0
  187. package/nitrogen/generated/shared/javascript/Screen.cjs +19 -0
  188. package/nitrogen/generated/shared/javascript/Screen.d.cts +9 -0
  189. package/nitrogen/generated/shared/javascript/ScrollView.cjs +19 -0
  190. package/nitrogen/generated/shared/javascript/ScrollView.d.cts +9 -0
  191. package/nitrogen/generated/shared/javascript/ScrollViewContent.cjs +19 -0
  192. package/nitrogen/generated/shared/javascript/ScrollViewContent.d.cts +9 -0
  193. package/nitrogen/generated/shared/javascript/TapGestureRecognizer.cjs +19 -0
  194. package/nitrogen/generated/shared/javascript/TapGestureRecognizer.d.cts +9 -0
  195. package/nitrogen/generated/shared/javascript/View.cjs +19 -0
  196. package/nitrogen/generated/shared/javascript/View.d.cts +9 -0
  197. package/nitrogen/generated/shared/javascript/ViewController.cjs +19 -0
  198. package/nitrogen/generated/shared/javascript/ViewController.d.cts +9 -0
  199. package/nitrogen/generated/shared/javascript/Window.cjs +19 -0
  200. package/nitrogen/generated/shared/javascript/Window.d.cts +9 -0
  201. package/nitrogen/generated/shared/javascript/WindowScene.cjs +19 -0
  202. package/nitrogen/generated/shared/javascript/WindowScene.d.cts +9 -0
  203. package/package.json +42 -4
  204. package/src/NitroRendererHostConfig.ts +396 -0
  205. package/src/PropSetter.ts +29 -0
  206. package/src/StylePropSetters.ts +145 -0
  207. package/src/ViewPropSetters.ts +33 -0
  208. package/src/ViewRegistry.ts +47 -0
  209. package/src/YogaPropSetters.ts +347 -0
  210. package/src/components/ScrollView.tsx +30 -0
  211. package/src/components/ScrollViewContent.tsx +12 -0
  212. package/src/components/Text.tsx +34 -0
  213. package/src/components/View.ts +33 -0
  214. package/src/contexts/RootContext.ts +5 -0
  215. package/src/getViewYogaNode.ts +9 -0
  216. package/src/hooks/useRootContext.ts +11 -0
  217. package/src/hooks/useSafeAreaInsets.ts +36 -0
  218. package/src/hybrids.ts +9 -0
  219. package/src/index.ts +30 -0
  220. package/src/registerApp.ts +22 -0
  221. package/src/renderRoot.ts +44 -0
  222. package/src/specs/Animations/AnimationCurve.ts +6 -0
  223. package/src/specs/Animations/Animator.nitro.ts +16 -0
  224. package/src/specs/Application.nitro.ts +20 -0
  225. package/src/specs/Corner.ts +1 -0
  226. package/src/specs/EdgeInsets.ts +13 -0
  227. package/src/specs/Frame.ts +6 -0
  228. package/src/specs/Gestures/GestureRecognizer.nitro.ts +26 -0
  229. package/src/specs/Gestures/LongPressGestureRecognizer.nitro.ts +26 -0
  230. package/src/specs/Gestures/PanGestureRecognizer.nitro.ts +33 -0
  231. package/src/specs/Gestures/TapGestureRecognizer.nitro.ts +20 -0
  232. package/src/specs/Label.nitro.ts +16 -0
  233. package/src/specs/ListenerSubscription.ts +3 -0
  234. package/src/specs/Screen.nitro.ts +16 -0
  235. package/src/specs/ScrollView.nitro.ts +14 -0
  236. package/src/specs/ScrollViewContent.nitro.ts +14 -0
  237. package/src/specs/Size.ts +4 -0
  238. package/src/specs/View.nitro.ts +112 -0
  239. package/src/specs/ViewController.nitro.ts +29 -0
  240. package/src/specs/Window.nitro.ts +20 -0
  241. package/src/specs/WindowScene.nitro.ts +15 -0
  242. package/src/types/ReactNitroReconcilerHostConfig.ts +44 -0
  243. package/src/types/ReactRoot.ts +5 -0
  244. package/src/types/StrictMap.ts +6 -0
  245. package/src/types/ViewPropsUpdater.ts +30 -0
  246. package/src/types/YogaStyleProps.ts +47 -0
  247. package/src/utils/arePropArraysEqual.ts +18 -0
@@ -0,0 +1,19 @@
1
+ ///
2
+ /// ViewController.cjs
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ const { NitroModules } = require('nitro-core')
9
+
10
+ let hybridClass
11
+
12
+ module.exports = {
13
+ get ViewController() {
14
+ if (hybridClass === undefined) {
15
+ hybridClass = NitroModules.getHybridClass('renderer.ViewController')
16
+ }
17
+ return hybridClass
18
+ },
19
+ }
@@ -0,0 +1,9 @@
1
+ ///
2
+ /// ViewController.d.cts
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ // The spec's `export declare class ViewController` types this runtime export.
9
+ export {}
@@ -0,0 +1,19 @@
1
+ ///
2
+ /// Window.cjs
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ const { NitroModules } = require('nitro-core')
9
+
10
+ let hybridClass
11
+
12
+ module.exports = {
13
+ get Window() {
14
+ if (hybridClass === undefined) {
15
+ hybridClass = NitroModules.getHybridClass('renderer.Window')
16
+ }
17
+ return hybridClass
18
+ },
19
+ }
@@ -0,0 +1,9 @@
1
+ ///
2
+ /// Window.d.cts
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ // The spec's `export declare class Window` types this runtime export.
9
+ export {}
@@ -0,0 +1,19 @@
1
+ ///
2
+ /// WindowScene.cjs
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ const { NitroModules } = require('nitro-core')
9
+
10
+ let hybridClass
11
+
12
+ module.exports = {
13
+ get WindowScene() {
14
+ if (hybridClass === undefined) {
15
+ hybridClass = NitroModules.getHybridClass('renderer.WindowScene')
16
+ }
17
+ return hybridClass
18
+ },
19
+ }
@@ -0,0 +1,9 @@
1
+ ///
2
+ /// WindowScene.d.cts
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ // The spec's `export declare class WindowScene` types this runtime export.
9
+ export {}
package/package.json CHANGED
@@ -1,6 +1,44 @@
1
1
  {
2
2
  "name": "react-nitro-renderer",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.0.1-alpha.7",
4
+ "dependencies": {
5
+ "nitro-core": "1.0.0-alpha.nightly.105.g69d365fc9b18",
6
+ "react": "19.3.0",
7
+ "react-nitro-yoga": "0.0.1-alpha.7",
8
+ "react-nitro-runtime": "0.0.1-alpha.7",
9
+ "react-reconciler": "0.34.0",
10
+ "@types/react-reconciler": "0.33.0"
11
+ },
12
+ "publishConfig": {
13
+ "tag": "latest",
14
+ "access": "public"
15
+ },
16
+ "module": "src/index.ts",
17
+ "type": "module",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./src/index.ts",
21
+ "default": "./src/index.ts"
22
+ },
23
+ "./hybrids": {
24
+ "types": "./src/hybrids.ts",
25
+ "default": "./src/hybrids.ts"
26
+ },
27
+ "./package.json": "./package.json"
28
+ },
29
+ "imports": {
30
+ "#nitro/*": "./nitrogen/generated/shared/javascript/*.cjs"
31
+ },
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/margelo/react-nitro.git",
36
+ "directory": "packages/react-nitro-renderer"
37
+ },
38
+ "files": [
39
+ "src",
40
+ "Package.swift",
41
+ "Sources",
42
+ "nitrogen/generated"
43
+ ]
44
+ }
@@ -0,0 +1,396 @@
1
+ import createReconciler from "react-reconciler";
2
+ import type {
3
+ YGNodeRef,
4
+ } from "react-nitro-yoga";
5
+
6
+ import type {
7
+ ReactNitroReconcilerHostConfig,
8
+ ReconcilerElementType,
9
+ ReconcilerProps,
10
+ } from "./types/ReactNitroReconcilerHostConfig";
11
+ import { DefaultEventPriority } from "react-reconciler/constants";
12
+ import type { View } from "./specs/View.nitro";
13
+ import { viewRegistry } from "./ViewRegistry";
14
+ import { getViewYogaNode } from "./getViewYogaNode";
15
+ import { arePropArraysEqual } from "./utils/arePropArraysEqual";
16
+
17
+ // React's host callbacks don't preserve the relationship between type, props,
18
+ // and instance. Erase it only here; React pairs each instance with its host type.
19
+ const reconcilerViewRegistry = viewRegistry as {
20
+ factories: Partial<
21
+ Record<ReconcilerElementType, (props: ReconcilerProps) => View>
22
+ >;
23
+ propSetters: Partial<
24
+ Record<
25
+ ReconcilerElementType,
26
+ Record<string, (view: View, propValue: unknown, previousPropValue?: unknown) => void>
27
+ >
28
+ >;
29
+ };
30
+
31
+ export function createNitroRenderer(rootView: View) {
32
+ let currentUpdatePriority = DefaultEventPriority;
33
+
34
+ const yogaNodeToViewMap = new Map<YGNodeRef, View>();
35
+ const yogaRootNode = getViewYogaNode(rootView);
36
+ yogaNodeToViewMap.set(yogaRootNode, rootView);
37
+ // TODO: i guess the root node can change its dimensions (e.g. iPhone Duo / landscape orientation)
38
+ const rootFrame = rootView.getFrame();
39
+ yoga.YGNodeStyleSetWidth(yogaRootNode, rootFrame.width);
40
+ yoga.YGNodeStyleSetHeight(yogaRootNode, rootFrame.height);
41
+
42
+ const HostConfig: ReactNitroReconcilerHostConfig = {
43
+ // As react is running on the UI thread, we can use mutation mode directly!
44
+ supportsMutation: true,
45
+ // If mutation is true, this has to be false
46
+ supportsPersistence: false,
47
+ // For now we just try to roll with react's own queueMicrotask implementation instead of building our own scheduler
48
+ supportsMicrotasks: true,
49
+ // This is a standalone renderer, not build on top of any other react renderer:
50
+ isPrimaryRenderer: true,
51
+ // TODO: false for now, but check if we can use this as a performance optimization, e.g. for first frame rendering after an app restart
52
+ supportsHydration: false,
53
+
54
+ // TODO: is there an optimization chance in passing props directly in the view constructor? this could avoid optional prop's boxing
55
+ createInstance(type, props) {
56
+ const viewFactory = reconcilerViewRegistry.factories[type];
57
+ if (viewFactory == null) {
58
+ throw new Error(`No view registered for type: ${type}`);
59
+ }
60
+ const viewInstance = viewFactory(props);
61
+ const yogaNode = getViewYogaNode(viewInstance);
62
+ yogaNodeToViewMap.set(yogaNode, viewInstance);
63
+
64
+ updatePropsOnView(viewInstance, type, props);
65
+ return viewInstance;
66
+ },
67
+
68
+ createTextInstance() {
69
+ throw new Error(
70
+ `This should never be reached as we use the performance optimized shouldSetTextContent. Have you passed string as a children to a non-text component?`,
71
+ );
72
+ },
73
+
74
+ shouldSetTextContent(type) {
75
+ if (type === "Text") {
76
+ return true;
77
+ }
78
+ return false;
79
+ },
80
+ resetTextContent(_instance) {
81
+ throw new Error(
82
+ "This should never be reached, as text components stay as text in ReactNitro.",
83
+ );
84
+ },
85
+ commitTextUpdate(textInstance, _oldText, newText) {
86
+ textInstance.text = newText;
87
+ },
88
+
89
+ appendInitialChild: appendChild,
90
+
91
+ appendChild,
92
+
93
+ appendChildToContainer(container, child) {
94
+ appendChild(container.rootView, child);
95
+ },
96
+
97
+ insertBefore,
98
+
99
+ insertInContainerBefore(container, child, beforeChild) {
100
+ insertBefore(container.rootView, child, beforeChild);
101
+ },
102
+
103
+ removeChild(parentInstance, child) {
104
+ parentInstance.removeChild(child);
105
+ const parentYogaNode = getViewYogaNode(parentInstance);
106
+ const childYogaNode = getViewYogaNode(child);
107
+ globalThis.yoga.YGNodeRemoveChild(parentYogaNode, childYogaNode);
108
+ },
109
+
110
+ removeChildFromContainer(container, child) {
111
+ container.rootView.removeChild(child);
112
+ const parentYogaNode = getViewYogaNode(container.rootView);
113
+ const childYogaNode = getViewYogaNode(child);
114
+ globalThis.yoga.YGNodeRemoveChild(parentYogaNode, childYogaNode);
115
+ },
116
+
117
+ detachDeletedInstance(instance) {
118
+ const yogaNode = getViewYogaNode(instance);
119
+ yogaNodeToViewMap.delete(yogaNode);
120
+ // TODO: eagerly "gc", figure out if this is a good idea performance wise
121
+ // TODO: disabled for now, measure memory impact of this!
122
+ // instance.dispose();
123
+ },
124
+
125
+ clearContainer(container) {
126
+ const rootYogaNode = getViewYogaNode(container.rootView);
127
+ const childCount = globalThis.yoga.YGNodeGetChildCount(rootYogaNode);
128
+ for (let index = childCount - 1; index >= 0; index--) {
129
+ const childYogaNode = globalThis.yoga.YGNodeGetChild(rootYogaNode, index);
130
+ const child = yogaNodeToViewMap.get(childYogaNode);
131
+ if (child == null) {
132
+ throw new Error("View not found for yoga node");
133
+ }
134
+ container.rootView.removeChild(child);
135
+ globalThis.yoga.YGNodeRemoveChild(rootYogaNode, childYogaNode);
136
+ }
137
+ },
138
+
139
+ finalizeInitialChildren() {
140
+ // Called when the render phase is finishing (next is committing it).
141
+ // Returning false for now as at this point i don't see that there is any additional work we'd like to do.
142
+ return false;
143
+ },
144
+
145
+ getRootHostContext() {
146
+ return null; // not sure if we are going to use that anywhere
147
+ },
148
+ getChildHostContext(parentHostContext) {
149
+ return parentHostContext; // returning parent means opting out
150
+ },
151
+
152
+ getPublicInstance(instance) {
153
+ return instance;
154
+ },
155
+
156
+ prepareForCommit() {
157
+ return null;
158
+ },
159
+ resetAfterCommit(container) {
160
+ // called right after React has performed the tree mutations, but before layout effects
161
+
162
+ // Calculate the layout
163
+ const start = performance.now();
164
+ const rootView = container.rootView;
165
+ const rootViewNode = getViewYogaNode(rootView);
166
+ const { width, height } = rootView.getFrame();
167
+ globalThis.yoga.YGNodeCalculateLayout(
168
+ rootViewNode,
169
+ width,
170
+ height,
171
+ yoga.YGDirectionLTR,
172
+ );
173
+ // Iterate over all dirty nodes and update the corresponding views with the calculated layout.
174
+ const end = performance.now();
175
+ console.log(`Layout calculation took ${end - start} ms`);
176
+ applyLayout(rootViewNode);
177
+ console.log(`Layout application took ${performance.now() - end} ms`);
178
+ },
179
+ commitUpdate(instance, type, prevProps, nextProps) {
180
+ updatePropsOnView(instance, type, nextProps, prevProps);
181
+ },
182
+
183
+ preparePortalMount() {
184
+ // not used in ReactNitro yet
185
+ },
186
+
187
+ scheduleTimeout(fn, delay) {
188
+ return setTimeout(fn, delay ?? 0);
189
+ },
190
+ cancelTimeout(id) {
191
+ clearTimeout(id);
192
+ },
193
+ noTimeout: -1,
194
+
195
+ //#region scheduling
196
+ setCurrentUpdatePriority(priority) {
197
+ currentUpdatePriority = priority;
198
+ },
199
+ getCurrentUpdatePriority() {
200
+ return currentUpdatePriority;
201
+ },
202
+ resolveUpdatePriority() {
203
+ return currentUpdatePriority;
204
+ },
205
+ scheduleMicrotask(fn) {
206
+ return globalThis.queueMicrotask(fn);
207
+ },
208
+ shouldAttemptEagerTransition() {
209
+ // whether React should try rendering the current event’s transition synchronously.
210
+ // returning true would force always sync rendering, maybe interesting to consider (basically disabling interrupted rendering phase)
211
+ return false;
212
+ },
213
+ // react's scheduler performance tracking
214
+ trackSchedulerEvent() {},
215
+ resolveEventTimeStamp() {
216
+ return performance.now();
217
+ },
218
+ resolveEventType() {
219
+ return null;
220
+ },
221
+ requestPostPaintCallback() {
222
+ // used for scheduling tracing
223
+ },
224
+ //#endregion
225
+
226
+ //#region suspension
227
+ maySuspendCommit() {
228
+ return false;
229
+ },
230
+ preloadInstance() {
231
+ return false;
232
+ },
233
+ startSuspendingCommit() {},
234
+ suspendInstance() {},
235
+ waitForCommitToBeReady() {
236
+ return null;
237
+ },
238
+ //#endregion
239
+
240
+ //#region not sure what those methods are yet
241
+ getInstanceFromNode() {
242
+ throw new Error("TODO: called getInstanceFromNode");
243
+ },
244
+ beforeActiveInstanceBlur() {},
245
+ afterActiveInstanceBlur() {},
246
+ prepareScopeUpdate() {
247
+ throw new Error("TODO: called prepareScopeUpdate");
248
+ },
249
+ getInstanceFromScope() {
250
+ throw new Error("TODO: called getInstanceFromScope");
251
+ },
252
+ //#endregion
253
+
254
+ //#region irrelevant for mobile
255
+ resetFormInstance() {},
256
+ NotPendingTransition: null,
257
+ HostTransitionContext: {
258
+ $$typeof: Symbol.for("react.context"),
259
+ // @ts-expect-error Wrongly typed, null is fine here
260
+ Provider: null,
261
+ // @ts-expect-error Wrongly typed, null is fine here
262
+ Consumer: null,
263
+ _currentValue: null,
264
+ _currentValue2: null,
265
+ _threadCount: 0,
266
+ },
267
+ //#endregion
268
+ };
269
+
270
+ function applyLayout(node: YGNodeRef): void {
271
+ const hasNewLayout = yoga.YGNodeGetHasNewLayout(node);
272
+ if (hasNewLayout === false) {
273
+ return;
274
+ }
275
+
276
+ const x = yoga.YGNodeLayoutGetLeft(node);
277
+ const y = yoga.YGNodeLayoutGetTop(node);
278
+ const width = yoga.YGNodeLayoutGetWidth(node);
279
+ const height = yoga.YGNodeLayoutGetHeight(node);
280
+
281
+ const view = yogaNodeToViewMap.get(node);
282
+ if (view == null) {
283
+ throw new Error("View not found for yoga node");
284
+ }
285
+ view.setFrame({ x, y, width, height });
286
+ yoga.YGNodeSetHasNewLayout(node, false);
287
+
288
+ const childCount = yoga.YGNodeGetChildCount(node);
289
+ for (let index = 0; index < childCount; index++) {
290
+ const child = yoga.YGNodeGetChild(node, index);
291
+ applyLayout(child);
292
+ }
293
+ }
294
+
295
+ return createReconciler(HostConfig);
296
+ }
297
+
298
+ function appendChild(parent: View, child: View): void {
299
+ const parentYogaNode = getViewYogaNode(parent);
300
+ const childYogaNode = getViewYogaNode(child);
301
+ const previousParent = child.parent;
302
+
303
+ parent.appendChild(child);
304
+ detachYogaChild(previousParent, childYogaNode);
305
+ const index = yoga.YGNodeGetChildCount(parentYogaNode);
306
+ yoga.YGNodeInsertChild(parentYogaNode, childYogaNode, index);
307
+ }
308
+
309
+ function insertBefore(parent: View, child: View, beforeChild: View): void {
310
+ const parentYogaNode = getViewYogaNode(parent);
311
+ const childYogaNode = getViewYogaNode(child);
312
+ const beforeChildYogaNode = getViewYogaNode(beforeChild);
313
+ if (childYogaNode === beforeChildYogaNode) {
314
+ return;
315
+ }
316
+
317
+ const childCount = yoga.YGNodeGetChildCount(parentYogaNode);
318
+ let insertionIndex = 0;
319
+ for (let index = 0; index < childCount; index++) {
320
+ const sibling = yoga.YGNodeGetChild(parentYogaNode, index);
321
+ if (sibling === beforeChildYogaNode) {
322
+ const previousParent = child.parent;
323
+ parent.insertBefore(child, beforeChild);
324
+ detachYogaChild(previousParent, childYogaNode);
325
+ yoga.YGNodeInsertChild(parentYogaNode, childYogaNode, insertionIndex);
326
+ return;
327
+ }
328
+ // Moving a child removes its old slot before the insertion takes place.
329
+ if (sibling !== childYogaNode) {
330
+ insertionIndex++;
331
+ }
332
+ }
333
+
334
+ throw new Error("Cannot insert child: beforeChild is not a child of the parent");
335
+ }
336
+
337
+ function detachYogaChild(parent: View | undefined, child: YGNodeRef): void {
338
+ if (parent == null) {
339
+ return;
340
+ }
341
+ const parentYogaNode = getViewYogaNode(parent);
342
+ const owner = yoga.YGNodeGetOwner(child);
343
+ if (owner === parentYogaNode) {
344
+ yoga.YGNodeRemoveChild(parentYogaNode, child);
345
+ }
346
+ }
347
+
348
+ const updatePropsOnView = ((
349
+ view: View,
350
+ type: ReconcilerElementType,
351
+ props: ReconcilerProps,
352
+ prevProps?: ReconcilerProps,
353
+ ) => {
354
+ const propSetters = reconcilerViewRegistry.propSetters[type]
355
+
356
+ // Check if a prop has been removed
357
+ if (prevProps != null) {
358
+ for (const key in prevProps) {
359
+ if (key in props) {
360
+ continue
361
+ }
362
+ if (prevProps[key] === undefined) {
363
+ continue
364
+ }
365
+ // Prop was reset / removed:
366
+ const propSetter = propSetters?.[key]
367
+ if (propSetter != null) {
368
+ propSetter(view, undefined, prevProps[key])
369
+ }
370
+ }
371
+ }
372
+
373
+ // A performance benchmark showed that Hermes favored scanning present keys
374
+ // over Object.keys() allocations or checking every supported prop.
375
+ for (const key in props) {
376
+ const propSetter = propSetters?.[key]
377
+ if (propSetter == null) {
378
+ continue
379
+ }
380
+ const propValue = props[key]
381
+ const previousPropValue = prevProps?.[key]
382
+ if (propValue === previousPropValue) {
383
+ continue
384
+ }
385
+ const isArray = Array.isArray(propValue)
386
+ const wasArray = Array.isArray(previousPropValue)
387
+ if (isArray && wasArray) {
388
+ const sameArray = arePropArraysEqual(propValue, previousPropValue)
389
+ if (sameArray) {
390
+ continue
391
+ }
392
+ }
393
+ propSetter(view, propValue, previousPropValue)
394
+ }
395
+ view.afterUpdate();
396
+ });
@@ -0,0 +1,29 @@
1
+ export type PropSetter<Target, Props extends object> = (
2
+ target: Target,
3
+ props: Props,
4
+ propName: keyof Props,
5
+ previousProps?: Props,
6
+ ) => void;
7
+
8
+ /**
9
+ * Takes an array of prop names, and a setter function.
10
+ * Whenever one of the props in the group changes, the setter function will be called with all props.
11
+ */
12
+ export function groupPropSetter<Target, Props extends object>(
13
+ propNames: readonly (keyof Props)[],
14
+ setter: (target: Target, props: Props) => void,
15
+ ): PropSetter<Target, Props> {
16
+ return (target, props, propName, previousProps) => {
17
+ for (const groupedPropName of propNames) {
18
+ const value = props[groupedPropName];
19
+ const previousValue = previousProps?.[groupedPropName];
20
+ if (value === previousValue) {
21
+ continue;
22
+ }
23
+ if (propName === groupedPropName) {
24
+ setter(target, props);
25
+ }
26
+ return;
27
+ }
28
+ };
29
+ }