221d1eceda
Summary: - Current implementation does not follow CSS spec for rectangle boxes with corner angles. It is using non spec compliant algorithm to calculate start and end points. This PR follows the spec compliant algorithm to implement and makes sure Web, iOS and Android gradients are identical with corner angles. - Also, currently it is using `CAGradientLayer` which does not support spec compliant start and end points i.e. start and end point can be outside of rectangle bounds. This leads to inconsistent gradients on iOS for corner angles compared to web and android. So this PR replaces it with `CGGradient`. - I have also moved some files to make it easier to add more background image types in future. ## Changelog: [GENERAL] [FIXED] - Linear gradient start and end point algorithm. <!-- Help reviewers and the release process by writing your own changelog entry. Pick one each for the category and type tags: For more details, see: https://reactnative.dev/contributing/changelogs-in-pull-requests Pull Request resolved: https://github.com/facebook/react-native/pull/47003 Test Plan: - Added multiple gradient example which should be identical in all platforms (Web, iOS and Android) and tested thoroughly on all platforms. I think some visual test cases can help here. - I have referred to [blink's](https://github.com/chromium/chromium/blob/main/third_party/blink/renderer/core/css/css_gradient_value.cc) implementation. ## Aside Took a while to understand the [spec](https://www.w3.org/TR/css-images-3/#corner-gradient-example), but felt great after getting it. Gradients should be 100% identical on all platforms now. Sorry i missed testing cornered angles + rectangles earlier and I found out it is inconsistent on platforms just this weekend 😅 <img width="1389" alt="Screenshot 2024-10-14 at 12 24 45 AM" src="https://github.com/user-attachments/assets/2f61eb87-502b-4b8c-88f3-d8a3cca9a7a3"> Reviewed By: joevilches Differential Revision: D64497127 Pulled By: jorge-cab fbshipit-source-id: 2647176ae2ee74b6c71f9061465b07dccdabcfc1 |
||
---|---|---|
.. | ||
.maestro | ||
android/app | ||
IntegrationTests | ||
js | ||
NativeComponentExample | ||
NativeCxxModuleExample | ||
NativeModuleExample | ||
RCTTest | ||
RNTester | ||
RNTesterIntegrationTests | ||
RNTesterPods.xcodeproj | ||
RNTesterPods.xcworkspace | ||
RNTesterUnitTests | ||
scripts | ||
.babelrc | ||
.eslintrc | ||
.gitignore | ||
.xcode.env | ||
Gemfile | ||
metro.config.js | ||
package.json | ||
Podfile | ||
Podfile.lock | ||
PrivacyInfo.xcprivacy | ||
react-native.config.js | ||
README.md |
RNTester
The RNTester showcases React Native views and modules.
Running this app
Before running the app, make sure you ran:
git clone https://github.com/facebook/react-native.git
cd react-native
yarn install
Running on iOS
If you are testing non-fabric component, search for and modify the fabric_enabled
flag in RNTester's Podfile.
fabric_enabled = false
Also, if you previously built RNTester with fabric enabled, you might need to clean up the build files and Pods.
# Clean the generated files and folders to clean install RNTester
cd packages/rn-tester
yarn clean-ios
If you are still having a problem after doing the clean up (which can happen if you have built RNTester with older React Native versions where files were generated inside the react-native folder.), the best way might be to clean-install react-native (e.g. remove node_modules and yarn install). If after cleaning up, you are still having issues, you might also want to try RCT_NEW_ARCH_ENABLED=0 bundle exec pod install
to disable the new architecture as it might be conflicting.
Both macOS and Xcode are required.
cd packages/rn-tester
- Install Bundler:
gem install bundler
. We use bundler to install the right version of CocoaPods locally. - Install Bundler and CocoaPods dependencies:
bundle install && bundle exec pod install
oryarn setup-ios-hermes
. In order to use JSC instead of Hermes engine, run:USE_HERMES=0 bundle exec pod install
oryarn setup-ios-jsc
instead. - Open the generated
RNTesterPods.xcworkspace
. This is not checked in, as it is generated by CocoaPods. Do not openRNTesterPods.xcodeproj
directly.
Note for Apple Silicon users
If you own a Mac laptop with Apple Silicon, you need to run some different commands to install and run cocoapods.
sudo arch -x86_64 gem install ffi
: this installs theffi
package to load dynamically-linked libraries.arch -x86_64 pod install
: this runpod install
with the right architecture.
Running on Android
You'll need to have all the prerequisites (SDK, NDK) for Building React Native installed.
You can build and run RN-Tester by using this command from the root of the repo:
yarn android
If you wish to use JSC instead you should invoke:
cd packages/rn-tester
yarn install-android-jsc
yarn start
Note
Building for the first time can take a while.
If you're using a physical device, run adb reverse tcp:8081 tcp:8081
to make sure the device can access Metro.
See Running on Device for additional instructions on using a physical device.
Building from source
Building the app on both iOS and Android means building the React Native framework from source. This way you're running the latest native and JS code the way you see it in your clone of the github repo.
This is different from apps created using react-native init
which have a dependency on a specific version of React Native JS and native code, declared in a package.json
file (and build.gradle
for Android apps).