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
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
//
|
|
2
|
+
// View.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Marc Rousavy on 18.09.26.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
public import UIKit
|
|
9
|
+
internal import NitroModules
|
|
10
|
+
internal import yoga
|
|
11
|
+
|
|
12
|
+
public protocol View: AnyObject {
|
|
13
|
+
associatedtype ViewType: UIView
|
|
14
|
+
associatedtype AllowedChildrenType
|
|
15
|
+
var view: ViewType { get }
|
|
16
|
+
var yogaNode: YGNode { get }
|
|
17
|
+
var parentReference: (any HybridViewSpec)? { get set }
|
|
18
|
+
var yogaNodePtr: Double { get }
|
|
19
|
+
var cornerCurve: CornerCurve { get set }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public extension View {
|
|
23
|
+
var safeAreaInsets: EdgeInsets {
|
|
24
|
+
let insets = view.safeAreaInsets
|
|
25
|
+
return EdgeInsets(insets)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var parent: (any HybridViewSpec)? {
|
|
29
|
+
return parentReference
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var yogaNodePtr: Double {
|
|
33
|
+
let address = UInt(bitPattern: yogaNode.ref)
|
|
34
|
+
let bits = UInt64(address)
|
|
35
|
+
return Double(bitPattern: bits)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//MARK: Props
|
|
39
|
+
|
|
40
|
+
var backgroundColor: Double? {
|
|
41
|
+
guard let color = view.backgroundColor else {
|
|
42
|
+
return nil
|
|
43
|
+
}
|
|
44
|
+
let resolved = color.resolvedColor(with: view.traitCollection)
|
|
45
|
+
guard let rgba = resolved.rgba else {
|
|
46
|
+
return nil
|
|
47
|
+
}
|
|
48
|
+
return Double(rgba)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func setBackgroundColor(color: Double) throws {
|
|
52
|
+
guard let rgba = UInt32(exactly: color) else {
|
|
53
|
+
throw RuntimeError("Invalid background color \(color): expected an integer between 0 and 0xffffffff in 0xRRGGBBAA format.")
|
|
54
|
+
}
|
|
55
|
+
view.backgroundColor = UIColor(rgba: rgba)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var opacity: Double {
|
|
59
|
+
get {
|
|
60
|
+
return view.alpha
|
|
61
|
+
}
|
|
62
|
+
set {
|
|
63
|
+
view.alpha = newValue
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
var borderWidth: Double? {
|
|
68
|
+
get {
|
|
69
|
+
return view.layer.borderWidth
|
|
70
|
+
}
|
|
71
|
+
set {
|
|
72
|
+
view.layer.borderWidth = newValue ?? 0
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
var borderColor: Double? {
|
|
77
|
+
guard let color = view.layer.borderColor else {
|
|
78
|
+
return nil
|
|
79
|
+
}
|
|
80
|
+
let uiColor = UIColor(cgColor: color)
|
|
81
|
+
guard let rgba = uiColor.rgba else {
|
|
82
|
+
return nil
|
|
83
|
+
}
|
|
84
|
+
return Double(rgba)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
func setBorderColor(color: Double?) throws {
|
|
88
|
+
guard let color else {
|
|
89
|
+
view.layer.borderColor = nil
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
guard let rgba = UInt32(exactly: color) else {
|
|
94
|
+
throw RuntimeError("Invalid background color \(color): expected an integer between 0 and 0xffffffff in 0xRRGGBBAA format.")
|
|
95
|
+
}
|
|
96
|
+
view.layer.borderColor = UIColor(rgba: rgba).cgColor
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
var cornerRadius: Double {
|
|
100
|
+
get {
|
|
101
|
+
return view.layer.cornerRadius
|
|
102
|
+
}
|
|
103
|
+
set {
|
|
104
|
+
view.layer.cornerRadius = newValue
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
var maskedCorners: [Corner] {
|
|
109
|
+
get {
|
|
110
|
+
let mask = view.layer.maskedCorners
|
|
111
|
+
let corners: [Corner] = [.topleft, .topright, .bottomleft, .bottomright]
|
|
112
|
+
return corners.filter { corner in
|
|
113
|
+
let cornerMask = corner.toCACornerMask()
|
|
114
|
+
return mask.contains(cornerMask)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
set {
|
|
118
|
+
var mask: CACornerMask = []
|
|
119
|
+
for corner in newValue {
|
|
120
|
+
let cornerMask = corner.toCACornerMask()
|
|
121
|
+
mask.formUnion(cornerMask)
|
|
122
|
+
}
|
|
123
|
+
view.layer.maskedCorners = mask
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
var cornerCurve: CornerCurve {
|
|
128
|
+
get {
|
|
129
|
+
let curve = view.layer.cornerCurve
|
|
130
|
+
return CornerCurve(curve)
|
|
131
|
+
}
|
|
132
|
+
set {
|
|
133
|
+
let curve = newValue.toUICornerCurve()
|
|
134
|
+
view.layer.cornerCurve = curve
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
var translation: Point3D {
|
|
139
|
+
let transform = view.layer.transform
|
|
140
|
+
let x = Double(transform.m41)
|
|
141
|
+
let y = Double(transform.m42)
|
|
142
|
+
let z = Double(transform.m43)
|
|
143
|
+
return Point3D(x: x, y: y, z: z)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func setTranslation(x: Double, y: Double, z: Double) throws {
|
|
147
|
+
guard x.isFinite && y.isFinite && z.isFinite else {
|
|
148
|
+
throw RuntimeError("Invalid translation (\(x), \(y), \(z)): expected finite numbers.")
|
|
149
|
+
}
|
|
150
|
+
var transform = view.layer.transform
|
|
151
|
+
transform.m41 = CGFloat(x)
|
|
152
|
+
transform.m42 = CGFloat(y)
|
|
153
|
+
transform.m43 = CGFloat(z)
|
|
154
|
+
let isUnchanged = CATransform3DEqualToTransform(view.layer.transform, transform)
|
|
155
|
+
if isUnchanged {
|
|
156
|
+
return
|
|
157
|
+
}
|
|
158
|
+
view.layer.transform = transform
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
var scale: Point3D {
|
|
162
|
+
let transform = view.layer.transform
|
|
163
|
+
let x = Double(transform.m11)
|
|
164
|
+
let y = Double(transform.m22)
|
|
165
|
+
let z = Double(transform.m33)
|
|
166
|
+
return Point3D(x: x, y: y, z: z)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
func setScale(x: Double, y: Double, z: Double) throws {
|
|
170
|
+
guard x.isFinite && y.isFinite && z.isFinite else {
|
|
171
|
+
throw RuntimeError("Invalid scale (\(x), \(y), \(z)): expected finite numbers.")
|
|
172
|
+
}
|
|
173
|
+
// TODO: Remove zero substitution once UIKit fixes zero-scale transform interpolation on all supported iOS versions.
|
|
174
|
+
// Reports: https://stackoverflow.com/questions/25964224/cgaffinetransformscale-not-working-with-zero-scale
|
|
175
|
+
// https://stackoverflow.com/questions/75793513/uiview-animation-downscale-instantly-hides-the-view
|
|
176
|
+
let zeroScaleReplacement = 0.00001
|
|
177
|
+
var transform = view.layer.transform
|
|
178
|
+
transform.m11 = CGFloat(x == 0 ? zeroScaleReplacement : x)
|
|
179
|
+
transform.m22 = CGFloat(y == 0 ? zeroScaleReplacement : y)
|
|
180
|
+
transform.m33 = CGFloat(z == 0 ? zeroScaleReplacement : z)
|
|
181
|
+
let isUnchanged = CATransform3DEqualToTransform(view.layer.transform, transform)
|
|
182
|
+
if isUnchanged {
|
|
183
|
+
return
|
|
184
|
+
}
|
|
185
|
+
view.layer.transform = transform
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
func getFrame() -> Frame {
|
|
189
|
+
let size = view.bounds.size
|
|
190
|
+
let center = view.center
|
|
191
|
+
return Frame(x: center.x - size.width / 2,
|
|
192
|
+
y: center.y - size.height / 2,
|
|
193
|
+
width: size.width,
|
|
194
|
+
height: size.height)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
func setFrame(frame: Frame) throws {
|
|
198
|
+
view.bounds.size = CGSize(width: frame.width, height: frame.height)
|
|
199
|
+
view.center = CGPoint(x: frame.x + frame.width / 2,
|
|
200
|
+
y: frame.y + frame.height / 2)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
func afterUpdate() {
|
|
204
|
+
let isYogaNodeDirty = YGNodeIsDirty(yogaNode.ref)
|
|
205
|
+
if isYogaNodeDirty {
|
|
206
|
+
let overflow = YGNodeStyleGetOverflow(yogaNode.ref)
|
|
207
|
+
view.clipsToBounds = overflow == .hidden
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
//MARK: Gestures
|
|
212
|
+
|
|
213
|
+
func setGestureRecognizers(gestureRecognizers: [any HybridGestureRecognizerSpec]?) throws {
|
|
214
|
+
view.gestureRecognizers?.forEach { prevGestureRecognizer in
|
|
215
|
+
view.removeGestureRecognizer(prevGestureRecognizer)
|
|
216
|
+
}
|
|
217
|
+
gestureRecognizers?.forEach { newGestureRecognizer in
|
|
218
|
+
view.addGestureRecognizer(newGestureRecognizer.gestureRecognizer)
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
var isUserInteractionEnabled: Bool {
|
|
223
|
+
get {
|
|
224
|
+
return view.isUserInteractionEnabled
|
|
225
|
+
}
|
|
226
|
+
set {
|
|
227
|
+
view.isUserInteractionEnabled = newValue
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
public extension View where Self: HybridViewSpec {
|
|
233
|
+
//MARK: Child mutations
|
|
234
|
+
|
|
235
|
+
func appendChild(child: any HybridViewSpec) throws {
|
|
236
|
+
let childView = try getAllowedChildView(child: child)
|
|
237
|
+
view.addSubview(childView)
|
|
238
|
+
child.parentReference = self
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
func insertBefore(child: any HybridViewSpec, beforeChild: any HybridViewSpec) throws {
|
|
242
|
+
let childView = try getAllowedChildView(child: child)
|
|
243
|
+
let beforeChildView = try getAllowedChildView(child: beforeChild)
|
|
244
|
+
if child === beforeChild {
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
view.insertSubview(childView, belowSubview: beforeChildView)
|
|
248
|
+
child.parentReference = self
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
func removeChild(child: any HybridViewSpec) throws {
|
|
252
|
+
let childView = try getAllowedChildView(child: child)
|
|
253
|
+
childView.removeFromSuperview()
|
|
254
|
+
child.parentReference = nil
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private func getAllowedChildView(child: any HybridViewSpec) throws -> UIView {
|
|
258
|
+
if AllowedChildrenType.self == Never.self {
|
|
259
|
+
throw RuntimeError("\(Self.self) does not support children!")
|
|
260
|
+
}
|
|
261
|
+
guard child is AllowedChildrenType else {
|
|
262
|
+
let expectedType = String(describing: AllowedChildrenType.self)
|
|
263
|
+
throw RuntimeError("Unsupported child View type for \(Self.self). Expected \(expectedType).")
|
|
264
|
+
}
|
|
265
|
+
return child.view
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
|
|
4
|
+
final class CustomViewController: UIViewController {
|
|
5
|
+
private var onKeyPressedListeners: [UIKeyCommand: () -> Void] = [:]
|
|
6
|
+
private let safeAreaInsetsListeners = SafeAreaInsetsListeners()
|
|
7
|
+
|
|
8
|
+
override func viewSafeAreaInsetsDidChange() {
|
|
9
|
+
super.viewSafeAreaInsetsDidChange()
|
|
10
|
+
let insets = view.safeAreaInsets
|
|
11
|
+
let edgeInsets = EdgeInsets(insets)
|
|
12
|
+
safeAreaInsetsListeners.emit(edgeInsets)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
func addOnSafeAreaInsetsChangedListener(_ listener: @escaping (EdgeInsets) -> Void) -> ListenerSubscription {
|
|
16
|
+
return safeAreaInsetsListeners.add(listener)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func addOnKeyPressedListener(key: String, modifiers: [ModifierKey], onPress: @escaping () -> Void) -> ListenerSubscription {
|
|
20
|
+
let modifierFlags = modifiers.toUIKeyModifierFlags()
|
|
21
|
+
let command = UIKeyCommand(input: key,
|
|
22
|
+
modifierFlags: modifierFlags,
|
|
23
|
+
action: #selector(handleKeyCommand(_:)))
|
|
24
|
+
onKeyPressedListeners[command] = onPress
|
|
25
|
+
addKeyCommand(command)
|
|
26
|
+
return ListenerSubscription(remove: .native {
|
|
27
|
+
self.removeKeyCommand(command)
|
|
28
|
+
self.onKeyPressedListeners.removeValue(forKey: command)
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@objc private func handleKeyCommand(_ command: UIKeyCommand) {
|
|
33
|
+
guard let listener = onKeyPressedListeners[command] else { return }
|
|
34
|
+
listener()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
internal import UIKit
|
|
2
|
+
|
|
3
|
+
extension Corner {
|
|
4
|
+
func toCACornerMask() -> CACornerMask {
|
|
5
|
+
switch self {
|
|
6
|
+
case .topleft:
|
|
7
|
+
return .layerMinXMinYCorner
|
|
8
|
+
case .topright:
|
|
9
|
+
return .layerMaxXMinYCorner
|
|
10
|
+
case .bottomleft:
|
|
11
|
+
return .layerMinXMaxYCorner
|
|
12
|
+
case .bottomright:
|
|
13
|
+
return .layerMaxXMaxYCorner
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
internal import UIKit
|
|
2
|
+
|
|
3
|
+
extension CornerCurve {
|
|
4
|
+
init(_ uiCornerCurve: CALayerCornerCurve) {
|
|
5
|
+
switch uiCornerCurve {
|
|
6
|
+
case .circular:
|
|
7
|
+
self = .circular
|
|
8
|
+
case .continuous:
|
|
9
|
+
self = .continuous
|
|
10
|
+
default:
|
|
11
|
+
preconditionFailure("Unknown corner curve: \(uiCornerCurve.rawValue)")
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
func toUICornerCurve() -> CALayerCornerCurve {
|
|
16
|
+
switch self {
|
|
17
|
+
case .circular:
|
|
18
|
+
return .circular
|
|
19
|
+
case .continuous:
|
|
20
|
+
return .continuous
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ModifierKey+toUIKeyModifierFlags.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Marc Rousavy on 18.09.26.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
internal import UIKit
|
|
9
|
+
|
|
10
|
+
extension ModifierKey {
|
|
11
|
+
func toUIKeyModifierFlags() -> UIKeyModifierFlags {
|
|
12
|
+
switch self {
|
|
13
|
+
case .command:
|
|
14
|
+
return .command
|
|
15
|
+
case .alternate:
|
|
16
|
+
return .alternate
|
|
17
|
+
case .control:
|
|
18
|
+
return .control
|
|
19
|
+
case .shift:
|
|
20
|
+
return .shift
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
extension [ModifierKey] {
|
|
26
|
+
func toUIKeyModifierFlags() -> UIKeyModifierFlags {
|
|
27
|
+
return reduce(into: UIKeyModifierFlags()) { flags, modifier in
|
|
28
|
+
flags.formUnion(modifier.toUIKeyModifierFlags())
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
internal import CoreGraphics
|
|
2
|
+
|
|
3
|
+
extension Point {
|
|
4
|
+
init(_ point: CGPoint) {
|
|
5
|
+
let x = Double(point.x)
|
|
6
|
+
let y = Double(point.y)
|
|
7
|
+
self.init(x: x, y: y)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
var cgPoint: CGPoint {
|
|
11
|
+
let x = CGFloat(self.x)
|
|
12
|
+
let y = CGFloat(self.y)
|
|
13
|
+
return CGPoint(x: x, y: y)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
internal import UIKit
|
|
2
|
+
|
|
3
|
+
extension GestureRecognizerState {
|
|
4
|
+
init(_ uiGestureRecognizerState: UIGestureRecognizer.State) {
|
|
5
|
+
switch uiGestureRecognizerState {
|
|
6
|
+
case .possible:
|
|
7
|
+
self = .possible
|
|
8
|
+
case .began:
|
|
9
|
+
self = .began
|
|
10
|
+
case .changed:
|
|
11
|
+
self = .changed
|
|
12
|
+
case .ended:
|
|
13
|
+
self = .ended
|
|
14
|
+
case .cancelled:
|
|
15
|
+
self = .cancelled
|
|
16
|
+
case .failed:
|
|
17
|
+
self = .failed
|
|
18
|
+
@unknown default:
|
|
19
|
+
preconditionFailure("Unknown gesture recognizer state: \(uiGestureRecognizerState.rawValue)")
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func toUIGestureRecognizerState() -> UIGestureRecognizer.State {
|
|
24
|
+
switch self {
|
|
25
|
+
case .possible:
|
|
26
|
+
return .possible
|
|
27
|
+
case .began:
|
|
28
|
+
return .began
|
|
29
|
+
case .changed:
|
|
30
|
+
return .changed
|
|
31
|
+
case .ended:
|
|
32
|
+
return .ended
|
|
33
|
+
case .cancelled:
|
|
34
|
+
return .cancelled
|
|
35
|
+
case .failed:
|
|
36
|
+
return .failed
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridGestureRecognizer.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 19.10.2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
public import UIKit
|
|
9
|
+
|
|
10
|
+
public protocol HybridGestureRecognizer: AnyObject {
|
|
11
|
+
associatedtype Recognizer: UIGestureRecognizer
|
|
12
|
+
var gestureRecognizer: Recognizer { get }
|
|
13
|
+
|
|
14
|
+
var numberOfTouches: Double { get }
|
|
15
|
+
var isEnabled: Bool { get set }
|
|
16
|
+
var state: GestureRecognizerState { get }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
extension HybridGestureRecognizer {
|
|
20
|
+
var numberOfTouches: Double {
|
|
21
|
+
get {
|
|
22
|
+
return Double(gestureRecognizer.numberOfTouches)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var isEnabled: Bool {
|
|
27
|
+
get {
|
|
28
|
+
return gestureRecognizer.isEnabled
|
|
29
|
+
}
|
|
30
|
+
set {
|
|
31
|
+
gestureRecognizer.isEnabled = newValue
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var state: GestureRecognizerState {
|
|
36
|
+
get {
|
|
37
|
+
return GestureRecognizerState(gestureRecognizer.state)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
|
|
4
|
+
final class HybridLongPressGestureRecognizer: HybridLongPressGestureRecognizerSpec, HybridGestureRecognizer {
|
|
5
|
+
var gestureRecognizer: UILongPressGestureRecognizer = UILongPressGestureRecognizer()
|
|
6
|
+
var onLongPress: any Callback<any HybridLongPressGestureRecognizerSpec, Void>?
|
|
7
|
+
|
|
8
|
+
override init() throws {
|
|
9
|
+
try super.init()
|
|
10
|
+
let action = #selector(handleLongPress(_:))
|
|
11
|
+
self.gestureRecognizer.addTarget(self, action: action)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
var minimumPressDuration: Double {
|
|
15
|
+
get {
|
|
16
|
+
return gestureRecognizer.minimumPressDuration
|
|
17
|
+
}
|
|
18
|
+
set {
|
|
19
|
+
gestureRecognizer.minimumPressDuration = newValue
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var allowableMovement: Double {
|
|
24
|
+
get {
|
|
25
|
+
return Double(gestureRecognizer.allowableMovement)
|
|
26
|
+
}
|
|
27
|
+
set {
|
|
28
|
+
gestureRecognizer.allowableMovement = CGFloat(newValue)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var numberOfTapsRequired: Double {
|
|
33
|
+
get {
|
|
34
|
+
return Double(gestureRecognizer.numberOfTapsRequired)
|
|
35
|
+
}
|
|
36
|
+
set {
|
|
37
|
+
gestureRecognizer.numberOfTapsRequired = Int(newValue)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
var numberOfTouchesRequired: Double {
|
|
42
|
+
get {
|
|
43
|
+
return Double(gestureRecognizer.numberOfTouchesRequired)
|
|
44
|
+
}
|
|
45
|
+
set {
|
|
46
|
+
gestureRecognizer.numberOfTouchesRequired = Int(newValue)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@objc private func handleLongPress(_ recognizer: UILongPressGestureRecognizer) throws {
|
|
51
|
+
try self.onLongPress?.callSync(self)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridPanGestureRecognizer.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 20.10.2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
internal import NitroModules
|
|
9
|
+
internal import UIKit
|
|
10
|
+
|
|
11
|
+
final class HybridPanGestureRecognizer : HybridPanGestureRecognizerSpec, HybridGestureRecognizer {
|
|
12
|
+
var gestureRecognizer: UIPanGestureRecognizer = UIPanGestureRecognizer()
|
|
13
|
+
var onPan: any Callback<any HybridPanGestureRecognizerSpec, Void>?
|
|
14
|
+
|
|
15
|
+
override init() throws {
|
|
16
|
+
try super.init()
|
|
17
|
+
let action = #selector(handlePan(_:))
|
|
18
|
+
self.gestureRecognizer.addTarget(self, action: action)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
var maximumNumberOfTouches: Double {
|
|
22
|
+
get {
|
|
23
|
+
return Double(gestureRecognizer.maximumNumberOfTouches)
|
|
24
|
+
}
|
|
25
|
+
set {
|
|
26
|
+
gestureRecognizer.maximumNumberOfTouches = Int(newValue)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var minimumNumberOfTouches: Double {
|
|
31
|
+
get {
|
|
32
|
+
return Double(gestureRecognizer.minimumNumberOfTouches)
|
|
33
|
+
}
|
|
34
|
+
set {
|
|
35
|
+
gestureRecognizer.minimumNumberOfTouches = Int(newValue)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
func translation(inParent: any HybridViewSpec) throws -> Point {
|
|
40
|
+
let translation = gestureRecognizer.translation(in: inParent.view)
|
|
41
|
+
return Point(translation)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func velocity(inParent: any HybridViewSpec) throws -> Point {
|
|
45
|
+
let velocity = gestureRecognizer.velocity(in: inParent.view)
|
|
46
|
+
return Point(velocity)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@objc private func handlePan(_ recognizer: UITapGestureRecognizer) throws {
|
|
50
|
+
try self.onPan?.callSync(self)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridTapGestureRecorgnizer.swift
|
|
3
|
+
// ReactNitroRenderer
|
|
4
|
+
//
|
|
5
|
+
// Created by Hanno Gödecke on 19.10.2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
internal import NitroModules
|
|
9
|
+
internal import UIKit
|
|
10
|
+
|
|
11
|
+
final class HybridTapGestureRecognizer : HybridTapGestureRecognizerSpec, HybridGestureRecognizer {
|
|
12
|
+
var gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()
|
|
13
|
+
var onTap: any Callback<any HybridTapGestureRecognizerSpec, Void>?
|
|
14
|
+
|
|
15
|
+
override init() throws {
|
|
16
|
+
try super.init()
|
|
17
|
+
let action = #selector(handleTap(_:))
|
|
18
|
+
self.gestureRecognizer.addTarget(self, action: action)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
var numberOfTapsRequired: Double {
|
|
22
|
+
get {
|
|
23
|
+
return Double(gestureRecognizer.numberOfTapsRequired)
|
|
24
|
+
}
|
|
25
|
+
set {
|
|
26
|
+
gestureRecognizer.numberOfTapsRequired = Int(newValue)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var numberOfTouchesRequired: Double {
|
|
31
|
+
get {
|
|
32
|
+
return Double(gestureRecognizer.numberOfTouchesRequired)
|
|
33
|
+
}
|
|
34
|
+
set {
|
|
35
|
+
gestureRecognizer.numberOfTouchesRequired = Int(newValue)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@objc private func handleTap(_ recognizer: UITapGestureRecognizer) throws {
|
|
40
|
+
try self.onTap?.callSync(self)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
|
|
4
|
+
final class HybridApplication: HybridApplicationSpec {
|
|
5
|
+
static func createView() throws -> any HybridViewSpec {
|
|
6
|
+
return try HybridView()
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
static func registerRoot(onSceneCreated: any Callback<any HybridWindowSceneSpec, any HybridWindowSpec>) throws {
|
|
10
|
+
try RegisterRootCallback.registerRoot(onSceneCreated: onSceneCreated)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static func reloadRuntime() throws {
|
|
14
|
+
guard let reloadableRuntime = UIApplication.shared.delegate as? any RuntimeReloadableAppDelegate else {
|
|
15
|
+
throw RuntimeError("Failed to reload Runtime - The main `AppDelegate` does not implement `RuntimeReloadableAppDelegate`!")
|
|
16
|
+
}
|
|
17
|
+
reloadableRuntime.reloadRuntime()
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
internal import NitroModules
|
|
2
|
+
internal import UIKit
|
|
3
|
+
|
|
4
|
+
final class HybridScreen: HybridScreenSpec {
|
|
5
|
+
private let screen: UIScreen
|
|
6
|
+
|
|
7
|
+
var size: Size {
|
|
8
|
+
return Size(width: screen.bounds.width, height: screen.bounds.height)
|
|
9
|
+
}
|
|
10
|
+
var displayScale: Double {
|
|
11
|
+
return screen.scale
|
|
12
|
+
}
|
|
13
|
+
var brightness: Double {
|
|
14
|
+
return screen.brightness
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
init(screen: UIScreen) {
|
|
18
|
+
self.screen = screen
|
|
19
|
+
// The generated base initializer is empty. Wrapping this UIKit object cannot fail.
|
|
20
|
+
try! super.init()
|
|
21
|
+
}
|
|
22
|
+
}
|