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,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,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
|
+
}
|