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.
- package/LICENSE +21 -0
- package/Package.swift +104 -0
- package/README.md +111 -2
- package/Sources/ReactNitroRenderer/Animations/AnimationCurve+toUIAnimationCurve.swift +31 -0
- package/Sources/ReactNitroRenderer/Animations/HybridAnimator.swift +36 -0
- package/Sources/ReactNitroRenderer/Animations/View+Animations.swift +39 -0
- package/Sources/ReactNitroRenderer/Components/HybridLabel.swift +89 -0
- package/Sources/ReactNitroRenderer/Components/HybridScrollView.swift +21 -0
- package/Sources/ReactNitroRenderer/Components/HybridScrollViewContent.swift +36 -0
- package/Sources/ReactNitroRenderer/Components/HybridView.swift +22 -0
- package/Sources/ReactNitroRenderer/Components/View.swift +267 -0
- package/Sources/ReactNitroRenderer/CustomViewController.swift +36 -0
- package/Sources/ReactNitroRenderer/Extensions/Corner+toCACornerMask.swift +16 -0
- package/Sources/ReactNitroRenderer/Extensions/CornerCurve+toUICornerCurve.swift +23 -0
- package/Sources/ReactNitroRenderer/Extensions/EdgeInsets+UIEdgeInsets.swift +7 -0
- package/Sources/ReactNitroRenderer/Extensions/ModifierKey+toUIKeyModifierFlags.swift +31 -0
- package/Sources/ReactNitroRenderer/Extensions/Point+CGPoint.swift +15 -0
- package/Sources/ReactNitroRenderer/Extensions/UIGestureRecognizerState+toUIGestureRecognizerState.swift +39 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridGestureRecognizer.swift +40 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridLongPressGestureRecognizer.swift +53 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridPanGestureRecognizer.swift +52 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridTapGestureRecognizer.swift +42 -0
- package/Sources/ReactNitroRenderer/HybridApplication.swift +19 -0
- package/Sources/ReactNitroRenderer/HybridScreen.swift +22 -0
- package/Sources/ReactNitroRenderer/HybridViewController.swift +66 -0
- package/Sources/ReactNitroRenderer/HybridWindow.swift +25 -0
- package/Sources/ReactNitroRenderer/HybridWindowScene.swift +16 -0
- package/Sources/ReactNitroRenderer/RegisterRootCallback.swift +28 -0
- package/Sources/ReactNitroRenderer/RuntimeReloadableAppDelegate.swift +14 -0
- package/Sources/ReactNitroRenderer/SafeAreaInsetsListeners.swift +22 -0
- package/Sources/ReactNitroRenderer/UIColor+initRGBA.swift +10 -0
- package/Sources/ReactNitroRenderer/UIColor+rgba.swift +20 -0
- package/Sources/ReactNitroRenderer/ViewController.swift +13 -0
- package/Sources/ReactNitroRenderer/Window.swift +12 -0
- package/Sources/ReactNitroRenderer/WindowScene.swift +12 -0
- package/Sources/ReactNitroRenderer/YGNode.swift +46 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/apple/ReactNitroRenderer-Swift-Cxx-Bridge.cpp +376 -0
- package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.cpp +9 -0
- package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/include/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.h +245 -0
- package/nitrogen/generated/apple/ReactNitroRendererAutolinking.cpp +46 -0
- package/nitrogen/generated/apple/ReactNitroRendererAutolinking.mm +24 -0
- package/nitrogen/generated/apple/c++/AnimationCurve-Swift.cpp +42 -0
- package/nitrogen/generated/apple/c++/Corner-Swift.cpp +52 -0
- package/nitrogen/generated/apple/c++/CornerCurve-Swift.cpp +46 -0
- package/nitrogen/generated/apple/c++/EdgeInsets-Swift.cpp +35 -0
- package/nitrogen/generated/apple/c++/Frame-Swift.cpp +35 -0
- package/nitrogen/generated/apple/c++/GestureRecognizerState-Swift.cpp +44 -0
- package/nitrogen/generated/apple/c++/HybridAnimatorSpecSwift.cpp +53 -0
- package/nitrogen/generated/apple/c++/HybridAnimatorSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridApplicationSpecSwift.cpp +58 -0
- package/nitrogen/generated/apple/c++/HybridApplicationSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpecSwift.cpp +48 -0
- package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridLabelSpecSwift.cpp +49 -0
- package/nitrogen/generated/apple/c++/HybridLabelSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpecSwift.cpp +85 -0
- package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpecSwift.cpp +89 -0
- package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScreenSpecSwift.cpp +44 -0
- package/nitrogen/generated/apple/c++/HybridScreenSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewContentSpecSwift.cpp +40 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewContentSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewSpecSwift.cpp +40 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpecSwift.cpp +67 -0
- package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridViewControllerSpecSwift.cpp +91 -0
- package/nitrogen/generated/apple/c++/HybridViewControllerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridViewSpecSwift.cpp +231 -0
- package/nitrogen/generated/apple/c++/HybridViewSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridWindowSceneSpecSwift.cpp +34 -0
- package/nitrogen/generated/apple/c++/HybridWindowSceneSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridWindowSpecSwift.cpp +53 -0
- package/nitrogen/generated/apple/c++/HybridWindowSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/ListenerSubscription-Swift.cpp +37 -0
- package/nitrogen/generated/apple/c++/ModifierKey-Swift.cpp +52 -0
- package/nitrogen/generated/apple/c++/Point-Swift.cpp +33 -0
- package/nitrogen/generated/apple/c++/Point3D-Swift.cpp +34 -0
- package/nitrogen/generated/apple/c++/Size-Swift.cpp +33 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/ReactNitroRendererAutolinking.hpp +13 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/AnimationCurve-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Corner-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/CornerCurve-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/EdgeInsets-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Frame-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/GestureRecognizerState-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpecSwift.hpp +73 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpecSwift.hpp +82 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpecSwift.hpp +80 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpecSwift.hpp +73 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpecSwift.hpp +72 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpecSwift.hpp +72 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpecSwift.hpp +78 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpecSwift.hpp +77 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpecSwift.hpp +102 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpecSwift.hpp +71 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ListenerSubscription-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ModifierKey-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point3D-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ReactNitroRenderer-Swift-Cxx-Umbrella.hpp +69 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Size-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/module.modulemap +12 -0
- package/nitrogen/generated/apple/swift/AnimationCurve.swift +64 -0
- package/nitrogen/generated/apple/swift/Callback___ReactNitroRenderer__HybridWindowSpec_cxx___ReactNitroRenderer__HybridWindowSceneSpec_cxx.swift +71 -0
- package/nitrogen/generated/apple/swift/Callback_void.swift +60 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__EdgeInsets.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridLongPressGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridPanGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridTapGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Corner.swift +64 -0
- package/nitrogen/generated/apple/swift/CornerCurve.swift +54 -0
- package/nitrogen/generated/apple/swift/EdgeInsets.swift +49 -0
- package/nitrogen/generated/apple/swift/Frame.swift +49 -0
- package/nitrogen/generated/apple/swift/GestureRecognizerState.swift +74 -0
- package/nitrogen/generated/apple/swift/HybridAnimatorSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridAnimatorSpec_cxx.swift +158 -0
- package/nitrogen/generated/apple/swift/HybridApplicationSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridApplicationSpec_cxx.swift +160 -0
- package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec_cxx.swift +147 -0
- package/nitrogen/generated/apple/swift/HybridLabelSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridLabelSpec_cxx.swift +157 -0
- package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec.swift +70 -0
- package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec_cxx.swift +193 -0
- package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec.swift +69 -0
- package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec_cxx.swift +195 -0
- package/nitrogen/generated/apple/swift/HybridScreenSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridScreenSpec_cxx.swift +146 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec_cxx.swift +148 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewSpec_cxx.swift +148 -0
- package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec.swift +68 -0
- package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec_cxx.swift +175 -0
- package/nitrogen/generated/apple/swift/HybridViewControllerSpec.swift +68 -0
- package/nitrogen/generated/apple/swift/HybridViewControllerSpec_cxx.swift +185 -0
- package/nitrogen/generated/apple/swift/HybridViewSpec.swift +89 -0
- package/nitrogen/generated/apple/swift/HybridViewSpec_cxx.swift +335 -0
- package/nitrogen/generated/apple/swift/HybridWindowSceneSpec.swift +65 -0
- package/nitrogen/generated/apple/swift/HybridWindowSceneSpec_cxx.swift +136 -0
- package/nitrogen/generated/apple/swift/HybridWindowSpec.swift +65 -0
- package/nitrogen/generated/apple/swift/HybridWindowSpec_cxx.swift +156 -0
- package/nitrogen/generated/apple/swift/ListenerSubscription.swift +29 -0
- package/nitrogen/generated/apple/swift/ModifierKey.swift +64 -0
- package/nitrogen/generated/apple/swift/Point.swift +35 -0
- package/nitrogen/generated/apple/swift/Point3D.swift +42 -0
- package/nitrogen/generated/apple/swift/Promise___ReactNitroRenderer__HybridWindowSpec_cxx.swift +102 -0
- package/nitrogen/generated/apple/swift/Promise_void.swift +100 -0
- package/nitrogen/generated/apple/swift/ReactNitroRenderer+ForeignTypeMetadata.swift +34 -0
- package/nitrogen/generated/apple/swift/Size.swift +35 -0
- package/nitrogen/generated/hybrid-classes.json +144 -0
- package/nitrogen/generated/shared/c++/ReactNitroRendererCxxModule.cpp +2 -0
- package/nitrogen/generated/shared/c++/include/ReactNitroRenderer/ReactNitroRendererCxxModule.hpp +2 -0
- package/nitrogen/generated/shared/javascript/Animator.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Animator.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Application.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Application.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/GestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/GestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Label.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Label.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/PanGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/PanGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Screen.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Screen.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ScrollView.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ScrollView.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ScrollViewContent.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ScrollViewContent.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/TapGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/TapGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/View.cjs +19 -0
- package/nitrogen/generated/shared/javascript/View.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ViewController.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ViewController.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Window.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Window.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/WindowScene.cjs +19 -0
- package/nitrogen/generated/shared/javascript/WindowScene.d.cts +9 -0
- package/package.json +42 -4
- package/src/NitroRendererHostConfig.ts +396 -0
- package/src/PropSetter.ts +29 -0
- package/src/StylePropSetters.ts +145 -0
- package/src/ViewPropSetters.ts +33 -0
- package/src/ViewRegistry.ts +47 -0
- package/src/YogaPropSetters.ts +347 -0
- package/src/components/ScrollView.tsx +30 -0
- package/src/components/ScrollViewContent.tsx +12 -0
- package/src/components/Text.tsx +34 -0
- package/src/components/View.ts +33 -0
- package/src/contexts/RootContext.ts +5 -0
- package/src/getViewYogaNode.ts +9 -0
- package/src/hooks/useRootContext.ts +11 -0
- package/src/hooks/useSafeAreaInsets.ts +36 -0
- package/src/hybrids.ts +9 -0
- package/src/index.ts +30 -0
- package/src/registerApp.ts +22 -0
- package/src/renderRoot.ts +44 -0
- package/src/specs/Animations/AnimationCurve.ts +6 -0
- package/src/specs/Animations/Animator.nitro.ts +16 -0
- package/src/specs/Application.nitro.ts +20 -0
- package/src/specs/Corner.ts +1 -0
- package/src/specs/EdgeInsets.ts +13 -0
- package/src/specs/Frame.ts +6 -0
- package/src/specs/Gestures/GestureRecognizer.nitro.ts +26 -0
- package/src/specs/Gestures/LongPressGestureRecognizer.nitro.ts +26 -0
- package/src/specs/Gestures/PanGestureRecognizer.nitro.ts +33 -0
- package/src/specs/Gestures/TapGestureRecognizer.nitro.ts +20 -0
- package/src/specs/Label.nitro.ts +16 -0
- package/src/specs/ListenerSubscription.ts +3 -0
- package/src/specs/Screen.nitro.ts +16 -0
- package/src/specs/ScrollView.nitro.ts +14 -0
- package/src/specs/ScrollViewContent.nitro.ts +14 -0
- package/src/specs/Size.ts +4 -0
- package/src/specs/View.nitro.ts +112 -0
- package/src/specs/ViewController.nitro.ts +29 -0
- package/src/specs/Window.nitro.ts +20 -0
- package/src/specs/WindowScene.nitro.ts +15 -0
- package/src/types/ReactNitroReconcilerHostConfig.ts +44 -0
- package/src/types/ReactRoot.ts +5 -0
- package/src/types/StrictMap.ts +6 -0
- package/src/types/ViewPropsUpdater.ts +30 -0
- package/src/types/YogaStyleProps.ts +47 -0
- package/src/utils/arePropArraysEqual.ts +18 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Margelo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
9
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
10
|
+
so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/Package.swift
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// swift-tools-version: 6.4
|
|
2
|
+
|
|
3
|
+
import Foundation
|
|
4
|
+
import PackageDescription
|
|
5
|
+
|
|
6
|
+
let name = "ReactNitroRenderer"
|
|
7
|
+
let generated = "nitrogen/generated"
|
|
8
|
+
let nitroDependencies: [Target.Dependency] = [
|
|
9
|
+
.product(name: "NitroModules", package: "nitro-core"),
|
|
10
|
+
.product(name: "Yoga", package: "react-nitro-yoga"),
|
|
11
|
+
]
|
|
12
|
+
let cxxSettings: [CXXSetting] = [
|
|
13
|
+
.define("DEBUG", .when(configuration: .debug)),
|
|
14
|
+
.define("NDEBUG", .when(configuration: .release)),
|
|
15
|
+
.disableWarning("nullability-extension"),
|
|
16
|
+
]
|
|
17
|
+
let swiftSources = ["Sources/ReactNitroRenderer", "\(generated)/apple/swift"]
|
|
18
|
+
let bridgeSources = [
|
|
19
|
+
"c++", "ReactNitroRenderer-Swift-Cxx-Bridge.cpp", "ReactNitroRendererAutolinking.cpp",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
// Bare-host integration. Nitrogen generates the bindings; this manifest owns the targets.
|
|
23
|
+
let package = Package(
|
|
24
|
+
name: name,
|
|
25
|
+
platforms: [.iOS(.v16), .macOS(.v13)],
|
|
26
|
+
products: [
|
|
27
|
+
.library(name: name, targets: ["\(name)Cxx", name, "\(name)SwiftBridge"])
|
|
28
|
+
],
|
|
29
|
+
dependencies: [
|
|
30
|
+
.package(path: "../nitro-core"),
|
|
31
|
+
.package(path: "../react-nitro-yoga"),
|
|
32
|
+
],
|
|
33
|
+
targets: [
|
|
34
|
+
.target(
|
|
35
|
+
name: "\(name)Cxx",
|
|
36
|
+
dependencies: nitroDependencies,
|
|
37
|
+
path: "\(generated)/shared/c++",
|
|
38
|
+
exclude: ["include"],
|
|
39
|
+
publicHeadersPath: "include",
|
|
40
|
+
cxxSettings: cxxSettings
|
|
41
|
+
),
|
|
42
|
+
.target(
|
|
43
|
+
name: "\(name)AppleCxx",
|
|
44
|
+
dependencies: [.target(name: "\(name)Cxx")] + nitroDependencies,
|
|
45
|
+
path: "\(generated)/apple/\(name)AppleCxx",
|
|
46
|
+
cxxSettings: cxxSettings
|
|
47
|
+
),
|
|
48
|
+
.target(
|
|
49
|
+
name: name,
|
|
50
|
+
dependencies: [.target(name: "\(name)AppleCxx")] + nitroDependencies,
|
|
51
|
+
path: ".",
|
|
52
|
+
exclude: excludes(in: ".", keeping: swiftSources),
|
|
53
|
+
sources: swiftSources,
|
|
54
|
+
cxxSettings: cxxSettings,
|
|
55
|
+
swiftSettings: [
|
|
56
|
+
// UIKit implementations run synchronously on the host's main thread.
|
|
57
|
+
.swiftLanguageMode(.v5),
|
|
58
|
+
.unsafeFlags(["-strict-concurrency=minimal"]),
|
|
59
|
+
.enableUpcomingFeature("InternalImportsByDefault"),
|
|
60
|
+
.enableUpcomingFeature("MemberImportVisibility"),
|
|
61
|
+
.interoperabilityMode(.Cxx),
|
|
62
|
+
.unsafeFlags(["-Xfrontend", "-clang-header-expose-decls=has-expose-attr-or-stdlib"]),
|
|
63
|
+
.unsafeFlags([
|
|
64
|
+
"-Xfrontend", "-clang-header-expose-module",
|
|
65
|
+
"-Xfrontend", "NitroModules=NitroModules-Swift.h",
|
|
66
|
+
]),
|
|
67
|
+
]
|
|
68
|
+
),
|
|
69
|
+
.target(
|
|
70
|
+
name: "\(name)SwiftBridge",
|
|
71
|
+
dependencies: [.target(name: name), .target(name: "\(name)AppleCxx")] + nitroDependencies,
|
|
72
|
+
path: "\(generated)/apple",
|
|
73
|
+
exclude: excludes(in: "\(generated)/apple", keeping: bridgeSources) + ["c++/include"],
|
|
74
|
+
sources: bridgeSources,
|
|
75
|
+
publicHeadersPath: "c++/include",
|
|
76
|
+
cxxSettings: cxxSettings + [
|
|
77
|
+
.unsafeFlags(["-I${GENERATED_MODULEMAP_DIR}", "-fno-modules"])
|
|
78
|
+
]
|
|
79
|
+
),
|
|
80
|
+
],
|
|
81
|
+
cxxLanguageStandard: .cxx20
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
func excludes(in path: String, keeping sources: [String]) -> [String] {
|
|
85
|
+
var parents: Set<String> = [""]
|
|
86
|
+
for source in sources {
|
|
87
|
+
var components = source.split(separator: "/").dropLast()
|
|
88
|
+
while !components.isEmpty {
|
|
89
|
+
parents.insert(components.joined(separator: "/"))
|
|
90
|
+
components = components.dropLast()
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
let root = URL(fileURLWithPath: Context.packageDirectory).appendingPathComponent(path)
|
|
94
|
+
return parents.sorted().flatMap { parent in
|
|
95
|
+
let entries =
|
|
96
|
+
(try? FileManager.default.contentsOfDirectory(
|
|
97
|
+
atPath: root.appendingPathComponent(parent).path)) ?? []
|
|
98
|
+
return entries.sorted().compactMap { entry in
|
|
99
|
+
let entryPath = parent.isEmpty ? entry : "\(parent)/\(entry)"
|
|
100
|
+
return entry.hasPrefix(".") || sources.contains(entryPath) || parents.contains(entryPath)
|
|
101
|
+
? nil : entryPath
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
package/README.md
CHANGED
|
@@ -1,3 +1,112 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React Nitro Renderer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Install JavaScript dependencies from the repository root with `bun install`.
|
|
4
|
+
|
|
5
|
+
The JavaScript package exports React components such as `View` and `Text`, rendering
|
|
6
|
+
functions, and `registerApp`. For a standard app, register the root component:
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { registerApp } from 'react-nitro-renderer'
|
|
10
|
+
import { App } from './App'
|
|
11
|
+
|
|
12
|
+
registerApp(App)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The renderer initializes runtime globals before loading its rendering dependencies.
|
|
16
|
+
`registerApp` creates a native window and renders the component for each scene.
|
|
17
|
+
|
|
18
|
+
For custom window setup, use `Application`, `ViewController`, `Window` and
|
|
19
|
+
`WindowScene`. Register the root callback with `Application.registerRoot`, then
|
|
20
|
+
create the view controller and window:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Application, renderRoot, ViewController, Window } from "react-nitro-renderer";
|
|
24
|
+
|
|
25
|
+
Application.registerRoot((scene) => {
|
|
26
|
+
const viewController = new ViewController();
|
|
27
|
+
renderRoot(<App />, viewController);
|
|
28
|
+
return new Window(scene, viewController);
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
React roots provide `useSafeAreaInsets()`, which subscribes to the closest
|
|
33
|
+
view controller's root view and returns its insets in points:
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
function App() {
|
|
37
|
+
const insets = useSafeAreaInsets();
|
|
38
|
+
return (
|
|
39
|
+
<View layout={{ flex: 1, paddingTop: insets.top, paddingBottom: insets.bottom }}>
|
|
40
|
+
<Text>Inside the safe area</Text>
|
|
41
|
+
</View>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The hook is exported from `react-nitro-renderer` and throws outside a React
|
|
47
|
+
Nitro root. Every native view exposes `safeAreaInsets`, including `viewController.view`.
|
|
48
|
+
Insets are relative to that view's bounds, so a view entirely inside its parent's
|
|
49
|
+
safe area reports zero. The controller's
|
|
50
|
+
`addOnSafeAreaInsetsChangedListener(listener)` observes its root view. Call
|
|
51
|
+
`remove()` on the returned subscription when it is no longer needed.
|
|
52
|
+
|
|
53
|
+
Scale and translation are flat style props:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
<View style={{ scale: 1.2, scaleX: 1.5, translateX: 20 }} />
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`scale` defaults to `1` and sets all three axes. `scaleX`, `scaleY`, and `scaleZ`
|
|
60
|
+
override their respective axes. Scaling preserves
|
|
61
|
+
translation and does not change Yoga layout dimensions. Native view refs expose
|
|
62
|
+
`setScale(x, y, z)` and a readonly `scale` value with `x`, `y`, and `z` fields.
|
|
63
|
+
|
|
64
|
+
On iOS, exact zero scale values are applied as `0.00001` to avoid a UIKit/Core
|
|
65
|
+
Animation bug that can make a view disappear immediately during an exit animation.
|
|
66
|
+
This applies to all scale style props and `setScale`; the `scale` getter returns
|
|
67
|
+
the applied values. Other finite scale values are preserved. Use `opacity: 0`
|
|
68
|
+
when the view must be fully transparent.
|
|
69
|
+
|
|
70
|
+
Public reports describe [zero-scale transform interpolation failures](https://stackoverflow.com/questions/25964224/cgaffinetransformscale-not-working-with-zero-scale)
|
|
71
|
+
and [immediate disappearance when animating to zero](https://stackoverflow.com/questions/75793513/uiview-animation-downscale-instantly-hides-the-view).
|
|
72
|
+
|
|
73
|
+
## Native renderer
|
|
74
|
+
|
|
75
|
+
The Swift package exposes the `ReactNitroRenderer` library and depends on the
|
|
76
|
+
local `../nitro-core` and `../react-nitro-yoga` packages. The core package builds
|
|
77
|
+
native sources copied from the pinned `nitro-core` dependency installed by `bun install`.
|
|
78
|
+
Add Swift sources under
|
|
79
|
+
`Sources/ReactNitroRenderer/` and use `import NitroModules` to access
|
|
80
|
+
Nitro's Swift types. C++ interoperability is enabled for Nitro's C++-backed types.
|
|
81
|
+
|
|
82
|
+
`Package.swift` owns the standalone host targets. Nitrogen generates their
|
|
83
|
+
bindings from specs configured with `"environment": "bare"`:
|
|
84
|
+
|
|
85
|
+
- `ReactNitroRendererCxx`: `nitrogen/generated/shared/c++`.
|
|
86
|
+
- `ReactNitroRendererAppleCxx`: the generated C++ bridge declarations.
|
|
87
|
+
- `ReactNitroRenderer`: handwritten Swift and `nitrogen/generated/apple/swift`.
|
|
88
|
+
- `ReactNitroRendererSwiftBridge`: `nitrogen/generated/apple/c++`, the generated bridge implementation, and the public autolinking API.
|
|
89
|
+
|
|
90
|
+
The `ReactNitroRenderer` product includes both the Swift module and its C++ wrappers.
|
|
91
|
+
Generated Swift imports `ReactNitroRendererAppleCxx` explicitly. Regenerate
|
|
92
|
+
bindings with `bun run specs` after changing specs or updating Nitrogen.
|
|
93
|
+
|
|
94
|
+
Register the generated HybridObject classes before using their JavaScript classes:
|
|
95
|
+
|
|
96
|
+
```cpp
|
|
97
|
+
#include <ReactNitroRenderer/ReactNitroRendererAutolinking.hpp>
|
|
98
|
+
|
|
99
|
+
margelo::nitro::renderer::registerHybridClasses();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Build the Swift package from this directory:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
swift build
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Use Swift 6.4's default Swift Build backend (or Xcode). The C++ wrappers use its
|
|
109
|
+
`GENERATED_MODULEMAP_DIR` to include Swift's generated header after the C++ types
|
|
110
|
+
it references; importing that header as an isolated Clang module loses those types.
|
|
111
|
+
|
|
112
|
+
Generate native bindings from the TypeScript specs with `bun run specs`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
internal import UIKit
|
|
2
|
+
|
|
3
|
+
extension AnimationCurve {
|
|
4
|
+
init(_ uiAnimationCurve: UIView.AnimationCurve) {
|
|
5
|
+
switch uiAnimationCurve {
|
|
6
|
+
case .linear:
|
|
7
|
+
self = .linear
|
|
8
|
+
case .easeIn:
|
|
9
|
+
self = .easein
|
|
10
|
+
case .easeOut:
|
|
11
|
+
self = .easeout
|
|
12
|
+
case .easeInOut:
|
|
13
|
+
self = .easeinout
|
|
14
|
+
@unknown default:
|
|
15
|
+
preconditionFailure("Unknown animation curve: \(uiAnimationCurve.rawValue)")
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func toUIAnimationCurve() -> UIView.AnimationCurve {
|
|
20
|
+
switch self {
|
|
21
|
+
case .linear:
|
|
22
|
+
return .linear
|
|
23
|
+
case .easein:
|
|
24
|
+
return .easeIn
|
|
25
|
+
case .easeout:
|
|
26
|
+
return .easeOut
|
|
27
|
+
case .easeinout:
|
|
28
|
+
return .easeInOut
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridAnimator.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 21.10.2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
internal import NitroModules
|
|
9
|
+
import UIKit
|
|
10
|
+
|
|
11
|
+
class HybridAnimator : HybridAnimatorSpec {
|
|
12
|
+
var animator: UIViewPropertyAnimator
|
|
13
|
+
|
|
14
|
+
init(animator: UIViewPropertyAnimator) throws {
|
|
15
|
+
self.animator = animator
|
|
16
|
+
try super.init()
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func startAnimation(afterDelay: Double?) throws {
|
|
20
|
+
guard let delay = afterDelay else {
|
|
21
|
+
animator.startAnimation()
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
animator.startAnimation(afterDelay: delay)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func pauseAnimation() throws {
|
|
28
|
+
animator.pauseAnimation()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func stopAnimation(withoutFinishing: Bool?) throws {
|
|
32
|
+
animator.stopAnimation(withoutFinishing ?? false)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//
|
|
2
|
+
// View+animations.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 21.10.2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import UIKit
|
|
9
|
+
public import NitroModules
|
|
10
|
+
internal import NitroModulesCxx
|
|
11
|
+
|
|
12
|
+
public extension View where Self: HybridViewSpec {
|
|
13
|
+
func animate(duration: Double, curve: AnimationCurve, animations: any NitroModules.Callback<(), Void>) throws -> any HybridAnimatorSpec {
|
|
14
|
+
let uiCurve = curve.toUIAnimationCurve()
|
|
15
|
+
let animator = UIViewPropertyAnimator(duration: duration, curve: uiCurve) {
|
|
16
|
+
do {
|
|
17
|
+
try animations.callSync()
|
|
18
|
+
} catch {
|
|
19
|
+
let cppError = error.toCpp()
|
|
20
|
+
margelo.nitro.GlobalErrorHandler.reportError(.UICallback, cppError)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return try HybridAnimator(animator: animator)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func animateSpring(duration: Double, dampingRatio: Double, animations: any NitroModules.Callback<(), Void>) throws -> any HybridAnimatorSpec {
|
|
28
|
+
let animator = UIViewPropertyAnimator(duration: duration, dampingRatio: dampingRatio) {
|
|
29
|
+
do {
|
|
30
|
+
try animations.callSync()
|
|
31
|
+
} catch {
|
|
32
|
+
let cppError = error.toCpp()
|
|
33
|
+
margelo.nitro.GlobalErrorHandler.reportError(.UICallback, cppError)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return try HybridAnimator(animator: animator)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
internal import yoga
|
|
4
|
+
|
|
5
|
+
final class HybridLabel: HybridLabelSpec {
|
|
6
|
+
typealias AllowedChildrenType = Never
|
|
7
|
+
|
|
8
|
+
let view: LabelView
|
|
9
|
+
let yogaNode: YGNode
|
|
10
|
+
var parentReference: (any HybridViewSpec)?
|
|
11
|
+
|
|
12
|
+
override init() throws {
|
|
13
|
+
let label = LabelView()
|
|
14
|
+
view = label
|
|
15
|
+
|
|
16
|
+
yogaNode = YGNode(measure: { width, widthMode, height, heightMode in
|
|
17
|
+
let availableWidth = widthMode == .undefined
|
|
18
|
+
? CGFloat.greatestFiniteMagnitude
|
|
19
|
+
: CGFloat(width)
|
|
20
|
+
let availableHeight = heightMode == .undefined
|
|
21
|
+
? CGFloat.greatestFiniteMagnitude
|
|
22
|
+
: CGFloat(height)
|
|
23
|
+
let availableSize = CGSize(width: availableWidth, height: availableHeight)
|
|
24
|
+
let measuredSize = label.sizeThatFits(availableSize)
|
|
25
|
+
var measuredWidth = Float(measuredSize.width)
|
|
26
|
+
var measuredHeight = Float(measuredSize.height)
|
|
27
|
+
|
|
28
|
+
if widthMode == .exactly {
|
|
29
|
+
measuredWidth = width
|
|
30
|
+
} else if widthMode == .atMost {
|
|
31
|
+
measuredWidth = min(measuredWidth, width)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if heightMode == .exactly {
|
|
35
|
+
measuredHeight = height
|
|
36
|
+
} else if heightMode == .atMost {
|
|
37
|
+
measuredHeight = min(measuredHeight, height)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return YGSize(width: measuredWidth, height: measuredHeight)
|
|
41
|
+
})
|
|
42
|
+
try super.init()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
func setFrame(frame: Frame) throws {
|
|
46
|
+
// setFrame gets called when we are done calculating the layout
|
|
47
|
+
// For the text content we have to consider any insets, which we are applying here
|
|
48
|
+
let top = contentInset(for: .top)
|
|
49
|
+
let left = contentInset(for: .left)
|
|
50
|
+
let bottom = contentInset(for: .bottom)
|
|
51
|
+
let right = contentInset(for: .right)
|
|
52
|
+
view.contentInsets = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
|
|
53
|
+
view.bounds.size = CGSize(width: frame.width, height: frame.height)
|
|
54
|
+
view.center = CGPoint(x: frame.x + frame.width / 2,
|
|
55
|
+
y: frame.y + frame.height / 2)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private func contentInset(for edge: YGEdge) -> CGFloat {
|
|
59
|
+
let border = YGNodeLayoutGetBorder(yogaNode.ref, edge)
|
|
60
|
+
let padding = YGNodeLayoutGetPadding(yogaNode.ref, edge)
|
|
61
|
+
let inset = border + padding
|
|
62
|
+
return CGFloat(inset)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
var text: String? {
|
|
66
|
+
get {
|
|
67
|
+
return view.text
|
|
68
|
+
}
|
|
69
|
+
set {
|
|
70
|
+
guard view.text != newValue else { return }
|
|
71
|
+
view.text = newValue
|
|
72
|
+
YGNodeMarkDirty(yogaNode.ref)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
final class LabelView: UILabel {
|
|
78
|
+
var contentInsets: UIEdgeInsets = .zero {
|
|
79
|
+
didSet {
|
|
80
|
+
guard contentInsets != oldValue else { return }
|
|
81
|
+
setNeedsDisplay()
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
override func drawText(in rect: CGRect) {
|
|
86
|
+
let contentRect = rect.inset(by: contentInsets)
|
|
87
|
+
super.drawText(in: contentRect)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridScrollView.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 29.09.2026.
|
|
6
|
+
//
|
|
7
|
+
// .contentSize is set by HybridScrollViewContent
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import UIKit
|
|
11
|
+
import yoga
|
|
12
|
+
import NitroModules
|
|
13
|
+
|
|
14
|
+
final class HybridScrollView: HybridScrollViewSpec {
|
|
15
|
+
typealias AllowedChildrenType = any ScrollViewContent
|
|
16
|
+
|
|
17
|
+
let view = UIScrollView();
|
|
18
|
+
|
|
19
|
+
let yogaNode: YGNode = YGNode()
|
|
20
|
+
var parentReference: (any HybridViewSpec)?
|
|
21
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridScrollViewContent.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 29.09.2026.
|
|
6
|
+
//
|
|
7
|
+
// This is expected to be the one and only child of HybridScrollView.
|
|
8
|
+
// It will contain all the ScrollView's content, and will report its size
|
|
9
|
+
// to the UIScrollView as contentSize. This is what makes it scroll, as the
|
|
10
|
+
// content size will be larger than the UIScrollView's bounds.
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import UIKit
|
|
15
|
+
import yoga
|
|
16
|
+
import NitroModules
|
|
17
|
+
|
|
18
|
+
protocol ScrollViewContent: View {}
|
|
19
|
+
|
|
20
|
+
final class HybridScrollViewContent: HybridScrollViewContentSpec, ScrollViewContent {
|
|
21
|
+
typealias AllowedChildrenType = any View
|
|
22
|
+
|
|
23
|
+
let view = UIView()
|
|
24
|
+
let yogaNode = YGNode()
|
|
25
|
+
var parentReference: (any HybridViewSpec)?
|
|
26
|
+
|
|
27
|
+
func setFrame(frame: Frame) throws {
|
|
28
|
+
guard let parent, let scrollView = parent.view as? UIScrollView else {
|
|
29
|
+
throw RuntimeError("<ScrollViewContent> must be the direct and only child of <ScrollView>!")
|
|
30
|
+
}
|
|
31
|
+
view.bounds.size = CGSize(width: frame.width, height: frame.height)
|
|
32
|
+
view.center = CGPoint(x: frame.x + frame.width / 2,
|
|
33
|
+
y: frame.y + frame.height / 2)
|
|
34
|
+
scrollView.contentSize = view.bounds.size
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
|
|
4
|
+
final class HybridView: HybridViewSpec {
|
|
5
|
+
typealias AllowedChildrenType = any View
|
|
6
|
+
|
|
7
|
+
let yogaNode = YGNode()
|
|
8
|
+
var parentReference: (any HybridViewSpec)?
|
|
9
|
+
|
|
10
|
+
let view: UIView
|
|
11
|
+
|
|
12
|
+
override convenience init() throws {
|
|
13
|
+
let view = UIView()
|
|
14
|
+
self.init(view: view)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
init(view: UIView) {
|
|
18
|
+
self.view = view
|
|
19
|
+
// The generated base initializer is empty. Wrapping this UIKit object cannot fail.
|
|
20
|
+
try! super.init()
|
|
21
|
+
}
|
|
22
|
+
}
|