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,145 @@
1
+ import type { StyleProps } from "./components/View";
2
+ import type { View } from "./specs/View.nitro";
3
+ import type { StrictMap } from "./types/StrictMap";
4
+ import { groupPropSetter, type PropSetter } from "./PropSetter";
5
+ import { arePropArraysEqual } from "./utils/arePropArraysEqual";
6
+
7
+ type StylePropSetter = PropSetter<View, StyleProps>;
8
+
9
+ const StrictMap: StrictMap<keyof StyleProps, StylePropSetter> = Map;
10
+
11
+ const emptyStyleProps: StyleProps = {};
12
+
13
+ const translationPropSetter = groupPropSetter<View, StyleProps>(
14
+ ["translateX", "translateY", "translateZ"],
15
+ (view, props) => {
16
+ const translateX = props.translateX ?? 0;
17
+ const translateY = props.translateY ?? 0;
18
+ const translateZ = props.translateZ ?? 0;
19
+ view.setTranslation(translateX, translateY, translateZ);
20
+ },
21
+ );
22
+
23
+ const scalePropSetter = groupPropSetter<View, StyleProps>(
24
+ ["scale", "scaleX", "scaleY", "scaleZ"],
25
+ (view, props) => {
26
+ const scale = props.scale ?? 1;
27
+ const scaleX = props.scaleX ?? scale;
28
+ const scaleY = props.scaleY ?? scale;
29
+ const scaleZ = props.scaleZ ?? scale;
30
+ view.setScale(scaleX, scaleY, scaleZ);
31
+ },
32
+ );
33
+
34
+ export const DEFAULTS = {
35
+ opacity: 1,
36
+ cornerRadius: 0,
37
+ cornerCurve: "circular",
38
+ } as const;
39
+
40
+ export const stylePropSetters = new StrictMap([
41
+ [
42
+ "backgroundColor",
43
+ (view, props) => {
44
+ const backgroundColor = props.backgroundColor;
45
+ if (backgroundColor == null) {
46
+ // TODO: Allow clearing backgroundColor when the prop is removed.
47
+ return;
48
+ }
49
+ view.setBackgroundColor(backgroundColor);
50
+ },
51
+ ],
52
+ [
53
+ "opacity",
54
+ (view, props) => {
55
+ view.opacity = props.opacity ?? DEFAULTS.opacity;
56
+ },
57
+ ],
58
+ [
59
+ "borderColor",
60
+ (view, props) => {
61
+ view.setBorderColor(props.borderColor);
62
+ },
63
+ ],
64
+ [
65
+ "cornerRadius",
66
+ (view, props) => {
67
+ view.cornerRadius = props.cornerRadius ?? DEFAULTS.cornerRadius;
68
+ },
69
+ ],
70
+ [
71
+ "maskedCorners",
72
+ (view, props) => {
73
+ view.maskedCorners = props.maskedCorners ?? [
74
+ "topLeft",
75
+ "topRight",
76
+ "bottomLeft",
77
+ "bottomRight",
78
+ ];
79
+ },
80
+ ],
81
+ [
82
+ "cornerCurve",
83
+ (view, props) => {
84
+ view.cornerCurve = props.cornerCurve ?? DEFAULTS.cornerCurve;
85
+ },
86
+ ],
87
+ ["translateX", translationPropSetter],
88
+ ["translateY", translationPropSetter],
89
+ ["translateZ", translationPropSetter],
90
+ ["scale", scalePropSetter],
91
+ ["scaleX", scalePropSetter],
92
+ ["scaleY", scalePropSetter],
93
+ ["scaleZ", scalePropSetter],
94
+ ]);
95
+
96
+ export function applyStyleProps(
97
+ view: View,
98
+ props: StyleProps | undefined,
99
+ previousProps?: StyleProps,
100
+ ): void {
101
+ if (props === previousProps) {
102
+ return;
103
+ }
104
+ const nextProps = props ?? emptyStyleProps;
105
+ let key: keyof StyleProps;
106
+ // A performance benchmark showed that Hermes favored scanning present keys
107
+ // over Object.keys() allocations or checking every supported prop.
108
+ for (key in nextProps) {
109
+ const value = nextProps[key];
110
+ const previousValue = previousProps?.[key];
111
+ if (value === previousValue) {
112
+ continue;
113
+ }
114
+ const isArray = Array.isArray(value);
115
+ const wasArray = Array.isArray(previousValue);
116
+ if (isArray && wasArray) {
117
+ const sameArray = arePropArraysEqual(value, previousValue);
118
+ if (sameArray) {
119
+ continue;
120
+ }
121
+ }
122
+ const setter = stylePropSetters.get(key);
123
+ if (setter === undefined) {
124
+ continue;
125
+ }
126
+ setter(view, nextProps, key, previousProps);
127
+ }
128
+
129
+ // Apply removed style prop values next:
130
+ if (previousProps == null) {
131
+ return;
132
+ }
133
+ for (key in previousProps) {
134
+ if (key in nextProps || previousProps[key] === undefined) {
135
+ continue;
136
+ }
137
+ const setter = stylePropSetters.get(key);
138
+ if (setter === undefined) {
139
+ continue;
140
+ }
141
+ // we always pass the full style object
142
+ // in this case the prop exists on the previousProps but not in nextProps, so the read here will be "undefined"
143
+ setter(view, nextProps, key, previousProps);
144
+ }
145
+ }
@@ -0,0 +1,33 @@
1
+ import { applyYogaProps } from "./YogaPropSetters";
2
+ import { applyStyleProps } from "./StylePropSetters";
3
+ import type { StyleProps } from "./components/View";
4
+ import type { GestureRecognizer } from "./specs/Gestures/GestureRecognizer.nitro";
5
+ import type { YogaStyleProps } from "./types/YogaStyleProps";
6
+ import type { View } from "./specs/View.nitro";
7
+
8
+ export type ViewProps = {
9
+ layout?: YogaStyleProps;
10
+ style?: StyleProps;
11
+
12
+ // Gestures:
13
+ gestureRecognizers?: (view: View) => GestureRecognizer[];
14
+ isUserInteractionEnabled?: boolean
15
+ }
16
+
17
+ export const viewPropsSetters: {
18
+ [propName in keyof ViewProps]: (
19
+ view: View,
20
+ value: ViewProps[propName],
21
+ previousValue?: ViewProps[propName],
22
+ ) => void
23
+ } = {
24
+ layout: applyYogaProps,
25
+ style: applyStyleProps,
26
+ gestureRecognizers: (view, value) => {
27
+ const gestureRecognizers = value?.(view)
28
+ view.setGestureRecognizers(gestureRecognizers)
29
+ },
30
+ isUserInteractionEnabled: (view: View, value?: boolean) => {
31
+ view.isUserInteractionEnabled = value ?? true
32
+ },
33
+ };
@@ -0,0 +1,47 @@
1
+ import type { ComponentType, RefAttributes } from "react";
2
+ import type { ReconcilerElementType } from "./types/ReactNitroReconcilerHostConfig";
3
+ import type { ViewDefinitionMap, ViewPropsMap } from "./types/ViewPropsUpdater";
4
+
5
+ type ViewFactoryMap = {
6
+ [Type in ReconcilerElementType]: (
7
+ props: ViewPropsMap[Type],
8
+ ) => ViewDefinitionMap[Type]["view"];
9
+ };
10
+
11
+ type ViewPropSetterMap = {
12
+ [Type in ReconcilerElementType]: {
13
+ [PropName in keyof ViewPropsMap[Type]]: (
14
+ view: ViewDefinitionMap[Type]["view"],
15
+ propValue: ViewPropsMap[Type][PropName],
16
+ previousPropValue?: ViewPropsMap[Type][PropName],
17
+ ) => void;
18
+ };
19
+ };
20
+
21
+ export const viewRegistry: {
22
+ factories: Partial<ViewFactoryMap>;
23
+ propSetters: {
24
+ [Type in ReconcilerElementType]?: Partial<ViewPropSetterMap[Type]>;
25
+ };
26
+ } = {
27
+ factories: {},
28
+ propSetters: {},
29
+ };
30
+
31
+ type HostComponent<Type extends ReconcilerElementType> = ComponentType<
32
+ ViewPropsMap[Type] & RefAttributes<ViewDefinitionMap[Type]["view"]>
33
+ >;
34
+
35
+ export function registerView<Type extends ReconcilerElementType>(
36
+ type: Type,
37
+ factory: ViewFactoryMap[NoInfer<Type>],
38
+ propSetters?: Partial<ViewPropSetterMap[NoInfer<Type>]>,
39
+ ): HostComponent<Type> {
40
+ viewRegistry.factories[type] = factory;
41
+ if (propSetters != null) {
42
+ viewRegistry.propSetters[type] = propSetters;
43
+ }
44
+
45
+ // the react-reconciler actually takes a plain string for host components, so this type quirk is expected
46
+ return type as unknown as HostComponent<Type>;
47
+ }
@@ -0,0 +1,347 @@
1
+ import type {
2
+ YGAlign,
3
+ YGFlexDirection,
4
+ YGJustify,
5
+ YGNodeRef,
6
+ YGOverflow,
7
+ YGPositionType,
8
+ } from "react-nitro-yoga";
9
+ import type { View } from "./specs/View.nitro";
10
+ import type { StrictMap } from "./types/StrictMap";
11
+ import type { YogaStyleProps } from "./types/YogaStyleProps";
12
+ import { getViewYogaNode } from "./getViewYogaNode";
13
+
14
+ // Map lookups are faster than object/Record lookups in Hermes for these values.
15
+ const positionMap = new Map<YogaStyleProps["position"], YGPositionType>([
16
+ ["static", yoga.YGPositionTypeStatic],
17
+ ["relative", yoga.YGPositionTypeRelative],
18
+ ["absolute", yoga.YGPositionTypeAbsolute],
19
+ ]);
20
+
21
+ const flexDirectionMap = new Map<
22
+ YogaStyleProps["flexDirection"],
23
+ YGFlexDirection
24
+ >([
25
+ ["column", yoga.YGFlexDirectionColumn],
26
+ ["column-reverse", yoga.YGFlexDirectionColumnReverse],
27
+ ["row", yoga.YGFlexDirectionRow],
28
+ ["row-reverse", yoga.YGFlexDirectionRowReverse],
29
+ ]);
30
+
31
+ const alignItemsMap = new Map<YogaStyleProps["alignItems"], YGAlign>([
32
+ ["flex-start", yoga.YGAlignFlexStart],
33
+ ["center", yoga.YGAlignCenter],
34
+ ["flex-end", yoga.YGAlignFlexEnd],
35
+ ["stretch", yoga.YGAlignStretch],
36
+ ["baseline", yoga.YGAlignBaseline],
37
+ ]);
38
+
39
+ // Only alignSelf supports inheriting the parent's alignItems through "auto".
40
+ const alignSelfMap = new Map<YogaStyleProps["alignSelf"], YGAlign>([
41
+ ["auto", yoga.YGAlignAuto],
42
+ ...alignItemsMap,
43
+ ]);
44
+
45
+ const justifyContentMap = new Map<YogaStyleProps["justifyContent"], YGJustify>([
46
+ ["flex-start", yoga.YGJustifyFlexStart],
47
+ ["center", yoga.YGJustifyCenter],
48
+ ["flex-end", yoga.YGJustifyFlexEnd],
49
+ ["space-between", yoga.YGJustifySpaceBetween],
50
+ ["space-around", yoga.YGJustifySpaceAround],
51
+ ["space-evenly", yoga.YGJustifySpaceEvenly],
52
+ ]);
53
+
54
+ const overflowMap = new Map<YogaStyleProps["overflow"], YGOverflow>([
55
+ ["visible", yoga.YGOverflowVisible],
56
+ ["hidden", yoga.YGOverflowHidden],
57
+ ["scroll", yoga.YGOverflowScroll],
58
+ ]);
59
+
60
+ type YogaPropSetter = (yogaNode: YGNodeRef, props: YogaStyleProps, view: View) => void;
61
+
62
+ // Map is used as its faster than using plain object {}!
63
+ const StrictMap: StrictMap<keyof YogaStyleProps, YogaPropSetter> = Map;
64
+
65
+ const emptyYogaProps: YogaStyleProps = {};
66
+
67
+ // Yoga's C API uses NaN to unset scalar and edge values.
68
+ const yogaUndefined = Number.NaN;
69
+
70
+ export const yogaPropSetters = new StrictMap([
71
+ [
72
+ "position",
73
+ (yogaNode, props) => {
74
+ const position = positionMap.get(props.position) ?? yoga.YGPositionTypeRelative;
75
+ yoga.YGNodeStyleSetPositionType(yogaNode, position);
76
+ },
77
+ ],
78
+ [
79
+ "top",
80
+ (yogaNode, props) => {
81
+ const top = props.top ?? yogaUndefined;
82
+ yoga.YGNodeStyleSetPosition(yogaNode, yoga.YGEdgeTop, top);
83
+ },
84
+ ],
85
+ [
86
+ "right",
87
+ (yogaNode, props) => {
88
+ const right = props.right ?? yogaUndefined;
89
+ yoga.YGNodeStyleSetPosition(yogaNode, yoga.YGEdgeRight, right);
90
+ },
91
+ ],
92
+ [
93
+ "bottom",
94
+ (yogaNode, props) => {
95
+ const bottom = props.bottom ?? yogaUndefined;
96
+ yoga.YGNodeStyleSetPosition(yogaNode, yoga.YGEdgeBottom, bottom);
97
+ },
98
+ ],
99
+ [
100
+ "left",
101
+ (yogaNode, props) => {
102
+ const left = props.left ?? yogaUndefined;
103
+ yoga.YGNodeStyleSetPosition(yogaNode, yoga.YGEdgeLeft, left);
104
+ },
105
+ ],
106
+ [
107
+ "flex",
108
+ (yogaNode, props) => {
109
+ const flex = props.flex ?? yogaUndefined;
110
+ yoga.YGNodeStyleSetFlex(yogaNode, flex);
111
+ },
112
+ ],
113
+ [
114
+ "flexDirection",
115
+ (yogaNode, props) => {
116
+ const flexDirection =
117
+ flexDirectionMap.get(props.flexDirection) ?? yoga.YGFlexDirectionColumn;
118
+ yoga.YGNodeStyleSetFlexDirection(yogaNode, flexDirection);
119
+ },
120
+ ],
121
+ [
122
+ "flexShrink",
123
+ (yogaNode, props) => {
124
+ const flexShrink = props.flexShrink ?? yogaUndefined;
125
+ yoga.YGNodeStyleSetFlexShrink(yogaNode, flexShrink);
126
+ },
127
+ ],
128
+ [
129
+ "flexGrow",
130
+ (yogaNode, props) => {
131
+ const flexGrow = props.flexGrow ?? yogaUndefined;
132
+ yoga.YGNodeStyleSetFlexGrow(yogaNode, flexGrow);
133
+ },
134
+ ],
135
+ [
136
+ "justifyContent",
137
+ (yogaNode, props) => {
138
+ const justifyContent =
139
+ justifyContentMap.get(props.justifyContent) ?? yoga.YGJustifyFlexStart;
140
+ yoga.YGNodeStyleSetJustifyContent(yogaNode, justifyContent);
141
+ },
142
+ ],
143
+ [
144
+ "alignItems",
145
+ (yogaNode, props) => {
146
+ const alignItems = alignItemsMap.get(props.alignItems) ?? yoga.YGAlignStretch;
147
+ yoga.YGNodeStyleSetAlignItems(yogaNode, alignItems);
148
+ },
149
+ ],
150
+ [
151
+ "alignSelf",
152
+ (yogaNode, props) => {
153
+ const alignSelf = alignSelfMap.get(props.alignSelf) ?? yoga.YGAlignAuto;
154
+ yoga.YGNodeStyleSetAlignSelf(yogaNode, alignSelf);
155
+ },
156
+ ],
157
+ [
158
+ "width",
159
+ (yogaNode, props) => {
160
+ const width = props.width;
161
+ if (width === undefined) {
162
+ yoga.YGNodeStyleSetWidthAuto(yogaNode);
163
+ } else {
164
+ yoga.YGNodeStyleSetWidth(yogaNode, width);
165
+ }
166
+ },
167
+ ],
168
+ [
169
+ "height",
170
+ (yogaNode, props) => {
171
+ const height = props.height;
172
+ if (height === undefined) {
173
+ yoga.YGNodeStyleSetHeightAuto(yogaNode);
174
+ } else {
175
+ yoga.YGNodeStyleSetHeight(yogaNode, height);
176
+ }
177
+ },
178
+ ],
179
+ [
180
+ "margin",
181
+ (yogaNode, props) => {
182
+ const margin = props.margin ?? yogaUndefined;
183
+ if (margin === "auto") {
184
+ yoga.YGNodeStyleSetMarginAuto(yogaNode, yoga.YGEdgeAll);
185
+ } else {
186
+ yoga.YGNodeStyleSetMargin(yogaNode, yoga.YGEdgeAll, margin);
187
+ }
188
+ },
189
+ ],
190
+ [
191
+ "marginTop",
192
+ (yogaNode, props) => {
193
+ const marginTop = props.marginTop ?? yogaUndefined;
194
+ if (marginTop === "auto") {
195
+ yoga.YGNodeStyleSetMarginAuto(yogaNode, yoga.YGEdgeTop);
196
+ } else {
197
+ yoga.YGNodeStyleSetMargin(yogaNode, yoga.YGEdgeTop, marginTop);
198
+ }
199
+ },
200
+ ],
201
+ [
202
+ "marginBottom",
203
+ (yogaNode, props) => {
204
+ const marginBottom = props.marginBottom ?? yogaUndefined;
205
+ if (marginBottom === "auto") {
206
+ yoga.YGNodeStyleSetMarginAuto(yogaNode, yoga.YGEdgeBottom);
207
+ } else {
208
+ yoga.YGNodeStyleSetMargin(yogaNode, yoga.YGEdgeBottom, marginBottom);
209
+ }
210
+ },
211
+ ],
212
+ [
213
+ "marginLeft",
214
+ (yogaNode, props) => {
215
+ const marginLeft = props.marginLeft ?? yogaUndefined;
216
+ if (marginLeft === "auto") {
217
+ yoga.YGNodeStyleSetMarginAuto(yogaNode, yoga.YGEdgeLeft);
218
+ } else {
219
+ yoga.YGNodeStyleSetMargin(yogaNode, yoga.YGEdgeLeft, marginLeft);
220
+ }
221
+ },
222
+ ],
223
+ [
224
+ "marginRight",
225
+ (yogaNode, props) => {
226
+ const marginRight = props.marginRight ?? yogaUndefined;
227
+ if (marginRight === "auto") {
228
+ yoga.YGNodeStyleSetMarginAuto(yogaNode, yoga.YGEdgeRight);
229
+ } else {
230
+ yoga.YGNodeStyleSetMargin(yogaNode, yoga.YGEdgeRight, marginRight);
231
+ }
232
+ },
233
+ ],
234
+ [
235
+ "padding",
236
+ (yogaNode, props) => {
237
+ const padding = props.padding ?? yogaUndefined;
238
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeAll, padding);
239
+ },
240
+ ],
241
+ [
242
+ "paddingTop",
243
+ (yogaNode, props) => {
244
+ const paddingTop = props.paddingTop ?? yogaUndefined;
245
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeTop, paddingTop);
246
+ },
247
+ ],
248
+ [
249
+ "paddingBottom",
250
+ (yogaNode, props) => {
251
+ const paddingBottom = props.paddingBottom ?? yogaUndefined;
252
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeBottom, paddingBottom);
253
+ },
254
+ ],
255
+ [
256
+ "paddingLeft",
257
+ (yogaNode, props) => {
258
+ const paddingLeft = props.paddingLeft ?? yogaUndefined;
259
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeLeft, paddingLeft);
260
+ },
261
+ ],
262
+ [
263
+ "paddingRight",
264
+ (yogaNode, props) => {
265
+ const paddingRight = props.paddingRight ?? yogaUndefined;
266
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeRight, paddingRight);
267
+ },
268
+ ],
269
+ [
270
+ "paddingHorizontal",
271
+ (yogaNode, props) => {
272
+ const paddingHorizontal = props.paddingHorizontal ?? yogaUndefined;
273
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeHorizontal, paddingHorizontal);
274
+ },
275
+ ],
276
+ [
277
+ "paddingVertical",
278
+ (yogaNode, props) => {
279
+ const paddingVertical = props.paddingVertical ?? yogaUndefined;
280
+ yoga.YGNodeStyleSetPadding(yogaNode, yoga.YGEdgeVertical, paddingVertical);
281
+ },
282
+ ],
283
+ [
284
+ "overflow",
285
+ (yogaNode, props) => {
286
+ const overflow = overflowMap.get(props.overflow) ?? yoga.YGOverflowVisible;
287
+ yoga.YGNodeStyleSetOverflow(yogaNode, overflow);
288
+ },
289
+ ],
290
+ [
291
+ 'borderWidth',
292
+ (yogaNode, props, view) => {
293
+ const borderWidth = props.borderWidth;
294
+ const yogaBorderWidth = borderWidth ?? yogaUndefined;
295
+ yoga.YGNodeStyleSetBorder(yogaNode, yoga.YGEdgeAll, yogaBorderWidth);
296
+ view.borderWidth = borderWidth;
297
+ },
298
+ ],
299
+ ]);
300
+
301
+ export function applyYogaProps(
302
+ view: View,
303
+ props: YogaStyleProps | undefined,
304
+ previousProps?: YogaStyleProps,
305
+ ): void {
306
+ if (props === previousProps) {
307
+ return;
308
+ }
309
+ const nextProps = props ?? emptyYogaProps;
310
+
311
+ let yogaNode: YGNodeRef | undefined;
312
+ let key: keyof YogaStyleProps;
313
+ // A performance benchmark showed that Hermes favored scanning present keys
314
+ // over Object.keys() allocations or checking every supported prop.
315
+ for (key in nextProps) {
316
+ const value = nextProps[key];
317
+ const previousValue = previousProps?.[key];
318
+ if (value === previousValue) {
319
+ continue;
320
+ }
321
+ const setter = yogaPropSetters.get(key);
322
+ if (setter === undefined) {
323
+ continue;
324
+ }
325
+ if (yogaNode === undefined) {
326
+ yogaNode = getViewYogaNode(view);
327
+ }
328
+ setter(yogaNode, nextProps, view);
329
+ }
330
+
331
+ if (previousProps == null) {
332
+ return;
333
+ }
334
+ for (key in previousProps) {
335
+ if (key in nextProps || previousProps[key] === undefined) {
336
+ continue;
337
+ }
338
+ const setter = yogaPropSetters.get(key);
339
+ if (setter === undefined) {
340
+ continue;
341
+ }
342
+ if (yogaNode === undefined) {
343
+ yogaNode = getViewYogaNode(view);
344
+ }
345
+ setter(yogaNode, nextProps, view);
346
+ }
347
+ }
@@ -0,0 +1,30 @@
1
+ import type { YogaStyleProps } from "../types/YogaStyleProps";
2
+ import { ScrollView as ScrollViewHybrid } from "../hybrids";
3
+ import { viewPropsSetters } from "../ViewPropSetters";
4
+ import { registerView } from "../ViewRegistry";
5
+ import type { ViewProps } from "./View";
6
+
7
+ export interface ScrollViewProps extends ViewProps {}
8
+
9
+ const ScrollViewHostComponent = registerView(
10
+ "ScrollView",
11
+ () => new ScrollViewHybrid(),
12
+ { ...viewPropsSetters },
13
+ );
14
+
15
+ const defaultLayout: YogaStyleProps = {
16
+ // w/o this the scroll view view would equal content size, which would prevent it from scrolling
17
+ flex: 1,
18
+ overflow: "hidden",
19
+ };
20
+ export function ScrollView({layout, ...props}: ScrollViewProps) {
21
+ return (
22
+ <ScrollViewHostComponent
23
+ layout={{
24
+ ...defaultLayout,
25
+ ...layout,
26
+ }}
27
+ {...props}
28
+ />
29
+ );
30
+ }
@@ -0,0 +1,12 @@
1
+ import { ScrollViewContent as ScrollViewContentHybrid } from "../hybrids";
2
+ import { viewPropsSetters } from "../ViewPropSetters";
3
+ import { registerView } from "../ViewRegistry";
4
+ import type { ViewProps } from "./View";
5
+
6
+ export interface ScrollViewContentProps extends ViewProps {}
7
+
8
+ export const ScrollViewContent = registerView(
9
+ "ScrollViewContent",
10
+ () => new ScrollViewContentHybrid(),
11
+ viewPropsSetters,
12
+ );
@@ -0,0 +1,34 @@
1
+ import { Label } from "../hybrids";
2
+ import { registerView } from "../ViewRegistry";
3
+ import { viewPropsSetters } from "../ViewPropSetters";
4
+ import type { ViewProps } from "./View";
5
+
6
+ export type TextProps = Omit<ViewProps, "children"> &
7
+ Pick<Label, "text"> & {
8
+ children?: string | string[];
9
+ };
10
+
11
+ export const Text = registerView(
12
+ "Text",
13
+ () => new Label(),
14
+ {
15
+ ...viewPropsSetters,
16
+ text: (view, newText) => {
17
+ view.text = newText;
18
+ },
19
+ children: (view, childrenAsText) => {
20
+ let text = childrenAsText;
21
+ if (Array.isArray(text)) {
22
+ text = text.join('');
23
+ }
24
+ view.text = text;
25
+ },
26
+ gestureRecognizers(view, propValue) {
27
+ const enableInteractions = propValue !== undefined && propValue != null
28
+ // UILabel has gesture recognizers but its user interaction must be enabled explicitly
29
+ view.isUserInteractionEnabled = enableInteractions
30
+ // super:
31
+ viewPropsSetters.gestureRecognizers?.(view, propValue)
32
+ },
33
+ },
34
+ );
@@ -0,0 +1,33 @@
1
+ import { Application } from "../hybrids";
2
+ import { registerView } from "../ViewRegistry";
3
+ import { viewPropsSetters, type ViewProps as ViewPropsFromViewPropSetters } from "../ViewPropSetters";
4
+ import type { PropsWithChildren } from "react";
5
+ import type { View as ViewSpec } from "../specs/View.nitro";
6
+
7
+ export { type ViewSpec }
8
+
9
+ export type TranslationStyleProps = {
10
+ translateX?: number;
11
+ translateY?: number;
12
+ translateZ?: number;
13
+ };
14
+
15
+ export type ScaleStyleProps = {
16
+ scale?: number;
17
+ scaleX?: number;
18
+ scaleY?: number;
19
+ scaleZ?: number;
20
+ };
21
+
22
+ export type StyleProps = Pick<ViewSpec, "backgroundColor" | "borderColor"> &
23
+ Partial<Pick<ViewSpec, "opacity" | "cornerRadius" | "maskedCorners" | "cornerCurve">> &
24
+ TranslationStyleProps &
25
+ ScaleStyleProps;
26
+
27
+ export type ViewProps = PropsWithChildren<ViewPropsFromViewPropSetters>;
28
+
29
+ export const View = registerView(
30
+ "View",
31
+ () => Application.createView(),
32
+ viewPropsSetters,
33
+ );
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react'
2
+ import type { ViewController } from '../specs/ViewController.nitro'
3
+
4
+ /** The view controller hosting the current React rendering root. */
5
+ export const RootContext = createContext<ViewController | undefined>(undefined)
@@ -0,0 +1,9 @@
1
+ import type { YGNodeRef } from "react-nitro-yoga";
2
+ import type { View } from "./specs/View.nitro";
3
+
4
+ export function getViewYogaNode(view: View) {
5
+ // TODO: We can't use the JSIConverter yet with swift,
6
+ // so the yoga node is passed to us as a pointer address as number.
7
+ // But actually tht YGNodeRef type we use with shermes yoga is also just a pointer.
8
+ return view.yogaNodePtr as unknown as YGNodeRef;
9
+ }