diff --git a/website/versioned_docs/version-0.73.0/_getting-started-linux-android.md b/website/versioned_docs/version-0.73.0/_getting-started-linux-android.md
new file mode 100644
index 00000000000..ec095bc07d3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_getting-started-linux-android.md
@@ -0,0 +1,196 @@
+import RemoveGlobalCLI from './\_remove-global-cli.md';
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Installing dependencies
+
+You will need Node, the React Native command line interface, a JDK, and Android Studio.
+
+While you can use any editor of your choice to develop your app, you will need to install Android Studio in order to set up the necessary tooling to build your React Native app for Android.
+
+
Node
+
+Follow the [installation instructions for your Linux distribution](https://nodejs.org/en/download/package-manager/) to install Node 18 or newer.
+
+
Java Development Kit
+
+React Native currently recommends version 17 of the Java SE Development Kit (JDK). You may encounter problems using higher JDK versions. You may download and install [OpenJDK](https://openjdk.java.net) from [AdoptOpenJDK](https://adoptopenjdk.net/) or your system packager.
+
+
Android development environment
+
+Setting up your development environment can be somewhat tedious if you're new to Android development. If you're already familiar with Android development, there are a few things you may need to configure. In either case, please make sure to carefully follow the next few steps.
+
+
1. Install Android Studio
+
+[Download and install Android Studio](https://developer.android.com/studio/index.html). While on Android Studio installation wizard, make sure the boxes next to all of the following items are checked:
+
+- `Android SDK`
+- `Android SDK Platform`
+- `Android Virtual Device`
+
+Then, click "Next" to install all of these components.
+
+> If the checkboxes are grayed out, you will have a chance to install these components later on.
+
+Once setup has finalized and you're presented with the Welcome screen, proceed to the next step.
+
+
2. Install the Android SDK
+
+Android Studio installs the latest Android SDK by default. Building a React Native app with native code, however, requires the `Android 13 (Tiramisu)` SDK in particular. Additional Android SDKs can be installed through the SDK Manager in Android Studio.
+
+To do that, open Android Studio, click on "Configure" button and select "SDK Manager".
+
+> The SDK Manager can also be found within the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+Select the "SDK Platforms" tab from within the SDK Manager, then check the box next to "Show Package Details" in the bottom right corner. Look for and expand the `Android 13 (Tiramisu)` entry, then make sure the following items are checked:
+
+- `Android SDK Platform 33`
+- `Intel x86 Atom_64 System Image` or `Google APIs Intel x86 Atom System Image`
+
+Next, select the "SDK Tools" tab and check the box next to "Show Package Details" here as well. Look for and expand the "Android SDK Build-Tools" entry, then make sure that `33.0.0` is selected.
+
+Finally, click "Apply" to download and install the Android SDK and related build tools.
+
+
3. Configure the ANDROID_HOME environment variable
+
+The React Native tools require some environment variables to be set up in order to build apps with native code.
+
+Add the following lines to your `$HOME/.bash_profile` or `$HOME/.bashrc` (if you are using `zsh` then `~/.zprofile` or `~/.zshrc`) config file:
+
+```shell
+export ANDROID_HOME=$HOME/Android/Sdk
+export PATH=$PATH:$ANDROID_HOME/emulator
+export PATH=$PATH:$ANDROID_HOME/platform-tools
+```
+
+> `.bash_profile` is specific to `bash`. If you're using another shell, you will need to edit the appropriate shell-specific config file.
+
+Type `source $HOME/.bash_profile` for `bash` or `source $HOME/.zprofile` to load the config into your current shell. Verify that ANDROID_HOME has been set by running `echo $ANDROID_HOME` and the appropriate directories have been added to your path by running `echo $PATH`.
+
+> Please make sure you use the correct Android SDK path. You can find the actual location of the SDK in the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+
Watchman
+
+Follow the [Watchman installation guide](https://facebook.github.io/watchman/docs/install#buildinstall) to compile and install Watchman from source.
+
+> [Watchman](https://facebook.github.io/watchman/docs/install) is a tool by Facebook for watching changes in the filesystem. It is highly recommended you install it for better performance and increased compatibility in certain edge cases (translation: you may be able to get by without installing this, but your mileage may vary; installing this now may save you from a headache later).
+
+
React Native Command Line Interface
+
+React Native has a built-in command line interface. Rather than install and manage a specific version of the CLI globally, we recommend you access the current version at runtime using `npx`, which ships with Node.js. With `npx react-native `, the current stable version of the CLI will be downloaded and executed at the time the command is run.
+
+
Creating a new application
+
+
+
+React Native has a built-in command line interface, which you can use to generate a new project. You can access it without installing anything globally using `npx`, which ships with Node.js. Let's create a new React Native project called "AwesomeProject":
+
+```shell
+npx react-native@latest init AwesomeProject
+```
+
+This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding Android support to an existing React Native project (see [Integration with Existing Apps](integration-with-existing-apps.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite).
+
+
[Optional] Using a specific version or template
+
+If you want to start a new project with a specific React Native version, you can use the `--version` argument:
+
+```shell
+npx react-native@X.XX.X init AwesomeProject --version X.XX.X
+```
+
+You can also start a project with a custom React Native template with the `--template` argument.
+
+
Preparing the Android device
+
+You will need an Android device to run your React Native Android app. This can be either a physical Android device, or more commonly, you can use an Android Virtual Device which allows you to emulate an Android device on your computer.
+
+Either way, you will need to prepare the device to run Android apps for development.
+
+
Using a physical device
+
+If you have a physical Android device, you can use it for development in place of an AVD by plugging it in to your computer using a USB cable and following the instructions [here](running-on-device.md).
+
+
Using a virtual device
+
+If you use Android Studio to open `./AwesomeProject/android`, you can see the list of available Android Virtual Devices (AVDs) by opening the "AVD Manager" from within Android Studio. Look for an icon that looks like this:
+
+
+
+If you have recently installed Android Studio, you will likely need to [create a new AVD](https://developer.android.com/studio/run/managing-avds.html). Select "Create Virtual Device...", then pick any Phone from the list and click "Next", then select the **Tiramisu** API Level 33 image.
+
+> We recommend configuring [VM acceleration](https://developer.android.com/studio/run/emulator-acceleration.html#vm-linux) on your system to improve performance. Once you've followed those instructions, go back to the AVD Manager.
+
+Click "Next" then "Finish" to create your AVD. At this point you should be able to click on the green triangle button next to your AVD to launch it, then proceed to the next step.
+
+
Running your React Native application
+
+
Step 1: Start Metro
+
+[**Metro**](https://facebook.github.io/metro/) is the JavaScript build tool for React Native. To start the Metro development server, run the following from your project folder:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+:::note
+If you're familiar with web development, Metro is similar to bundlers such as Vite and webpack, but is designed end-to-end for React Native. For instance, Metro uses [Babel](https://babel.dev/) to transform syntax such as JSX into executable JavaScript.
+:::
+
+
Step 2: Start your application
+
+Let Metro Bundler run in its own terminal. Open a new terminal inside your React Native project folder. Run the following:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+If everything is set up correctly, you should see your new app running in your Android emulator shortly.
+
+This is one way to run your app - you can also run it directly from within Android Studio.
+
+> If you can't get this to work, see the [Troubleshooting](troubleshooting.md) page.
+
+
Modifying your app
+
+Now that you have successfully run the app, let's modify it.
+
+- Open `App.tsx` in your text editor of choice and edit some lines.
+- Press the R key twice or select `Reload` from the Dev Menu (Ctrl + M) to see your changes!
+
+
That's it!
+
+Congratulations! You've successfully run and modified your first React Native app.
+
+
+
+
Now what?
+
+- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md).
+
+If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).
diff --git a/website/versioned_docs/version-0.73.0/_getting-started-macos-android.md b/website/versioned_docs/version-0.73.0/_getting-started-macos-android.md
new file mode 100644
index 00000000000..fa5f79e1a62
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_getting-started-macos-android.md
@@ -0,0 +1,211 @@
+import RemoveGlobalCLI from './\_remove-global-cli.md';
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Installing dependencies
+
+You will need Node, Watchman, the React Native command line interface, a JDK, and Android Studio.
+
+While you can use any editor of your choice to develop your app, you will need to install Android Studio in order to set up the necessary tooling to build your React Native app for Android.
+
+
Node & Watchman
+
+We recommend installing Node and Watchman using [Homebrew](https://brew.sh/). Run the following commands in a Terminal after installing Homebrew:
+
+```shell
+brew install node
+brew install watchman
+```
+
+If you have already installed Node on your system, make sure it is Node 18 or newer.
+
+[Watchman](https://facebook.github.io/watchman) is a tool by Facebook for watching changes in the filesystem. It is highly recommended you install it for better performance.
+
+
Java Development Kit
+
+We recommend installing the OpenJDK distribution called Azul **Zulu** using [Homebrew](https://brew.sh/). Run the following commands in a Terminal after installing Homebrew:
+
+```shell
+brew tap homebrew/cask-versions
+brew install --cask zulu17
+
+# Get path to where cask was installed to double-click installer
+brew info --cask zulu17
+```
+
+After you install the JDK, update your `JAVA_HOME` environment variable. If you used above steps, JDK will likely be at `/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home`
+
+The Zulu OpenJDK distribution offers JDKs for **both Intel and M1 Macs**. This will make sure your builds are faster on M1 Macs compared to using an Intel-based JDK.
+
+If you have already installed JDK on your system, we recommend JDK 17. You may encounter problems using higher JDK versions.
+
+
Android development environment
+
+Setting up your development environment can be somewhat tedious if you're new to Android development. If you're already familiar with Android development, there are a few things you may need to configure. In either case, please make sure to carefully follow the next few steps.
+
+
1. Install Android Studio
+
+[Download and install Android Studio](https://developer.android.com/studio/index.html). While on Android Studio installation wizard, make sure the boxes next to all of the following items are checked:
+
+- `Android SDK`
+- `Android SDK Platform`
+- `Android Virtual Device`
+
+Then, click "Next" to install all of these components.
+
+> If the checkboxes are grayed out, you will have a chance to install these components later on.
+
+Once setup has finalized and you're presented with the Welcome screen, proceed to the next step.
+
+
2. Install the Android SDK
+
+Android Studio installs the latest Android SDK by default. Building a React Native app with native code, however, requires the `Android 13 (Tiramisu)` SDK in particular. Additional Android SDKs can be installed through the SDK Manager in Android Studio.
+
+To do that, open Android Studio, click on "More Actions" button and select "SDK Manager".
+
+
+
+> The SDK Manager can also be found within the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+Select the "SDK Platforms" tab from within the SDK Manager, then check the box next to "Show Package Details" in the bottom right corner. Look for and expand the `Android 13 (Tiramisu)` entry, then make sure the following items are checked:
+
+- `Android SDK Platform 33`
+- `Intel x86 Atom_64 System Image` or `Google APIs Intel x86 Atom System Image` or (for Apple M1 Silicon) `Google APIs ARM 64 v8a System Image`
+
+Next, select the "SDK Tools" tab and check the box next to "Show Package Details" here as well. Look for and expand the "Android SDK Build-Tools" entry, then make sure that `33.0.0` is selected.
+
+Finally, click "Apply" to download and install the Android SDK and related build tools.
+
+
3. Configure the ANDROID_HOME environment variable
+
+The React Native tools require some environment variables to be set up in order to build apps with native code.
+
+Add the following lines to your `~/.zprofile` or `~/.zshrc` (if you are using `bash`, then `~/.bash_profile` or `~/.bashrc`) config file:
+
+```shell
+export ANDROID_HOME=$HOME/Library/Android/sdk
+export PATH=$PATH:$ANDROID_HOME/emulator
+export PATH=$PATH:$ANDROID_HOME/platform-tools
+```
+
+Run `source ~/.zprofile` (or `source ~/.bash_profile` for `bash`) to load the config into your current shell. Verify that ANDROID_HOME has been set by running `echo $ANDROID_HOME` and the appropriate directories have been added to your path by running `echo $PATH`.
+
+> Please make sure you use the correct Android SDK path. You can find the actual location of the SDK in the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+
React Native Command Line Interface
+
+React Native has a built-in command line interface. Rather than install and manage a specific version of the CLI globally, we recommend you access the current version at runtime using `npx`, which ships with Node.js. With `npx react-native `, the current stable version of the CLI will be downloaded and executed at the time the command is run.
+
+
Creating a new application
+
+
+
+React Native has a built-in command line interface, which you can use to generate a new project. You can access it without installing anything globally using `npx`, which ships with Node.js. Let's create a new React Native project called "AwesomeProject":
+
+```shell
+npx react-native@latest init AwesomeProject
+```
+
+This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding Android support to an existing React Native project (see [Integration with Existing Apps](integration-with-existing-apps.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite).
+
+
[Optional] Using a specific version or template
+
+If you want to start a new project with a specific React Native version, you can use the `--version` argument:
+
+```shell
+npx react-native@X.XX.X init AwesomeProject --version X.XX.X
+```
+
+You can also start a project with a custom React Native template with the `--template` argument.
+
+
Preparing the Android device
+
+You will need an Android device to run your React Native Android app. This can be either a physical Android device, or more commonly, you can use an Android Virtual Device which allows you to emulate an Android device on your computer.
+
+Either way, you will need to prepare the device to run Android apps for development.
+
+
Using a physical device
+
+If you have a physical Android device, you can use it for development in place of an AVD by plugging it in to your computer using a USB cable and following the instructions [here](running-on-device.md).
+
+
Using a virtual device
+
+If you use Android Studio to open `./AwesomeProject/android`, you can see the list of available Android Virtual Devices (AVDs) by opening the "AVD Manager" from within Android Studio. Look for an icon that looks like this:
+
+
+
+If you have recently installed Android Studio, you will likely need to [create a new AVD](https://developer.android.com/studio/run/managing-avds.html). Select "Create Virtual Device...", then pick any Phone from the list and click "Next", then select the **Tiramisu** API Level 33 image.
+
+Click "Next" then "Finish" to create your AVD. At this point you should be able to click on the green triangle button next to your AVD to launch it, then proceed to the next step.
+
+
Running your React Native application
+
+
Step 1: Start Metro
+
+[**Metro**](https://facebook.github.io/metro/) is the JavaScript build tool for React Native. To start the Metro development server, run the following from your project folder:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+:::note
+If you're familiar with web development, Metro is similar to bundlers such as Vite and webpack, but is designed end-to-end for React Native. For instance, Metro uses [Babel](https://babel.dev/) to transform syntax such as JSX into executable JavaScript.
+:::
+
+
Step 2: Start your application
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+If everything is set up correctly, you should see your new app running in your Android emulator shortly.
+
+
+
+This is one way to run your app - you can also run it directly from within Android Studio.
+
+> If you can't get this to work, see the [Troubleshooting](troubleshooting.md) page.
+
+
Modifying your app
+
+Now that you have successfully run the app, let's modify it.
+
+- Open `App.tsx` in your text editor of choice and edit some lines.
+- Press the R key twice or select `Reload` from the Dev Menu (Cmd ⌘ + M) to see your changes!
+
+
That's it!
+
+Congratulations! You've successfully run and modified your first React Native app.
+
+
+
+
Now what?
+
+- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md).
+
+If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).
diff --git a/website/versioned_docs/version-0.73.0/_getting-started-macos-ios.md b/website/versioned_docs/version-0.73.0/_getting-started-macos-ios.md
new file mode 100644
index 00000000000..60db1ec7acc
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_getting-started-macos-ios.md
@@ -0,0 +1,182 @@
+import RemoveGlobalCLI from './\_remove-global-cli.md';
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Installing dependencies
+
+You will need Node, Watchman, the React Native command line interface, Xcode and CocoaPods.
+
+While you can use any editor of your choice to develop your app, you will need to install Xcode in order to set up the necessary tooling to build your React Native app for iOS.
+
+### Node & Watchman
+
+We recommend installing Node and Watchman using [Homebrew](https://brew.sh/). Run the following commands in a Terminal after installing Homebrew:
+
+```shell
+brew install node
+brew install watchman
+```
+
+If you have already installed Node on your system, make sure it is Node 18 or newer.
+
+[Watchman](https://facebook.github.io/watchman) is a tool by Facebook for watching changes in the filesystem. It is highly recommended you install it for better performance.
+
+### Xcode
+
+The easiest way to install Xcode is via the [Mac App Store](https://itunes.apple.com/us/app/xcode/id497799835?mt=12). Installing Xcode will also install the iOS Simulator and all the necessary tools to build your iOS app.
+
+If you have already installed Xcode on your system, make sure it is version 10 or newer.
+
+#### Command Line Tools
+
+You will also need to install the Xcode Command Line Tools. Open Xcode, then choose **Settings... (or Preferences...)** from the Xcode menu. Go to the Locations panel and install the tools by selecting the most recent version in the Command Line Tools dropdown.
+
+
+
+#### Installing an iOS Simulator in Xcode
+
+To install a simulator, open **Xcode > Settings... (or Preferences...)** and select the **Platforms (or Components)** tab. Select a simulator with the corresponding version of iOS you wish to use.
+
+If you are using Xcode version 14.0 or greater than to install a simulator, open **Xcode > Settings > Platforms** tab, then click "+" icon and select **iOS…** option.
+
+#### CocoaPods
+
+[CocoaPods](https://cocoapods.org/) is one of the dependency management system available for iOS. CocoaPods is a Ruby [gem](https://en.wikipedia.org/wiki/RubyGems). You can install CocoaPods using the version of Ruby that ships with the latest version of macOS.
+
+For more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html).
+
+### React Native Command Line Interface
+
+React Native has a built-in command line interface. Rather than install and manage a specific version of the CLI globally, we recommend you access the current version at runtime using `npx`, which ships with Node.js. With `npx react-native `, the current stable version of the CLI will be downloaded and executed at the time the command is run.
+
+## Creating a new application
+
+
+
+You can use React Native's built-in command line interface to generate a new project. Let's create a new React Native project called "AwesomeProject":
+
+```shell
+npx react-native@latest init AwesomeProject
+```
+
+This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding iOS support to an existing React Native project (see [Integration with Existing Apps](integration-with-existing-apps.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite).
+
+:::info
+
+If you are having trouble with iOS, try to reinstall the dependencies by running:
+
+1. `cd ios` to navigate to the `ios` folder.
+2. `bundle install` to install [Bundler](https://bundler.io/)
+3. `bundle exec pod install` to install the iOS dependencies managed by CocoaPods.
+
+:::
+
+### [Optional] Using a specific version or template
+
+If you want to start a new project with a specific React Native version, you can use the `--version` argument:
+
+```shell
+npx react-native@X.XX.X init AwesomeProject --version X.XX.X
+```
+
+You can also start a project with a custom React Native template with the `--template` argument.
+
+> **Note** If the above command is failing, you may have old version of `react-native` or `react-native-cli` installed globally on your pc. Try uninstalling the cli and run the cli using `npx`.
+
+### [Optional] Configuring your environment
+
+Starting from React Native version 0.69, it is possible to configure the Xcode environment using the `.xcode.env` file provided by the template.
+
+The `.xcode.env` file contains an environment variable to export the path to the `node` executable in the `NODE_BINARY` variable.
+This is the **suggested approach** to decouple the build infrastructure from the system version of `node`. You should customize this variable with your own path or your own `node` version manager, if it differs from the default.
+
+On top of this, it's possible to add any other environment variable and to source the `.xcode.env` file in your build script phases. If you need to run script that requires some specific environment, this is the **suggested approach**: it allows to decouple the build phases from a specific environment.
+
+:::info
+If you are already using [NVM](https://nvm.sh/) (a command which helps you install and switch between versions of Node.js) and [zsh](https://ohmyz.sh/), you might want to move the code that initialize NVM from your `~/.zshrc` into a `~/.zshenv` file to help Xcode find your Node executable:
+
+```zsh
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
+```
+
+You might also want to ensure that all "shell script build phase" of your Xcode project, is using `/bin/zsh` as its shell.
+:::
+
+## Running your React Native application
+
+### Step 1: Start Metro
+
+[**Metro**](https://facebook.github.io/metro/) is the JavaScript build tool for React Native. To start the Metro development server, run the following from your project folder:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+:::note
+If you're familiar with web development, Metro is similar to bundlers such as Vite and webpack, but is designed end-to-end for React Native. For instance, Metro uses [Babel](https://babel.dev/) to transform syntax such as JSX into executable JavaScript.
+:::
+
+### Step 2: Start your application
+
+Let Metro Bundler run in its own terminal. Open a new terminal inside your React Native project folder. Run the following:
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+You should see your new app running in the iOS Simulator shortly.
+
+
+
+This is one way to run your app. You can also run it directly from within Xcode.
+
+> If you can't get this to work, see the [Troubleshooting](troubleshooting.md) page.
+
+### Running on a device
+
+The above command will automatically run your app on the iOS Simulator by default. If you want to run the app on an actual physical iOS device, please follow the instructions [here](running-on-device.md).
+
+### Modifying your app
+
+Now that you have successfully run the app, let's modify it.
+
+- Open `App.tsx` in your text editor of choice and edit some lines.
+- Hit Cmd ⌘ + R in your iOS Simulator to reload the app and see your changes!
+
+### That's it!
+
+Congratulations! You've successfully run and modified your first React Native app.
+
+
+
+## Now what?
+
+- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md).
+
+If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).
diff --git a/website/versioned_docs/version-0.73.0/_getting-started-windows-android.md b/website/versioned_docs/version-0.73.0/_getting-started-windows-android.md
new file mode 100644
index 00000000000..a9c01a46846
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_getting-started-windows-android.md
@@ -0,0 +1,229 @@
+import RemoveGlobalCLI from './\_remove-global-cli.md';
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
Installing dependencies
+
+You will need Node, the React Native command line interface, a JDK, and Android Studio.
+
+While you can use any editor of your choice to develop your app, you will need to install Android Studio in order to set up the necessary tooling to build your React Native app for Android.
+
+
Node, JDK
+
+We recommend installing Node via [Chocolatey](https://chocolatey.org/install), a popular package manager for Windows.
+
+It is recommended to use an LTS version of Node. If you want to be able to switch between different versions, you might want to install Node via [nvm-windows](https://github.com/coreybutler/nvm-windows), a Node version manager for Windows.
+
+React Native also requires [Java SE Development Kit (JDK)](https://openjdk.java.net/projects/jdk/17/), which can be installed using Chocolatey as well.
+
+Open an Administrator Command Prompt (right click Command Prompt and select "Run as Administrator"), then run the following command:
+
+```powershell
+choco install -y nodejs-lts microsoft-openjdk17
+```
+
+If you have already installed Node on your system, make sure it is Node 18 or newer. If you already have a JDK on your system, we recommend JDK17. You may encounter problems using higher JDK versions.
+
+> You can find additional installation options on [Node's Downloads page](https://nodejs.org/en/download/).
+
+> If you're using the latest version of Java Development Kit, you'll need to change the Gradle version of your project so it can recognize the JDK. You can do that by going to `{project root folder}\android\gradle\wrapper\gradle-wrapper.properties` and changing the `distributionUrl` value to upgrade the Gradle version. You can check out [here the latest releases of Gradle](https://gradle.org/releases/).
+
+
Android development environment
+
+Setting up your development environment can be somewhat tedious if you're new to Android development. If you're already familiar with Android development, there are a few things you may need to configure. In either case, please make sure to carefully follow the next few steps.
+
+
1. Install Android Studio
+
+[Download and install Android Studio](https://developer.android.com/studio/index.html). While on Android Studio installation wizard, make sure the boxes next to all of the following items are checked:
+
+- `Android SDK`
+- `Android SDK Platform`
+- `Android Virtual Device`
+- If you are not already using Hyper-V: `Performance (Intel ® HAXM)` ([See here for AMD or Hyper-V](https://android-developers.googleblog.com/2018/07/android-emulator-amd-processor-hyper-v.html))
+
+Then, click "Next" to install all of these components.
+
+> If the checkboxes are grayed out, you will have a chance to install these components later on.
+
+Once setup has finalized and you're presented with the Welcome screen, proceed to the next step.
+
+
2. Install the Android SDK
+
+Android Studio installs the latest Android SDK by default. Building a React Native app with native code, however, requires the `Android 13 (Tiramisu)` SDK in particular. Additional Android SDKs can be installed through the SDK Manager in Android Studio.
+
+To do that, open Android Studio, click on "More Actions" button and select "SDK Manager".
+
+
+
+> The SDK Manager can also be found within the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+Select the "SDK Platforms" tab from within the SDK Manager, then check the box next to "Show Package Details" in the bottom right corner. Look for and expand the `Android 13 (Tiramisu)` entry, then make sure the following items are checked:
+
+- `Android SDK Platform 33`
+- `Intel x86 Atom_64 System Image` or `Google APIs Intel x86 Atom System Image`
+
+Next, select the "SDK Tools" tab and check the box next to "Show Package Details" here as well. Look for and expand the `Android SDK Build-Tools` entry, then make sure that `33.0.0` is selected.
+
+Finally, click "Apply" to download and install the Android SDK and related build tools.
+
+
3. Configure the ANDROID_HOME environment variable
+
+The React Native tools require some environment variables to be set up in order to build apps with native code.
+
+1. Open the **Windows Control Panel.**
+2. Click on **User Accounts,** then click **User Accounts** again
+3. Click on **Change my environment variables**
+4. Click on **New...** to create a new `ANDROID_HOME` user variable that points to the path to your Android SDK:
+
+
+
+The SDK is installed, by default, at the following location:
+
+```powershell
+%LOCALAPPDATA%\Android\Sdk
+```
+
+You can find the actual location of the SDK in the Android Studio "Settings" dialog, under **Languages & Frameworks** → **Android SDK**.
+
+Open a new Command Prompt window to ensure the new environment variable is loaded before proceeding to the next step.
+
+1. Open powershell
+2. Copy and paste **Get-ChildItem -Path Env:\\** into powershell
+3. Verify `ANDROID_HOME` has been added
+
+
4. Add platform-tools to Path
+
+1. Open the **Windows Control Panel.**
+2. Click on **User Accounts,** then click **User Accounts** again
+3. Click on **Change my environment variables**
+4. Select the **Path** variable.
+5. Click **Edit.**
+6. Click **New** and add the path to platform-tools to the list.
+
+The default location for this folder is:
+
+```powershell
+%LOCALAPPDATA%\Android\Sdk\platform-tools
+```
+
+
React Native Command Line Interface
+
+React Native has a built-in command line interface. Rather than install and manage a specific version of the CLI globally, we recommend you access the current version at runtime using `npx`, which ships with Node.js. With `npx react-native `, the current stable version of the CLI will be downloaded and executed at the time the command is run.
+
+
Creating a new application
+
+
+
+React Native has a built-in command line interface, which you can use to generate a new project. You can access it without installing anything globally using `npx`, which ships with Node.js. Let's create a new React Native project called "AwesomeProject":
+
+```shell
+npx react-native@latest init AwesomeProject
+```
+
+This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding Android support to an existing React Native project (see [Integration with Existing Apps](integration-with-existing-apps.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite).
+
+
[Optional] Using a specific version or template
+
+If you want to start a new project with a specific React Native version, you can use the `--version` argument:
+
+```shell
+npx react-native@X.XX.X init AwesomeProject --version X.XX.X
+```
+
+You can also start a project with a custom React Native template with the `--template` argument.
+
+
Preparing the Android device
+
+You will need an Android device to run your React Native Android app. This can be either a physical Android device, or more commonly, you can use an Android Virtual Device which allows you to emulate an Android device on your computer.
+
+Either way, you will need to prepare the device to run Android apps for development.
+
+
Using a physical device
+
+If you have a physical Android device, you can use it for development in place of an AVD by plugging it in to your computer using a USB cable and following the instructions [here](running-on-device.md).
+
+
Using a virtual device
+
+If you use Android Studio to open `./AwesomeProject/android`, you can see the list of available Android Virtual Devices (AVDs) by opening the "AVD Manager" from within Android Studio. Look for an icon that looks like this:
+
+
+
+If you have recently installed Android Studio, you will likely need to [create a new AVD](https://developer.android.com/studio/run/managing-avds.html). Select "Create Virtual Device...", then pick any Phone from the list and click "Next", then select the **Tiramisu** API Level 33 image.
+
+> If you don't have HAXM installed, click on "Install HAXM" or follow [these instructions](https://github.com/intel/haxm/wiki/Installation-Instructions-on-Windows) to set it up, then go back to the AVD Manager.
+
+Click "Next" then "Finish" to create your AVD. At this point you should be able to click on the green triangle button next to your AVD to launch it, then proceed to the next step.
+
+
Running your React Native application
+
+
Step 1: Start Metro
+
+[**Metro**](https://facebook.github.io/metro/) is the JavaScript build tool for React Native. To start the Metro development server, run the following from your project folder:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+:::note
+If you're familiar with web development, Metro is similar to bundlers such as Vite and webpack, but is designed end-to-end for React Native. For instance, Metro uses [Babel](https://babel.dev/) to transform syntax such as JSX into executable JavaScript.
+:::
+
+
Step 2: Start your application
+
+Let Metro Bundler run in its own terminal. Open a new terminal inside your React Native project folder. Run the following:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+If everything is set up correctly, you should see your new app running in your Android emulator shortly.
+
+
+
+This is one way to run your app - you can also run it directly from within Android Studio.
+
+> If you can't get this to work, see the [Troubleshooting](troubleshooting.md) page.
+
+
Modifying your app
+
+Now that you have successfully run the app, let's modify it.
+
+- Open `App.tsx` in your text editor of choice and edit some lines.
+- Press the R key twice or select `Reload` from the Dev Menu (Ctrl + M) to see your changes!
+
+
That's it!
+
+Congratulations! You've successfully run and modified your first React Native app.
+
+
+
+
Now what?
+
+- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md).
+
+If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).
diff --git a/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-java.md b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-java.md
new file mode 100644
index 00000000000..af77483cebe
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-java.md
@@ -0,0 +1,443 @@
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Key Concepts
+
+The keys to integrating React Native components into your Android application are to:
+
+1. Set up React Native dependencies and directory structure.
+2. Develop your React Native components in JavaScript.
+3. Add a `ReactRootView` to your Android app. This view will serve as the container for your React Native component.
+4. Start the React Native server and run your native application.
+5. Verify that the React Native aspect of your application works as expected.
+
+## Prerequisites
+
+Follow the React Native CLI Quickstart in the [environment setup guide](environment-setup) to configure your development environment for building React Native apps for Android.
+
+### 1. Set up directory structure
+
+To ensure a smooth experience, create a new folder for your integrated React Native project, then copy your existing Android project to an `/android` subfolder.
+
+### 2. Install JavaScript dependencies
+
+Go to the root directory for your project and create a new `package.json` file with the following contents:
+
+```
+{
+ "name": "MyReactNativeApp",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "react-native start"
+ }
+}
+```
+
+Next, install the `react` and `react-native` packages. Open a terminal or command prompt, then navigate to the directory with your `package.json` file and run:
+
+
+
+
+```shell
+npm install react-native
+```
+
+
+
+
+```shell
+yarn add react-native
+```
+
+
+
+
+This will print a message similar to the following (scroll up in the yarn output to see it):
+
+> warning "`react-native@0.70.5`" has unmet peer dependency "`react@18.1.0`"
+
+This is OK, it means we also need to install React:
+
+
+
+
+```shell
+npm install react@version_printed_above
+```
+
+
+
+
+```shell
+yarn add react@version_printed_above
+```
+
+
+
+
+Yarn has created a new `/node_modules` folder. This folder stores all the JavaScript dependencies required to build your project.
+
+Add `node_modules/` to your `.gitignore` file.
+
+## Adding React Native to your app
+
+### Configuring Gradle
+
+React Native uses the React Native Gradle Plugin to configure your dependencies and project setup.
+
+First, let's edit your `settings.gradle` file by adding this line:
+
+```groovy
+includeBuild('../node_modules/@react-native/gradle-plugin')
+```
+
+Then you need to open your top level `build.gradle` and include this line:
+
+```diff
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath("com.android.tools.build:gradle:7.3.1")
++ classpath("com.facebook.react:react-native-gradle-plugin")
+ }
+}
+```
+
+This makes sure the React Native Gradle Plugin is available inside your project.
+Finally, add those lines inside your app's `build.gradle` file (it's a different `build.gradle` file inside your app folder):
+
+```diff
+apply plugin: "com.android.application"
++apply plugin: "com.facebook.react"
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ // Other dependencies here
++ implementation "com.facebook.react:react-android"
++ implementation "com.facebook.react:hermes-android"
+}
+```
+
+Those depedencies are available on `mavenCentral()` so make sure you have it defined in your `repositories{}` block.
+
+:::info
+We intentionally don't specify the version for those `implementation` dependencies as the React Native Gradle Plugin will take care of it. If you don't use the React Native Gradle Plugin, you'll have to specify version manually.
+:::
+
+### Enable native modules autolinking
+
+To use the power of [autolinking](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md), we have to apply it a few places. First add the following entry to `settings.gradle`:
+
+```gradle
+apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
+```
+
+Next add the following entry at the very bottom of the `app/build.gradle`:
+
+```gradle
+apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
+```
+
+### Configuring permissions
+
+Next, make sure you have the Internet permission in your `AndroidManifest.xml`:
+
+```xml
+
+```
+
+If you need to access to the `DevSettingsActivity` add to your `AndroidManifest.xml`:
+
+```xml
+
+```
+
+This is only used in dev mode when reloading JavaScript from the development server, so you can strip this in release builds if you need to.
+
+### Cleartext Traffic (API level 28+)
+
+> Starting with Android 9 (API level 28), cleartext traffic is disabled by default; this prevents your application from connecting to the [Metro bundler][metro]. The changes below allow cleartext traffic in debug builds.
+
+#### 1. Apply the `usesCleartextTraffic` option to your Debug `AndroidManifest.xml`
+
+```xml
+
+
+
+
+
+```
+
+This is not required for Release builds.
+
+To learn more about Network Security Config and the cleartext traffic policy [see this link](https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted).
+
+### Code integration
+
+Now we will actually modify the native Android application to integrate React Native.
+
+#### The React Native component
+
+The first bit of code we will write is the actual React Native code for the new "High Score" screen that will be integrated into our application.
+
+##### 1. Create a `index.js` file
+
+First, create an empty `index.js` file in the root of your React Native project.
+
+`index.js` is the starting point for React Native applications, and it is always required. It can be a small file that `require`s other file that are part of your React Native component or application, or it can contain all the code that is needed for it. In our case, we will put everything in `index.js`.
+
+##### 2. Add your React Native code
+
+In your `index.js`, create your component. In our sample here, we will add a `` component within a styled ``:
+
+```jsx
+import React from 'react';
+import {AppRegistry, StyleSheet, Text, View} from 'react-native';
+
+const HelloWorld = () => {
+ return (
+
+ Hello, World
+
+ );
+};
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ hello: {
+ fontSize: 20,
+ textAlign: 'center',
+ margin: 10,
+ },
+});
+
+AppRegistry.registerComponent(
+ 'MyReactNativeApp',
+ () => HelloWorld,
+);
+```
+
+##### 3. Configure permissions for development error overlay
+
+If your app is targeting the Android `API level 23` or greater, make sure you have the permission `android.permission.SYSTEM_ALERT_WINDOW` enabled for the development build. You can check this with `Settings.canDrawOverlays(this);`. This is required in dev builds because React Native development errors must be displayed above all the other windows. Due to the new permissions system introduced in the API level 23 (Android M), the user needs to approve it. This can be achieved by adding the following code to your Activity's in `onCreate()` method.
+
+```java
+private final int OVERLAY_PERMISSION_REQ_CODE = 1; // Choose any value
+
+...
+
+if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (!Settings.canDrawOverlays(this)) {
+ Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+ Uri.parse("package:" + getPackageName()));
+ startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
+ }
+}
+```
+
+Finally, the `onActivityResult()` method (as shown in the code below) has to be overridden to handle the permission Accepted or Denied cases for consistent UX. Also, for integrating Native Modules which use `startActivityForResult`, we need to pass the result to the `onActivityResult` method of our `ReactInstanceManager` instance.
+
+```java
+@Override
+protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (!Settings.canDrawOverlays(this)) {
+ // SYSTEM_ALERT_WINDOW permission not granted
+ }
+ }
+ }
+ mReactInstanceManager.onActivityResult( this, requestCode, resultCode, data );
+}
+```
+
+#### The Magic: `ReactRootView`
+
+Let's add some native code in order to start the React Native runtime and tell it to render our JS component. To do this, we're going to create an `Activity` that creates a `ReactRootView`, starts a React application inside it and sets it as the main content view.
+
+> If you are targeting Android version <5, use the `AppCompatActivity` class from the `com.android.support:appcompat` package instead of `Activity`.
+
+```java
+public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler {
+ private ReactRootView mReactRootView;
+ private ReactInstanceManager mReactInstanceManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ SoLoader.init(this, false);
+
+ mReactRootView = new ReactRootView(this);
+ List packages = new PackageList(getApplication()).getPackages();
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // packages.add(new MyReactNativePackage());
+ // Remember to include them in `settings.gradle` and `app/build.gradle` too.
+
+ mReactInstanceManager = ReactInstanceManager.builder()
+ .setApplication(getApplication())
+ .setCurrentActivity(this)
+ .setBundleAssetName("index.android.bundle")
+ .setJSMainModulePath("index")
+ .addPackages(packages)
+ .setUseDeveloperSupport(BuildConfig.DEBUG)
+ .setInitialLifecycleState(LifecycleState.RESUMED)
+ .build();
+ // The string here (e.g. "MyReactNativeApp") has to match
+ // the string in AppRegistry.registerComponent() in index.js
+ mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null);
+
+ setContentView(mReactRootView);
+ }
+
+ @Override
+ public void invokeDefaultOnBackPressed() {
+ super.onBackPressed();
+ }
+}
+```
+
+> If you are using a starter kit for React Native, replace the "HelloWorld" string with the one in your index.js file (it’s the first argument to the `AppRegistry.registerComponent()` method).
+
+Perform a “Sync Project files with Gradle” operation.
+
+If you are using Android Studio, use `Alt + Enter` to add all missing imports in your MyReactActivity class. Be careful to use your package’s `BuildConfig` and not the one from the `facebook` package.
+
+We need set the theme of `MyReactActivity` to `Theme.AppCompat.Light.NoActionBar` because some React Native UI components rely on this theme.
+
+```xml
+
+
+```
+
+> A `ReactInstanceManager` can be shared by multiple activities and/or fragments. You will want to make your own `ReactFragment` or `ReactActivity` and have a singleton _holder_ that holds a `ReactInstanceManager`. When you need the `ReactInstanceManager` (e.g., to hook up the `ReactInstanceManager` to the lifecycle of those Activities or Fragments) use the one provided by the singleton.
+
+Next, we need to pass some activity lifecycle callbacks to the `ReactInstanceManager` and `ReactRootView`:
+
+```java
+@Override
+protected void onPause() {
+ super.onPause();
+
+ if (mReactInstanceManager != null) {
+ mReactInstanceManager.onHostPause(this);
+ }
+}
+
+@Override
+protected void onResume() {
+ super.onResume();
+
+ if (mReactInstanceManager != null) {
+ mReactInstanceManager.onHostResume(this, this);
+ }
+}
+
+@Override
+protected void onDestroy() {
+ super.onDestroy();
+
+ if (mReactInstanceManager != null) {
+ mReactInstanceManager.onHostDestroy(this);
+ }
+ if (mReactRootView != null) {
+ mReactRootView.unmountReactApplication();
+ }
+}
+```
+
+We also need to pass back button events to React Native:
+
+```java
+@Override
+ public void onBackPressed() {
+ if (mReactInstanceManager != null) {
+ mReactInstanceManager.onBackPressed();
+ } else {
+ super.onBackPressed();
+ }
+}
+```
+
+This allows JavaScript to control what happens when the user presses the hardware back button (e.g. to implement navigation). When JavaScript doesn't handle the back button press, your `invokeDefaultOnBackPressed` method will be called. By default this finishes your `Activity`.
+
+Finally, we need to hook up the dev menu. By default, this is activated by (rage) shaking the device, but this is not very useful in emulators. So we make it show when you press the hardware menu button (use Ctrl + M if you're using Android Studio emulator):
+
+```java
+@Override
+public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
+ mReactInstanceManager.showDevOptionsDialog();
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+}
+```
+
+Now your activity is ready to run some JavaScript code.
+
+### Test your integration
+
+You have now done all the basic steps to integrate React Native with your current application. Now we will start the [Metro bundler][metro] to build the `index.bundle` package and the server running on localhost to serve it.
+
+##### 1. Run the packager
+
+To run your app, you need to first start the development server. To do this, run the following command in the root directory of your React Native project:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+##### 2. Run the app
+
+Now build and run your Android app as normal.
+
+Once you reach your React-powered activity inside the app, it should load the JavaScript code from the development server and display:
+
+
+
+### Creating a release build in Android Studio
+
+You can use Android Studio to create your release builds too! It’s as quick as creating release builds of your previously-existing native Android app.
+
+If you use the React Native Gradle Plugin as described above, everything should work when running app from Android Studio.
+
+If you're not using the React Native Gradle Plugin, there’s one additional step which you’ll have to do before every release build. You need to execute the following to create a React Native bundle, which will be included with your native Android app:
+
+```shell
+$ npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/com/your-company-name/app-package-name/src/main/assets/index.android.bundle --assets-dest android/com/your-company-name/app-package-name/src/main/res/
+```
+
+> Don’t forget to replace the paths with correct ones and create the assets folder if it doesn’t exist.
+
+Now, create a release build of your native app from within Android Studio as usual and you should be good to go!
+
+### Now what?
+
+At this point you can continue developing your app as usual. Refer to our [debugging](debugging) and [deployment](running-on-device) docs to learn more about working with React Native.
+
+[metro]: https://facebook.github.io/metro/
diff --git a/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-kotlin.md b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-kotlin.md
new file mode 100644
index 00000000000..a43d9e261e4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-kotlin.md
@@ -0,0 +1,419 @@
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Key Concepts
+
+The keys to integrating React Native components into your Android application are to:
+
+1. Set up React Native dependencies and directory structure.
+2. Develop your React Native components in JavaScript.
+3. Add a `ReactRootView` to your Android app. This view will serve as the container for your React Native component.
+4. Start the React Native server and run your native application.
+5. Verify that the React Native aspect of your application works as expected.
+
+## Prerequisites
+
+Follow the React Native CLI Quickstart in the [environment setup guide](environment-setup) to configure your development environment for building React Native apps for Android.
+
+### 1. Set up directory structure
+
+To ensure a smooth experience, create a new folder for your integrated React Native project, then copy your existing Android project to an `/android` subfolder.
+
+### 2. Install JavaScript dependencies
+
+Go to the root directory for your project and create a new `package.json` file with the following contents:
+
+```
+{
+ "name": "MyReactNativeApp",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "yarn react-native start"
+ }
+}
+```
+
+Next, install the `react` and `react-native` packages. Open a terminal or command prompt, then navigate to the directory with your `package.json` file and run:
+
+
+
+
+```shell
+npm install react-native
+```
+
+
+
+
+```shell
+yarn add react-native
+```
+
+
+
+
+This will print a message similar to the following (scroll up in the yarn output to see it):
+
+> warning "`react-native@0.70.5`" has unmet peer dependency "`react@18.1.0`"
+
+This is OK, it means we also need to install React:
+
+
+
+
+```shell
+npm install react@version_printed_above
+```
+
+
+
+
+```shell
+yarn add react@version_printed_above
+```
+
+
+
+
+Yarn has created a new `/node_modules` folder. This folder stores all the JavaScript dependencies required to build your project.
+
+Add `node_modules/` to your `.gitignore` file.
+
+## Adding React Native to your app
+
+### Configuring Gradle
+
+React Native uses the React Native Gradle Plugin to configure your dependencies and project setup.
+
+First, let's edit your `settings.gradle` file by adding this line:
+
+```groovy
+includeBuild('../node_modules/@react-native/gradle-plugin')
+```
+
+Then you need to open your top level `build.gradle` and include this line:
+
+```diff
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath("com.android.tools.build:gradle:7.3.1")
++ classpath("com.facebook.react:react-native-gradle-plugin")
+ }
+}
+```
+
+This makes sure the React Native Gradle Plugin is available inside your project.
+Finally, add those lines inside your app's `build.gradle` file (it's a different `build.gradle` file inside your app folder):
+
+```diff
+apply plugin: "com.android.application"
++apply plugin: "com.facebook.react"
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ // Other dependencies here
++ implementation "com.facebook.react:react-android"
++ implementation "com.facebook.react:hermes-android"
+}
+```
+
+Those depedencies are available on `mavenCentral()` so make sure you have it defined in your `repositories{}` block.
+
+:::info
+We intentionally don't specify the version for those `implementation` dependencies as the React Native Gradle Plugin will take care of it. If you don't use the React Native Gradle Plugin, you'll have to specify version manually.
+:::
+
+### Enable native modules autolinking
+
+To use the power of [autolinking](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md), we have to apply it a few places. First add the following entry to `settings.gradle`:
+
+```gradle
+apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
+```
+
+Next add the following entry at the very bottom of the `app/build.gradle`:
+
+```gradle
+apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
+```
+
+### Configuring permissions
+
+Next, make sure you have the Internet permission in your `AndroidManifest.xml`:
+
+```xml
+
+```
+
+If you need to access to the `DevSettingsActivity` add to your `AndroidManifest.xml`:
+
+```xml
+
+```
+
+This is only used in dev mode when reloading JavaScript from the development server, so you can strip this in release builds if you need to.
+
+### Cleartext Traffic (API level 28+)
+
+> Starting with Android 9 (API level 28), cleartext traffic is disabled by default; this prevents your application from connecting to the [Metro bundler][metro]. The changes below allow cleartext traffic in debug builds.
+
+#### 1. Apply the `usesCleartextTraffic` option to your Debug `AndroidManifest.xml`
+
+```xml
+
+
+
+
+
+```
+
+This is not required for Release builds.
+
+To learn more about Network Security Config and the cleartext traffic policy [see this link](https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted).
+
+### Code integration
+
+Now we will actually modify the native Android application to integrate React Native.
+
+#### The React Native component
+
+The first bit of code we will write is the actual React Native code for the new "High Score" screen that will be integrated into our application.
+
+##### 1. Create a `index.js` file
+
+First, create an empty `index.js` file in the root of your React Native project.
+
+`index.js` is the starting point for React Native applications, and it is always required. It can be a small file that `require`s other file that are part of your React Native component or application, or it can contain all the code that is needed for it. In our case, we will put everything in `index.js`.
+
+##### 2. Add your React Native code
+
+In your `index.js`, create your component. In our sample here, we will add a `` component within a styled ``:
+
+```jsx
+import React from 'react';
+import {AppRegistry, StyleSheet, Text, View} from 'react-native';
+
+const HelloWorld = () => {
+ return (
+
+ Hello, World
+
+ );
+};
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ hello: {
+ fontSize: 20,
+ textAlign: 'center',
+ margin: 10,
+ },
+});
+
+AppRegistry.registerComponent(
+ 'MyReactNativeApp',
+ () => HelloWorld,
+);
+```
+
+##### 3. Configure permissions for development error overlay
+
+If your app is targeting the Android `API level 23` or greater, make sure you have the permission `android.permission.SYSTEM_ALERT_WINDOW` enabled for the development build. You can check this with `Settings.canDrawOverlays(this)`. This is required in dev builds because React Native development errors must be displayed above all the other windows. Due to the new permissions system introduced in the API level 23 (Android M), the user needs to approve it. This can be achieved by adding the following code to your Activity's in `onCreate()` method.
+
+```kotlin
+companion object {
+ const val OVERLAY_PERMISSION_REQ_CODE = 1 // Choose any value
+}
+
+...
+
+if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if(!Settings.canDrawOverlays(this)) {
+ val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+ Uri.parse("package: $packageName"))
+ startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
+ }
+}
+```
+
+Finally, the `onActivityResult()` method (as shown in the code below) has to be overridden to handle the permission Accepted or Denied cases for consistent UX. Also, for integrating Native Modules which use `startActivityForResult`, we need to pass the result to the `onActivityResult` method of our `ReactInstanceManager` instance.
+
+```kotlin
+override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (!Settings.canDrawOverlays(this)) {
+ // SYSTEM_ALERT_WINDOW permission not granted
+ }
+ }
+ }
+ reactInstanceManager?.onActivityResult(this, requestCode, resultCode, data)
+}
+```
+
+#### The Magic: `ReactRootView`
+
+Let's add some native code in order to start the React Native runtime and tell it to render our JS component. To do this, we're going to create an `Activity` that creates a `ReactRootView`, starts a React application inside it and sets it as the main content view.
+
+> If you are targeting Android version <5, use the `AppCompatActivity` class from the `com.android.support:appcompat` package instead of `Activity`.
+
+```kotlin
+class MyReactActivity : Activity(), DefaultHardwareBackBtnHandler {
+ private lateinit var reactRootView: ReactRootView
+ private lateinit var reactInstanceManager: ReactInstanceManager
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ SoLoader.init(this, false)
+ reactRootView = ReactRootView(this)
+ val packages: List = PackageList(application).packages
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // packages.add(MyReactNativePackage())
+ // Remember to include them in `settings.gradle` and `app/build.gradle` too.
+ reactInstanceManager = ReactInstanceManager.builder()
+ .setApplication(application)
+ .setCurrentActivity(this)
+ .setBundleAssetName("index.android.bundle")
+ .setJSMainModulePath("index")
+ .addPackages(packages)
+ .setUseDeveloperSupport(BuildConfig.DEBUG)
+ .setInitialLifecycleState(LifecycleState.RESUMED)
+ .build()
+ // The string here (e.g. "MyReactNativeApp") has to match
+ // the string in AppRegistry.registerComponent() in index.js
+ reactRootView?.startReactApplication(reactInstanceManager, "MyReactNativeApp", null)
+ setContentView(reactRootView)
+ }
+
+ override fun invokeDefaultOnBackPressed() {
+ super.onBackPressed()
+ }
+}
+```
+
+> If you are using a starter kit for React Native, replace the "HelloWorld" string with the one in your index.js file (it’s the first argument to the `AppRegistry.registerComponent()` method).
+
+Perform a “Sync Project files with Gradle” operation.
+
+If you are using Android Studio, use `Alt + Enter` to add all missing imports in your MyReactActivity class. Be careful to use your package’s `BuildConfig` and not the one from the `facebook` package.
+
+We need set the theme of `MyReactActivity` to `Theme.AppCompat.Light.NoActionBar` because some React Native UI components rely on this theme.
+
+```xml
+
+
+```
+
+> A `ReactInstanceManager` can be shared by multiple activities and/or fragments. You will want to make your own `ReactFragment` or `ReactActivity` and have a singleton _holder_ that holds a `ReactInstanceManager`. When you need the `ReactInstanceManager` (e.g., to hook up the `ReactInstanceManager` to the lifecycle of those Activities or Fragments) use the one provided by the singleton.
+
+Next, we need to pass some activity lifecycle callbacks to the `ReactInstanceManager` and `ReactRootView`:
+
+```kotlin
+override fun onPause() {
+ super.onPause()
+ reactInstanceManager.onHostPause(this)
+}
+
+override fun onResume() {
+ super.onResume()
+ reactInstanceManager.onHostResume(this, this)
+}
+
+override fun onDestroy() {
+ super.onDestroy()
+ reactInstanceManager.onHostDestroy(this)
+ reactRootView.unmountReactApplication()
+}
+```
+
+We also need to pass back button events to React Native:
+
+```kotlin
+override fun onBackPressed() {
+ reactInstanceManager.onBackPressed()
+ super.onBackPressed()
+}
+```
+
+This allows JavaScript to control what happens when the user presses the hardware back button (e.g. to implement navigation). When JavaScript doesn't handle the back button press, your `invokeDefaultOnBackPressed` method will be called. By default this finishes your `Activity`.
+
+Finally, we need to hook up the dev menu. By default, this is activated by (rage) shaking the device, but this is not very useful in emulators. So we make it show when you press the hardware menu button (use Ctrl + M if you're using Android Studio emulator):
+
+```kotlin
+override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_MENU && reactInstanceManager != null) {
+ reactInstanceManager.showDevOptionsDialog()
+ return true
+ }
+ return super.onKeyUp(keyCode, event)
+}
+```
+
+Now your activity is ready to run some JavaScript code.
+
+### Test your integration
+
+You have now done all the basic steps to integrate React Native with your current application. Now we will start the [Metro bundler][metro] to build the `index.bundle` package and the server running on localhost to serve it.
+
+##### 1. Run the packager
+
+To run your app, you need to first start the development server. To do this, run the following command in the root directory of your React Native project:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+##### 2. Run the app
+
+Now build and run your Android app as normal.
+
+Once you reach your React-powered activity inside the app, it should load the JavaScript code from the development server and display:
+
+
+
+### Creating a release build in Android Studio
+
+You can use Android Studio to create your release builds too! It’s as quick as creating release builds of your previously-existing native Android app.
+
+If you use the React Native Gradle Plugin as described above, everything should work when running app from Android Studio.
+
+If you're not using the React Native Gradle Plugin, there’s one additional step which you’ll have to do before every release build. You need to execute the following to create a React Native bundle, which will be included with your native Android app:
+
+```shell
+$ npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/com/your-company-name/app-package-name/src/main/assets/index.android.bundle --assets-dest android/com/your-company-name/app-package-name/src/main/res/
+```
+
+> Don’t forget to replace the paths with correct ones and create the assets folder if it doesn’t exist.
+
+Now, create a release build of your native app from within Android Studio as usual and you should be good to go!
+
+### Now what?
+
+At this point you can continue developing your app as usual. Refer to our [debugging](debugging) and [deployment](running-on-device) docs to learn more about working with React Native.
+
+[metro]: https://facebook.github.io/metro/
diff --git a/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-objc.md b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-objc.md
new file mode 100644
index 00000000000..3b7c0701724
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-objc.md
@@ -0,0 +1,403 @@
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Key Concepts
+
+The keys to integrating React Native components into your iOS application are to:
+
+1. Set up React Native dependencies and directory structure.
+2. Understand what React Native components you will use in your app.
+3. Add these components as dependencies using CocoaPods.
+4. Develop your React Native components in JavaScript.
+5. Add a `RCTRootView` to your iOS app. This view will serve as the container for your React Native component.
+6. Start the React Native server and run your native application.
+7. Verify that the React Native aspect of your application works as expected.
+
+## Prerequisites
+
+Follow the React Native CLI Quickstart in the [environment setup guide](environment-setup) to configure your development environment for building React Native apps for iOS.
+
+### 1. Set up directory structure
+
+To ensure a smooth experience, create a new folder for your integrated React Native project, then copy your existing iOS project to a `/ios` subfolder.
+
+### 2. Install JavaScript dependencies
+
+Go to the root directory for your project and create a new `package.json` file with the following contents:
+
+```
+{
+ "name": "MyReactNativeApp",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "yarn react-native start"
+ }
+}
+```
+
+Next, make sure you have [installed the yarn package manager](https://yarnpkg.com/lang/en/docs/install/).
+
+Install the `react` and `react-native` packages. Open a terminal or command prompt, then navigate to the directory with your `package.json` file and run:
+
+
+
+
+```shell
+npm install react-native
+```
+
+
+
+
+```shell
+yarn add react-native
+```
+
+
+
+
+This will print a message similar to the following (scroll up in the yarn output to see it):
+
+> warning "`react-native@0.52.2`" has unmet peer dependency "`react@16.2.0`".
+
+This is OK, it means we also need to install React:
+
+
+
+
+```shell
+npm install react@version_printed_above
+```
+
+
+
+
+```shell
+yarn add react@version_printed_above
+```
+
+
+
+
+Installation process has created a new `/node_modules` folder. This folder stores all the JavaScript dependencies required to build your project.
+
+Add `node_modules/` to your `.gitignore` file.
+
+### 3. Install CocoaPods
+
+[CocoaPods](https://cocoapods.org) is a package management tool for iOS and macOS development. We use it to add the actual React Native framework code locally into your current project.
+
+We recommend installing CocoaPods using [Homebrew](https://brew.sh/).
+
+```shell
+brew install cocoapods
+```
+
+> It is technically possible not to use CocoaPods, but that would require manual library and linker additions that would overly complicate this process.
+
+## Adding React Native to your app
+
+Assume the [app for integration](https://github.com/JoelMarcey/iOS-2048) is a [2048](https://en.wikipedia.org/wiki/2048_%28video_game%29) game. Here is what the main menu of the native application looks like without React Native.
+
+
+
+### Command Line Tools for Xcode
+
+Install the Command Line Tools. Choose **Settings... (or Preferences...)** in the Xcode menu. Go to the Locations panel and install the tools by selecting the most recent version in the Command Line Tools dropdown.
+
+
+
+### Configuring CocoaPods dependencies
+
+Before you integrate React Native into your application, you will want to decide what parts of the React Native framework you would like to integrate. We will use CocoaPods to specify which of these "subspecs" your app will depend on.
+
+The list of supported `subspec`s is available in [`/node_modules/react-native/React.podspec`](https://github.com/facebook/react-native/blob/main/packages/react-native/React.podspec). They are generally named by functionality. For example, you will generally always want the `Core` `subspec`. That will get you the `AppRegistry`, `StyleSheet`, `View` and other core React Native libraries. If you want to add the React Native `Text` library (e.g., for `` elements), then you will need the `RCTText` `subspec`. If you want the `Image` library (e.g., for `` elements), then you will need the `RCTImage` `subspec`.
+
+You can specify which `subspec`s your app will depend on in a `Podfile` file. The easiest way to create a `Podfile` is by running the CocoaPods `init` command in the `/ios` subfolder of your project:
+
+```shell
+pod init
+```
+
+The `Podfile` will contain a boilerplate setup that you will tweak for your integration purposes.
+
+> The `Podfile` version changes depending on your version of `react-native`. Refer to https://react-native-community.github.io/upgrade-helper/ for the specific version of `Podfile` you should be using.
+
+Ultimately, your `Podfile` should look something similar to this:
+
+```
+# The target name is most likely the name of your project.
+target 'NumberTileGame' do
+
+ # Your 'node_modules' directory is probably in the root of your project,
+ # but if not, adjust the `:path` accordingly
+ pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
+ pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
+ pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
+ pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
+ pod 'React', :path => '../node_modules/react-native/'
+ pod 'React-Core', :path => '../node_modules/react-native/'
+ pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
+ pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
+ pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
+ pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
+ pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
+ pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
+ pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
+ pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
+ pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
+ pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
+ pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
+ pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
+
+ pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
+ pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
+ pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
+ pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
+ pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
+ pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
+ pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
+
+ pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
+ pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
+ pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
+
+end
+```
+
+After you have created your `Podfile`, you are ready to install the React Native pod.
+
+```shell
+$ pod install
+```
+
+You should see output such as:
+
+```
+Analyzing dependencies
+Fetching podspec for `React` from `../node_modules/react-native`
+Downloading dependencies
+Installing React (0.62.0)
+Generating Pods project
+Integrating client project
+Sending stats
+Pod installation complete! There are 3 dependencies from the Podfile and 1 total pod installed.
+```
+
+> If this fails with errors mentioning `xcrun`, make sure that in Xcode in **Settings... (or Preferences...) > Locations** the Command Line Tools are assigned.
+
+### Code integration
+
+Now we will actually modify the native iOS application to integrate React Native. For our 2048 sample app, we will add a "High Score" screen in React Native.
+
+#### The React Native component
+
+The first bit of code we will write is the actual React Native code for the new "High Score" screen that will be integrated into our application.
+
+##### 1. Create a `index.js` file
+
+First, create an empty `index.js` file in the root of your React Native project.
+
+`index.js` is the starting point for React Native applications, and it is always required. It can be a small file that `require`s other file that are part of your React Native component or application, or it can contain all the code that is needed for it. In our case, we will put everything in `index.js`.
+
+##### 2. Add your React Native code
+
+In your `index.js`, create your component. In our sample here, we will add a `` component within a styled ``
+
+```jsx
+import React from 'react';
+import {AppRegistry, StyleSheet, Text, View} from 'react-native';
+
+const RNHighScores = ({scores}) => {
+ const contents = scores.map(score => (
+
+ {score.name}:{score.value}
+ {'\n'}
+
+ ));
+ return (
+
+
+ 2048 High Scores!
+
+ {contents}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#FFFFFF',
+ },
+ highScoresTitle: {
+ fontSize: 20,
+ textAlign: 'center',
+ margin: 10,
+ },
+ scores: {
+ textAlign: 'center',
+ color: '#333333',
+ marginBottom: 5,
+ },
+});
+
+// Module name
+AppRegistry.registerComponent('RNHighScores', () => RNHighScores);
+```
+
+> `RNHighScores` is the name of your module that will be used when you add a view to React Native from within your iOS application.
+
+#### The Magic: `RCTRootView`
+
+Now that your React Native component is created via `index.js`, you need to add that component to a new or existing `ViewController`. The easiest path to take is to optionally create an event path to your component and then add that component to an existing `ViewController`.
+
+We will tie our React Native component with a new native view in the `ViewController` that will actually contain it called `RCTRootView` .
+
+##### 1. Create an Event Path
+
+You can add a new link on the main game menu to go to the "High Score" React Native page.
+
+
+
+##### 2. Event Handler
+
+We will now add an event handler from the menu link. A method will be added to the main `ViewController` of your application. This is where `RCTRootView` comes into play.
+
+When you build a React Native application, you use the [Metro bundler][metro] to create an `index.bundle` that will be served by the React Native server. Inside `index.bundle` will be our `RNHighScore` module. So, we need to point our `RCTRootView` to the location of the `index.bundle` resource (via `NSURL`) and tie it to the module.
+
+We will, for debugging purposes, log that the event handler was invoked. Then, we will create a string with the location of our React Native code that exists inside the `index.bundle`. Finally, we will create the main `RCTRootView`. Notice how we provide `RNHighScores` as the `moduleName` that we created [above](#the-react-native-component) when writing the code for our React Native component.
+
+First `import` the `RCTRootView` header.
+
+```objectivec
+#import
+```
+
+> The `initialProperties` are here for illustration purposes so we have some data for our high score screen. In our React Native component, we will use `this.props` to get access to that data.
+
+```objectivec
+- (IBAction)highScoreButtonPressed:(id)sender {
+ NSLog(@"High Score Button Pressed");
+ NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios"];
+
+ RCTRootView *rootView =
+ [[RCTRootView alloc] initWithBundleURL: jsCodeLocation
+ moduleName: @"RNHighScores"
+ initialProperties:
+ @{
+ @"scores" : @[
+ @{
+ @"name" : @"Alex",
+ @"value": @"42"
+ },
+ @{
+ @"name" : @"Joel",
+ @"value": @"10"
+ }
+ ]
+ }
+ launchOptions: nil];
+ UIViewController *vc = [[UIViewController alloc] init];
+ vc.view = rootView;
+ [self presentViewController:vc animated:YES completion:nil];
+}
+```
+
+> Note that `RCTRootView initWithURL` starts up a new JSC VM. To save resources and simplify the communication between RN views in different parts of your native app, you can have multiple views powered by React Native that are associated with a single JS runtime. To do that, instead of using `[RCTRootView alloc] initWithURL`, use [`RCTBridge initWithBundleURL`](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTBridge.h#L94) to create a bridge and then use `RCTRootView initWithBridge`.
+
+> When moving your app to production, the `NSURL` can point to a pre-bundled file on disk via something like `[[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];`. You can use the `react-native-xcode.sh` script in `node_modules/react-native/scripts/` to generate that pre-bundled file.
+
+##### 3. Wire Up
+
+Wire up the new link in the main menu to the newly added event handler method.
+
+
+
+> One of the easier ways to do this is to open the view in the storyboard and right click on the new link. Select something such as the `Touch Up Inside` event, drag that to the storyboard and then select the created method from the list provided.
+
+### Test your integration
+
+You have now done all the basic steps to integrate React Native with your current application. Now we will start the [Metro bundler][metro] to build the `index.bundle` package and the server running on `localhost` to serve it.
+
+##### 1. Add App Transport Security exception
+
+Apple has blocked implicit cleartext HTTP resource loading. So we need to add the following our project's `Info.plist` (or equivalent) file.
+
+```xml
+NSAppTransportSecurity
+
+ NSExceptionDomains
+
+ localhost
+
+ NSTemporaryExceptionAllowsInsecureHTTPLoads
+
+
+
+
+```
+
+> App Transport Security is good for your users. Make sure to re-enable it prior to releasing your app for production.
+
+##### 2. Run the packager
+
+To run your app, you need to first start the development server. To do this, run the following command in the root directory of your React Native project:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+##### 3. Run the app
+
+If you are using Xcode or your favorite editor, build and run your native iOS application as normal. Alternatively, you can run the app from the command line using:
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+In our sample application, you should see the link to the "High Scores" and then when you click on that you will see the rendering of your React Native component.
+
+Here is the _native_ application home screen:
+
+
+
+Here is the _React Native_ high score screen:
+
+
+
+> If you are getting module resolution issues when running your application please see [this GitHub issue](https://github.com/facebook/react-native/issues/4968) for information and possible resolution. [This comment](https://github.com/facebook/react-native/issues/4968#issuecomment-220941717) seemed to be the latest possible resolution.
+
+### Now what?
+
+At this point you can continue developing your app as usual. Refer to our [debugging](debugging) and [deployment](running-on-device) docs to learn more about working with React Native.
+
+[metro]: https://facebook.github.io/metro/
diff --git a/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-swift.md b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-swift.md
new file mode 100644
index 00000000000..93d586d3fa5
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_integration-with-existing-apps-swift.md
@@ -0,0 +1,381 @@
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Key Concepts
+
+The keys to integrating React Native components into your iOS application are to:
+
+1. Set up React Native dependencies and directory structure.
+2. Understand what React Native components you will use in your app.
+3. Add these components as dependencies using CocoaPods.
+4. Develop your React Native components in JavaScript.
+5. Add a `RCTRootView` to your iOS app. This view will serve as the container for your React Native component.
+6. Start the React Native server and run your native application.
+7. Verify that the React Native aspect of your application works as expected.
+
+## Prerequisites
+
+Follow the React Native CLI Quickstart in the [environment setup guide](environment-setup) to configure your development environment for building React Native apps for iOS.
+
+### 1. Set up directory structure
+
+To ensure a smooth experience, create a new folder for your integrated React Native project, then copy your existing iOS project to a `/ios` subfolder.
+
+### 2. Install JavaScript dependencies
+
+Go to the root directory for your project and create a new `package.json` file with the following contents:
+
+```
+{
+ "name": "MyReactNativeApp",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "start": "yarn react-native start"
+ }
+}
+```
+
+Next, install the `react` and `react-native` packages. Open a terminal or command prompt, then navigate to the directory with your `package.json` file and run:
+
+
+
+
+```shell
+npm install react-native
+```
+
+
+
+
+```shell
+yarn add react-native
+```
+
+
+
+
+This will print a message similar to the following (scroll up in the yarn output to see it):
+
+> warning "`react-native@0.52.2`" has unmet peer dependency "`react@16.2.0`".
+
+This is OK, it means we also need to install React:
+
+
+
+
+```shell
+npm install react@version_printed_above
+```
+
+
+
+
+```shell
+yarn add react@version_printed_above
+```
+
+
+
+
+Yarn has created a new `/node_modules` folder. This folder stores all the JavaScript dependencies required to build your project.
+
+Add `node_modules/` to your `.gitignore` file.
+
+### 3. Install CocoaPods
+
+[CocoaPods](https://cocoapods.org) is a package management tool for iOS and macOS development. We use it to add the actual React Native framework code locally into your current project.
+
+We recommend installing CocoaPods using [Homebrew](https://brew.sh/).
+
+```shell
+$ brew install cocoapods
+```
+
+> It is technically possible not to use CocoaPods, but that would require manual library and linker additions that would overly complicate this process.
+
+## Adding React Native to your app
+
+Assume the [app for integration](https://github.com/JoelMarcey/swift-2048) is a [2048](https://en.wikipedia.org/wiki/2048_%28video_game%29) game. Here is what the main menu of the native application looks like without React Native.
+
+
+
+### Command Line Tools for Xcode
+
+Install the Command Line Tools. Choose **Settings... (or Preferences...)** in the Xcode menu. Go to the Locations panel and install the tools by selecting the most recent version in the Command Line Tools dropdown.
+
+
+
+### Configuring CocoaPods dependencies
+
+Before you integrate React Native into your application, you will want to decide what parts of the React Native framework you would like to integrate. We will use CocoaPods to specify which of these "subspecs" your app will depend on.
+
+The list of supported `subspec`s is available in [`/node_modules/react-native/React.podspec`](https://github.com/facebook/react-native/blob/main/packages/react-native/React.podspec). They are generally named by functionality. For example, you will generally always want the `Core` `subspec`. That will get you the `AppRegistry`, `StyleSheet`, `View` and other core React Native libraries. If you want to add the React Native `Text` library (e.g., for `` elements), then you will need the `RCTText` `subspec`. If you want the `Image` library (e.g., for `` elements), then you will need the `RCTImage` `subspec`.
+
+You can specify which `subspec`s your app will depend on in a `Podfile` file. The easiest way to create a `Podfile` is by running the CocoaPods `init` command in the `/ios` subfolder of your project:
+
+```shell
+$ pod init
+```
+
+The `Podfile` will contain a boilerplate setup that you will tweak for your integration purposes.
+
+> The `Podfile` version changes depending on your version of `react-native`. Refer to https://react-native-community.github.io/upgrade-helper/ for the specific version of `Podfile` you should be using.
+
+Ultimately, your `Podfile` should look something similar to this:
+[Podfile Template](https://github.com/facebook/react-native/blob/main/packages/react-native/template/ios/Podfile)
+
+After you have created your `Podfile`, you are ready to install the React Native pod.
+
+```shell
+$ pod install
+```
+
+You should see output such as:
+
+```
+Analyzing dependencies
+Fetching podspec for `React` from `../node_modules/react-native`
+Downloading dependencies
+Installing React (0.62.0)
+Generating Pods project
+Integrating client project
+Sending stats
+Pod installation complete! There are 3 dependencies from the Podfile and 1 total pod installed.
+```
+
+> If this fails with errors mentioning `xcrun`, make sure that in Xcode in **Settings... (or Preferences...) > Locations** the Command Line Tools are assigned.
+
+> If you get a warning such as "_The `swift-2048 [Debug]` target overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-swift-2048/Pods-swift-2048.debug.xcconfig`. This can lead to problems with the CocoaPods installation_", then make sure the `Framework Search Paths` in `Build Settings` for both `Debug` and `Release` only contain `$(inherited)`.
+
+### Code integration
+
+Now we will actually modify the native iOS application to integrate React Native. For our 2048 sample app, we will add a "High Score" screen in React Native.
+
+#### The React Native component
+
+The first bit of code we will write is the actual React Native code for the new "High Score" screen that will be integrated into our application.
+
+##### 1. Create a `index.js` file
+
+First, create an empty `index.js` file in the root of your React Native project.
+
+`index.js` is the starting point for React Native applications, and it is always required. It can be a small file that `require`s other file that are part of your React Native component or application, or it can contain all the code that is needed for it. In our case, we will put everything in `index.js`.
+
+##### 2. Add your React Native code
+
+In your `index.js`, create your component. In our sample here, we will add a `` component within a styled ``
+
+```jsx
+import React from 'react';
+import {AppRegistry, StyleSheet, Text, View} from 'react-native';
+
+const RNHighScores = ({scores}) => {
+ const contents = scores.map(score => (
+
+ {score.name}:{score.value}
+ {'\n'}
+
+ ));
+ return (
+
+
+ 2048 High Scores!
+
+ {contents}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#FFFFFF',
+ },
+ highScoresTitle: {
+ fontSize: 20,
+ textAlign: 'center',
+ margin: 10,
+ },
+ scores: {
+ textAlign: 'center',
+ color: '#333333',
+ marginBottom: 5,
+ },
+});
+
+// Module name
+AppRegistry.registerComponent('RNHighScores', () => RNHighScores);
+```
+
+> `RNHighScores` is the name of your module that will be used when you add a view to React Native from within your iOS application.
+
+#### The Magic: `RCTRootView`
+
+Now that your React Native component is created via `index.js`, you need to add that component to a new or existing `ViewController`. The easiest path to take is to optionally create an event path to your component and then add that component to an existing `ViewController`.
+
+We will tie our React Native component with a new native view in the `ViewController` that will actually contain it called `RCTRootView` .
+
+##### 1. Create an Event Path
+
+You can add a new link on the main game menu to go to the "High Score" React Native page.
+
+
+
+##### 2. Event Handler
+
+We will now add an event handler from the menu link. A method will be added to the main `ViewController` of your application. This is where `RCTRootView` comes into play.
+
+When you build a React Native application, you use the [Metro bundler][metro] to create an `index.bundle` that will be served by the React Native server. Inside `index.bundle` will be our `RNHighScore` module. So, we need to point our `RCTRootView` to the location of the `index.bundle` resource (via `NSURL`) and tie it to the module.
+
+We will, for debugging purposes, log that the event handler was invoked. Then, we will create a string with the location of our React Native code that exists inside the `index.bundle`. Finally, we will create the main `RCTRootView`. Notice how we provide `RNHighScores` as the `moduleName` that we created [above](#the-react-native-component) when writing the code for our React Native component.
+
+First `import` the `React` library.
+
+```jsx
+import React
+```
+
+> The `initialProperties` are here for illustration purposes so we have some data for our high score screen. In our React Native component, we will use `this.props` to get access to that data.
+
+```swift
+@IBAction func highScoreButtonTapped(sender : UIButton) {
+ NSLog("Hello")
+ let jsCodeLocation = URL(string: "http://localhost:8081/index.bundle?platform=ios")
+ let mockData:NSDictionary = ["scores":
+ [
+ ["name":"Alex", "value":"42"],
+ ["name":"Joel", "value":"10"]
+ ]
+ ]
+
+ let rootView = RCTRootView(
+ bundleURL: jsCodeLocation,
+ moduleName: "RNHighScores",
+ initialProperties: mockData as [NSObject : AnyObject],
+ launchOptions: nil
+ )
+ let vc = UIViewController()
+ vc.view = rootView
+ self.present(vc, animated: true, completion: nil)
+}
+```
+
+> Note that `RCTRootView bundleURL` starts up a new JSC VM. To save resources and simplify the communication between RN views in different parts of your native app, you can have multiple views powered by React Native that are associated with a single JS runtime. To do that, instead of using `RCTRootView bundleURL`, use [`RCTBridge initWithBundleURL`](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTBridge.h#94) to create a bridge and then use `RCTRootView initWithBridge`.
+
+> When moving your app to production, the `NSURL` can point to a pre-bundled file on disk via something like `let mainBundle = NSBundle(URLForResource: "main" withExtension:"jsbundle")`. You can use the `react-native-xcode.sh` script in `node_modules/react-native/scripts/` to generate that pre-bundled file.
+
+##### 3. Wire Up
+
+Wire up the new link in the main menu to the newly added event handler method.
+
+
+
+> One of the easier ways to do this is to open the view in the storyboard and right click on the new link. Select something such as the `Touch Up Inside` event, drag that to the storyboard and then select the created method from the list provided.
+
+##### 3. Window Reference
+
+Add an window reference to your AppDelegate.swift file. Ultimately, your AppDelegate should look something similar to this:
+
+```swift
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ // Add window reference
+ var window: UIWindow?
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ ....
+}
+```
+
+### Test your integration
+
+You have now done all the basic steps to integrate React Native with your current application. Now we will start the [Metro bundler][metro] to build the `index.bundle` package and the server running on `localhost` to serve it.
+
+##### 1. Add App Transport Security exception
+
+Apple has blocked implicit cleartext HTTP resource loading. So we need to add the following our project's `Info.plist` (or equivalent) file.
+
+```xml
+NSAppTransportSecurity
+
+ NSExceptionDomains
+
+ localhost
+
+ NSTemporaryExceptionAllowsInsecureHTTPLoads
+
+
+
+
+```
+
+> App Transport Security is good for your users. Make sure to re-enable it prior to releasing your app for production.
+
+##### 2. Run the packager
+
+To run your app, you need to first start the development server. To do this, run the following command in the root directory of your React Native project:
+
+
+
+
+```shell
+npm start
+```
+
+
+
+
+```shell
+yarn start
+```
+
+
+
+
+##### 3. Run the app
+
+If you are using Xcode or your favorite editor, build and run your native iOS application as normal. Alternatively, you can run the app from the command line using following command from the root directory of your React Native project:
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+In our sample application, you should see the link to the "High Scores" and then when you click on that you will see the rendering of your React Native component.
+
+Here is the _native_ application home screen:
+
+
+
+Here is the _React Native_ high score screen:
+
+
+
+> If you are getting module resolution issues when running your application please see [this GitHub issue](https://github.com/facebook/react-native/issues/4968) for information and possible resolution. [This comment](https://github.com/facebook/react-native/issues/4968#issuecomment-220941717) seemed to be the latest possible resolution.
+
+### Now what?
+
+At this point you can continue developing your app as usual. Refer to our [debugging](debugging) and [deployment](running-on-device) docs to learn more about working with React Native.
+
+[metro]: https://facebook.github.io/metro/
diff --git a/website/versioned_docs/version-0.73.0/_markdown-new-architecture-warning.mdx b/website/versioned_docs/version-0.73.0/_markdown-new-architecture-warning.mdx
new file mode 100644
index 00000000000..d52c490153b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_markdown-new-architecture-warning.mdx
@@ -0,0 +1,7 @@
+:::caution
+
+This documentation is still **experimental** and details are subject to changes as we iterate. Feel free to share your feedback on the [discussion inside the working group](https://github.com/reactwg/react-native-new-architecture/discussions/8) for this page.
+
+Moreover, it contains several **manual steps**. Please note that this won't be representative of the final developer experience once the New Architecture is stable. We're working on tools, templates and libraries to help you get started fast on the New Architecture, without having to go through the whole setup.
+
+:::
diff --git a/website/versioned_docs/version-0.73.0/_remove-global-cli.md b/website/versioned_docs/version-0.73.0/_remove-global-cli.md
new file mode 100644
index 00000000000..08d0d9ba3c1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/_remove-global-cli.md
@@ -0,0 +1,5 @@
+> If you previously installed a global `react-native-cli` package, please remove it as it may cause unexpected issues:
+>
+> ```shell
+> npm uninstall -g react-native-cli @react-native-community/cli
+> ```
diff --git a/website/versioned_docs/version-0.73.0/accessibility.md b/website/versioned_docs/version-0.73.0/accessibility.md
new file mode 100644
index 00000000000..0df4e15a858
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/accessibility.md
@@ -0,0 +1,487 @@
+---
+id: accessibility
+title: Accessibility
+description: Create mobile apps accessible to assistive technology with React Native's suite of APIs designed to work with Android and iOS.
+---
+
+Both Android and iOS provide APIs for integrating apps with assistive technologies like the bundled screen readers VoiceOver (iOS) and TalkBack (Android). React Native has complementary APIs that let your app accommodate all users.
+
+:::info
+Android and iOS differ slightly in their approaches, and thus the React Native implementations may vary by platform.
+:::
+
+## Accessibility properties
+
+### `accessible`
+
+When `true`, indicates that the view is an accessibility element. When a view is an accessibility element, it groups its children into a single selectable component. By default, all touchable elements are accessible.
+
+On Android, `accessible={true}` property for a react-native View will be translated into native `focusable={true}`.
+
+```tsx
+
+ text one
+ text two
+
+```
+
+In the above example, we can't get accessibility focus separately on 'text one' and 'text two'. Instead we get focus on a parent view with 'accessible' property.
+
+### `accessibilityLabel`
+
+When a view is marked as accessible, it is a good practice to set an accessibilityLabel on the view, so that people who use VoiceOver know what element they have selected. VoiceOver will read this string when a user selects the associated element.
+
+To use, set the `accessibilityLabel` property to a custom string on your View, Text or Touchable:
+
+```tsx
+
+
+ Press me!
+
+
+```
+
+In the above example, the `accessibilityLabel` on the TouchableOpacity element would default to "Press me!". The label is constructed by concatenating all Text node children separated by spaces.
+
+### `accessibilityLabelledBy`
Android
+
+A reference to another element [nativeID](view.md#nativeid) used to build complex forms.
+The value of `accessibilityLabelledBy` should match the `nativeID` of the related element:
+
+```tsx
+
+ Label for Input Field
+
+
+```
+
+In the above example, the screenreader announces `Input, Edit Box for Label for Input Field` when focusing on the TextInput.
+
+### `accessibilityHint`
+
+An accessibility hint helps users understand what will happen when they perform an action on the accessibility element when that result is not clear from the accessibility label.
+
+To use, set the `accessibilityHint` property to a custom string on your View, Text or Touchable:
+
+```tsx
+
+
+ Back
+
+
+```
+
+
iOS
+
+In the above example, VoiceOver will read the hint after the label, if the user has hints enabled in the device's VoiceOver settings. Read more about guidelines for `accessibilityHint` in the [iOS Developer Docs](https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint)
+
+
Android
+
+In the above example, TalkBack will read the hint after the label. At this time, hints cannot be turned off on Android.
+
+### `accessibilityLanguage`
iOS
+
+By using the `accessibilityLanguage` property, the screen reader will understand which language to use while reading the element's **label**, **value** and **hint**. The provided string value must follow the [BCP 47 specification](https://www.rfc-editor.org/info/bcp47).
+
+```tsx
+
+ 🍕
+
+```
+
+### `accessibilityIgnoresInvertColors`
iOS
+
+Inverting screen colors is an Accessibility feature that makes the iPhone and iPad easier on the eyes for some people with a sensitivity to brightness, easier to distinguish for some people with color blindness, and easier to make out for some people with low vision. However, sometimes you have views such as photos that you don't want to be inverted. In this case, you can set this property to be `true` so that these specific views won't have their colors inverted.
+
+### `accessibilityLiveRegion`
Android
+
+When components dynamically change, we want TalkBack to alert the end user. This is made possible by the `accessibilityLiveRegion` property. It can be set to `none`, `polite` and `assertive`:
+
+- **none** Accessibility services should not announce changes to this view.
+- **polite** Accessibility services should announce changes to this view.
+- **assertive** Accessibility services should interrupt ongoing speech to immediately announce changes to this view.
+
+```tsx
+
+
+ Click me
+
+
+
+ Clicked {count} times
+
+```
+
+In the above example method `addOne` changes the state variable `count`. As soon as an end user clicks the TouchableWithoutFeedback, TalkBack reads text in the Text view because of its `accessibilityLiveRegion="polite"` property.
+
+### `accessibilityRole`
+
+`accessibilityRole` communicates the purpose of a component to the user of an assistive technology.
+
+`accessibilityRole` can be one of the following:
+
+- **adjustable** Used when an element can be "adjusted" (e.g. a slider).
+- **alert** Used when an element contains important text to be presented to the user.
+- **button** Used when the element should be treated as a button.
+- **checkbox** Used when an element represents a checkbox which can be checked, unchecked, or have mixed checked state.
+- **combobox** Used when an element represents a combo box, which allows the user to select among several choices.
+- **header** Used when an element acts as a header for a content section (e.g. the title of a navigation bar).
+- **image** Used when the element should be treated as an image. Can be combined with button or link, for example.
+- **imagebutton** Used when the element should be treated as a button and is also an image.
+- **keyboardkey** Used when the element acts as a keyboard key.
+- **link** Used when the element should be treated as a link.
+- **menu** Used when the component is a menu of choices.
+- **menubar** Used when a component is a container of multiple menus.
+- **menuitem** Used to represent an item within a menu.
+- **none** Used when the element has no role.
+- **progressbar** Used to represent a component which indicates progress of a task.
+- **radio** Used to represent a radio button.
+- **radiogroup** Used to represent a group of radio buttons.
+- **scrollbar** Used to represent a scroll bar.
+- **search** Used when the text field element should also be treated as a search field.
+- **spinbutton** Used to represent a button which opens a list of choices.
+- **summary** Used when an element can be used to provide a quick summary of current conditions in the app when the app first launches.
+- **switch** Used to represent a switch which can be turned on and off.
+- **tab** Used to represent a tab.
+- **tablist** Used to represent a list of tabs.
+- **text** Used when the element should be treated as static text that cannot change.
+- **timer** Used to represent a timer.
+- **togglebutton** Used to represent a toggle button. Should be used with accessibilityState checked to indicate if the button is toggled on or off.
+- **toolbar** Used to represent a tool bar (a container of action buttons or components).
+- **grid** Used with ScrollView, VirtualizedList, FlatList, or SectionList to represent a grid. Adds the in/out of grid announcements to the android GridView.
+
+### `accessibilityState`
+
+Describes the current state of a component to the user of an assistive technology.
+
+`accessibilityState` is an object. It contains the following fields:
+
+| Name | Description | Type | Required |
+| -------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -------- |
+| disabled | Indicates whether the element is disabled or not. | boolean | No |
+| selected | Indicates whether a selectable element is currently selected or not. | boolean | No |
+| checked | Indicates the state of a checkable element. This field can either take a boolean or the "mixed" string to represent mixed checkboxes. | boolean or 'mixed' | No |
+| busy | Indicates whether an element is currently busy or not. | boolean | No |
+| expanded | Indicates whether an expandable element is currently expanded or collapsed. | boolean | No |
+
+To use, set the `accessibilityState` to an object with a specific definition.
+
+### `accessibilityValue`
+
+Represents the current value of a component. It can be a textual description of a component's value, or for range-based components, such as sliders and progress bars, it contains range information (minimum, current, and maximum).
+
+`accessibilityValue` is an object. It contains the following fields:
+
+| Name | Description | Type | Required |
+| ---- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------- |
+| min | The minimum value of this component's range. | integer | Required if `now` is set. |
+| max | The maximum value of this component's range. | integer | Required if `now` is set. |
+| now | The current value of this component's range. | integer | No |
+| text | A textual description of this component's value. Will override `min`, `now`, and `max` if set. | string | No |
+
+### `accessibilityViewIsModal`
iOS
+
+A Boolean value indicating whether VoiceOver should ignore the elements within views that are siblings of the receiver.
+
+For example, in a window that contains sibling views `A` and `B`, setting `accessibilityViewIsModal` to `true` on view `B` causes VoiceOver to ignore the elements in the view `A`. On the other hand, if view `B` contains a child view `C` and you set `accessibilityViewIsModal` to `true` on view `C`, VoiceOver does not ignore the elements in view `A`.
+
+### `accessibilityElementsHidden`
iOS
+
+A Boolean value indicating whether the accessibility elements contained within this accessibility element are hidden.
+
+For example, in a window that contains sibling views `A` and `B`, setting `accessibilityElementsHidden` to `true` on view `B` causes VoiceOver to ignore the elements in the view `B`. This is similar to the Android property `importantForAccessibility="no-hide-descendants"`.
+
+### `aria-valuemax`
+
+Represents the maximum value for range-based components, such as sliders and progress bars.
+
+### `aria-valuemin`
+
+Represents the minimum value for range-based components, such as sliders and progress bars.
+
+### `aria-valuenow`
+
+Represents the current value for range-based components, such as sliders and progress bars.
+
+### `aria-valuetext`
+
+Represents the textual description of the component.
+
+### `aria-busy`
+
+Indicates an element is being modified and that assistive technologies may want to wait until the changes are complete before informing the user about the update.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### `aria-checked`
+
+Indicates the state of a checkable element. This field can either take a boolean or the "mixed" string to represent mixed checkboxes.
+
+| Type | Default |
+| ---------------- | ------- |
+| boolean, 'mixed' | false |
+
+### `aria-disabled`
+
+Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### `aria-expanded`
+
+Indicates whether an expandable element is currently expanded or collapsed.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### `aria-hidden`
+
+Indicates whether the accessibility elements contained within this accessibility element are hidden.
+
+For example, in a window that contains sibling views `A` and `B`, setting `aria-hidden` to `true` on view `B` causes VoiceOver to ignore the elements in the view `B`.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### `aria-label`
+
+Defines a string value that labels an interactive element.
+
+| Type |
+| ------ |
+| string |
+
+### `aria-labelledby`
Android
+
+Identifies the element that labels the element it is applied to. The value of `aria-labelledby` should match the [`nativeID`](view.md#nativeid) of the related element:
+
+```tsx
+
+ Label for Input Field
+
+
+```
+
+| Type |
+| ------ |
+| string |
+
+### `aria-live`
Android
+
+Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region.
+
+- **off** Accessibility services should not announce changes to this view.
+- **polite** Accessibility services should announce changes to this view.
+- **assertive** Accessibility services should interrupt ongoing speech to immediately announce changes to this view.
+
+| Type | Default |
+| ---------------------------------------- | ------- |
+| enum(`'assertive'`, `'off'`, `'polite'`) | `'off'` |
+
+---
+
+### `aria-modal`
iOS
+
+Boolean value indicating whether VoiceOver should ignore the elements within views that are siblings of the receiver.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+### `aria-selected`
+
+Indicates whether a selectable element is currently selected or not.
+
+| Type |
+| ------- |
+| boolean |
+
+### `importantForAccessibility`
Android
+
+In the case of two overlapping UI components with the same parent, default accessibility focus can have unpredictable behavior. The `importantForAccessibility` property will resolve this by controlling if a view fires accessibility events and if it is reported to accessibility services. It can be set to `auto`, `yes`, `no` and `no-hide-descendants` (the last value will force accessibility services to ignore the component and all of its children).
+
+```tsx
+
+
+ First layout
+
+
+ Second layout
+
+
+```
+
+In the above example, the `yellow` layout and its descendants are completely invisible to TalkBack and all other accessibility services. So we can use overlapping views with the same parent without confusing TalkBack.
+
+### `onAccessibilityEscape`
iOS
+
+Assign this property to a custom function which will be called when someone performs the "escape" gesture, which is a two finger Z shaped gesture. An escape function should move back hierarchically in the user interface. This can mean moving up or back in a navigation hierarchy or dismissing a modal user interface. If the selected element does not have an `onAccessibilityEscape` function, the system will attempt to traverse up the view hierarchy until it finds a view that does or bonk to indicate it was unable to find one.
+
+### `onAccessibilityTap`
+
+Use this property to assign a custom function to be called when someone activates an accessible element by double tapping on it while it's selected.
+
+### `onMagicTap`
iOS
+
+Assign this property to a custom function which will be called when someone performs the "magic tap" gesture, which is a double-tap with two fingers. A magic tap function should perform the most relevant action a user could take on a component. In the Phone app on iPhone, a magic tap answers a phone call, or ends the current one. If the selected element does not have an `onMagicTap` function, the system will traverse up the view hierarchy until it finds a view that does.
+
+### `role`
+
+`role` communicates the purpose of a component to the user of an assistive technology. Has precedence over the [`accessibilityRole`](accessibility#accessibilityrole) prop.
+
+`role` can be one of the following:
+
+- **alert** Used when an element contains important text to be presented to the user.
+- **button** Used when the element should be treated as a button.
+- **checkbox** Used when an element represents a checkbox which can be checked, unchecked, or have mixed checked state.
+- **combobox** Used when an element represents a combo box, which allows the user to select among several choices.
+- **grid** Used with ScrollView, VirtualizedList, FlatList, or SectionList to represent a grid. Adds the in/out of grid announcements to the android GridView.
+- **heading** Used when an element acts as a header for a content section (e.g. the title of a navigation bar).
+- **img** Used when the element should be treated as an image. Can be combined with button or link, for example.
+- **link** Used when the element should be treated as a link.
+- **list** Used to identify a list of items.
+- **menu** Used when the component is a menu of choices.
+- **menubar** Used when a component is a container of multiple menus.
+- **menuitem** Used to represent an item within a menu.
+- **none** Used when the element has no role.
+- **presentation** Used when the element has no role.
+- **progressbar** Used to represent a component which indicates progress of a task.
+- **radio** Used to represent a radio button.
+- **radiogroup** Used to represent a group of radio buttons.
+- **scrollbar** Used to represent a scroll bar.
+- **searchbox** Used when the text field element should also be treated as a search field.
+- **slider** Used when an element can be "adjusted" (e.g. a slider).
+- **spinbutton** Used to represent a button which opens a list of choices.
+- **summary** Used when an element can be used to provide a quick summary of current conditions in the app when the app first launches.
+- **switch** Used to represent a switch which can be turned on and off.
+- **tab** Used to represent a tab.
+- **tablist** Used to represent a list of tabs.
+- **timer** Used to represent a timer.
+- **toolbar** Used to represent a tool bar (a container of action buttons or components).
+
+## Accessibility Actions
+
+Accessibility actions allow an assistive technology to programmatically invoke the actions of a component. In order to support accessibility actions, a component must do two things:
+
+- Define the list of actions it supports via the `accessibilityActions` property.
+- Implement an `onAccessibilityAction` function to handle action requests.
+
+The `accessibilityActions` property should contain a list of action objects. Each action object should contain the following fields:
+
+| Name | Type | Required |
+| ----- | ------ | -------- |
+| name | string | Yes |
+| label | string | No |
+
+Actions either represent standard actions, such as clicking a button or adjusting a slider, or custom actions specific to a given component such as deleting an email message. The `name` field is required for both standard and custom actions, but `label` is optional for standard actions.
+
+When adding support for standard actions, `name` must be one of the following:
+
+- `'magicTap'` - iOS only - While VoiceOver focus is on or inside the component, the user double tapped with two fingers.
+- `'escape'` - iOS only - While VoiceOver focus is on or inside the component, the user performed a two finger scrub gesture (left, right, left).
+- `'activate'` - Activate the component. Typically this should perform the same action as when the user touches or clicks the component when not using an assistive technology. This is generated when a screen reader user double taps the component.
+- `'increment'` - Increment an adjustable component. On iOS, VoiceOver generates this action when the component has a role of `'adjustable'` and the user places focus on it and swipes upward. On Android, TalkBack generates this action when the user places accessibility focus on the component and presses the volume up button.
+- `'decrement'` - Decrement an adjustable component. On iOS, VoiceOver generates this action when the component has a role of `'adjustable'` and the user places focus on it and swipes downward. On Android, TalkBack generates this action when the user places accessibility focus on the component and presses the volume down button.
+- `'longpress'` - Android only - This action is generated when the user places accessibility focus on the component and double tap and holds one finger on the screen. Typically, this should perform the same action as when the user holds down one finger on the component while not using an assistive technology.
+
+The `label` field is optional for standard actions, and is often unused by assistive technologies. For custom actions, it is a localized string containing a description of the action to be presented to the user.
+
+To handle action requests, a component must implement an `onAccessibilityAction` function. The only argument to this function is an event containing the name of the action to perform. The below example from RNTester shows how to create a component which defines and handles several custom actions.
+
+```tsx
+ {
+ switch (event.nativeEvent.actionName) {
+ case 'cut':
+ Alert.alert('Alert', 'cut action success');
+ break;
+ case 'copy':
+ Alert.alert('Alert', 'copy action success');
+ break;
+ case 'paste':
+ Alert.alert('Alert', 'paste action success');
+ break;
+ }
+ }}
+/>
+```
+
+## Checking if a Screen Reader is Enabled
+
+The `AccessibilityInfo` API allows you to determine whether or not a screen reader is currently active. See the [AccessibilityInfo documentation](accessibilityinfo) for details.
+
+## Sending Accessibility Events
Android
+
+Sometimes it is useful to trigger an accessibility event on a UI component (i.e. when a custom view appears on a screen or set accessibility focus to a view). Native UIManager module exposes a method ‘sendAccessibilityEvent’ for this purpose. It takes two arguments: view tag and a type of an event. The supported event types are `typeWindowStateChanged`, `typeViewFocused` and `typeViewClicked`.
+
+```tsx
+import {Platform, UIManager, findNodeHandle} from 'react-native';
+
+if (Platform.OS === 'android') {
+ UIManager.sendAccessibilityEvent(
+ findNodeHandle(this),
+ UIManager.AccessibilityEventTypes.typeViewFocused,
+ );
+}
+```
+
+## Testing TalkBack Support
Android
+
+To enable TalkBack, go to the Settings app on your Android device or emulator. Tap Accessibility, then TalkBack. Toggle the "Use service" switch to enable or disable it.
+
+Android emulators don't have TalkBack installed by default. You can install TalkBack on your emulator via the Google Play Store. Make sure to choose an emulator with the Google Play store installed. These are available in Android Studio.
+
+You can use the volume key shortcut to toggle TalkBack. To turn on the volume key shortcut, go to the Settings app, then Accessibility. At the top, turn on Volume key shortcut.
+
+To use the volume key shortcut, press both volume keys for 3 seconds to start an accessibility tool.
+
+Additionally, if you prefer, you can toggle TalkBack via command line with:
+
+```shell
+# disable
+adb shell settings put secure enabled_accessibility_services com.android.talkback/com.google.android.marvin.talkback.TalkBackService
+
+# enable
+adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService
+```
+
+## Testing VoiceOver Support
iOS
+
+To enable VoiceOver, go to the Settings app on your iOS device (it's not available for simulator). Tap General, then Accessibility. There you will find many tools that people use to make their devices more usable, such as bolder text, increased contrast, and VoiceOver.
+
+To enable VoiceOver, tap on VoiceOver under "Vision" and toggle the switch that appears at the top.
+
+At the very bottom of the Accessibility settings, there is an "Accessibility Shortcut". You can use this to toggle VoiceOver by triple clicking the Home button.
+
+## Additional Resources
+
+- [Making React Native Apps Accessible](https://engineering.fb.com/ios/making-react-native-apps-accessible/)
diff --git a/website/versioned_docs/version-0.73.0/accessibilityinfo.md b/website/versioned_docs/version-0.73.0/accessibilityinfo.md
new file mode 100644
index 00000000000..4fb955f42f2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/accessibilityinfo.md
@@ -0,0 +1,242 @@
+---
+id: accessibilityinfo
+title: AccessibilityInfo
+---
+
+Sometimes it's useful to know whether or not the device has a screen reader that is currently active. The `AccessibilityInfo` API is designed for this purpose. You can use it to query the current state of the screen reader as well as to register to be notified when the state of the screen reader changes.
+
+## Example
+
+```SnackPlayer name=AccessibilityInfo%20Example&supportedPlatforms=android,ios
+import React, {useState, useEffect} from 'react';
+import {AccessibilityInfo, View, Text, StyleSheet} from 'react-native';
+
+const App = () => {
+ const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false);
+ const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);
+
+ useEffect(() => {
+ const reduceMotionChangedSubscription = AccessibilityInfo.addEventListener(
+ 'reduceMotionChanged',
+ isReduceMotionEnabled => {
+ setReduceMotionEnabled(isReduceMotionEnabled);
+ },
+ );
+ const screenReaderChangedSubscription = AccessibilityInfo.addEventListener(
+ 'screenReaderChanged',
+ isScreenReaderEnabled => {
+ setScreenReaderEnabled(isScreenReaderEnabled);
+ },
+ );
+
+ AccessibilityInfo.isReduceMotionEnabled().then(isReduceMotionEnabled => {
+ setReduceMotionEnabled(isReduceMotionEnabled);
+ });
+ AccessibilityInfo.isScreenReaderEnabled().then(isScreenReaderEnabled => {
+ setScreenReaderEnabled(isScreenReaderEnabled);
+ });
+
+ return () => {
+ reduceMotionChangedSubscription.remove();
+ screenReaderChangedSubscription.remove();
+ };
+ }, []);
+
+ return (
+
+
+ The reduce motion is {reduceMotionEnabled ? 'enabled' : 'disabled'}.
+
+
+ The screen reader is {screenReaderEnabled ? 'enabled' : 'disabled'}.
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ status: {
+ margin: 30,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ eventName: AccessibilityChangeEventName | AccessibilityAnnouncementEventName,
+ handler: (
+ event: AccessibilityChangeEvent | AccessibilityAnnouncementFinishedEvent,
+ ) => void,
+): EmitterSubscription;
+```
+
+Add an event handler. Supported events:
+
+| Event name | Description |
+| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `accessibilityServiceChanged`
Android
| Fires when some services such as TalkBack, other Android assistive technologies, and third-party accessibility services are enabled. The argument to the event handler is a boolean. The boolean is `true` when a some accessibility services is enabled and `false` otherwise. |
+| `announcementFinished`
iOS
| Fires when the screen reader has finished making an announcement. The argument to the event handler is a dictionary with these keys:
`announcement`: The string announced by the screen reader.
`success`: A boolean indicating whether the announcement was successfully made.
|
+| `boldTextChanged`
iOS
| Fires when the state of the bold text toggle changes. The argument to the event handler is a boolean. The boolean is `true` when bold text is enabled and `false` otherwise. |
+| `grayscaleChanged`
iOS
| Fires when the state of the gray scale toggle changes. The argument to the event handler is a boolean. The boolean is `true` when a gray scale is enabled and `false` otherwise. |
+| `invertColorsChanged`
iOS
| Fires when the state of the invert colors toggle changes. The argument to the event handler is a boolean. The boolean is `true` when invert colors is enabled and `false` otherwise. |
+| `reduceMotionChanged` | Fires when the state of the reduce motion toggle changes. The argument to the event handler is a boolean. The boolean is `true` when a reduce motion is enabled (or when "Transition Animation Scale" in "Developer options" is "Animation off") and `false` otherwise. |
+| `reduceTransparencyChanged`
iOS
| Fires when the state of the reduce transparency toggle changes. The argument to the event handler is a boolean. The boolean is `true` when reduce transparency is enabled and `false` otherwise. |
+| `screenReaderChanged` | Fires when the state of the screen reader changes. The argument to the event handler is a boolean. The boolean is `true` when a screen reader is enabled and `false` otherwise. |
+
+---
+
+### `announceForAccessibility()`
+
+```tsx
+static announceForAccessibility(announcement: string);
+```
+
+Post a string to be announced by the screen reader.
+
+---
+
+### `announceForAccessibilityWithOptions()`
+
+```tsx
+static announceForAccessibilityWithOptions(
+ announcement: string,
+ options: options: {queue?: boolean},
+);
+```
+
+Post a string to be announced by the screen reader with modification options. By default announcements will interrupt any existing speech, but on iOS they can be queued behind existing speech by setting `queue` to `true` in the options object.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------- |
+| announcement
Required
| string | The string to be announced |
+| options
+
+```tsx
+static getRecommendedTimeoutMillis(originalTimeout: number): Promise;
+```
+
+Gets the timeout in millisecond that the user needs.
+This value is set in "Time to take action (Accessibility timeout)" of "Accessibility" settings.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ---------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------- |
+| originalTimeout
Required
| number | The timeout to return if "Accessibility timeout" is not set. Specify in milliseconds. |
+
+---
+
+### `isAccessibilityServiceEnabled()`
Android
+
+```tsx
+static isAccessibilityServiceEnabled(): Promise;
+```
+
+Check whether any accessibility service is enabled. This includes TalkBack but also any third-party accessibility app that may be installed. To only check whether TalkBack is enabled, use [isScreenReaderEnabled](#isscreenreaderenabled). Returns a promise which resolves to a boolean. The result is `true` when some accessibility services is enabled and `false` otherwise.
+
+> **Note**: Please use [isScreenReaderEnabled](#isscreenreaderenabled) if you only want to check the status of TalkBack.
+
+---
+
+### `isBoldTextEnabled()`
iOS
+
+```tsx
+static isBoldTextEnabled(): Promise:
+```
+
+Query whether a bold text is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when bold text is enabled and `false` otherwise.
+
+---
+
+### `isGrayscaleEnabled()`
iOS
+
+```tsx
+static isGrayscaleEnabled(): Promise;
+```
+
+Query whether grayscale is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when grayscale is enabled and `false` otherwise.
+
+---
+
+### `isInvertColorsEnabled()`
iOS
+
+```tsx
+static isInvertColorsEnabled(): Promise;
+```
+
+Query whether invert colors is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when invert colors is enabled and `false` otherwise.
+
+---
+
+### `isReduceMotionEnabled()`
+
+```tsx
+static isReduceMotionEnabled(): Promise;
+```
+
+Query whether reduce motion is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when reduce motion is enabled and `false` otherwise.
+
+---
+
+### `isReduceTransparencyEnabled()`
iOS
+
+```tsx
+static isReduceTransparencyEnabled(): Promise;
+```
+
+Query whether reduce transparency is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when a reduce transparency is enabled and `false` otherwise.
+
+---
+
+### `isScreenReaderEnabled()`
+
+```tsx
+static isScreenReaderEnabled(): Promise;
+```
+
+Query whether a screen reader is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when a screen reader is enabled and `false` otherwise.
+
+---
+
+### `prefersCrossFadeTransitions()`
iOS
+
+```tsx
+static prefersCrossFadeTransitions(): Promise;
+```
+
+Query whether reduce motion and prefer cross-fade transitions settings are currently enabled. Returns a promise which resolves to a boolean. The result is `true` when prefer cross-fade transitions is enabled and `false` otherwise.
+
+---
+
+### `setAccessibilityFocus()`
+
+```tsx
+static setAccessibilityFocus(reactTag: number);
+```
+
+Set accessibility focus to a React component.
+
+On Android, this calls `UIManager.sendAccessibilityEvent` method with passed `reactTag` and `UIManager.AccessibilityEventTypes.typeViewFocused` arguments.
+
+> **Note**: Make sure that any `View` you want to receive the accessibility focus has `accessible={true}`.
diff --git a/website/versioned_docs/version-0.73.0/actionsheetios.md b/website/versioned_docs/version-0.73.0/actionsheetios.md
new file mode 100644
index 00000000000..fd060e0dec9
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/actionsheetios.md
@@ -0,0 +1,139 @@
+---
+id: actionsheetios
+title: ActionSheetIOS
+---
+
+Displays native to iOS [Action Sheet](https://developer.apple.com/design/human-interface-guidelines/ios/views/action-sheets/) component.
+
+## Example
+
+```SnackPlayer name=ActionSheetIOS&supportedPlatforms=ios
+import React, {useState} from 'react';
+import {ActionSheetIOS, Button, StyleSheet, Text, View} from 'react-native';
+
+const App = () => {
+ const [result, setResult] = useState('🔮');
+
+ const onPress = () =>
+ ActionSheetIOS.showActionSheetWithOptions(
+ {
+ options: ['Cancel', 'Generate number', 'Reset'],
+ destructiveButtonIndex: 2,
+ cancelButtonIndex: 0,
+ userInterfaceStyle: 'dark',
+ },
+ buttonIndex => {
+ if (buttonIndex === 0) {
+ // cancel action
+ } else if (buttonIndex === 1) {
+ setResult(String(Math.floor(Math.random() * 100) + 1));
+ } else if (buttonIndex === 2) {
+ setResult('🔮');
+ }
+ },
+ );
+
+ return (
+
+ {result}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ result: {
+ fontSize: 64,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+# Reference
+
+## Methods
+
+### `showActionSheetWithOptions()`
+
+```tsx
+static showActionSheetWithOptions: (
+ options: ActionSheetIOSOptions,
+ callback: (buttonIndex: number) => void,
+);
+```
+
+Display an iOS action sheet. The `options` object must contain one or more of:
+
+- `options` (array of strings) - a list of button titles (required)
+- `cancelButtonIndex` (int) - index of cancel button in `options`
+- `cancelButtonTintColor` (string) - the [color](colors) used for the change the text color of the cancel button
+- `destructiveButtonIndex` (int or array of ints) - indices of destructive buttons in `options`
+- `title` (string) - a title to show above the action sheet
+- `message` (string) - a message to show below the title
+- `anchor` (number) - the node to which the action sheet should be anchored (used for iPad)
+- `tintColor` (string) - the [color](colors) used for non-destructive button titles
+- `disabledButtonIndices` (array of numbers) - a list of button indices which should be disabled
+- `userInterfaceStyle` (string) - the interface style used for the action sheet, can be set to `light` or `dark`, otherwise the default system style will be used
+
+The 'callback' function takes one parameter, the zero-based index of the selected item.
+
+Minimal example:
+
+```tsx
+ActionSheetIOS.showActionSheetWithOptions(
+ {
+ options: ['Cancel', 'Remove'],
+ destructiveButtonIndex: 1,
+ cancelButtonIndex: 0,
+ },
+ buttonIndex => {
+ if (buttonIndex === 1) {
+ /* destructive action */
+ }
+ },
+);
+```
+
+---
+
+### `dismissActionSheet()`
+
+```tsx
+static dismissActionSheet();
+```
+
+Dismisses the most upper iOS action sheet presented, if no action sheet is present a warning is displayed.
+
+---
+
+### `showShareActionSheetWithOptions()`
+
+```tsx
+static showShareActionSheetWithOptions: (
+ options: ShareActionSheetIOSOptions,
+ failureCallback: (error: Error) => void,
+ successCallback: (success: boolean, method: string) => void,
+);
+```
+
+Display the iOS share sheet. The `options` object should contain one or both of `message` and `url` and can additionally have a `subject` or `excludedActivityTypes`:
+
+- `url` (string) - a URL to share
+- `message` (string) - a message to share
+- `subject` (string) - a subject for the message
+- `excludedActivityTypes` (array) - the activities to exclude from the ActionSheet
+
+> **Note:** If `url` points to a local file, or is a base64-encoded uri, the file it points to will be loaded and shared directly. In this way, you can share images, videos, PDF files, etc. If `url` points to a remote file or address it must conform to URL format as described in [RFC 2396](https://www.ietf.org/rfc/rfc2396.txt). For example, a web URL without a proper protocol (HTTP/HTTPS) will not be shared.
+
+The 'failureCallback' function takes one parameter, an error object. The only property defined on this object is an optional `stack` property of type `string`.
+
+The 'successCallback' function takes two parameters:
+
+- a boolean value signifying success or failure
+- a string that, in the case of success, indicates the method of sharing
diff --git a/website/versioned_docs/version-0.73.0/activityindicator.md b/website/versioned_docs/version-0.73.0/activityindicator.md
new file mode 100644
index 00000000000..cdcd5605c3a
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/activityindicator.md
@@ -0,0 +1,84 @@
+---
+id: activityindicator
+title: ActivityIndicator
+---
+
+Displays a circular loading indicator.
+
+## Example
+
+```SnackPlayer name=ActivityIndicator%20Example
+import React from 'react';
+import {ActivityIndicator, StyleSheet, View} from 'react-native';
+
+const App = () => (
+
+
+
+
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ horizontal: {
+ flexDirection: 'row',
+ justifyContent: 'space-around',
+ padding: 10,
+ },
+});
+
+export default App;
+```
+
+# Reference
+
+## Props
+
+### [View Props](view#props)
+
+Inherits [View Props](view#props).
+
+---
+
+### `animating`
+
+Whether to show the indicator (`true`) or hide it (`false`).
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `color`
+
+The foreground color of the spinner.
+
+| Type | Default |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [color](colors) | `null` (system accent default color)
Android
`'#999999'`
iOS
|
+
+---
+
+### `hidesWhenStopped`
iOS
+
+Whether the indicator should hide when not animating.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `size`
+
+Size of the indicator.
+
+| Type | Default |
+| ------------------------------------------------------------------------------ | --------- |
+| enum(`'small'`, `'large'`)number
Android
| `'small'` |
diff --git a/website/versioned_docs/version-0.73.0/alert.md b/website/versioned_docs/version-0.73.0/alert.md
new file mode 100644
index 00000000000..a17abfb87f4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/alert.md
@@ -0,0 +1,248 @@
+---
+id: alert
+title: Alert
+---
+
+Launches an alert dialog with the specified title and message.
+
+Optionally provide a list of buttons. Tapping any button will fire the respective onPress callback and dismiss the alert. By default, the only button will be an 'OK' button.
+
+This is an API that works both on Android and iOS and can show static alerts. Alert that prompts the user to enter some information is available on iOS only.
+
+## Example
+
+```SnackPlayer name=Alert%20Example&supportedPlatforms=ios,android
+import React from 'react';
+import {View, StyleSheet, Button, Alert} from 'react-native';
+
+const App = () => {
+ const createTwoButtonAlert = () =>
+ Alert.alert('Alert Title', 'My Alert Msg', [
+ {
+ text: 'Cancel',
+ onPress: () => console.log('Cancel Pressed'),
+ style: 'cancel',
+ },
+ {text: 'OK', onPress: () => console.log('OK Pressed')},
+ ]);
+
+ const createThreeButtonAlert = () =>
+ Alert.alert('Alert Title', 'My Alert Msg', [
+ {
+ text: 'Ask me later',
+ onPress: () => console.log('Ask me later pressed'),
+ },
+ {
+ text: 'Cancel',
+ onPress: () => console.log('Cancel Pressed'),
+ style: 'cancel',
+ },
+ {text: 'OK', onPress: () => console.log('OK Pressed')},
+ ]);
+
+ return (
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+## iOS
+
+On iOS you can specify any number of buttons. Each button can optionally specify a style or be emphasized, available options are represented by the [AlertButtonStyle](#alertbuttonstyle-ios) enum and the `isPreferred` field on [AlertButton](alert#alertbutton).
+
+## Android
+
+On Android at most three buttons can be specified. Android has a concept of a neutral, negative and a positive button:
+
+- If you specify one button, it will be the 'positive' one (such as 'OK')
+- Two buttons mean 'negative', 'positive' (such as 'Cancel', 'OK')
+- Three buttons mean 'neutral', 'negative', 'positive' (such as 'Later', 'Cancel', 'OK')
+
+Alerts on Android can be dismissed by tapping outside of the alert box. It is disabled by default and can be enabled by providing an optional [AlertOptions](alert#alertoptions) parameter with the cancelable property set to `true` i.e. `{cancelable: true}`.
+
+The cancel event can be handled by providing an `onDismiss` callback property inside the `options` parameter.
+
+### Example
| string | The dialog's title. Passing `null` or empty string will hide the title. |
+| message | string | An optional message that appears below the dialog's title. |
+| buttons | [AlertButton](alert#alertbutton)[] | An optional array containing buttons configuration. |
+| options | [AlertOptions](alert#alertoptions) | An optional Alert configuration. |
+
+---
+
+### `prompt()`
iOS
+
+```tsx
+static prompt: (
+ title: string,
+ message?: string,
+ callbackOrButtons?: ((text: string) => void) | AlertButton[],
+ type?: AlertType,
+ defaultValue?: string,
+ keyboardType?: string,
+);
+```
+
+Create and display a prompt to enter some text in form of Alert.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| title
Required
| string | The dialog's title. |
+| message | string | An optional message that appears above the text input. |
+| callbackOrButtons | function[AlertButton](alert#alertButton)[] | If passed a function, it will be called with the prompt's value `(text: string) => void`, when the user taps 'OK'.If passed an array, buttons will be configured based on the array content. |
+| type | [AlertType](alert#alerttype-ios) | This configures the text input. |
+| defaultValue | string | The default text in text input. |
+| keyboardType | string | The keyboard type of first text field (if exists). One of TextInput [keyboardTypes](textinput#keyboardtype). |
+| options | [AlertOptions](alert#alertoptions) | An optional Alert configuration. |
+
+---
+
+## Type Definitions
+
+### AlertButtonStyle
+
+An iOS Alert type.
+
+| Type |
+| ---- |
+| enum |
+
+**Constants:**
+
+| Value | Description |
+| ------------------ | ---------------------------- |
+| `'default'` | Default alert with no inputs |
+| `'plain-text'` | Plain text input alert |
+| `'secure-text'` | Secure text input alert |
+| `'login-password'` | Login and password alert |
+
+---
+
+### AlertButton
+
+An object describing the configuration of a button in the alert.
+
+| Type |
+| ---------------- |
+| array of objects |
+
+**Objects properties:**
+
+| Name | Type | Description |
+| -------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------ |
+| text | string | Button label. |
+| onPress | function | Callback function when button is pressed. |
+| style
iOS
| [AlertButtonStyle](alert#alertbuttonstyle-ios) | Button style, on Android this property will be ignored. |
+| isPreferred
iOS
| boolean | Whether button should be emphasized, on Android this property will be ignored. |
+
+---
+
+### AlertOptions
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type | Description |
+| --------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+| cancelable
Android
| boolean | Defines if alert can be dismissed by tapping outside of the alert box. |
+| userInterfaceStyle
iOS
| string | The interface style used for the alert, can be set to `light` or `dark`, otherwise the default system style will be used. |
+| onDismiss
Android
| function | Callback function fired when alert has been dismissed. |
diff --git a/website/versioned_docs/version-0.73.0/alertios.md b/website/versioned_docs/version-0.73.0/alertios.md
new file mode 100644
index 00000000000..5fe745e86ec
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/alertios.md
@@ -0,0 +1,190 @@
+---
+id: alertios
+title: '🚧 AlertIOS'
+---
+
+> **Removed.** Use [`Alert`](alert) instead.
+
+`AlertIOS` provides functionality to create an iOS alert dialog with a message or create a prompt for user input.
+
+Creating an iOS alert:
+
+```jsx
+AlertIOS.alert(
+ 'Sync Complete',
+ 'All your data are belong to us.',
+);
+```
+
+Creating an iOS prompt:
+
+```jsx
+AlertIOS.prompt('Enter a value', null, text =>
+ console.log('You entered ' + text),
+);
+```
+
+We recommend using the [`Alert.alert`](alert) method for cross-platform support if you don't need to create iOS-only prompts.
+
+---
+
+# Reference
+
+## Methods
+
+### `alert()`
+
+```jsx
+static alert(title: string, [message]: string, [callbackOrButtons]: ?(() => void), ButtonsArray, [type]: AlertType): [object Object]
+```
+
+Create and display a popup alert.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----------------- | --------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| title | string | Yes | The dialog's title. Passing null or '' will hide the title. |
+| message | string | No | An optional message that appears below the dialog's title. |
+| callbackOrButtons | ?(() => void),[ButtonsArray](alertios#buttonsarray) | No | This optional argument should be either a single-argument function or an array of buttons. If passed a function, it will be called when the user taps 'OK'. If passed an array of button configurations, each button should include a `text` key, as well as optional `onPress` and `style` keys. `style` should be one of 'default', 'cancel' or 'destructive'. |
+| type | [AlertType](alertios#alerttype) | No | Deprecated, do not use. |
+
+Example with custom buttons:
+
+```jsx
+AlertIOS.alert(
+ 'Update available',
+ 'Keep your app up to date to enjoy the latest features',
+ [
+ {
+ text: 'Cancel',
+ onPress: () => console.log('Cancel Pressed'),
+ style: 'cancel',
+ },
+ {
+ text: 'Install',
+ onPress: () => console.log('Install Pressed'),
+ },
+ ],
+);
+```
+
+---
+
+### `prompt()`
+
+```jsx
+static prompt(title: string, [message]: string, [callbackOrButtons]: ?((text: string) => void), ButtonsArray, [type]: AlertType, [defaultValue]: string, [keyboardType]: string): [object Object]
+```
+
+Create and display a prompt to enter some text.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----------------- | --------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| title | string | Yes | The dialog's title. |
+| message | string | No | An optional message that appears above the text input. |
+| callbackOrButtons | ?((text: string) => void),[ButtonsArray](alertios#buttonsarray) | No | This optional argument should be either a single-argument function or an array of buttons. If passed a function, it will be called with the prompt's value when the user taps 'OK'. If passed an array of button configurations, each button should include a `text` key, as well as optional `onPress` and `style` keys (see example). `style` should be one of 'default', 'cancel' or 'destructive'. |
+| type | [AlertType](alertios#alerttype) | No | This configures the text input. One of 'plain-text', 'secure-text' or 'login-password'. |
+| defaultValue | string | No | The default text in text input. |
+| keyboardType | string | No | The keyboard type of first text field(if exists). One of 'default', 'email-address', 'numeric', 'phone-pad', 'ascii-capable', 'numbers-and-punctuation', 'url', 'number-pad', 'name-phone-pad', 'decimal-pad', 'twitter' or 'web-search'. |
+
+Example with custom buttons:
+
+```jsx
+AlertIOS.prompt(
+ 'Enter password',
+ 'Enter your password to claim your $1.5B in lottery winnings',
+ [
+ {
+ text: 'Cancel',
+ onPress: () => console.log('Cancel Pressed'),
+ style: 'cancel',
+ },
+ {
+ text: 'OK',
+ onPress: password =>
+ console.log('OK Pressed, password: ' + password),
+ },
+ ],
+ 'secure-text',
+);
+```
+
+,
+
+Example with the default button and a custom callback:
+
+```jsx
+AlertIOS.prompt(
+ 'Update username',
+ null,
+ text => console.log('Your username is ' + text),
+ null,
+ 'default',
+);
+```
+
+## Type Definitions
+
+### AlertType
+
+An Alert button type
+
+| Type |
+| ----- |
+| $Enum |
+
+**Constants:**
+
+| Value | Description |
+| -------------- | ---------------------------- |
+| default | Default alert with no inputs |
+| plain-text | Plain text input alert |
+| secure-text | Secure text input alert |
+| login-password | Login and password alert |
+
+---
+
+### AlertButtonStyle
+
+An Alert button style
+
+| Type |
+| ----- |
+| $Enum |
+
+**Constants:**
+
+| Value | Description |
+| ----------- | ------------------------ |
+| default | Default button style |
+| cancel | Cancel button style |
+| destructive | Destructive button style |
+
+---
+
+### ButtonsArray
+
+Array or buttons
+
+| Type |
+| ----- |
+| Array |
+
+**Properties:**
+
+| Name | Type | Description |
+| --------- | --------------------------------------------- | ------------------------------------- |
+| [text] | string | Button label |
+| [onPress] | function | Callback function when button pressed |
+| [style] | [AlertButtonStyle](alertios#alertbuttonstyle) | Button style |
+
+**Constants:**
+
+| Value | Description |
+| ------- | ------------------------------------- |
+| text | Button label |
+| onPress | Callback function when button pressed |
+| style | Button style |
diff --git a/website/versioned_docs/version-0.73.0/animated.md b/website/versioned_docs/version-0.73.0/animated.md
new file mode 100644
index 00000000000..fcf94c7801c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/animated.md
@@ -0,0 +1,536 @@
+---
+id: animated
+title: Animated
+---
+
+The `Animated` library is designed to make animations fluid, powerful, and painless to build and maintain. `Animated` focuses on declarative relationships between inputs and outputs, configurable transforms in between, and `start`/`stop` methods to control time-based animation execution.
+
+The core workflow for creating an animation is to create an `Animated.Value`, hook it up to one or more style attributes of an animated component, and then drive updates via animations using `Animated.timing()`.
+
+> Don't modify the animated value directly. You can use the [`useRef` Hook](https://reactjs.org/docs/hooks-reference.html#useref) to return a mutable ref object. This ref object's `current` property is initialized as the given argument and persists throughout the component lifecycle.
+
+## Example
+
+The following example contains a `View` which will fade in and fade out based on the animated value `fadeAnim`
+
+```SnackPlayer name=Animated
+import React, {useRef} from 'react';
+import {
+ Animated,
+ Text,
+ View,
+ StyleSheet,
+ Button,
+ SafeAreaView,
+} from 'react-native';
+
+const App = () => {
+ // fadeAnim will be used as the value for opacity. Initial Value: 0
+ const fadeAnim = useRef(new Animated.Value(0)).current;
+
+ const fadeIn = () => {
+ // Will change fadeAnim value to 1 in 5 seconds
+ Animated.timing(fadeAnim, {
+ toValue: 1,
+ duration: 5000,
+ useNativeDriver: true,
+ }).start();
+ };
+
+ const fadeOut = () => {
+ // Will change fadeAnim value to 0 in 3 seconds
+ Animated.timing(fadeAnim, {
+ toValue: 0,
+ duration: 3000,
+ useNativeDriver: true,
+ }).start();
+ };
+
+ return (
+
+
+ Fading View!
+
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ fadingContainer: {
+ padding: 20,
+ backgroundColor: 'powderblue',
+ },
+ fadingText: {
+ fontSize: 28,
+ },
+ buttonRow: {
+ flexBasis: 100,
+ justifyContent: 'space-evenly',
+ marginVertical: 16,
+ },
+});
+
+export default App;
+```
+
+Refer to the [Animations](animations#animated-api) guide to see additional examples of `Animated` in action.
+
+## Overview
+
+There are two value types you can use with `Animated`:
+
+- [`Animated.Value()`](animated#value) for single values
+- [`Animated.ValueXY()`](animated#valuexy) for vectors
+
+`Animated.Value` can bind to style properties or other props, and can be interpolated as well. A single `Animated.Value` can drive any number of properties.
+
+### Configuring animations
+
+`Animated` provides three types of animation types. Each animation type provides a particular animation curve that controls how your values animate from their initial value to the final value:
+
+- [`Animated.decay()`](animated#decay) starts with an initial velocity and gradually slows to a stop.
+- [`Animated.spring()`](animated#spring) provides a basic spring physics model.
+- [`Animated.timing()`](animated#timing) animates a value over time using [easing functions](easing).
+
+In most cases, you will be using `timing()`. By default, it uses a symmetric easeInOut curve that conveys the gradual acceleration of an object to full speed and concludes by gradually decelerating to a stop.
+
+### Working with animations
+
+Animations are started by calling `start()` on your animation. `start()` takes a completion callback that will be called when the animation is done. If the animation finished running normally, the completion callback will be invoked with `{finished: true}`. If the animation is done because `stop()` was called on it before it could finish (e.g. because it was interrupted by a gesture or another animation), then it will receive `{finished: false}`.
+
+```tsx
+Animated.timing({}).start(({finished}) => {
+ /* completion callback */
+});
+```
+
+### Using the native driver
+
+By using the native driver, we send everything about the animation to native before starting the animation, allowing native code to perform the animation on the UI thread without having to go through the bridge on every frame. Once the animation has started, the JS thread can be blocked without affecting the animation.
+
+You can use the native driver by specifying `useNativeDriver: true` in your animation configuration. See the [Animations](animations#using-the-native-driver) guide to learn more.
+
+### Animatable components
+
+Only animatable components can be animated. These unique components do the magic of binding the animated values to the properties, and do targeted native updates to avoid the cost of the React render and reconciliation process on every frame. They also handle cleanup on unmount so they are safe by default.
+
+- [`createAnimatedComponent()`](animated#createanimatedcomponent) can be used to make a component animatable.
+
+`Animated` exports the following animatable components using the above wrapper:
+
+- `Animated.Image`
+- `Animated.ScrollView`
+- `Animated.Text`
+- `Animated.View`
+- `Animated.FlatList`
+- `Animated.SectionList`
+
+### Composing animations
+
+Animations can also be combined in complex ways using composition functions:
+
+- [`Animated.delay()`](animated#delay) starts an animation after a given delay.
+- [`Animated.parallel()`](animated#parallel) starts a number of animations at the same time.
+- [`Animated.sequence()`](animated#sequence) starts the animations in order, waiting for each to complete before starting the next.
+- [`Animated.stagger()`](animated#stagger) starts animations in order and in parallel, but with successive delays.
+
+Animations can also be chained together by setting the `toValue` of one animation to be another `Animated.Value`. See [Tracking dynamic values](animations#tracking-dynamic-values) in the Animations guide.
+
+By default, if one animation is stopped or interrupted, then all other animations in the group are also stopped.
+
+### Combining animated values
+
+You can combine two animated values via addition, subtraction, multiplication, division, or modulo to make a new animated value:
+
+- [`Animated.add()`](animated#add)
+- [`Animated.subtract()`](animated#subtract)
+- [`Animated.divide()`](animated#divide)
+- [`Animated.modulo()`](animated#modulo)
+- [`Animated.multiply()`](animated#multiply)
+
+### Interpolation
+
+The `interpolate()` function allows input ranges to map to different output ranges. By default, it will extrapolate the curve beyond the ranges given, but you can also have it clamp the output value. It uses linear interpolation by default but also supports easing functions.
+
+- [`interpolate()`](animated#interpolate)
+
+Read more about interpolation in the [Animation](animations#interpolation) guide.
+
+### Handling gestures and other events
+
+Gestures, like panning or scrolling, and other events can map directly to animated values using `Animated.event()`. This is done with a structured map syntax so that values can be extracted from complex event objects. The first level is an array to allow mapping across multiple args, and that array contains nested objects.
+
+- [`Animated.event()`](animated#event)
+
+For example, when working with horizontal scrolling gestures, you would do the following in order to map `event.nativeEvent.contentOffset.x` to `scrollX` (an `Animated.Value`):
+
+```tsx
+ onScroll={Animated.event(
+ // scrollX = e.nativeEvent.contentOffset.x
+ [{nativeEvent: {
+ contentOffset: {
+ x: scrollX
+ }
+ }
+ }]
+ )}
+```
+
+---
+
+# Reference
+
+## Methods
+
+When the given value is a ValueXY instead of a Value, each config option may be a vector of the form `{x: ..., y: ...}` instead of a scalar.
+
+### `decay()`
+
+```tsx
+static decay(value, config): CompositeAnimation;
+```
+
+Animates a value from an initial velocity to zero based on a decay coefficient.
+
+Config is an object that may have the following options:
+
+- `velocity`: Initial velocity. Required.
+- `deceleration`: Rate of decay. Default 0.997.
+- `isInteraction`: Whether or not this animation creates an "interaction handle" on the `InteractionManager`. Default true.
+- `useNativeDriver`: Uses the native driver when true. Required.
+
+---
+
+### `timing()`
+
+```tsx
+static timing(value, config): CompositeAnimation;
+```
+
+Animates a value along a timed easing curve. The [`Easing`](easing) module has tons of predefined curves, or you can use your own function.
+
+Config is an object that may have the following options:
+
+- `duration`: Length of animation (milliseconds). Default 500.
+- `easing`: Easing function to define curve. Default is `Easing.inOut(Easing.ease)`.
+- `delay`: Start the animation after delay (milliseconds). Default 0.
+- `isInteraction`: Whether or not this animation creates an "interaction handle" on the `InteractionManager`. Default true.
+- `useNativeDriver`: Uses the native driver when true. Required.
+
+---
+
+### `spring()`
+
+```tsx
+static spring(value, config): CompositeAnimation;
+```
+
+Animates a value according to an analytical spring model based on [damped harmonic oscillation](https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator). Tracks velocity state to create fluid motions as the `toValue` updates, and can be chained together.
+
+Config is an object that may have the following options.
+
+Note that you can only define one of bounciness/speed, tension/friction, or stiffness/damping/mass, but not more than one:
+
+The friction/tension or bounciness/speed options match the spring model in [`Facebook Pop`](https://github.com/facebook/pop), [Rebound](https://github.com/facebookarchive/rebound), and [Origami](https://origami.design/).
+
+- `friction`: Controls "bounciness"/overshoot. Default 7.
+- `tension`: Controls speed. Default 40.
+- `speed`: Controls speed of the animation. Default 12.
+- `bounciness`: Controls bounciness. Default 8.
+
+Specifying stiffness/damping/mass as parameters makes `Animated.spring` use an analytical spring model based on the motion equations of a [damped harmonic oscillator](https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator). This behavior is slightly more precise and faithful to the physics behind spring dynamics, and closely mimics the implementation in iOS's CASpringAnimation.
+
+- `stiffness`: The spring stiffness coefficient. Default 100.
+- `damping`: Defines how the spring’s motion should be damped due to the forces of friction. Default 10.
+- `mass`: The mass of the object attached to the end of the spring. Default 1.
+
+Other configuration options are as follows:
+
+- `velocity`: The initial velocity of the object attached to the spring. Default 0 (object is at rest).
+- `overshootClamping`: Boolean indicating whether the spring should be clamped and not bounce. Default false.
+- `restDisplacementThreshold`: The threshold of displacement from rest below which the spring should be considered at rest. Default 0.001.
+- `restSpeedThreshold`: The speed at which the spring should be considered at rest in pixels per second. Default 0.001.
+- `delay`: Start the animation after delay (milliseconds). Default 0.
+- `isInteraction`: Whether or not this animation creates an "interaction handle" on the `InteractionManager`. Default true.
+- `useNativeDriver`: Uses the native driver when true. Required.
+
+---
+
+### `add()`
+
+```tsx
+static add(a: Animated, b: Animated): AnimatedAddition;
+```
+
+Creates a new Animated value composed from two Animated values added together.
+
+---
+
+### `subtract()`
+
+```tsx
+static subtract(a: Animated, b: Animated): AnimatedSubtraction;
+```
+
+Creates a new Animated value composed by subtracting the second Animated value from the first Animated value.
+
+---
+
+### `divide()`
+
+```tsx
+static divide(a: Animated, b: Animated): AnimatedDivision;
+```
+
+Creates a new Animated value composed by dividing the first Animated value by the second Animated value.
+
+---
+
+### `multiply()`
+
+```tsx
+static multiply(a: Animated, b: Animated): AnimatedMultiplication;
+```
+
+Creates a new Animated value composed from two Animated values multiplied together.
+
+---
+
+### `modulo()`
+
+```tsx
+static modulo(a: Animated, modulus: number): AnimatedModulo;
+```
+
+Creates a new Animated value that is the (non-negative) modulo of the provided Animated value
+
+---
+
+### `diffClamp()`
+
+```tsx
+static diffClamp(a: Animated, min: number, max: number): AnimatedDiffClamp;
+```
+
+Create a new Animated value that is limited between 2 values. It uses the difference between the last value so even if the value is far from the bounds it will start changing when the value starts getting closer again. (`value = clamp(value + diff, min, max)`).
+
+This is useful with scroll events, for example, to show the navbar when scrolling up and to hide it when scrolling down.
+
+---
+
+### `delay()`
+
+```tsx
+static delay(time: number): CompositeAnimation;
+```
+
+Starts an animation after the given delay.
+
+---
+
+### `sequence()`
+
+```tsx
+static sequence(animations: CompositeAnimation[]): CompositeAnimation;
+```
+
+Starts an array of animations in order, waiting for each to complete before starting the next. If the current running animation is stopped, no following animations will be started.
+
+---
+
+### `parallel()`
+
+```tsx
+static parallel(
+ animations: CompositeAnimation[],
+ config?: ParallelConfig
+): CompositeAnimation;
+```
+
+Starts an array of animations all at the same time. By default, if one of the animations is stopped, they will all be stopped. You can override this with the `stopTogether` flag.
+
+---
+
+### `stagger()`
+
+```tsx
+static stagger(
+ time: number,
+ animations: CompositeAnimation[]
+): CompositeAnimation;
+```
+
+Array of animations may run in parallel (overlap), but are started in sequence with successive delays. Nice for doing trailing effects.
+
+---
+
+### `loop()`
+
+```tsx
+static loop(
+ animation: CompositeAnimation[],
+ config?: LoopAnimationConfig
+): CompositeAnimation;
+```
+
+Loops a given animation continuously, so that each time it reaches the end, it resets and begins again from the start. Will loop without blocking the JS thread if the child animation is set to `useNativeDriver: true`. In addition, loops can prevent `VirtualizedList`-based components from rendering more rows while the animation is running. You can pass `isInteraction: false` in the child animation config to fix this.
+
+Config is an object that may have the following options:
+
+- `iterations`: Number of times the animation should loop. Default `-1` (infinite).
+
+---
+
+### `event()`
+
+```tsx
+static event(
+ argMapping: Mapping[],
+ config?: EventConfig
+): (...args: any[]) => void;
+```
+
+Takes an array of mappings and extracts values from each arg accordingly, then calls `setValue` on the mapped outputs. e.g.
+
+```tsx
+onScroll={Animated.event(
+ [{nativeEvent: {contentOffset: {x: this._scrollX}}}],
+ {listener: (event: ScrollEvent) => console.log(event)}, // Optional async listener
+)}
+ ...
+onPanResponderMove: Animated.event(
+ [
+ null, // raw event arg ignored
+ {dx: this._panX},
+ ], // gestureState arg
+ {
+ listener: (
+ event: GestureResponderEvent,
+ gestureState: PanResponderGestureState
+ ) => console.log(event, gestureState),
+ } // Optional async listener
+);
+```
+
+Config is an object that may have the following options:
+
+- `listener`: Optional async listener.
+- `useNativeDriver`: Uses the native driver when true. Required.
+
+---
+
+### `forkEvent()`
+
+```jsx
+static forkEvent(event: AnimatedEvent, listener: Function): AnimatedEvent;
+```
+
+Advanced imperative API for snooping on animated events that are passed in through props. It permits to add a new javascript listener to an existing `AnimatedEvent`. If `animatedEvent` is a javascript listener, it will merge the 2 listeners into a single one, and if `animatedEvent` is null/undefined, it will assign the javascript listener directly. Use values directly where possible.
+
+---
+
+### `unforkEvent()`
+
+```jsx
+static unforkEvent(event: AnimatedEvent, listener: Function);
+```
+
+---
+
+### `start()`
+
+```tsx
+static start(callback?: (result: {finished: boolean}) => void);
+```
+
+Animations are started by calling start() on your animation. start() takes a completion callback that will be called when the animation is done or when the animation is done because stop() was called on it before it could finish.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | --------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| callback | `(result: {finished: boolean}) => void` | No | Function that will be called after the animation finished running normally or when the animation is done because stop() was called on it before it could finish |
+
+Start example with callback:
+
+```tsx
+Animated.timing({}).start(({finished}) => {
+ /* completion callback */
+});
+```
+
+---
+
+### `stop()`
+
+```tsx
+static stop();
+```
+
+Stops any running animation.
+
+---
+
+### `reset()`
+
+```tsx
+static reset();
+```
+
+Stops any running animation and resets the value to its original.
+
+## Properties
+
+### `Value`
+
+Standard value class for driving animations. Typically initialized with `new Animated.Value(0);`
+
+You can read more about `Animated.Value` API on the separate [page](animatedvalue).
+
+---
+
+### `ValueXY`
+
+2D value class for driving 2D animations, such as pan gestures.
+
+You can read more about `Animated.ValueXY` API on the separate [page](animatedvaluexy).
+
+---
+
+### `Interpolation`
+
+Exported to use the Interpolation type in flow.
+
+---
+
+### `Node`
+
+Exported for ease of type checking. All animated values derive from this class.
+
+---
+
+### `createAnimatedComponent`
+
+Make any React component Animatable. Used to create `Animated.View`, etc.
+
+---
+
+### `attachNativeEvent`
+
+Imperative API to attach an animated value to an event on a view. Prefer using `Animated.event` with `useNativeDriver: true` if possible.
diff --git a/website/versioned_docs/version-0.73.0/animatedvalue.md b/website/versioned_docs/version-0.73.0/animatedvalue.md
new file mode 100644
index 00000000000..f6caa7ba422
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/animatedvalue.md
@@ -0,0 +1,184 @@
+---
+id: animatedvalue
+title: Animated.Value
+---
+
+Standard value for driving animations. One `Animated.Value` can drive multiple properties in a synchronized fashion, but can only be driven by one mechanism at a time. Using a new mechanism (e.g. starting a new animation, or calling `setValue`) will stop any previous ones.
+
+Typically initialized with `new Animated.Value(0);`
+
+---
+
+# Reference
+
+## Methods
+
+### `setValue()`
+
+```tsx
+setValue(value: number);
+```
+
+Directly set the value. This will stop any animations running on the value and update all the bound properties.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----- | ------ | -------- | ----------- |
+| value | number | Yes | Value |
+
+---
+
+### `setOffset()`
+
+```tsx
+setOffset(offset: number);
+```
+
+Sets an offset that is applied on top of whatever value is set, whether via `setValue`, an animation, or `Animated.event`. Useful for compensating things like the start of a pan gesture.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------ | ------ | -------- | ------------ |
+| offset | number | Yes | Offset value |
+
+---
+
+### `flattenOffset()`
+
+```tsx
+flattenOffset();
+```
+
+Merges the offset value into the base value and resets the offset to zero. The final output of the value is unchanged.
+
+---
+
+### `extractOffset()`
+
+```tsx
+extractOffset();
+```
+
+Sets the offset value to the base value, and resets the base value to zero. The final output of the value is unchanged.
+
+---
+
+### `addListener()`
+
+```tsx
+addListener(callback: (state: {value: number}) => void): string;
+```
+
+Adds an asynchronous listener to the value so you can observe updates from animations. This is useful because there is no way to synchronously read the value because it might be driven natively.
+
+Returns a string that serves as an identifier for the listener.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ------------------------------------------------------------------------------------------- |
+| callback | function | Yes | The callback function which will receive an object with a `value` key set to the new value. |
+
+---
+
+### `removeListener()`
+
+```tsx
+removeListener(id: string);
+```
+
+Unregister a listener. The `id` param shall match the identifier previously returned by `addListener()`.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ---- | ------ | -------- | ---------------------------------- |
+| id | string | Yes | Id for the listener being removed. |
+
+---
+
+### `removeAllListeners()`
+
+```tsx
+removeAllListeners();
+```
+
+Remove all registered listeners.
+
+---
+
+### `stopAnimation()`
+
+```tsx
+stopAnimation(callback?: (value: number) => void);
+```
+
+Stops any running animation or tracking. `callback` is invoked with the final value after stopping the animation, which is useful for updating state to match the animation position with layout.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | --------------------------------------------- |
+| callback | function | No | A function that will receive the final value. |
+
+---
+
+### `resetAnimation()`
+
+```tsx
+resetAnimation(callback?: (value: number) => void);
+```
+
+Stops any animation and resets the value to its original.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ------------------------------------------------ |
+| callback | function | No | A function that will receive the original value. |
+
+---
+
+### `interpolate()`
+
+```tsx
+interpolate(config: InterpolationConfigType);
+```
+
+Interpolates the value before updating the property, e.g. mapping 0-1 to 0-10.
+
+See `AnimatedInterpolation.js`
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------ | ------ | -------- | ----------- |
+| config | object | Yes | See below. |
+
+The `config` object is composed of the following keys:
+
+- `inputRange`: an array of numbers
+- `outputRange`: an array of numbers or strings
+- `easing` (optional): a function that returns a number, given an input number
+- `extrapolate` (optional): a string such as 'extend', 'identity', or 'clamp'
+- `extrapolateLeft` (optional): a string such as 'extend', 'identity', or 'clamp'
+- `extrapolateRight` (optional): a string such as 'extend', 'identity', or 'clamp'
+
+---
+
+### `animate()`
+
+```tsx
+animate(animation, callback);
+```
+
+Typically only used internally, but could be used by a custom Animation class.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| --------- | --------- | -------- | ------------------- |
+| animation | Animation | Yes | See `Animation.js`. |
+| callback | function | Yes | Callback function. |
diff --git a/website/versioned_docs/version-0.73.0/animatedvaluexy.md b/website/versioned_docs/version-0.73.0/animatedvaluexy.md
new file mode 100644
index 00000000000..e8353d333c8
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/animatedvaluexy.md
@@ -0,0 +1,224 @@
+---
+id: animatedvaluexy
+title: Animated.ValueXY
+---
+
+2D Value for driving 2D animations, such as pan gestures. Almost identical API to normal [`Animated.Value`](animatedvalue), but multiplexed. Contains two regular `Animated.Value`s under the hood.
+
+## Example
+
+```SnackPlayer name=Animated.ValueXY
+import React, {useRef} from 'react';
+import {Animated, PanResponder, StyleSheet, View} from 'react-native';
+
+const DraggableView = () => {
+ const pan = useRef(new Animated.ValueXY()).current;
+
+ const panResponder = PanResponder.create({
+ onStartShouldSetPanResponder: () => true,
+ onPanResponderMove: Animated.event([
+ null,
+ {
+ dx: pan.x, // x,y are Animated.Value
+ dy: pan.y,
+ },
+ ]),
+ onPanResponderRelease: () => {
+ Animated.spring(
+ pan, // Auto-multiplexed
+ {toValue: {x: 0, y: 0}, useNativeDriver: true}, // Back to zero
+ ).start();
+ },
+ });
+
+ return (
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ box: {
+ backgroundColor: '#61dafb',
+ width: 80,
+ height: 80,
+ borderRadius: 4,
+ },
+});
+
+export default DraggableView;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `setValue()`
+
+```tsx
+setValue(value: {x: number; y: number});
+```
+
+Directly set the value. This will stop any animations running on the value and update all the bound properties.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----- | ------------------------ | -------- | ----------- |
+| value | `{x: number; y: number}` | Yes | Value |
+
+---
+
+### `setOffset()`
+
+```tsx
+setOffset(offset: {x: number; y: number});
+```
+
+Sets an offset that is applied on top of whatever value is set, whether via `setValue`, an animation, or `Animated.event`. Useful for compensating things like the start of a pan gesture.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------ | ------------------------ | -------- | ------------ |
+| offset | `{x: number; y: number}` | Yes | Offset value |
+
+---
+
+### `flattenOffset()`
+
+```tsx
+flattenOffset();
+```
+
+Merges the offset value into the base value and resets the offset to zero. The final output of the value is unchanged.
+
+---
+
+### `extractOffset()`
+
+```tsx
+extractOffset();
+```
+
+Sets the offset value to the base value, and resets the base value to zero. The final output of the value is unchanged.
+
+---
+
+### `addListener()`
+
+```tsx
+addListener(callback: (value: {x: number; y: number}) => void);
+```
+
+Adds an asynchronous listener to the value so you can observe updates from animations. This is useful because there is no way to synchronously read the value because it might be driven natively.
+
+Returns a string that serves as an identifier for the listener.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ------------------------------------------------------------------------------------------- |
+| callback | function | Yes | The callback function which will receive an object with a `value` key set to the new value. |
+
+---
+
+### `removeListener()`
+
+```tsx
+removeListener(id: string);
+```
+
+Unregister a listener. The `id` param shall match the identifier previously returned by `addListener()`.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ---- | ------ | -------- | ---------------------------------- |
+| id | string | Yes | Id for the listener being removed. |
+
+---
+
+### `removeAllListeners()`
+
+```tsx
+removeAllListeners();
+```
+
+Remove all registered listeners.
+
+---
+
+### `stopAnimation()`
+
+```tsx
+stopAnimation(callback?: (value: {x: number; y: number}) => void);
+```
+
+Stops any running animation or tracking. `callback` is invoked with the final value after stopping the animation, which is useful for updating state to match the animation position with layout.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | --------------------------------------------- |
+| callback | function | No | A function that will receive the final value. |
+
+---
+
+### `resetAnimation()`
+
+```tsx
+resetAnimation(callback?: (value: {x: number; y: number}) => void);
+```
+
+Stops any animation and resets the value to its original.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ------------------------------------------------ |
+| callback | function | No | A function that will receive the original value. |
+
+---
+
+### `getLayout()`
+
+```tsx
+getLayout(): {left: Animated.Value, top: Animated.Value};
+```
+
+Converts `{x, y}` into `{left, top}` for use in style, e.g.
+
+```tsx
+style={this.state.anim.getLayout()}
+```
+
+---
+
+### `getTranslateTransform()`
+
+```tsx
+getTranslateTransform(): [
+ {translateX: Animated.Value},
+ {translateY: Animated.Value},
+];
+```
+
+Converts `{x, y}` into a useable translation transform, e.g.
+
+```tsx
+style={{
+ transform: this.state.anim.getTranslateTransform()
+}}
+```
diff --git a/website/versioned_docs/version-0.73.0/animations.md b/website/versioned_docs/version-0.73.0/animations.md
new file mode 100644
index 00000000000..086c27e881d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/animations.md
@@ -0,0 +1,675 @@
+---
+id: animations
+title: Animations
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Animations are very important to create a great user experience. Stationary objects must overcome inertia as they start moving. Objects in motion have momentum and rarely come to a stop immediately. Animations allow you to convey physically believable motion in your interface.
+
+React Native provides two complementary animation systems: [`Animated`](animations#animated-api) for granular and interactive control of specific values, and [`LayoutAnimation`](animations#layoutanimation-api) for animated global layout transactions.
+
+## `Animated` API
+
+The [`Animated`](animated) API is designed to concisely express a wide variety of interesting animation and interaction patterns in a very performant way. `Animated` focuses on declarative relationships between inputs and outputs, with configurable transforms in between, and `start`/`stop` methods to control time-based animation execution.
+
+`Animated` exports six animatable component types: `View`, `Text`, `Image`, `ScrollView`, `FlatList` and `SectionList`, but you can also create your own using `Animated.createAnimatedComponent()`.
+
+For example, a container view that fades in when it is mounted may look like this:
+
+
+
+
+```SnackPlayer ext=js
+import React, {useRef, useEffect} from 'react';
+import {Animated, Text, View} from 'react-native';
+
+const FadeInView = props => {
+ const fadeAnim = useRef(new Animated.Value(0)).current; // Initial value for opacity: 0
+
+ useEffect(() => {
+ Animated.timing(fadeAnim, {
+ toValue: 1,
+ duration: 10000,
+ useNativeDriver: true,
+ }).start();
+ }, [fadeAnim]);
+
+ return (
+
+ {props.children}
+
+ );
+};
+
+// You can then use your `FadeInView` in place of a `View` in your components:
+export default () => {
+ return (
+
+
+
+ Fading in
+
+
+
+ );
+};
+```
+
+
+
+
+```SnackPlayer ext=tsx
+import React, {useRef, useEffect} from 'react';
+import {Animated, Text, View} from 'react-native';
+import type {PropsWithChildren} from 'react';
+import type {ViewStyle} from 'react-native';
+
+type FadeInViewProps = PropsWithChildren<{style: ViewStyle}>;
+
+const FadeInView: React.FC = props => {
+ const fadeAnim = useRef(new Animated.Value(0)).current; // Initial value for opacity: 0
+
+ useEffect(() => {
+ Animated.timing(fadeAnim, {
+ toValue: 1,
+ duration: 10000,
+ useNativeDriver: true,
+ }).start();
+ }, [fadeAnim]);
+
+ return (
+
+ {props.children}
+
+ );
+};
+
+// You can then use your `FadeInView` in place of a `View` in your components:
+export default () => {
+ return (
+
+
+
+ Fading in
+
+
+
+ );
+};
+```
+
+
+
+
+Let's break down what's happening here. In the `FadeInView` constructor, a new `Animated.Value` called `fadeAnim` is initialized as part of `state`. The opacity property on the `View` is mapped to this animated value. Behind the scenes, the numeric value is extracted and used to set opacity.
+
+When the component mounts, the opacity is set to 0. Then, an easing animation is started on the `fadeAnim` animated value, which will update all of its dependent mappings (in this case, only the opacity) on each frame as the value animates to the final value of 1.
+
+This is done in an optimized way that is faster than calling `setState` and re-rendering. Because the entire configuration is declarative, we will be able to implement further optimizations that serialize the configuration and runs the animation on a high-priority thread.
+
+### Configuring animations
+
+Animations are heavily configurable. Custom and predefined easing functions, delays, durations, decay factors, spring constants, and more can all be tweaked depending on the type of animation.
+
+`Animated` provides several animation types, the most commonly used one being [`Animated.timing()`](animated#timing). It supports animating a value over time using one of various predefined easing functions, or you can use your own. Easing functions are typically used in animation to convey gradual acceleration and deceleration of objects.
+
+By default, `timing` will use an easeInOut curve that conveys gradual acceleration to full speed and concludes by gradually decelerating to a stop. You can specify a different easing function by passing an `easing` parameter. Custom `duration` or even a `delay` before the animation starts is also supported.
+
+For example, if we want to create a 2-second long animation of an object that slightly backs up before moving to its final position:
+
+```tsx
+Animated.timing(this.state.xPosition, {
+ toValue: 100,
+ easing: Easing.back(),
+ duration: 2000,
+ useNativeDriver: true,
+}).start();
+```
+
+Take a look at the [Configuring animations](animated#configuring-animations) section of the `Animated` API reference to learn more about all the config parameters supported by the built-in animations.
+
+### Composing animations
+
+Animations can be combined and played in sequence or in parallel. Sequential animations can play immediately after the previous animation has finished, or they can start after a specified delay. The `Animated` API provides several methods, such as `sequence()` and `delay()`, each of which take an array of animations to execute and automatically calls `start()`/`stop()` as needed.
+
+For example, the following animation coasts to a stop, then it springs back while twirling in parallel:
+
+```tsx
+Animated.sequence([
+ // decay, then spring to start and twirl
+ Animated.decay(position, {
+ // coast to a stop
+ velocity: {x: gestureState.vx, y: gestureState.vy}, // velocity from gesture release
+ deceleration: 0.997,
+ useNativeDriver: true,
+ }),
+ Animated.parallel([
+ // after decay, in parallel:
+ Animated.spring(position, {
+ toValue: {x: 0, y: 0}, // return to start
+ useNativeDriver: true,
+ }),
+ Animated.timing(twirl, {
+ // and twirl
+ toValue: 360,
+ useNativeDriver: true,
+ }),
+ ]),
+]).start(); // start the sequence group
+```
+
+If one animation is stopped or interrupted, then all other animations in the group are also stopped. `Animated.parallel` has a `stopTogether` option that can be set to `false` to disable this.
+
+You can find a full list of composition methods in the [Composing animations](animated#composing-animations) section of the `Animated` API reference.
+
+### Combining animated values
+
+You can [combine two animated values](animated#combining-animated-values) via addition, multiplication, division, or modulo to make a new animated value.
+
+There are some cases where an animated value needs to invert another animated value for calculation. An example is inverting a scale (2x --> 0.5x):
+
+```tsx
+const a = new Animated.Value(1);
+const b = Animated.divide(1, a);
+
+Animated.spring(a, {
+ toValue: 2,
+ useNativeDriver: true,
+}).start();
+```
+
+### Interpolation
+
+Each property can be run through an interpolation first. An interpolation maps input ranges to output ranges, typically using a linear interpolation but also supports easing functions. By default, it will extrapolate the curve beyond the ranges given, but you can also have it clamp the output value.
+
+A basic mapping to convert a 0-1 range to a 0-100 range would be:
+
+```tsx
+value.interpolate({
+ inputRange: [0, 1],
+ outputRange: [0, 100],
+});
+```
+
+For example, you may want to think about your `Animated.Value` as going from 0 to 1, but animate the position from 150px to 0px and the opacity from 0 to 1. This can be done by modifying `style` from the example above like so:
+
+```tsx
+ style={{
+ opacity: this.state.fadeAnim, // Binds directly
+ transform: [{
+ translateY: this.state.fadeAnim.interpolate({
+ inputRange: [0, 1],
+ outputRange: [150, 0] // 0 : 150, 0.5 : 75, 1 : 0
+ }),
+ }],
+ }}
+```
+
+[`interpolate()`](animated#interpolate) supports multiple range segments as well, which is handy for defining dead zones and other handy tricks. For example, to get a negation relationship at -300 that goes to 0 at -100, then back up to 1 at 0, and then back down to zero at 100 followed by a dead-zone that remains at 0 for everything beyond that, you could do:
+
+```tsx
+value.interpolate({
+ inputRange: [-300, -100, 0, 100, 101],
+ outputRange: [300, 0, 1, 0, 0],
+});
+```
+
+Which would map like so:
+
+```
+Input | Output
+------|-------
+ -400| 450
+ -300| 300
+ -200| 150
+ -100| 0
+ -50| 0.5
+ 0| 1
+ 50| 0.5
+ 100| 0
+ 101| 0
+ 200| 0
+```
+
+`interpolate()` also supports mapping to strings, allowing you to animate colors as well as values with units. For example, if you wanted to animate a rotation you could do:
+
+```tsx
+value.interpolate({
+ inputRange: [0, 360],
+ outputRange: ['0deg', '360deg'],
+});
+```
+
+`interpolate()` also supports arbitrary easing functions, many of which are already implemented in the [`Easing`](easing) module. `interpolate()` also has configurable behavior for extrapolating the `outputRange`. You can set the extrapolation by setting the `extrapolate`, `extrapolateLeft`, or `extrapolateRight` options. The default value is `extend` but you can use `clamp` to prevent the output value from exceeding `outputRange`.
+
+### Tracking dynamic values
+
+Animated values can also track other values by setting the `toValue` of an animation to another animated value instead of a plain number. For example, a "Chat Heads" animation like the one used by Messenger on Android could be implemented with a `spring()` pinned on another animated value, or with `timing()` and a `duration` of 0 for rigid tracking. They can also be composed with interpolations:
+
+```tsx
+Animated.spring(follower, {toValue: leader}).start();
+Animated.timing(opacity, {
+ toValue: pan.x.interpolate({
+ inputRange: [0, 300],
+ outputRange: [1, 0],
+ useNativeDriver: true,
+ }),
+}).start();
+```
+
+The `leader` and `follower` animated values would be implemented using `Animated.ValueXY()`. `ValueXY` is a handy way to deal with 2D interactions, such as panning or dragging. It is a basic wrapper that contains two `Animated.Value` instances and some helper functions that call through to them, making `ValueXY` a drop-in replacement for `Value` in many cases. It allows us to track both x and y values in the example above.
+
+### Tracking gestures
+
+Gestures, like panning or scrolling, and other events can map directly to animated values using [`Animated.event`](animated#event). This is done with a structured map syntax so that values can be extracted from complex event objects. The first level is an array to allow mapping across multiple args, and that array contains nested objects.
+
+For example, when working with horizontal scrolling gestures, you would do the following in order to map `event.nativeEvent.contentOffset.x` to `scrollX` (an `Animated.Value`):
+
+```tsx
+ onScroll={Animated.event(
+ // scrollX = e.nativeEvent.contentOffset.x
+ [{nativeEvent: {
+ contentOffset: {
+ x: scrollX
+ }
+ }
+ }]
+ )}
+```
+
+The following example implements a horizontal scrolling carousel where the scroll position indicators are animated using the `Animated.event` used in the `ScrollView`
+
+#### ScrollView with Animated Event Example
+
+```SnackPlayer name=Animated&supportedPlatforms=ios,android
+import React, {useRef} from 'react';
+import {
+ SafeAreaView,
+ ScrollView,
+ Text,
+ StyleSheet,
+ View,
+ ImageBackground,
+ Animated,
+ useWindowDimensions,
+} from 'react-native';
+
+const images = new Array(6).fill(
+ 'https://images.unsplash.com/photo-1556740749-887f6717d7e4',
+);
+
+const App = () => {
+ const scrollX = useRef(new Animated.Value(0)).current;
+
+ const {width: windowWidth} = useWindowDimensions();
+
+ return (
+
+
+
+ {images.map((image, imageIndex) => {
+ return (
+
+
+
+
+ {'Image - ' + imageIndex}
+
+
+
+
+ );
+ })}
+
+
+ {images.map((image, imageIndex) => {
+ const width = scrollX.interpolate({
+ inputRange: [
+ windowWidth * (imageIndex - 1),
+ windowWidth * imageIndex,
+ windowWidth * (imageIndex + 1),
+ ],
+ outputRange: [8, 16, 8],
+ extrapolate: 'clamp',
+ });
+ return (
+
+ );
+ })}
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ scrollContainer: {
+ height: 300,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ card: {
+ flex: 1,
+ marginVertical: 4,
+ marginHorizontal: 16,
+ borderRadius: 5,
+ overflow: 'hidden',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ textContainer: {
+ backgroundColor: 'rgba(0,0,0, 0.7)',
+ paddingHorizontal: 24,
+ paddingVertical: 8,
+ borderRadius: 5,
+ },
+ infoText: {
+ color: 'white',
+ fontSize: 16,
+ fontWeight: 'bold',
+ },
+ normalDot: {
+ height: 8,
+ width: 8,
+ borderRadius: 4,
+ backgroundColor: 'silver',
+ marginHorizontal: 4,
+ },
+ indicatorContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+
+export default App;
+```
+
+When using `PanResponder`, you could use the following code to extract the x and y positions from `gestureState.dx` and `gestureState.dy`. We use a `null` in the first position of the array, as we are only interested in the second argument passed to the `PanResponder` handler, which is the `gestureState`.
+
+```tsx
+onPanResponderMove={Animated.event(
+ [null, // ignore the native event
+ // extract dx and dy from gestureState
+ // like 'pan.x = gestureState.dx, pan.y = gestureState.dy'
+ {dx: pan.x, dy: pan.y}
+])}
+```
+
+#### PanResponder with Animated Event Example
+
+```SnackPlayer name=Animated
+import React, {useRef} from 'react';
+import {Animated, View, StyleSheet, PanResponder, Text} from 'react-native';
+
+const App = () => {
+ const pan = useRef(new Animated.ValueXY()).current;
+ const panResponder = useRef(
+ PanResponder.create({
+ onMoveShouldSetPanResponder: () => true,
+ onPanResponderMove: Animated.event([null, {dx: pan.x, dy: pan.y}]),
+ onPanResponderRelease: () => {
+ Animated.spring(pan, {
+ toValue: {x: 0, y: 0},
+ useNativeDriver: true,
+ }).start();
+ },
+ }),
+ ).current;
+
+ return (
+
+ Drag & Release this box!
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ titleText: {
+ fontSize: 14,
+ lineHeight: 24,
+ fontWeight: 'bold',
+ },
+ box: {
+ height: 150,
+ width: 150,
+ backgroundColor: 'blue',
+ borderRadius: 5,
+ },
+});
+
+export default App;
+```
+
+### Responding to the current animation value
+
+You may notice that there is no clear way to read the current value while animating. This is because the value may only be known in the native runtime due to optimizations. If you need to run JavaScript in response to the current value, there are two approaches:
+
+- `spring.stopAnimation(callback)` will stop the animation and invoke `callback` with the final value. This is useful when making gesture transitions.
+- `spring.addListener(callback)` will invoke `callback` asynchronously while the animation is running, providing a recent value. This is useful for triggering state changes, for example snapping a bobble to a new option as the user drags it closer, because these larger state changes are less sensitive to a few frames of lag compared to continuous gestures like panning which need to run at 60 fps.
+
+`Animated` is designed to be fully serializable so that animations can be run in a high performance way, independent of the normal JavaScript event loop. This does influence the API, so keep that in mind when it seems a little trickier to do something compared to a fully synchronous system. Check out `Animated.Value.addListener` as a way to work around some of these limitations, but use it sparingly since it might have performance implications in the future.
+
+### Using the native driver
+
+The `Animated` API is designed to be serializable. By using the [native driver](/blog/2017/02/14/using-native-driver-for-animated), we send everything about the animation to native before starting the animation, allowing native code to perform the animation on the UI thread without having to go through the bridge on every frame. Once the animation has started, the JS thread can be blocked without affecting the animation.
+
+Using the native driver for normal animations can be accomplished by setting `useNativeDriver: true` in animation config when starting it. Animations without a `useNativeDriver` property will default to false for legacy reasons, but emit a warning (and typechecking error in TypeScript).
+
+```tsx
+Animated.timing(this.state.animatedValue, {
+ toValue: 1,
+ duration: 500,
+ useNativeDriver: true, // <-- Set this to true
+}).start();
+```
+
+Animated values are only compatible with one driver so if you use native driver when starting an animation on a value, make sure every animation on that value also uses the native driver.
+
+The native driver also works with `Animated.event`. This is especially useful for animations that follow the scroll position as without the native driver, the animation will always run a frame behind the gesture due to the async nature of React Native.
+
+```tsx
+
+ {content}
+
+```
+
+You can see the native driver in action by running the [RNTester app](https://github.com/facebook/react-native/blob/main/packages/rn-tester/), then loading the Native Animated Example. You can also take a look at the [source code](https://github.com/facebook/react-native/blob/master/packages/rn-tester/js/examples/NativeAnimation/NativeAnimationsExample.js) to learn how these examples were produced.
+
+#### Caveats
+
+Not everything you can do with `Animated` is currently supported by the native driver. The main limitation is that you can only animate non-layout properties: things like `transform` and `opacity` will work, but Flexbox and position properties will not. When using `Animated.event`, it will only work with direct events and not bubbling events. This means it does not work with `PanResponder` but does work with things like `ScrollView#onScroll`.
+
+When an animation is running, it can prevent `VirtualizedList` components from rendering more rows. If you need to run a long or looping animation while the user is scrolling through a list, you can use `isInteraction: false` in your animation's config to prevent this issue.
+
+### Bear in mind
+
+While using transform styles such as `rotateY`, `rotateX`, and others ensure the transform style `perspective` is in place. At this time some animations may not render on Android without it. Example below.
+
+```tsx
+
+```
+
+### Additional examples
+
+The RNTester app has various examples of `Animated` in use:
+
+- [AnimatedGratuitousApp](https://github.com/facebook/react-native/tree/main/packages/rn-tester/js/examples/AnimatedGratuitousApp)
+- [NativeAnimationsExample](https://github.com/facebook/react-native/blob/main/packages/rn-tester/js/examples/NativeAnimation/NativeAnimationsExample.js)
+
+## `LayoutAnimation` API
+
+`LayoutAnimation` allows you to globally configure `create` and `update` animations that will be used for all views in the next render/layout cycle. This is useful for doing Flexbox layout updates without bothering to measure or calculate specific properties in order to animate them directly, and is especially useful when layout changes may affect ancestors, for example a "see more" expansion that also increases the size of the parent and pushes down the row below which would otherwise require explicit coordination between the components in order to animate them all in sync.
+
+Note that although `LayoutAnimation` is very powerful and can be quite useful, it provides much less control than `Animated` and other animation libraries, so you may need to use another approach if you can't get `LayoutAnimation` to do what you want.
+
+Note that in order to get this to work on **Android** you need to set the following flags via `UIManager`:
+
+```tsx
+UIManager.setLayoutAnimationEnabledExperimental(true);
+```
+
+```SnackPlayer name=LayoutAnimations&supportedPlatforms=ios,android
+import React from 'react';
+import {
+ NativeModules,
+ LayoutAnimation,
+ Text,
+ TouchableOpacity,
+ StyleSheet,
+ View,
+} from 'react-native';
+
+const {UIManager} = NativeModules;
+
+UIManager.setLayoutAnimationEnabledExperimental &&
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+
+export default class App extends React.Component {
+ state = {
+ w: 100,
+ h: 100,
+ };
+
+ _onPress = () => {
+ // Animate the update
+ LayoutAnimation.spring();
+ this.setState({w: this.state.w + 15, h: this.state.h + 15});
+ };
+
+ render() {
+ return (
+
+
+
+
+ Press me!
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ box: {
+ width: 200,
+ height: 200,
+ backgroundColor: 'red',
+ },
+ button: {
+ backgroundColor: 'black',
+ paddingHorizontal: 20,
+ paddingVertical: 15,
+ marginTop: 15,
+ },
+ buttonText: {
+ color: '#fff',
+ fontWeight: 'bold',
+ },
+});
+```
+
+This example uses a preset value, you can customize the animations as you need, see [LayoutAnimation.js](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/LayoutAnimation/LayoutAnimation.js) for more information.
+
+## Additional notes
+
+### `requestAnimationFrame`
+
+`requestAnimationFrame` is a polyfill from the browser that you might be familiar with. It accepts a function as its only argument and calls that function before the next repaint. It is an essential building block for animations that underlies all of the JavaScript-based animation APIs. In general, you shouldn't need to call this yourself - the animation APIs will manage frame updates for you.
+
+### `setNativeProps`
+
+As mentioned [in the Direct Manipulation section](direct-manipulation), `setNativeProps` allows us to modify properties of native-backed components (components that are actually backed by native views, unlike composite components) directly, without having to `setState` and re-render the component hierarchy.
+
+We could use this in the Rebound example to update the scale - this might be helpful if the component that we are updating is deeply nested and hasn't been optimized with `shouldComponentUpdate`.
+
+If you find your animations with dropping frames (performing below 60 frames per second), look into using `setNativeProps` or `shouldComponentUpdate` to optimize them. Or you could run the animations on the UI thread rather than the JavaScript thread [with the useNativeDriver option](/blog/2017/02/14/using-native-driver-for-animated). You may also want to defer any computationally intensive work until after animations are complete, using the [InteractionManager](interactionmanager). You can monitor the frame rate by using the In-App Dev Menu "FPS Monitor" tool.
diff --git a/website/versioned_docs/version-0.73.0/app-extensions.md b/website/versioned_docs/version-0.73.0/app-extensions.md
new file mode 100644
index 00000000000..809cacfe1dd
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/app-extensions.md
@@ -0,0 +1,26 @@
+---
+id: app-extensions
+title: App Extensions
+---
+
+App extensions let you provide custom functionality and content outside of your main app. There are different types of app extensions on iOS, and they are all covered in the [App Extension Programming Guide](https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/index.html#//apple_ref/doc/uid/TP40014214-CH20-SW1). In this guide, we'll briefly cover how you may take advantage of app extensions on iOS.
+
+## Memory use in extensions
+
+As these extensions are loaded outside of the regular app sandbox, it's highly likely that several of these app extensions will be loaded simultaneously. As you might expect, these extensions have small memory usage limits. Keep these in mind when developing your app extensions. It's always highly recommended to test your application on an actual device, and more so when developing app extensions: too frequently, developers find that their extension works fine in the iOS Simulator, only to get user reports that their extension is not loading on actual devices.
+
+We highly recommend that you watch Conrad Kramer's talk on [Memory Use in Extensions](https://www.youtube.com/watch?v=GqXMqn6MXrM) to learn more about this topic.
+
+### Today widget
+
+The memory limit of a Today widget is 16 MB. As it happens, Today widget implementations using React Native may work unreliably because the memory usage tends to be too high. You can tell if your Today widget is exceeding the memory limit if it yields the message 'Unable to Load':
+
+
+
+Always make sure to test your app extensions in a real device, but be aware that this may not be sufficient, especially when dealing with Today widgets. Debug-configured builds are more likely to exceed the memory limits, while release-configured builds don't fail right away. We highly recommend that you use [Xcode's Instruments](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html) to analyze your real world memory usage, as it's very likely that your release-configured build is very close to the 16 MB limit. In situations like these, you can quickly go over the 16 MB limit by performing common operations, such as fetching data from an API.
+
+To experiment with the limits of React Native Today widget implementations, try extending the example project in [react-native-today-widget](https://github.com/matejkriz/react-native-today-widget/).
+
+### Other app extensions
+
+Other types of app extensions have greater memory limits than the Today widget. For instance, Custom Keyboard extensions are limited to 48 MB, and Share extensions are limited to 120 MB. Implementing such app extensions with React Native is more viable. One proof of concept example is [react-native-ios-share-extension](https://github.com/andrewsardone/react-native-ios-share-extension).
diff --git a/website/versioned_docs/version-0.73.0/appearance.md b/website/versioned_docs/version-0.73.0/appearance.md
new file mode 100644
index 00000000000..51fe453f6e1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/appearance.md
@@ -0,0 +1,100 @@
+---
+id: appearance
+title: Appearance
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+```tsx
+import {Appearance} from 'react-native';
+```
+
+The `Appearance` module exposes information about the user's appearance preferences, such as their preferred color scheme (light or dark).
+
+#### Developer notes
+
+
+
+
+
+> The `Appearance` API is inspired by the [Media Queries draft](https://drafts.csswg.org/mediaqueries-5/) from the W3C. The color scheme preference is modeled after the [`prefers-color-scheme` CSS media feature](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme).
+
+
+
+
+> The color scheme preference will map to the user's Light or [Dark theme](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme) preference on Android 10 (API level 29) devices and higher.
+
+
+
+
+> The color scheme preference will map to the user's Light or [Dark Mode](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/dark-mode/) preference on iOS 13 devices and higher.
+
+
+
+
+## Example
+
+You can use the `Appearance` module to determine if the user prefers a dark color scheme:
+
+```tsx
+const colorScheme = Appearance.getColorScheme();
+if (colorScheme === 'dark') {
+ // Use dark color scheme
+}
+```
+
+Although the color scheme is available immediately, this may change (e.g. scheduled color scheme change at sunrise or sunset). Any rendering logic or styles that depend on the user preferred color scheme should try to call this function on every render, rather than caching the value. For example, you may use the [`useColorScheme`](usecolorscheme) React hook as it provides and subscribes to color scheme updates, or you may use inline styles rather than setting a value in a `StyleSheet`.
+
+---
+
+# Reference
+
+## Methods
+
+### `getColorScheme()`
+
+```tsx
+static getColorScheme(): 'light' | 'dark' | null;
+```
+
+Indicates the current user preferred color scheme. The value may be updated later, either through direct user action (e.g. theme selection in device settings or application-level selected user interface style via `setColorScheme`) or on a schedule (e.g. light and dark themes that follow the day/night cycle).
+
+Supported color schemes:
+
+- `light`: The user prefers a light color theme.
+- `dark`: The user prefers a dark color theme.
+- null: The user has not indicated a preferred color theme.
+
+See also: `useColorScheme` hook.
+
+> Note: `getColorScheme()` will always return `light` when debugging with Chrome.
+
+---
+
+### `setColorScheme()`
+
+```tsx
+static setColorScheme('light' | 'dark' | null): void;
+```
+
+Force the application to always adopt a light or dark interface style. The default value is `null` which causes the application to inherit the system's interface style. If you assign a different value, the new style applies to the application and all native elements within the application (Alerts, Pickers etc).
+
+Supported color schemes:
+
+- `light`: Apply light user interface style.
+- `dark`: Apply dark user interface style.
+- null: Follow the system's interface style.
+
+> Note: The change will not affect the system's selected interface style or any style set in other applications.
+
+---
+
+### `addChangeListener()`
+
+```tsx
+static addChangeListener(
+ listener: (preferences: {colorScheme: 'light' | 'dark' | null}) => void,
+): NativeEventSubscription;
+```
+
+Add an event handler that is fired when appearance preferences change.
diff --git a/website/versioned_docs/version-0.73.0/appregistry.md b/website/versioned_docs/version-0.73.0/appregistry.md
new file mode 100644
index 00000000000..4db609c8fbd
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/appregistry.md
@@ -0,0 +1,383 @@
+---
+id: appregistry
+title: AppRegistry
+---
+
+
+
Project with Native Code Required
+
+ If you are using the managed Expo workflow there is only ever one entry component registered with AppRegistry and it is handled automatically (or through registerRootComponent). You do not need to use this API.
+
+
+
+`AppRegistry` is the JS entry point to running all React Native apps. App root components should register themselves with `AppRegistry.registerComponent`, then the native system can load the bundle for the app and then actually run the app when it's ready by invoking `AppRegistry.runApplication`.
+
+```tsx
+import {Text, AppRegistry} from 'react-native';
+
+const App = () => (
+
+ App1
+
+);
+
+AppRegistry.registerComponent('Appname', () => App);
+```
+
+To "stop" an application when a view should be destroyed, call `AppRegistry.unmountApplicationComponentAtRootTag` with the tag that was passed into `runApplication`. These should always be used as a pair.
+
+`AppRegistry` should be required early in the `require` sequence to make sure the JS execution environment is setup before other modules are required.
+
+---
+
+# Reference
+
+## Methods
+
+### `getAppKeys()`
+
+```tsx
+static getAppKeys(): string[];
+```
+
+Returns an array of strings.
+
+---
+
+### `getRegistry()`
+
+```tsx
+static getRegistry(): {sections: string[]; runnables: Runnable[]};
+```
+
+Returns a [Registry](appregistry#registry) object.
+
+---
+
+### `getRunnable()`
+
+```tsx
+static getRunnable(appKey: string): : Runnable | undefined;
+```
+
+Returns a [Runnable](appregistry#runnable) object.
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ------ |
+| appKey
Required
| string |
+
+---
+
+### `getSectionKeys()`
+
+```tsx
+static getSectionKeys(): string[];
+```
+
+Returns an array of strings.
+
+---
+
+### `getSections()`
+
+```tsx
+static getSections(): Record;
+```
+
+Returns a [Runnables](appregistry#runnables) object.
+
+---
+
+### `registerCancellableHeadlessTask()`
+
+```tsx
+static registerCancellableHeadlessTask(
+ taskKey: string,
+ taskProvider: TaskProvider,
+ taskCancelProvider: TaskCancelProvider,
+);
+```
+
+Register a headless task which can be cancelled. A headless task is a bit of code that runs without a UI.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| taskKey
Required
| string | The native id for this task instance that was used when startHeadlessTask was called. |
+| taskProvider
Required
| [TaskProvider](appregistry#taskprovider) | A promise returning function that takes some data passed from the native side as the only argument. When the promise is resolved or rejected the native side is notified of this event and it may decide to destroy the JS context. |
+| taskCancelProvider
Required
| [TaskCancelProvider](appregistry#taskcancelprovider) | a void returning function that takes no arguments; when a cancellation is requested, the function being executed by taskProvider should wrap up and return ASAP. |
+
+---
+
+### `registerComponent()`
+
+```tsx
+static registerComponent(
+ appKey: string,
+ getComponentFunc: ComponentProvider,
+ section?: boolean,
+): string;
+```
+
+**Parameters:**
+
+| Name | Type |
+| ---------------------------------------------------------------------- | ----------------- |
+| appKey
| [AppConfig](appregistry#appconfig)[] |
+
+---
+
+### `registerHeadlessTask()`
+
+```tsx
+static registerHeadlessTask(
+ taskKey: string,
+ taskProvider: TaskProvider,
+);
+```
+
+Register a headless task. A headless task is a bit of code that runs without a UI.
+
+This is a way to run tasks in JavaScript while your app is in the background. It can be used, for example, to sync fresh data, handle push notifications, or play music.
+
+**Parameters:**
+
+| Name | Type | Description |
+| --------------------------------------------------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| taskKey
Required
| string | The native id for this task instance that was used when startHeadlessTask was called. |
+| taskProvider
Required
| [TaskProvider](appregistry#taskprovider) | A promise returning function that takes some data passed from the native side as the only argument. When the promise is resolved or rejected the native side is notified of this event and it may decide to destroy the JS context. |
+
+---
+
+### `registerRunnable()`
+
+```tsx
+static registerRunnable(appKey: string, func: Runnable): string;
+```
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | -------- |
+| appKey
| function |
+
+A valid `hook` function accepts the following as arguments:
+
+| Name | Type |
+| ---------------------------------------------------------------------------- | ------------------ |
+| component
Required
| ComponentProvider |
+| scopedPerformanceLogger
Required
| IPerformanceLogger |
+
+The function must also return a React Component.
+
+---
+
+### `setWrapperComponentProvider()`
+
+```tsx
+static setWrapperComponentProvider(
+ provider: WrapperComponentProvider,
+);
+```
+
+**Parameters:**
+
+| Name | Type |
+| ------------------------------------------------------------- | ----------------- |
+| provider
| number | The native id for this task instance to keep track of its execution. |
+| taskKey
Required
| string | The key for the task to start. |
+| data
Required
| any | The data to pass to the task. |
+
+---
+
+### `unmountApplicationComponentAtRootTag()`
+
+```tsx
+static unmountApplicationComponentAtRootTag(rootTag: number);
+```
+
+Stops an application when a view should be destroyed.
+
+**Parameters:**
+
+| Name | Type |
+| ------------------------------------------------------------ | ------ |
+| rootTag
Required
| number |
+
+## Type Definitions
+
+### AppConfig
+
+Application configuration for the `registerConfig` method.
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ----------------- |
+| appKey
Required
| string |
+| component | ComponentProvider |
+| run | function |
+| section | boolean |
+
+> **Note:** Every config is expected to set either `component` or `run` function.
+
+### Registry
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type |
+| --------- | ------------------------------------------ |
+| runnables | array of [Runnables](appregistry#runnable) |
+| sections | array of strings |
+
+### Runnable
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type |
+| --------- | ----------------- |
+| component | ComponentProvider |
+| run | function |
+
+### Runnables
+
+An object with key of `appKey` and value of type of [`Runnable`](appregistry#runnable).
+
+| Type |
+| ------ |
+| object |
+
+### Task
+
+A `Task` is a function that accepts any data as argument and returns a Promise that resolves to `undefined`.
+
+| Type |
+| -------- |
+| function |
+
+### TaskCanceller
+
+A `TaskCanceller` is a function that accepts no argument and returns void.
+
+| Type |
+| -------- |
+| function |
+
+### TaskCancelProvider
+
+A valid `TaskCancelProvider` is a function that returns a [`TaskCanceller`](appregistry#taskcanceller).
+
+| Type |
+| -------- |
+| function |
+
+### TaskProvider
+
+A valid `TaskProvider` is a function that returns a [`Task`](appregistry#task).
+
+| Type |
+| -------- |
+| function |
diff --git a/website/versioned_docs/version-0.73.0/appstate.md b/website/versioned_docs/version-0.73.0/appstate.md
new file mode 100644
index 00000000000..31eac825fb6
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/appstate.md
@@ -0,0 +1,114 @@
+---
+id: appstate
+title: AppState
+---
+
+`AppState` can tell you if the app is in the foreground or background, and notify you when the state changes.
+
+AppState is frequently used to determine the intent and proper behavior when handling push notifications.
+
+### App States
+
+- `active` - The app is running in the foreground
+- `background` - The app is running in the background. The user is either:
+ - in another app
+ - on the home screen
+ - [Android] on another `Activity` (even if it was launched by your app)
+- [iOS] `inactive` - This is a state that occurs when transitioning between foreground & background, and during periods of inactivity such as entering the multitasking view, opening the Notification Center or in the event of an incoming call.
+
+For more information, see [Apple's documentation](https://developer.apple.com/documentation/uikit/app_and_scenes/managing_your_app_s_life_cycle)
+
+## Basic Usage
+
+To see the current state, you can check `AppState.currentState`, which will be kept up-to-date. However, `currentState` will be null at launch while `AppState` retrieves it over the bridge.
+
+```SnackPlayer name=AppState%20Example
+import React, {useRef, useState, useEffect} from 'react';
+import {AppState, StyleSheet, Text, View} from 'react-native';
+
+const AppStateExample = () => {
+ const appState = useRef(AppState.currentState);
+ const [appStateVisible, setAppStateVisible] = useState(appState.current);
+
+ useEffect(() => {
+ const subscription = AppState.addEventListener('change', nextAppState => {
+ if (
+ appState.current.match(/inactive|background/) &&
+ nextAppState === 'active'
+ ) {
+ console.log('App has come to the foreground!');
+ }
+
+ appState.current = nextAppState;
+ setAppStateVisible(appState.current);
+ console.log('AppState', appState.current);
+ });
+
+ return () => {
+ subscription.remove();
+ };
+ }, []);
+
+ return (
+
+ Current state is: {appStateVisible}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default AppStateExample;
+```
+
+This example will only ever appear to say "Current state is: active" because the app is only visible to the user when in the `active` state, and the null state will happen only momentarily. If you want to experiment with the code we recommend to use your own device instead of embedded preview.
+
+---
+
+# Reference
+
+## Events
+
+### `change`
+
+This event is received when the app state has changed. The listener is called with one of [the current app state values](appstate#app-states).
+
+### `memoryWarning`
+
+This event is used in the need of throwing memory warning or releasing it.
+
+### `focus`
Android
+
+Received when the app gains focus (the user is interacting with the app).
+
+### `blur`
Android
+
+Received when the user is not actively interacting with the app. Useful in situations when the user pulls down the [notification drawer](https://developer.android.com/guide/topics/ui/notifiers/notifications#bar-and-drawer). `AppState` won't change but the `blur` event will get fired.
+
+## Methods
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ type: AppStateEvent,
+ listener: (state: AppStateStatus) => void,
+): NativeEventSubscription;
+```
+
+Sets up a function that will be called whenever the specified event type on AppState occurs. Valid values for `eventType` are
+[listed above](#events). Returns the `EventSubscription`.
+
+## Properties
+
+### `currentState`
+
+```tsx
+static currentState: AppStateStatus;
+```
diff --git a/website/versioned_docs/version-0.73.0/asyncstorage.md b/website/versioned_docs/version-0.73.0/asyncstorage.md
new file mode 100644
index 00000000000..8fa79f07ba8
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/asyncstorage.md
@@ -0,0 +1,365 @@
+---
+id: asyncstorage
+title: '🚧 AsyncStorage'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=storage) instead.
+
+`AsyncStorage` is an unencrypted, asynchronous, persistent, key-value storage system that is global to the app. It should be used instead of LocalStorage.
+
+It is recommended that you use an abstraction on top of `AsyncStorage` instead of `AsyncStorage` directly for anything more than light usage since it operates globally.
+
+On iOS, `AsyncStorage` is backed by native code that stores small values in a serialized dictionary and larger values in separate files. On Android, `AsyncStorage` will use either [RocksDB](https://rocksdb.org/) or SQLite based on what is available.
+
+The `AsyncStorage` JavaScript code is a facade that provides a clear JavaScript API, real `Error` objects, and non-multi functions. Each method in the API returns a `Promise` object.
+
+Importing the `AsyncStorage` library:
+
+```jsx
+import {AsyncStorage} from 'react-native';
+```
+
+Persisting data:
+
+```jsx
+_storeData = async () => {
+ try {
+ await AsyncStorage.setItem(
+ '@MySuperStore:key',
+ 'I like to save it.',
+ );
+ } catch (error) {
+ // Error saving data
+ }
+};
+```
+
+Fetching data:
+
+```jsx
+_retrieveData = async () => {
+ try {
+ const value = await AsyncStorage.getItem('TASKS');
+ if (value !== null) {
+ // We have data!!
+ console.log(value);
+ }
+ } catch (error) {
+ // Error retrieving data
+ }
+};
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `getItem()`
+
+```jsx
+static getItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void)
+```
+
+Fetches an item for a `key` and invokes a callback upon completion. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | ------------------------------------------- | -------- | ----------------------------------------------------------------- |
+| key | string | Yes | Key of the item to fetch. |
+| callback | `?(error: ?Error, result: ?string) => void` | No | Function that will be called with a result if found or any error. |
+
+---
+
+### `setItem()`
+
+```jsx
+static setItem(key: string, value: string, [callback]: ?(error: ?Error) => void)
+```
+
+Sets the value for a `key` and invokes a callback upon completion. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------------------------- | -------- | -------------------------------------------- |
+| key | string | Yes | Key of the item to set. |
+| value | string | Yes | Value to set for the `key`. |
+| callback | `?(error: ?Error) => void` | No | Function that will be called with any error. |
+
+---
+
+### `removeItem()`
+
+```jsx
+static removeItem(key: string, [callback]: ?(error: ?Error) => void)
+```
+
+Removes an item for a `key` and invokes a callback upon completion. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------------------------- | -------- | -------------------------------------------- |
+| key | string | Yes | Key of the item to remove. |
+| callback | `?(error: ?Error) => void` | No | Function that will be called with any error. |
+
+---
+
+### `mergeItem()`
+
+```jsx
+static mergeItem(key: string, value: string, [callback]: ?(error: ?Error) => void)
+```
+
+Merges an existing `key` value with an input value, assuming both values are stringified JSON. Returns a `Promise` object.
+
+**NOTE:** This is not supported by all native implementations.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------------------------- | -------- | -------------------------------------------- |
+| key | string | Yes | Key of the item to modify. |
+| value | string | Yes | New value to merge for the `key`. |
+| callback | `?(error: ?Error) => void` | No | Function that will be called with any error. |
+
+Example:
+
+```jsx
+let UID123_object = {
+ name: 'Chris',
+ age: 30,
+ traits: {hair: 'brown', eyes: 'brown'},
+};
+// You only need to define what will be added or updated
+let UID123_delta = {
+ age: 31,
+ traits: {eyes: 'blue', shoe_size: 10},
+};
+
+AsyncStorage.setItem(
+ 'UID123',
+ JSON.stringify(UID123_object),
+ () => {
+ AsyncStorage.mergeItem(
+ 'UID123',
+ JSON.stringify(UID123_delta),
+ () => {
+ AsyncStorage.getItem('UID123', (err, result) => {
+ console.log(result);
+ });
+ },
+ );
+ },
+);
+
+// Console log result:
+// => {'name':'Chris','age':31,'traits':
+// {'shoe_size':10,'hair':'brown','eyes':'blue'}}
+```
+
+---
+
+### `clear()`
+
+```jsx
+static clear([callback]: ?(error: ?Error) => void)
+```
+
+Erases _all_ `AsyncStorage` for all clients, libraries, etc. You probably don't want to call this; use `removeItem` or `multiRemove` to clear only your app's keys. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------------------------- | -------- | -------------------------------------------- |
+| callback | `?(error: ?Error) => void` | No | Function that will be called with any error. |
+
+---
+
+### `getAllKeys()`
+
+```jsx
+static getAllKeys([callback]: ?(error: ?Error, keys: ?Array) => void)
+```
+
+Gets _all_ keys known to your app; for all callers, libraries, etc. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | ------------------------------------------------ | -------- | --------------------------------------------------------------- |
+| callback | `?(error: ?Error, keys: ?Array) => void` | No | Function that will be called with all keys found and any error. |
+
+---
+
+### `flushGetRequests()`
+
+```jsx
+static flushGetRequests(): [object Object]
+```
+
+Flushes any pending requests using a single batch call to get the data.
+
+---
+
+### `multiGet()`
+
+```jsx
+static multiGet(keys: Array, [callback]: ?(errors: ?Array, result: ?Array>) => void)
+```
+
+This allows you to batch the fetching of items given an array of `key` inputs. Your callback will be invoked with an array of corresponding key-value pairs found:
+
+```
+multiGet(['k1', 'k2'], cb) -> cb([['k1', 'val1'], ['k2', 'val2']])
+```
+
+The method returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | ----------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
+| keys | `Array` | Yes | Array of key for the items to get. |
+| callback | `?(errors: ?Array, result: ?Array>) => void` | No | Function that will be called with a key-value array of the results, plus an array of any key-specific errors found. |
+
+Example:
+
+```jsx
+AsyncStorage.getAllKeys((err, keys) => {
+ AsyncStorage.multiGet(keys, (err, stores) => {
+ stores.map((result, i, store) => {
+ // get at each store's key/value so you can work with it
+ let key = store[i][0];
+ let value = store[i][1];
+ });
+ });
+});
+```
+
+---
+
+### `multiSet()`
+
+```jsx
+static multiSet(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void)
+```
+
+Use this as a batch operation for storing multiple key-value pairs. When the operation completes you'll get a single callback with any errors:
+
+```
+multiSet([['k1', 'val1'], ['k2', 'val2']], cb);
+```
+
+The method returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------------- | ---------------------------------- | -------- | ---------------------------------------------------------------------------- |
+| keyValuePairs | `Array>` | Yes | Array of key-value array for the items to set. |
+| callback | `?(errors: ?Array) => void` | No | Function that will be called with an array of any key-specific errors found. |
+
+---
+
+### `multiRemove()`
+
+```jsx
+static multiRemove(keys: Array, [callback]: ?(errors: ?Array) => void)
+```
+
+Call this to batch the deletion of all keys in the `keys` array. Returns a `Promise` object.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | ---------------------------------- | -------- | ----------------------------------------------------------------------- |
+| keys | `Array` | Yes | Array of key for the items to delete. |
+| callback | `?(errors: ?Array) => void` | No | Function that will be called an array of any key-specific errors found. |
+
+Example:
+
+```jsx
+let keys = ['k1', 'k2'];
+AsyncStorage.multiRemove(keys, err => {
+ // keys k1 & k2 removed, if they existed
+ // do most stuff after removal (if you want)
+});
+```
+
+---
+
+### `multiMerge()`
+
+```jsx
+static multiMerge(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void)
+```
+
+Batch operation to merge in existing and new values for a given set of keys. This assumes that the values are stringified JSON. Returns a `Promise` object.
+
+**NOTE**: This is not supported by all native implementations.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------------- | ---------------------------------- | -------- | ---------------------------------------------------------------------------- |
+| keyValuePairs | `Array>` | Yes | Array of key-value array for the items to merge. |
+| callback | `?(errors: ?Array) => void` | No | Function that will be called with an array of any key-specific errors found. |
+
+Example:
+
+```jsx
+// first user, initial values
+let UID234_object = {
+ name: 'Chris',
+ age: 30,
+ traits: {hair: 'brown', eyes: 'brown'},
+};
+
+// first user, delta values
+let UID234_delta = {
+ age: 31,
+ traits: {eyes: 'blue', shoe_size: 10},
+};
+
+// second user, initial values
+let UID345_object = {
+ name: 'Marge',
+ age: 25,
+ traits: {hair: 'blonde', eyes: 'blue'},
+};
+
+// second user, delta values
+let UID345_delta = {
+ age: 26,
+ traits: {eyes: 'green', shoe_size: 6},
+};
+
+let multi_set_pairs = [
+ ['UID234', JSON.stringify(UID234_object)],
+ ['UID345', JSON.stringify(UID345_object)],
+];
+let multi_merge_pairs = [
+ ['UID234', JSON.stringify(UID234_delta)],
+ ['UID345', JSON.stringify(UID345_delta)],
+];
+
+AsyncStorage.multiSet(multi_set_pairs, err => {
+ AsyncStorage.multiMerge(multi_merge_pairs, err => {
+ AsyncStorage.multiGet(['UID234', 'UID345'], (err, stores) => {
+ stores.map((result, i, store) => {
+ let key = store[i][0];
+ let val = store[i][1];
+ console.log(key, val);
+ });
+ });
+ });
+});
+
+// Console log results:
+// => UID234 {"name":"Chris","age":31,"traits":{"shoe_size":10,"hair":"brown","eyes":"blue"}}
+// => UID345 {"name":"Marge","age":26,"traits":{"shoe_size":6,"hair":"blonde","eyes":"green"}}
+```
diff --git a/website/versioned_docs/version-0.73.0/backhandler.md b/website/versioned_docs/version-0.73.0/backhandler.md
new file mode 100644
index 00000000000..07efa0b94b2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/backhandler.md
@@ -0,0 +1,136 @@
+---
+id: backhandler
+title: BackHandler
+---
+
+The Backhandler API detects hardware button presses for back navigation, lets you register event listeners for the system's back action, and lets you control how your application responds. It is Android-only.
+
+The event subscriptions are called in reverse order (i.e. the last registered subscription is called first).
+
+- **If one subscription returns true,** then subscriptions registered earlier will not be called.
+- **If no subscription returns true or none are registered,** it programmatically invokes the default back button functionality to exit the app.
+
+> **Warning for modal users:** If your app shows an opened `Modal`, `BackHandler` will not publish any events ([see `Modal` docs](modal#onrequestclose)).
+
+## Pattern
+
+```tsx
+BackHandler.addEventListener('hardwareBackPress', function () {
+ /**
+ * this.onMainScreen and this.goBack are just examples,
+ * you need to use your own implementation here.
+ *
+ * Typically you would use the navigator here to go to the last state.
+ */
+
+ if (!this.onMainScreen()) {
+ this.goBack();
+ /**
+ * When true is returned the event will not be bubbled up
+ * & no other back action will execute
+ */
+ return true;
+ }
+ /**
+ * Returning false will let the event to bubble up & let other event listeners
+ * or the system's default back action to be executed.
+ */
+ return false;
+});
+```
+
+## Example
+
+The following example implements a scenario where you confirm if the user wants to exit the app:
+
+```SnackPlayer name=BackHandler&supportedPlatforms=android
+import React, {useEffect} from 'react';
+import {Text, View, StyleSheet, BackHandler, Alert} from 'react-native';
+
+const App = () => {
+ useEffect(() => {
+ const backAction = () => {
+ Alert.alert('Hold on!', 'Are you sure you want to go back?', [
+ {
+ text: 'Cancel',
+ onPress: () => null,
+ style: 'cancel',
+ },
+ {text: 'YES', onPress: () => BackHandler.exitApp()},
+ ]);
+ return true;
+ };
+
+ const backHandler = BackHandler.addEventListener(
+ 'hardwareBackPress',
+ backAction,
+ );
+
+ return () => backHandler.remove();
+ }, []);
+
+ return (
+
+ Click Back button!
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ text: {
+ fontSize: 18,
+ fontWeight: 'bold',
+ },
+});
+
+export default App;
+```
+
+`BackHandler.addEventListener` creates an event listener & returns a `NativeEventSubscription` object which should be cleared using `NativeEventSubscription.remove` method.
+
+## Usage with React Navigation
+
+If you are using React Navigation to navigate across different screens, you can follow their guide on [Custom Android back button behaviour](https://reactnavigation.org/docs/custom-android-back-button-handling/)
+
+## Backhandler hook
+
+[React Native Hooks](https://github.com/react-native-community/hooks#usebackhandler) has a nice `useBackHandler` hook which will simplify the process of setting up event listeners.
+
+---
+
+# Reference
+
+## Methods
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ eventName: BackPressEventName,
+ handler: () => boolean | null | undefined,
+): NativeEventSubscription;
+```
+
+---
+
+### `exitApp()`
+
+```tsx
+static exitApp();
+```
+
+---
+
+### `removeEventListener()`
+
+```tsx
+static removeEventListener(
+ eventName: BackPressEventName,
+ handler: () => boolean | null | undefined,
+);
+```
diff --git a/website/versioned_docs/version-0.73.0/build-speed.md b/website/versioned_docs/version-0.73.0/build-speed.md
new file mode 100644
index 00000000000..dc5b7682861
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/build-speed.md
@@ -0,0 +1,197 @@
+---
+id: build-speed
+title: Speeding up your Build phase
+---
+
+Building your React Native app could be **expensive** and take several minutes of developers time.
+This can be problematic as your project grows and generally in bigger organizations with multiple React Native developers.
+
+To mitigate this performance hit, this page shares some suggestions on how to **improve your build time**.
+
+:::info
+If you're noticing slower build time with the **New Architecture on Android**, we recommend to upgrade to React Native 0.71
+:::
+
+## Build only one ABI during development (Android-only)
+
+When building your android app locally, by default you build all the 4 [Application Binary Interfaces (ABIs)](https://developer.android.com/ndk/guides/abis) : `armeabi-v7a`, `arm64-v8a`, `x86` & `x86_64`.
+
+However, you probably don't need to build all of them if you're building locally and testing your emulator or on a physical device.
+
+This should reduce your **native build time** by a ~75% factor.
+
+If you're using the React Native CLI, you can add the `--active-arch-only` flag to the `run-android` command. This flag will make sure the correct ABI is picked up from either the running emulator or the plugged in phone. To confirm that this approach is working fine, you'll see a message like `info Detected architectures arm64-v8a` on console.
+
+```
+$ yarn react-native run-android --active-arch-only
+
+[ ... ]
+info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag.
+Jetifier found 1037 file(s) to forward-jetify. Using 32 workers...
+info JS server already running.
+info Detected architectures arm64-v8a
+info Installing the app...
+```
+
+This mechanism relies on the `reactNativeArchitectures` Gradle property.
+
+Therefore, if you're building directly with Gradle from the command line and without the CLI, you can specify the ABI you want to build as follows:
+
+```
+$ ./gradlew :app:assembleDebug -PreactNativeArchitectures=x86,x86_64
+```
+
+This can be useful if you wish to build your Android App on a CI and use a matrix to parallelize the build of the different architectures.
+
+If you wish, you can also override this value locally, using the `gradle.properties` file you have in the [top-level folder](https://github.com/facebook/react-native/blob/19cf70266eb8ca151aa0cc46ac4c09cb987b2ceb/template/android/gradle.properties#L30-L33) of your project:
+
+```
+# Use this property to specify which architecture you want to build.
+# You can also override it from the CLI using
+# ./gradlew -PreactNativeArchitectures=x86_64
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+```
+
+Once you build a **release version** of your app, don't forget to remove those flags as you want to build an apk/app bundle that works for all the ABIs and not only for the one you're using in your daily development workflow.
+
+## Use a compiler cache
+
+If you're running frequent native builds (either C++ or Objective-C), you might benefit from using a **compiler cache**.
+
+Specifically you can use two type of caches: local compiler caches and distributed compiler caches.
+
+### Local caches
+
+:::info
+The following instructions will work for **both Android & iOS**.
+If you're building only Android apps, you should be good to go.
+If you're building also iOS apps, please follow the instructions in the [XCode Specific Setup](#xcode-specific-setup) section below.
+:::
+
+We suggest to use [**ccache**](https://ccache.dev/) to cache the compilation of your native builds.
+Ccache works by wrapping the C++ compilers, storing the compilation results, and skipping the compilation
+if an intermediate compilation result was originally stored.
+
+To install it, you can follow the [official installation instructions](https://github.com/ccache/ccache/blob/master/doc/INSTALL.md).
+
+On macOS, we can install ccache with `brew install ccache`.
+Once installed you can configure it as follows to cache NDK compile results:
+
+```
+ln -s $(which ccache) /usr/local/bin/gcc
+ln -s $(which ccache) /usr/local/bin/g++
+ln -s $(which ccache) /usr/local/bin/cc
+ln -s $(which ccache) /usr/local/bin/c++
+ln -s $(which ccache) /usr/local/bin/clang
+ln -s $(which ccache) /usr/local/bin/clang++
+```
+
+This will create symbolic links to `ccache` inside the `/usr/local/bin/` which are called `gcc`, `g++`, and so on.
+
+This works as long as `/usr/local/bin/` comes first than `/usr/bin/` inside your `$PATH` variable, which is the default.
+
+You can verify that it works using the `which` command:
+
+```
+$ which gcc
+/usr/local/bin/gcc
+```
+
+If the results is `/usr/local/bin/gcc`, then you're effectively calling `ccache` which will wrap the `gcc` calls.
+
+:::caution
+Please note that this setup of `ccache` will affect all the compilations that you're running on your machine, not only those related to React Native. Use it at your own risk. If you're failing to install/compile other software, this might be the reason. If that is the case, you can remove the symlink you created with:
+
+```
+unlink /usr/local/bin/gcc
+unlink /usr/local/bin/g++
+unlink /usr/local/bin/cc
+unlink /usr/local/bin/c++
+unlink /usr/local/bin/clang
+unlink /usr/local/bin/clang++
+```
+
+to revert your machine to the original status and use the default compilers.
+:::
+
+You can then do two clean builds (e.g. on Android you can first run `yarn react-native run-android`, delete the `android/app/build` folder and run the first command once more). You will notice that the second build was way faster than the first one (it should take seconds rather than minutes).
+While building, you can verify that `ccache` works correctly and check the cache hits/miss rate `ccache -s`
+
+```
+$ ccache -s
+Summary:
+ Hits: 196 / 3068 (6.39 %)
+ Direct: 0 / 3068 (0.00 %)
+ Preprocessed: 196 / 3068 (6.39 %)
+ Misses: 2872
+ Direct: 3068
+ Preprocessed: 2872
+ Uncacheable: 1
+Primary storage:
+ Hits: 196 / 6136 (3.19 %)
+ Misses: 5940
+ Cache size (GB): 0.60 / 20.00 (3.00 %)
+```
+
+Note that `ccache` aggregates the stats over all builds. You can use `ccache --zero-stats` to reset them before a build to verify the cache-hit ratio.
+
+Should you need to wipe your cache, you can do so with `ccache --clear`
+
+#### XCode Specific Setup
+
+To make sure `ccache` works correctly with iOS and XCode, you need to follow a couple of extra steps:
+
+1. You must alter the way Xcode and `xcodebuild` call for the compiler command. By default they use _fully specified paths_ to the compiler binaries, so the symbolic links installed in `/usr/local/bin` will not be used. You may configure Xcode to use _relative_ names for the compilers using either of these two options:
+
+- environment variables prefixed on the command line if you use a direct command line: `CLANG=clang CLANGPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ xcodebuild `
+- A `post_install` section in your `ios/Podfile` that alters the compiler in your Xcode workspace during the `pod install` step:
+
+```ruby
+ post_install do |installer|
+ react_native_post_install(installer)
+
+ # ...possibly other post_install items here
+
+ installer.pods_project.targets.each do |target|
+ target.build_configurations.each do |config|
+ # Using the un-qualified names means you can swap in different implementations, for example ccache
+ config.build_settings["CC"] = "clang"
+ config.build_settings["LD"] = "clang"
+ config.build_settings["CXX"] = "clang++"
+ config.build_settings["LDPLUSPLUS"] = "clang++"
+ end
+ end
+
+ __apply_Xcode_12_5_M1_post_install_workaround(installer)
+ end
+```
+
+2. You need a ccache configuration that allows for a certain level of sloppiness and cache behavior such that ccache registers cache hits during Xcode compiles. The ccache configuration variables that are different from standard are as follows if configured by environment variable:
+
+```bash
+export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros
+export CCACHE_FILECLONE=true
+export CCACHE_DEPEND=true
+export CCACHE_INODECACHE=true
+```
+
+The same may be configured in a `ccache.conf` file or any other mechanism ccache provides. More on this can be found in the [official ccache manual](https://ccache.dev/manual/4.3.html).
+
+#### Using this approach on a CI
+
+Ccache uses the `/Users/$USER/Library/Caches/ccache` folder on macOS to store the cache.
+Therefore you could save & restore the corresponding folder also on CI to speedup your builds.
+
+However, there are a couple of things to be aware:
+
+1. On CI, we recommend to do a full clean build, to avoid poisoned cache problems. If you follow the approach mentioned in the previous paragraph, you should be able to parallelize the native build on 4 different ABIs and you will most likely not need `ccache` on CI.
+
+2. `ccache` relies on timestamps to compute a cache hit. This doesn't work well on CI as files are re-downloaded at every CI run. To overcome this, you'll need to use the `compiler_check content` option which relies instead on [hashing the content of the file](https://ccache.dev/manual/4.3.html).
+
+### Distributed caches
+
+Similar to local caches, you might want to consider using a distributed cache for your native builds.
+This could be specifically useful in bigger organizations that are doing frequent native builds.
+
+We recommend to use [sccache](https://github.com/mozilla/sccache) to achieve this.
+We defer to the sccache [distributed compilation quickstart](https://github.com/mozilla/sccache/blob/main/docs/DistributedQuickstart.md) for instructions on how to setup and use this tool.
diff --git a/website/versioned_docs/version-0.73.0/building-for-tv.md b/website/versioned_docs/version-0.73.0/building-for-tv.md
new file mode 100644
index 00000000000..435415ce4d8
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/building-for-tv.md
@@ -0,0 +1,191 @@
+---
+id: building-for-tv
+title: Building For TV Devices
+hide_table_of_contents: true
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+TV devices support has been implemented with the intention of making existing React Native applications work on Apple TV and Android TV, with few or no changes needed in the JavaScript code for the applications.
+
+
+
+
+
+## Build changes
+
+- _Native layer_: To run React Native project on Android TV make sure to make the following changes to `AndroidManifest.xml`
+
+```xml
+
+
+ ...
+
+ ...
+
+
+
+ ...
+
+```
+
+- _JavaScript layer_: Support for Android TV has been added to `Platform.android.js`. You can check whether code is running on Android TV by doing
+
+```js
+const Platform = require('Platform');
+const running_on_android_tv = Platform.isTV;
+```
+
+## Code changes
+
+- _Access to touchable controls_: When running on Android TV the Android framework will automatically apply a directional navigation scheme based on relative position of focusable elements in your views. The `Touchable` mixin has code added to detect focus changes and use existing methods to style the components properly and initiate the proper actions when the view is selected using the TV remote, so `TouchableWithoutFeedback`, `TouchableHighlight`, `TouchableOpacity` and `TouchableNativeFeedback` will work as expected. In particular:
+
+ - `onFocus` will be executed when the touchable view goes into focus
+ - `onBlur` will be executed when the touchable view goes out of focus
+ - `onPress` will be executed when the touchable view is actually selected by pressing the "select" button on the TV remote.
+
+- _TV remote/keyboard input_: A new native class, `ReactAndroidTVRootViewHelper`, sets up key events handlers for TV remote events. When TV remote events occur, this class fires a JS event. This event will be picked up by instances of the `TVEventHandler` JavaScript object. Application code that needs to implement custom handling of TV remote events can create an instance of `TVEventHandler` and listen for these events, as in the following code:
+
+```tsx
+const TVEventHandler = require('TVEventHandler');
+
+class Game2048 extends React.Component {
+ _tvEventHandler: any;
+
+ _enableTVEventHandler() {
+ this._tvEventHandler = new TVEventHandler();
+ this._tvEventHandler.enable(this, function (cmp, evt) {
+ if (evt && evt.eventType === 'right') {
+ cmp.setState({board: cmp.state.board.move(2)});
+ } else if (evt && evt.eventType === 'up') {
+ cmp.setState({board: cmp.state.board.move(1)});
+ } else if (evt && evt.eventType === 'left') {
+ cmp.setState({board: cmp.state.board.move(0)});
+ } else if (evt && evt.eventType === 'down') {
+ cmp.setState({board: cmp.state.board.move(3)});
+ } else if (evt && evt.eventType === 'playPause') {
+ cmp.restartGame();
+ }
+ });
+ }
+
+ _disableTVEventHandler() {
+ if (this._tvEventHandler) {
+ this._tvEventHandler.disable();
+ delete this._tvEventHandler;
+ }
+ }
+
+ componentDidMount() {
+ this._enableTVEventHandler();
+ }
+
+ componentWillUnmount() {
+ this._disableTVEventHandler();
+ }
+}
+```
+
+- _Dev Menu support_: On the emulator, cmd-M will bring up the Dev Menu, similar to Android. To bring it up on a real Android TV device, press the menu button or long press the fast-forward button on the remote. (Please do not shake the Android TV device, that will not work :) )
+
+- _Known issues_:
+
+ - `TextInput` components do not work for now (i.e. they cannot receive focus automatically, see [this comment](https://github.com/facebook/react-native/pull/16500#issuecomment-629285638)).
+ - It is however possible to use a ref to manually trigger `inputRef.current.focus()`.
+ - You can wrap your input inside a `TouchableWithoutFeedback` component and trigger focus in the `onFocus` event of that touchable. This enables opening the keyboard via the arrow keys.
+ - The keyboard might reset its state after each keypress (this might only happen inside the Android TV emulator).
+ - The content of `Modal` components cannot receive focus, see [this issue](https://github.com/facebook/react-native/issues/24448) for details.
+
+
+
+
+> **Deprecated.** Use [react-native-tvos](https://github.com/react-native-community/react-native-tvos) instead. For the details please check the [0.62 release blog post](https://reactnative.dev/blog/#moving-apple-tv-to-react-native-tvos).
+
+## Build changes
+
+- _Native layer_: React Native Xcode projects all now have Apple TV build targets, with names ending in the string '-tvOS'.
+
+- _react-native init_: New React Native projects created with `react-native init` will have Apple TV target automatically created in their XCode projects.
+
+- _JavaScript layer_: Support for Apple TV has been added to `Platform.ios.js`. You can check whether code is running on AppleTV by doing
+
+```tsx
+const Platform = require('Platform');
+const running_on_tv = Platform.isTV;
+
+// If you want to be more specific and only detect devices running tvOS
+// (but no Android TV devices) you can use:
+const running_on_apple_tv = Platform.isTVOS;
+```
+
+## Code changes
+
+- _General support for tvOS_: Apple TV specific changes in native code are all wrapped by the TARGET_OS_TV define. These include changes to suppress APIs that are not supported on tvOS (e.g. web views, sliders, switches, status bar, etc.), and changes to support user input from the TV remote or keyboard.
+
+- _Common codebase_: Since tvOS and iOS share most Objective-C and JavaScript code in common, most documentation for iOS applies equally to tvOS.
+
+- _Access to touchable controls_: When running on Apple TV, the native view class is `RCTTVView`, which has additional methods to make use of the tvOS focus engine. The `Touchable` mixin has code added to detect focus changes and use existing methods to style the components properly and initiate the proper actions when the view is selected using the TV remote, so `TouchableWithoutFeedback`, `TouchableHighlight` and `TouchableOpacity` will work as expected. In particular:
+
+ - `onFocus` will be executed when the touchable view goes into focus
+ - `onBlur` will be executed when the touchable view goes out of focus
+ - `onPress` will be executed when the touchable view is actually selected by pressing the "select" button on the TV remote.
+
+- _TV remote/keyboard input_: A new native class, `RCTTVRemoteHandler`, sets up gesture recognizers for TV remote events. When TV remote events occur, this class fires notifications that are picked up by `RCTTVNavigationEventEmitter` (a subclass of `RCTEventEmitter`), that fires a JS event. This event will be picked up by instances of the `TVEventHandler` JavaScript object. Application code that needs to implement custom handling of TV remote events can create an instance of `TVEventHandler` and listen for these events, as in the following code:
+
+```tsx
+const TVEventHandler = require('TVEventHandler');
+
+class Game2048 extends React.Component {
+ _tvEventHandler: any;
+
+ _enableTVEventHandler() {
+ this._tvEventHandler = new TVEventHandler();
+ this._tvEventHandler.enable(this, function (cmp, evt) {
+ if (evt && evt.eventType === 'right') {
+ cmp.setState({board: cmp.state.board.move(2)});
+ } else if (evt && evt.eventType === 'up') {
+ cmp.setState({board: cmp.state.board.move(1)});
+ } else if (evt && evt.eventType === 'left') {
+ cmp.setState({board: cmp.state.board.move(0)});
+ } else if (evt && evt.eventType === 'down') {
+ cmp.setState({board: cmp.state.board.move(3)});
+ } else if (evt && evt.eventType === 'playPause') {
+ cmp.restartGame();
+ }
+ });
+ }
+
+ _disableTVEventHandler() {
+ if (this._tvEventHandler) {
+ this._tvEventHandler.disable();
+ delete this._tvEventHandler;
+ }
+ }
+
+ componentDidMount() {
+ this._enableTVEventHandler();
+ }
+
+ componentWillUnmount() {
+ this._disableTVEventHandler();
+ }
+}
+```
+
+- _Dev Menu support_: On the simulator, cmd-D will bring up the Dev Menu, similar to iOS. To bring it up on a real Apple TV device, make a long press on the play/pause button on the remote. (Please do not shake the Apple TV device, that will not work :) )
+
+- _TV remote animations_: `RCTTVView` native code implements Apple-recommended parallax animations to help guide the eye as the user navigates through views. The animations can be disabled or adjusted with new optional view properties.
+
+- _Back navigation with the TV remote menu button_: The `BackHandler` component, originally written to support the Android back button, now also supports back navigation on the Apple TV using the menu button on the TV remote.
+
+- _TabBarIOS behavior_: The `TabBarIOS` component wraps the native `UITabBar` API, which works differently on Apple TV. To avoid jittery re-rendering of the tab bar in tvOS (see [this issue](https://github.com/facebook/react-native/issues/15081)), the selected tab bar item can only be set from JavaScript on initial render, and is controlled after that by the user through native code.
+
+- _Known issues_:
+
+ - [ListView scrolling](https://github.com/facebook/react-native/issues/12793). The issue can be worked around by setting `removeClippedSubviews` to false in ListView and similar components. For more discussion of this issue, see [this PR](https://github.com/facebook/react-native/pull/12944).
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/button.md b/website/versioned_docs/version-0.73.0/button.md
new file mode 100644
index 00000000000..262ad5fd01d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/button.md
@@ -0,0 +1,295 @@
+---
+id: button
+title: Button
+---
+
+A basic button component that should render nicely on any platform. Supports a minimal level of customization.
+
+If this button doesn't look right for your app, you can build your own button using [Pressable](pressable). For inspiration, look at the [source code for the Button component](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Components/Button.js).
+
+```tsx
+
+```
+
+## Example
+
+```SnackPlayer name=Button%20Example
+import React from 'react';
+import {
+ StyleSheet,
+ Button,
+ View,
+ SafeAreaView,
+ Text,
+ Alert,
+} from 'react-native';
+
+const Separator = () => ;
+
+const App = () => (
+
+
+
+ The title and onPress handler are required. It is recommended to set
+ accessibilityLabel to help make your app usable by everyone.
+
+
+
+
+
+ Adjust the color in a way that looks standard on each platform. On iOS,
+ the color prop controls the color of the text. On Android, the color
+ adjusts the background color of the button.
+
+
+
+
+
+ All interaction for the component are disabled.
+
+
+
+
+
+ This layout strategy lets the title define the width of the button.
+
+
+
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ marginHorizontal: 16,
+ },
+ title: {
+ textAlign: 'center',
+ marginVertical: 8,
+ },
+ fixToText: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ },
+ separator: {
+ marginVertical: 8,
+ borderBottomColor: '#737373',
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+###
Required
**`onPress`**
+
+Handler to be called when the user taps the button.
+
+| Type |
+| ---------------------------------------------- |
+| `md ({nativeEvent: [PressEvent](pressevent)})` |
+
+---
+
+###
Required
**`title`**
+
+Text to display inside the button. On Android the given title will be converted to the uppercased form.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityLabel`
+
+Text to display for blindness accessibility features.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityLanguage`
iOS
+
+A value indicating which language should be used by the screen reader when the user interacts with the element. It should follow the [BCP 47 specification](https://www.rfc-editor.org/info/bcp47).
+
+See the [iOS `accessibilityLanguage` doc](https://developer.apple.com/documentation/objectivec/nsobject/1615192-accessibilitylanguage) for more information.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityActions`
+
+Accessibility actions allow an assistive technology to programmatically invoke the actions of a component. The `accessibilityActions` property should contain a list of action objects. Each action object should contain the field name and label.
+
+See the [Accessibility guide](accessibility.md#accessibility-actions) for more information.
+
+| Type | Required |
+| ----- | -------- |
+| array | No |
+
+---
+
+### `onAccessibilityAction`
+
+Invoked when the user performs the accessibility actions. The only argument to this function is an event containing the name of the action to perform.
+
+See the [Accessibility guide](accessibility.md#accessibility-actions) for more information.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `color`
+
+Color of the text (iOS), or background color of the button (Android).
+
+```mdx-code-block
+export function ColorDefaults() {
+ return (
+ <>
+ {" "}'#2196F3'
+ {" "}
+
+Designates the next view to receive focus when the user navigates down. See the [Android documentation](https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusDown).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `nextFocusForward`
Android
TV
+
+Designates the next view to receive focus when the user navigates forward. See the [Android documentation](https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusForward).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `nextFocusLeft`
Android
TV
+
+Designates the next view to receive focus when the user navigates left. See the [Android documentation](https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusLeft).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `nextFocusRight`
Android
TV
+
+Designates the next view to receive focus when the user navigates right. See the [Android documentation](https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusRight).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `nextFocusUp`
Android
TV
+
+Designates the next view to receive focus when the user navigates up. See the [Android documentation](https://developer.android.com/reference/android/view/View.html#attr_android:nextFocusUp).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `testID`
+
+Used to locate this view in end-to-end tests.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `touchSoundDisabled`
Android
+
+If `true`, doesn't play system sound on touch.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
diff --git a/website/versioned_docs/version-0.73.0/checkbox.md b/website/versioned_docs/version-0.73.0/checkbox.md
new file mode 100644
index 00000000000..f9558d0f48d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/checkbox.md
@@ -0,0 +1,113 @@
+---
+id: checkbox
+title: '🚧 CheckBox'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=checkbox) instead.
+
+Renders a boolean input (Android only).
+
+This is a controlled component that requires an `onValueChange` callback that updates the `value` prop in order for the component to reflect user actions. If the `value` prop is not updated, the component will continue to render the supplied `value` prop instead of the expected result of any user actions.
+
+## Example
+
+```SnackPlayer name=CheckBox%20Component%20Example&supportedPlatforms=android,web&ext=js
+import React, {useState} from 'react';
+import {CheckBox, Text, StyleSheet, View} from 'react-native';
+
+const App = () => {
+ const [isSelected, setSelection] = useState(false);
+
+ return (
+
+
+
+ Do you like React Native?
+
+ Is CheckBox selected: {isSelected ? '👍' : '👎'}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ checkboxContainer: {
+ flexDirection: 'row',
+ marginBottom: 20,
+ },
+ checkbox: {
+ alignSelf: 'center',
+ },
+ label: {
+ margin: 8,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view#props).
+
+---
+
+### `disabled`
+
+If true the user won't be able to toggle the checkbox. Default value is `false`.
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
+
+---
+
+### `onChange`
+
+Used in case the props change removes the component.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onValueChange`
+
+Invoked with the new value when the value changes.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `testID`
+
+Used to locate this view in end-to-end tests.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
+
+---
+
+### `value`
+
+The value of the checkbox. If true the checkbox will be turned on. Default value is `false`.
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
diff --git a/website/versioned_docs/version-0.73.0/clipboard.md b/website/versioned_docs/version-0.73.0/clipboard.md
new file mode 100644
index 00000000000..9280538046a
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/clipboard.md
@@ -0,0 +1,110 @@
+---
+id: clipboard
+title: '🚧 Clipboard'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=clipboard) instead.
+
+`Clipboard` gives you an interface for setting and getting content from Clipboard on both Android and iOS
+
+---
+
+## Example
+
+```SnackPlayer name=Clipboard%20API%20Example&supportedPlatforms=ios,android
+import React, {useState} from 'react';
+import {
+ SafeAreaView,
+ View,
+ Text,
+ TouchableOpacity,
+ Clipboard,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ const [copiedText, setCopiedText] = useState('');
+
+ const copyToClipboard = () => {
+ Clipboard.setString('hello world');
+ };
+
+ const fetchCopiedText = async () => {
+ const text = await Clipboard.getString();
+ setCopiedText(text);
+ };
+
+ return (
+
+
+ copyToClipboard()}>
+ Click here to copy to Clipboard
+
+ fetchCopiedText()}>
+ View copied text
+
+
+ {copiedText}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ copiedText: {
+ marginTop: 10,
+ color: 'red',
+ },
+});
+
+export default App;
+```
+
+# Reference
+
+## Methods
+
+### `getString()`
+
+```jsx
+static getString()
+```
+
+Get content of string type, this method returns a `Promise`, so you can use following code to get clipboard content
+
+```jsx
+async _getContent() {
+ const content = await Clipboard.getString();
+}
+```
+
+---
+
+### `setString()`
+
+```jsx
+static setString(content)
+```
+
+Set content of string type. You can use following code to set clipboard content
+
+```jsx
+_setContent() {
+ Clipboard.setString('hello world');
+}
+```
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------- | ------ | -------- | ----------------------------------------- |
+| content | string | Yes | The content to be stored in the clipboard |
+
+_Notice_
+
+Be careful when you're trying to copy to clipboard any data except `string` and `number`, some data need additional stringification. For example, if you will try to copy array - Android will raise an exception, but iOS will not.
diff --git a/website/versioned_docs/version-0.73.0/colors.md b/website/versioned_docs/version-0.73.0/colors.md
new file mode 100644
index 00000000000..3da23478851
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/colors.md
@@ -0,0 +1,223 @@
+---
+id: colors
+title: Color Reference
+---
+
+Components in React Native are [styled using JavaScript](style). Color properties usually match how [CSS works on the web](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value). General guides on the color usage on each platform could be found below:
+
+- [Android](https://material.io/design/color/color-usage.html)
+- [iOS](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/color/)
+
+## Color APIs
+
+React Native has several color APIs designed to allow you to take full advantage of your platform's design and user preferences.
+
+- [PlatformColor](platformcolor) lets you reference the platform's color system.
+- [DynamicColorIOS](dynamiccolorios) is iOS specific and allows you to specify which colors should be used in light or Dark Mode.
+
+## Color representations
+
+### Red Green Blue (RGB)
+
+React Native supports `rgb()` and `rgba()` in both hexadecimal and functional notation:
+
+- `'#f0f'` (#rgb)
+- `'#ff00ff'` (#rrggbb)
+- `'#f0ff'` (#rgba)
+- `'#ff00ff00'` (#rrggbbaa)
+- `'rgb(255, 0, 255)'`
+- `'rgb(255 0 255)'`
+- `'rgba(255, 0, 255, 1.0)'`
+- `'rgba(255 0 255 / 1.0)'`
+
+### Hue Saturation Lightness (HSL)
+
+React Native supports `hsl()` and `hsla()` in functional notation:
+
+- `'hsl(360, 100%, 100%)'`
+- `'hsl(360 100% 100%)'`
+- `'hsla(360, 100%, 100%, 1.0)'`
+- `'hsla(360 100% 100% / 1.0)'`
+
+### Hue Whiteness Blackness (HWB)
+
+React Native supports `hwb()` in functional notation:
+
+- `'hwb(0, 0%, 100%)'`
+- `'hwb(360, 100%, 100%)'`
+- `'hwb(0 0% 0%)'`
+- `'hwb(70 50% 0%)'`
+
+### Color ints
+
+React Native supports also colors as an `int` values (in RGB color mode):
+
+- `0xff00ff00` (0xrrggbbaa)
+
+:::caution
+This might appear similar to the Android [Color](https://developer.android.com/reference/android/graphics/Color) ints representation but on Android values are stored in SRGB color mode (0xaarrggbb).
+:::
+
+### Named colors
+
+In React Native you can also use color name strings as values.
+
+:::info
+React Native only supports lowercase color names. Uppercase color names are not supported.
+:::
+
+#### `transparent`
+
+This is a shortcut for `rgba(0,0,0,0)`, same like in [CSS3](https://www.w3.org/TR/css-color-3/#transparent).
+
+#### Color keywords
+
+Named colors implementation follows the [CSS3/SVG specification](https://www.w3.org/TR/css-color-3/#svg-color):
+
+
+
+- aliceblue (#f0f8ff)
+- antiquewhite (#faebd7)
+- aqua (#00ffff)
+- aquamarine (#7fffd4)
+- azure (#f0ffff)
+- beige (#f5f5dc)
+- bisque (#ffe4c4)
+- black (#000000)
+- blanchedalmond (#ffebcd)
+- blue (#0000ff)
+- blueviolet (#8a2be2)
+- brown (#a52a2a)
+- burlywood (#deb887)
+- cadetblue (#5f9ea0)
+- chartreuse (#7fff00)
+- chocolate (#d2691e)
+- coral (#ff7f50)
+- cornflowerblue (#6495ed)
+- cornsilk (#fff8dc)
+- crimson (#dc143c)
+- cyan (#00ffff)
+- darkblue (#00008b)
+- darkcyan (#008b8b)
+- darkgoldenrod (#b8860b)
+- darkgray (#a9a9a9)
+- darkgreen (#006400)
+- darkgrey (#a9a9a9)
+- darkkhaki (#bdb76b)
+- darkmagenta (#8b008b)
+- darkolivegreen (#556b2f)
+- darkorange (#ff8c00)
+- darkorchid (#9932cc)
+- darkred (#8b0000)
+- darksalmon (#e9967a)
+- darkseagreen (#8fbc8f)
+- darkslateblue (#483d8b)
+- darkslategrey (#2f4f4f)
+- darkturquoise (#00ced1)
+- darkviolet (#9400d3)
+- deeppink (#ff1493)
+- deepskyblue (#00bfff)
+- dimgray (#696969)
+- dimgrey (#696969)
+- dodgerblue (#1e90ff)
+- firebrick (#b22222)
+- floralwhite (#fffaf0)
+- forestgreen (#228b22)
+- fuchsia (#ff00ff)
+- gainsboro (#dcdcdc)
+- ghostwhite (#f8f8ff)
+- gold (#ffd700)
+- goldenrod (#daa520)
+- gray (#808080)
+- green (#008000)
+- greenyellow (#adff2f)
+- grey (#808080)
+- honeydew (#f0fff0)
+- hotpink (#ff69b4)
+- indianred (#cd5c5c)
+- indigo (#4b0082)
+- ivory (#fffff0)
+- khaki (#f0e68c)
+- lavender (#e6e6fa)
+- lavenderblush (#fff0f5)
+- lawngreen (#7cfc00)
+- lemonchiffon (#fffacd)
+- lightblue (#add8e6)
+- lightcoral (#f08080)
+- lightcyan (#e0ffff)
+- lightgoldenrodyellow (#fafad2)
+- lightgray (#d3d3d3)
+- lightgreen (#90ee90)
+- lightgrey (#d3d3d3)
+- lightpink (#ffb6c1)
+- lightsalmon (#ffa07a)
+- lightseagreen (#20b2aa)
+- lightskyblue (#87cefa)
+- lightslategrey (#778899)
+- lightsteelblue (#b0c4de)
+- lightyellow (#ffffe0)
+- lime (#00ff00)
+- limegreen (#32cd32)
+- linen (#faf0e6)
+- magenta (#ff00ff)
+- maroon (#800000)
+- mediumaquamarine (#66cdaa)
+- mediumblue (#0000cd)
+- mediumorchid (#ba55d3)
+- mediumpurple (#9370db)
+- mediumseagreen (#3cb371)
+- mediumslateblue (#7b68ee)
+- mediumspringgreen (#00fa9a)
+- mediumturquoise (#48d1cc)
+- mediumvioletred (#c71585)
+- midnightblue (#191970)
+- mintcream (#f5fffa)
+- mistyrose (#ffe4e1)
+- moccasin (#ffe4b5)
+- navajowhite (#ffdead)
+- navy (#000080)
+- oldlace (#fdf5e6)
+- olive (#808000)
+- olivedrab (#6b8e23)
+- orange (#ffa500)
+- orangered (#ff4500)
+- orchid (#da70d6)
+- palegoldenrod (#eee8aa)
+- palegreen (#98fb98)
+- paleturquoise (#afeeee)
+- palevioletred (#db7093)
+- papayawhip (#ffefd5)
+- peachpuff (#ffdab9)
+- peru (#cd853f)
+- pink (#ffc0cb)
+- plum (#dda0dd)
+- powderblue (#b0e0e6)
+- purple (#800080)
+- rebeccapurple (#663399)
+- red (#ff0000)
+- rosybrown (#bc8f8f)
+- royalblue (#4169e1)
+- saddlebrown (#8b4513)
+- salmon (#fa8072)
+- sandybrown (#f4a460)
+- seagreen (#2e8b57)
+- seashell (#fff5ee)
+- sienna (#a0522d)
+- silver (#c0c0c0)
+- skyblue (#87ceeb)
+- slateblue (#6a5acd)
+- slategray (#708090)
+- snow (#fffafa)
+- springgreen (#00ff7f)
+- steelblue (#4682b4)
+- tan (#d2b48c)
+- teal (#008080)
+- thistle (#d8bfd8)
+- tomato (#ff6347)
+- turquoise (#40e0d0)
+- violet (#ee82ee)
+- wheat (#f5deb3)
+- white (#ffffff)
+- whitesmoke (#f5f5f5)
+- yellow (#ffff00)
+- yellowgreen (#9acd32)
diff --git a/website/versioned_docs/version-0.73.0/communication-android.md b/website/versioned_docs/version-0.73.0/communication-android.md
new file mode 100644
index 00000000000..e5d1efa2527
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/communication-android.md
@@ -0,0 +1,149 @@
+---
+id: communication-android
+title: Communication between native and React Native
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+In [Integrating with Existing Apps guide](integration-with-existing-apps) and [Native UI Components guide](native-components-android) we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques.
+
+## Introduction
+
+React Native is inspired by React, so the basic idea of the information flow is similar. The flow in React is one-directional. We maintain a hierarchy of components, in which each component depends only on its parent and its own internal state. We do this with properties: data is passed from a parent to its children in a top-down manner. If an ancestor component relies on the state of its descendant, one should pass down a callback to be used by the descendant to update the ancestor.
+
+The same concept applies to React Native. As long as we are building our application purely within the framework, we can drive our app with properties and callbacks. But, when we mix React Native and native components, we need some specific, cross-language mechanisms that would allow us to pass information between them.
+
+## Properties
+
+Properties are the most straightforward way of cross-component communication. So we need a way to pass properties both from native to React Native, and from React Native to native.
+
+### Passing properties from native to React Native
+
+You can pass properties down to the React Native app by providing a custom implementation of `ReactActivityDelegate` in your main activity. This implementation should override `getLaunchOptions` to return a `Bundle` with the desired properties.
+
+
+
+
+
+```java
+public class MainActivity extends ReactActivity {
+ @Override
+ protected ReactActivityDelegate createReactActivityDelegate() {
+ return new ReactActivityDelegate(this, getMainComponentName()) {
+ @Override
+ protected Bundle getLaunchOptions() {
+ Bundle initialProperties = new Bundle();
+ ArrayList imageList = new ArrayList(Arrays.asList(
+ "https://dummyimage.com/600x400/ffffff/000000.png",
+ "https://dummyimage.com/600x400/000000/ffffff.png"
+ ));
+ initialProperties.putStringArrayList("images", imageList);
+ return initialProperties;
+ }
+ };
+ }
+}
+```
+
+
+
+
+
+```kotlin
+class MainActivity : ReactActivity() {
+ override fun createReactActivityDelegate(): ReactActivityDelegate {
+ return object : ReactActivityDelegate(this, mainComponentName) {
+ override fun getLaunchOptions(): Bundle {
+ val imageList = arrayListOf("https://dummyimage.com/600x400/ffffff/000000.png", "https://dummyimage.com/600x400/000000/ffffff.png")
+ val initialProperties = Bundle().apply { putStringArrayList("images", imageList) }
+ return initialProperties
+ }
+ }
+ }
+}
+```
+
+
+
+
+```tsx
+import React from 'react';
+import {View, Image} from 'react-native';
+
+export default class ImageBrowserApp extends React.Component {
+ renderImage(imgURI) {
+ return ;
+ }
+ render() {
+ return {this.props.images.map(this.renderImage)};
+ }
+}
+```
+
+`ReactRootView` provides a read-write property `appProperties`. After `appProperties` is set, the React Native app is re-rendered with new properties. The update is only performed when the new updated properties differ from the previous ones.
+
+
+
+
+
+```java
+Bundle updatedProps = mReactRootView.getAppProperties();
+ArrayList imageList = new ArrayList(Arrays.asList(
+ "https://dummyimage.com/600x400/ff0000/000000.png",
+ "https://dummyimage.com/600x400/ffffff/ff0000.png"
+));
+updatedProps.putStringArrayList("images", imageList);
+
+mReactRootView.setAppProperties(updatedProps);
+```
+
+
+
+
+
+```kotlin
+var updatedProps: Bundle = reactRootView.getAppProperties()
+var imageList = arrayListOf("https://dummyimage.com/600x400/ff0000/000000.png", "https://dummyimage.com/600x400/ffffff/ff0000.png")
+```
+
+
+
+
+
+It is fine to update properties anytime. However, updates have to be performed on the main thread. You use the getter on any thread.
+
+There is no way to update only a few properties at a time. We suggest that you build it into your own wrapper instead.
+
+> **_Note:_** Currently, JS function `componentWillUpdateProps` of the top level RN component will not be called after a prop update. However, you can access the new props in `componentDidMount` function.
+
+### Passing properties from React Native to native
+
+The problem exposing properties of native components is covered in detail in [this article](native-components-android#3-expose-view-property-setters-using-reactprop-or-reactpropgroup-annotation). In short, properties that are to be reflected in JavaScript needs to be exposed as setter method annotated with `@ReactProp`, then use them in React Native as if the component was an ordinary React Native component.
+
+### Limits of properties
+
+The main drawback of cross-language properties is that they do not support callbacks, which would allow us to handle bottom-up data bindings. Imagine you have a small RN view that you want to be removed from the native parent view as a result of a JS action. There is no way to do that with props, as the information would need to go bottom-up.
+
+Although we have a flavor of cross-language callbacks ([described here](native-modules-android#callbacks)), these callbacks are not always the thing we need. The main problem is that they are not intended to be passed as properties. Rather, this mechanism allows us to trigger a native action from JS, and handle the result of that action in JS.
+
+## Other ways of cross-language interaction (events and native modules)
+
+As stated in the previous chapter, using properties comes with some limitations. Sometimes properties are not enough to drive the logic of our app and we need a solution that gives more flexibility. This chapter covers other communication techniques available in React Native. They can be used for internal communication (between JS and native layers in RN) as well as for external communication (between RN and the 'pure native' part of your app).
+
+React Native enables you to perform cross-language function calls. You can execute custom native code from JS and vice versa. Unfortunately, depending on the side we are working on, we achieve the same goal in different ways. For native - we use events mechanism to schedule an execution of a handler function in JS, while for React Native we directly call methods exported by native modules.
+
+### Calling React Native functions from native (events)
+
+Events are described in detail in [this article](native-components-android#events). Note that using events gives us no guarantees about execution time, as the event is handled on a separate thread.
+
+Events are powerful, because they allow us to change React Native components without needing a reference to them. However, there are some pitfalls that you can fall into while using them:
+
+- As events can be sent from anywhere, they can introduce spaghetti-style dependencies into your project.
+- Events share namespace, which means that you may encounter some name collisions. Collisions will not be detected statically, which makes them hard to debug.
+- If you use several instances of the same React Native component and you want to distinguish them from the perspective of your event, you'll likely need to introduce identifiers and pass them along with events (you can use the native view's `reactTag` as an identifier).
+
+### Calling native functions from React Native (native modules)
+
+Native modules are Java/Kotlin classes that are available in JS. Typically one instance of each module is created per JS bridge. They can export arbitrary functions and constants to React Native. They have been covered in detail in [this article](native-modules-android).
+
+> **_Warning_**: All native modules share the same namespace. Watch out for name collisions when creating new ones.
diff --git a/website/versioned_docs/version-0.73.0/communication-ios.md b/website/versioned_docs/version-0.73.0/communication-ios.md
new file mode 100644
index 00000000000..030cddd00f4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/communication-ios.md
@@ -0,0 +1,204 @@
+---
+id: communication-ios
+title: Communication between native and React Native
+---
+
+In [Integrating with Existing Apps guide](integration-with-existing-apps) and [Native UI Components guide](native-components-ios) we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques.
+
+## Introduction
+
+React Native is inspired by React, so the basic idea of the information flow is similar. The flow in React is one-directional. We maintain a hierarchy of components, in which each component depends only on its parent and its own internal state. We do this with properties: data is passed from a parent to its children in a top-down manner. If an ancestor component relies on the state of its descendant, one should pass down a callback to be used by the descendant to update the ancestor.
+
+The same concept applies to React Native. As long as we are building our application purely within the framework, we can drive our app with properties and callbacks. But, when we mix React Native and native components, we need some specific, cross-language mechanisms that would allow us to pass information between them.
+
+## Properties
+
+Properties are the most straightforward way of cross-component communication. So we need a way to pass properties both from native to React Native, and from React Native to native.
+
+### Passing properties from native to React Native
+
+In order to embed a React Native view in a native component, we use `RCTRootView`. `RCTRootView` is a `UIView` that holds a React Native app. It also provides an interface between native side and the hosted app.
+
+`RCTRootView` has an initializer that allows you to pass arbitrary properties down to the React Native app. The `initialProperties` parameter has to be an instance of `NSDictionary`. The dictionary is internally converted into a JSON object that the top-level JS component can reference.
+
+```objectivec
+NSArray *imageList = @[@"https://dummyimage.com/600x400/ffffff/000000.png",
+ @"https://dummyimage.com/600x400/000000/ffffff.png"];
+
+NSDictionary *props = @{@"images" : imageList};
+
+RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
+ moduleName:@"ImageBrowserApp"
+ initialProperties:props];
+```
+
+```tsx
+import React from 'react';
+import {View, Image} from 'react-native';
+
+export default class ImageBrowserApp extends React.Component {
+ renderImage(imgURI) {
+ return ;
+ }
+ render() {
+ return {this.props.images.map(this.renderImage)};
+ }
+}
+```
+
+`RCTRootView` also provides a read-write property `appProperties`. After `appProperties` is set, the React Native app is re-rendered with new properties. The update is only performed when the new updated properties differ from the previous ones.
+
+```objectivec
+NSArray *imageList = @[@"https://dummyimage.com/600x400/ff0000/000000.png",
+ @"https://dummyimage.com/600x400/ffffff/ff0000.png"];
+
+rootView.appProperties = @{@"images" : imageList};
+```
+
+It is fine to update properties anytime. However, updates have to be performed on the main thread. You use the getter on any thread.
+
+:::note
+Currently, there is a known issue where setting appProperties during the bridge startup, the change can be lost. See https://github.com/facebook/react-native/issues/20115 for more information.
+:::
+
+There is no way to update only a few properties at a time. We suggest that you build it into your own wrapper instead.
+
+### Passing properties from React Native to native
+
+The problem exposing properties of native components is covered in detail in [this article](native-components-ios#properties). In short, export properties with `RCT_CUSTOM_VIEW_PROPERTY` macro in your custom native component, then use them in React Native as if the component was an ordinary React Native component.
+
+### Limits of properties
+
+The main drawback of cross-language properties is that they do not support callbacks, which would allow us to handle bottom-up data bindings. Imagine you have a small RN view that you want to be removed from the native parent view as a result of a JS action. There is no way to do that with props, as the information would need to go bottom-up.
+
+Although we have a flavor of cross-language callbacks ([described here](native-modules-ios#callbacks)), these callbacks are not always the thing we need. The main problem is that they are not intended to be passed as properties. Rather, this mechanism allows us to trigger a native action from JS, and handle the result of that action in JS.
+
+## Other ways of cross-language interaction (events and native modules)
+
+As stated in the previous chapter, using properties comes with some limitations. Sometimes properties are not enough to drive the logic of our app and we need a solution that gives more flexibility. This chapter covers other communication techniques available in React Native. They can be used for internal communication (between JS and native layers in RN) as well as for external communication (between RN and the 'pure native' part of your app).
+
+React Native enables you to perform cross-language function calls. You can execute custom native code from JS and vice versa. Unfortunately, depending on the side we are working on, we achieve the same goal in different ways. For native - we use events mechanism to schedule an execution of a handler function in JS, while for React Native we directly call methods exported by native modules.
+
+### Calling React Native functions from native (events)
+
+Events are described in detail in [this article](native-components-ios#events). Note that using events gives us no guarantees about execution time, as the event is handled on a separate thread.
+
+Events are powerful, because they allow us to change React Native components without needing a reference to them. However, there are some pitfalls that you can fall into while using them:
+
+- As events can be sent from anywhere, they can introduce spaghetti-style dependencies into your project.
+- Events share namespace, which means that you may encounter some name collisions. Collisions will not be detected statically, which makes them hard to debug.
+- If you use several instances of the same React Native component and you want to distinguish them from the perspective of your event, you'll likely need to introduce identifiers and pass them along with events (you can use the native view's `reactTag` as an identifier).
+
+The common pattern we use when embedding native in React Native is to make the native component's RCTViewManager a delegate for the views, sending events back to JavaScript via the bridge. This keeps related event calls in one place.
+
+### Calling native functions from React Native (native modules)
+
+Native modules are Objective-C classes that are available in JS. Typically one instance of each module is created per JS bridge. They can export arbitrary functions and constants to React Native. They have been covered in detail in [this article](native-modules-ios#content).
+
+The fact that native modules are singletons limits the mechanism in the context of embedding. Let's say we have a React Native component embedded in a native view and we want to update the native, parent view. Using the native module mechanism, we would export a function that not only takes expected arguments, but also an identifier of the parent native view. The identifier would be used to retrieve a reference to the parent view to update. That said, we would need to keep a mapping from identifiers to native views in the module.
+
+Although this solution is complex, it is used in `RCTUIManager`, which is an internal React Native class that manages all React Native views.
+
+Native modules can also be used to expose existing native libraries to JS. The [Geolocation library](https://github.com/michalchudziak/react-native-geolocation) is a living example of the idea.
+
+:::caution
+All native modules share the same namespace. Watch out for name collisions when creating new ones.
+:::
+
+## Layout computation flow
+
+When integrating native and React Native, we also need a way to consolidate two different layout systems. This section covers common layout problems and provides a brief description of mechanisms to address them.
+
+### Layout of a native component embedded in React Native
+
+This case is covered in [this article](native-components-ios#styles). To summarize, since all our native react views are subclasses of `UIView`, most style and size attributes will work like you would expect out of the box.
+
+### Layout of a React Native component embedded in native
+
+#### React Native content with fixed size
+
+The general scenario is when we have a React Native app with a fixed size, which is known to the native side. In particular, a full-screen React Native view falls into this case. If we want a smaller root view, we can explicitly set RCTRootView's frame.
+
+For instance, to make an RN app 200 (logical) pixels high, and the hosting view's width wide, we could do:
+
+```objectivec title='SomeViewController.m'
+- (void)viewDidLoad
+{
+ [...]
+ RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
+ moduleName:appName
+ initialProperties:props];
+ rootView.frame = CGRectMake(0, 0, self.view.width, 200);
+ [self.view addSubview:rootView];
+}
+```
+
+When we have a fixed size root view, we need to respect its bounds on the JS side. In other words, we need to ensure that the React Native content can be contained within the fixed-size root view. The easiest way to ensure this is to use Flexbox layout. If you use absolute positioning, and React components are visible outside the root view's bounds, you'll get overlap with native views, causing some features to behave unexpectedly. For instance, 'TouchableHighlight' will not highlight your touches outside the root view's bounds.
+
+It's totally fine to update root view's size dynamically by re-setting its frame property. React Native will take care of the content's layout.
+
+#### React Native content with flexible size
+
+In some cases we'd like to render content of initially unknown size. Let's say the size will be defined dynamically in JS. We have two solutions to this problem.
+
+1. You can wrap your React Native view in a `ScrollView` component. This guarantees that your content will always be available and it won't overlap with native views.
+2. React Native allows you to determine, in JS, the size of the RN app and provide it to the owner of the hosting `RCTRootView`. The owner is then responsible for re-laying out the subviews and keeping the UI consistent. We achieve this with `RCTRootView`'s flexibility modes.
+
+`RCTRootView` supports 4 different size flexibility modes:
+
+```objectivec title='RCTRootView.h'
+typedef NS_ENUM(NSInteger, RCTRootViewSizeFlexibility) {
+ RCTRootViewSizeFlexibilityNone = 0,
+ RCTRootViewSizeFlexibilityWidth,
+ RCTRootViewSizeFlexibilityHeight,
+ RCTRootViewSizeFlexibilityWidthAndHeight,
+};
+```
+
+`RCTRootViewSizeFlexibilityNone` is the default value, which makes a root view's size fixed (but it still can be updated with `setFrame:`). The other three modes allow us to track React Native content's size updates. For instance, setting mode to `RCTRootViewSizeFlexibilityHeight` will cause React Native to measure the content's height and pass that information back to `RCTRootView`'s delegate. An arbitrary action can be performed within the delegate, including setting the root view's frame, so the content fits. The delegate is called only when the size of the content has changed.
+
+:::caution
+Making a dimension flexible in both JS and native leads to undefined behavior. For example - don't make a top-level React component's width flexible (with `flexbox`) while you're using `RCTRootViewSizeFlexibilityWidth` on the hosting `RCTRootView`.
+:::
+
+Let's look at an example.
+
+```objectivec title='FlexibleSizeExampleView.m'
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ [...]
+
+ _rootView = [[RCTRootView alloc] initWithBridge:bridge
+ moduleName:@"FlexibilityExampleApp"
+ initialProperties:@{}];
+
+ _rootView.delegate = self;
+ _rootView.sizeFlexibility = RCTRootViewSizeFlexibilityHeight;
+ _rootView.frame = CGRectMake(0, 0, self.frame.size.width, 0);
+}
+
+#pragma mark - RCTRootViewDelegate
+- (void)rootViewDidChangeIntrinsicSize:(RCTRootView *)rootView
+{
+ CGRect newFrame = rootView.frame;
+ newFrame.size = rootView.intrinsicContentSize;
+
+ rootView.frame = newFrame;
+}
+```
+
+In the example we have a `FlexibleSizeExampleView` view that holds a root view. We create the root view, initialize it and set the delegate. The delegate will handle size updates. Then, we set the root view's size flexibility to `RCTRootViewSizeFlexibilityHeight`, which means that `rootViewDidChangeIntrinsicSize:` method will be called every time the React Native content changes its height. Finally, we set the root view's width and position. Note that we set there height as well, but it has no effect as we made the height RN-dependent.
+
+You can checkout full source code of the example [here](https://github.com/facebook/react-native/blob/main/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm).
+
+It's fine to change root view's size flexibility mode dynamically. Changing flexibility mode of a root view will schedule a layout recalculation and the delegate `rootViewDidChangeIntrinsicSize:` method will be called once the content size is known.
+
+:::note
+React Native layout calculation is performed on a separate thread, while native UI view updates are done on the main thread.
+This may cause temporary UI inconsistencies between native and React Native. This is a known problem and our team is working on synchronizing UI updates coming from different sources.
+:::
+
+:::note
+React Native does not perform any layout calculations until the root view becomes a subview of some other views.
+If you want to hide React Native view until its dimensions are known, add the root view as a subview and make it initially hidden (use `UIView`'s `hidden` property). Then change its visibility in the delegate method.
+:::
diff --git a/website/versioned_docs/version-0.73.0/components-and-apis.md b/website/versioned_docs/version-0.73.0/components-and-apis.md
new file mode 100644
index 00000000000..9c54a48d7a1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/components-and-apis.md
@@ -0,0 +1,207 @@
+---
+id: components-and-apis
+title: Core Components and APIs
+---
+
+React Native provides a number of built-in [Core Components](intro-react-native-components) ready for you to use in your app. You can find them all in the left sidebar (or menu above, if you are on a narrow screen). If you're not sure where to get started, take a look at the following categories:
+
+- [Basic Components](components-and-apis#basic-components)
+- [User Interface](components-and-apis#user-interface)
+- [List Views](components-and-apis#list-views)
+- [Android-specific](components-and-apis#android-components-and-apis)
+- [iOS-specific](components-and-apis#ios-components-and-apis)
+- [Others](components-and-apis#others)
+
+You're not limited to the components and APIs bundled with React Native. React Native has a community of thousands of developers. If you're looking for a library that does something specific, please refer to [this guide about finding libraries](libraries#finding-libraries).
+
+## Basic Components
+
+Most apps will end up using one or more of these basic components.
+
+
+
+## List Views
+
+Unlike the more generic [`ScrollView`](./scrollview), the following list view components only render elements that are currently showing on the screen. This makes them a performant choice for displaying long lists of data.
+
+
+
+## Others
+
+These components may be useful for certain applications. For an exhaustive list of components and APIs, check out the sidebar to the left (or menu above, if you are on a narrow screen).
+
+
diff --git a/website/versioned_docs/version-0.73.0/custom-webview-android.md b/website/versioned_docs/version-0.73.0/custom-webview-android.md
new file mode 100644
index 00000000000..50ae8d4d92f
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/custom-webview-android.md
@@ -0,0 +1,403 @@
+---
+id: custom-webview-android
+title: Custom WebView
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+While the built-in web view has a lot of features, it is not possible to handle every use-case in React Native. You can, however, extend the web view with native code without forking React Native or duplicating all the existing web view code.
+
+:::info
+The React Native WebView component has been extracted to [`react-native-webview`](https://github.com/react-native-webview/react-native-webview) package as part of the [Lean Core effort](https://github.com/facebook/react-native/issues/23313).
+That is the recommended way to use WebView in React Native as of today. You should not use the [WebView](https://reactnative-archive-august-2023.netlify.app/docs/0.61/webview) component as that was deprecated and removed from React Native.
+:::
+
+Before you do this, you should be familiar with the concepts in [native UI components](native-components-android). You should also familiarise yourself with the [native code for web views](https://github.com/react-native-webview/react-native-webview/blob/master/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManagerImpl.kt), as you will have to use this as a reference when implementing new features—although a deep understanding is not required.
+
+## Native Code
+
+:::info
+This example assumes you already have [`react-native-webview`](https://github.com/react-native-webview/react-native-webview) installed, if not please follow their [Getting Started guide](https://github.com/react-native-webview/react-native-webview/blob/master/docs/Getting-Started.md) first.
+:::
+
+To get started, you'll need to create a subclass of `RNCWebViewManager`, `RNCWebView`, and `RNCWebViewClient`. In your view manager, you'll then need to override:
+
+- `createRNCWebViewInstance`
+- `getName`
+- `addEventEmitters`
+
+
+
+
+```java
+@ReactModule(name = CustomWebViewManager.REACT_CLASS)
+public class CustomWebViewManager extends RNCWebViewManager {
+ /* This name must match what we're referring to in JS */
+ protected static final String REACT_CLASS = "RCTCustomWebView";
+
+ protected static class CustomWebViewClient extends RNCWebViewClient { }
+
+ protected static class CustomWebView extends RNCWebView {
+ public CustomWebView(ThemedReactContext reactContext) {
+ super(reactContext);
+ }
+ }
+
+ @Override
+ protected RNCWebView createRNCWebViewInstance(ThemedReactContext reactContext) {
+ return new CustomWebView(reactContext);
+ }
+
+ @Override
+ public String getName() {
+ return REACT_CLASS;
+ }
+
+ @Override
+ protected void addEventEmitters(ThemedReactContext reactContext, WebView view) {
+ view.setWebViewClient(new CustomWebViewClient());
+ }
+}
+```
+
+
+
+
+```kotlin
+@ReactModule(name = CustomWebViewManager.REACT_CLASS)
+class CustomWebViewManager : RNCWebViewManager() {
+ protected class CustomWebViewClient : RNCWebViewClient()
+ protected inner class CustomWebView(reactContext: ThemedReactContext?) :
+ RNCWebView(reactContext)
+
+ override fun createRNCWebViewInstance(reactContext: ThemedReactContext?): RNCWebView {
+ return CustomWebView(reactContext)
+ }
+
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: WebView) {
+ view.webViewClient = CustomWebViewClient()
+ }
+
+ companion object {
+ /* This name must match what we're referring to in JS */
+ const val REACT_CLASS = "RCTCustomWebView"
+ }
+}
+```
+
+
+
+
+You'll need to follow the usual steps to [register the module](native-modules-android.md#register-the-module).
+
+### Adding New Properties
+
+To add a new property, you'll need to add it to `CustomWebView`, and then expose it in `CustomWebViewManager`.
+
+
+
+
+```java
+public class CustomWebViewManager extends RNCWebViewManager {
+ ...
+ protected static class CustomWebView extends RNCWebView {
+ public CustomWebView(ThemedReactContext reactContext) {
+ super(reactContext);
+ }
+
+ protected @Nullable String mFinalUrl;
+
+ public void setFinalUrl(String url) {
+ mFinalUrl = url;
+ }
+
+ public String getFinalUrl() {
+ return mFinalUrl;
+ }
+ }
+
+ ...
+
+ @ReactProp(name = "finalUrl")
+ public void setFinalUrl(WebView view, String url) {
+ ((CustomWebView) view).setFinalUrl(url);
+ }
+}
+```
+
+
+
+
+```kotlin
+class CustomWebViewManager : RNCWebViewManager() {
+ protected inner class CustomWebView(
+ reactContext: ThemedReactContext?,
+ var finalUrl: String? = null
+ ) : RNCWebView(reactContext)
+
+ @ReactProp(name = "finalUrl")
+ fun setFinalUrl(view: WebView, url: String?) {
+ (view as CustomWebView).finalUrl = url
+ }
+}
+```
+
+
+
+
+### Adding New Events
+
+For events, you'll first need to make create event subclass.
+
+
+
+
+```java
+// NavigationCompletedEvent.java
+public class NavigationCompletedEvent extends Event {
+ private WritableMap mParams;
+
+ public NavigationCompletedEvent(int viewTag, WritableMap params) {
+ super(viewTag);
+ this.mParams = params;
+ }
+
+ @Override
+ public String getEventName() {
+ return "navigationCompleted";
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ init(getViewTag());
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), mParams);
+ }
+}
+```
+
+
+
+
+```kotlin
+// NavigationCompletedEvent.kt
+class NavigationCompletedEvent(viewTag: Int, val params: WritableMap) :
+ Event(viewTag) {
+ override fun getEventName(): String = "navigationCompleted"
+
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
+ init(viewTag)
+ rctEventEmitter.receiveEvent(viewTag, eventName, params)
+ }
+}
+```
+
+
+
+
+You can trigger the event in your web view client. You can hook existing handlers if your events are based on them.
+
+You should refer to [RNCWebViewManagerImpl.kt](https://github.com/react-native-webview/react-native-webview/blob/master/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManagerImpl.kt) in the React Native WebView codebase to see what handlers are available and how they are implemented. You can extend any methods here to provide extra functionality.
+
+
+
+
+```java
+public class NavigationCompletedEvent extends Event {
+ private WritableMap mParams;
+
+ public NavigationCompletedEvent(int viewTag, WritableMap params) {
+ super(viewTag);
+ this.mParams = params;
+ }
+
+ @Override
+ public String getEventName() {
+ return "navigationCompleted";
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ init(getViewTag());
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), mParams);
+ }
+}
+
+// CustomWebViewManager.java
+protected static class CustomWebViewClient extends RNCWebViewClient {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ boolean shouldOverride = super.shouldOverrideUrlLoading(view, url);
+ String finalUrl = ((CustomWebView) view).getFinalUrl();
+
+ if (!shouldOverride && url != null && finalUrl != null && new String(url).equals(finalUrl)) {
+ final WritableMap params = Arguments.createMap();
+ dispatchEvent(view, new NavigationCompletedEvent(view.getId(), params));
+ }
+
+ return shouldOverride;
+ }
+}
+```
+
+
+
+
+```kotlin
+class NavigationCompletedEvent(viewTag: Int, val params: WritableMap) :
+ Event(viewTag) {
+
+ override fun getEventName(): String = "navigationCompleted"
+
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
+ init(viewTag)
+ rctEventEmitter.receiveEvent(viewTag, eventName, params)
+ }
+}
+
+// CustomWebViewManager.kt
+
+protected class CustomWebViewClient : RNCWebViewClient() {
+ override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
+ val shouldOverride: Boolean = super.shouldOverrideUrlLoading(view, url)
+ val finalUrl: String? = (view as CustomWebView).finalUrl
+ if (!shouldOverride && url != null && finalUrl != null && url == finalUrl) {
+ val params: WritableMap = Arguments.createMap()
+ dispatchEvent(view, NavigationCompletedEvent(view.getId(), params))
+ }
+ return shouldOverride
+ }
+}
+```
+
+
+
+
+Finally, you'll need to expose the events in `CustomWebViewManager` through `getExportedCustomDirectEventTypeConstants`. Note that currently, the default implementation returns `null`, but this may change in the future.
+
+
+
+
+```java
+public class CustomWebViewManager extends RNCWebViewManager {
+ ...
+
+ @Override
+ public @Nullable
+ Map getExportedCustomDirectEventTypeConstants() {
+ Map export = super.getExportedCustomDirectEventTypeConstants();
+ if (export == null) {
+ export = MapBuilder.newHashMap();
+ }
+ export.put("navigationCompleted", MapBuilder.of("registrationName", "onNavigationCompleted"));
+ return export;
+ }
+}
+```
+
+
+
+
+```kotlin
+class CustomWebViewManager : RNCWebViewManager() {
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap? {
+ val superTypeConstants = super.getExportedCustomDirectEventTypeConstants()
+ val export = superTypeConstants ?: MapBuilder.newHashMap()
+ export["navigationCompleted"] = MapBuilder.of("registrationName", "onNavigationCompleted")
+ return export
+ }
+}
+```
+
+
+
+
+## JavaScript Interface
+
+To use your custom web view, you'll need to create a class for it. Your class must:
+
+- Export all the prop types from `WebView.propTypes`
+- Return a `WebView` component with the prop `nativeConfig.component` set to your native component (see below)
+
+To get your native component, you must use `requireNativeComponent`: the same as for regular custom components. However, you must pass in an extra third argument, `WebView.extraNativeComponentConfig`. This third argument contains prop types that are only required for native code.
+
+```jsx
+import React, {Component, PropTypes} from 'react';
+import {WebView, requireNativeComponent} from 'react-native';
+
+export default class CustomWebView extends Component {
+ static propTypes = WebView.propTypes;
+
+ render() {
+ return (
+
+ );
+ }
+}
+
+const RCTCustomWebView = requireNativeComponent(
+ 'RCTCustomWebView',
+ CustomWebView,
+ WebView.extraNativeComponentConfig,
+);
+```
+
+If you want to add custom props to your native component, you can use `nativeConfig.props` on the web view.
+
+For events, the event handler must always be set to a function. This means it isn't safe to use the event handler directly from `this.props`, as the user might not have provided one. The standard approach is to create a event handler in your class, and then invoking the event handler given in `this.props` if it exists.
+
+If you are unsure how something should be implemented from the JS side, look at [WebView.android.js](https://github.com/react-native-webview/react-native-webview/blob/master/src/WebView.android.tsx) in the React Native WebView source.
+
+```jsx
+export default class CustomWebView extends Component {
+ static propTypes = {
+ ...WebView.propTypes,
+ finalUrl: PropTypes.string,
+ onNavigationCompleted: PropTypes.func,
+ };
+
+ static defaultProps = {
+ finalUrl: 'about:blank',
+ };
+
+ _onNavigationCompleted = event => {
+ const {onNavigationCompleted} = this.props;
+ onNavigationCompleted && onNavigationCompleted(event);
+ };
+
+ render() {
+ return (
+
+ );
+ }
+}
+```
+
+Similar to regular native components, you must provide all your prop types in the component to have them forwarded on to the native component. However, if you have some prop types that are only used internally in component, you can add them to the `nativeOnly` property of the third argument previously mentioned. For event handlers, you have to use the value `true` instead of a regular prop type.
+
+For example, if you wanted to add an internal event handler called `onScrollToBottom`, you would use,
+
+```jsx
+const RCTCustomWebView = requireNativeComponent(
+ 'RCTCustomWebView',
+ CustomWebView,
+ {
+ ...WebView.extraNativeComponentConfig,
+ nativeOnly: {
+ ...WebView.extraNativeComponentConfig.nativeOnly,
+ onScrollToBottom: true,
+ },
+ },
+);
+```
diff --git a/website/versioned_docs/version-0.73.0/custom-webview-ios.md b/website/versioned_docs/version-0.73.0/custom-webview-ios.md
new file mode 100644
index 00000000000..61d84b06bc1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/custom-webview-ios.md
@@ -0,0 +1,236 @@
+---
+id: custom-webview-ios
+title: Custom WebView
+---
+
+While the built-in web view has a lot of features, it is not possible to handle every use-case in React Native. You can, however, extend the web view with native code without forking React Native or duplicating all the existing web view code.
+
+Before you do this, you should be familiar with the concepts in [native UI components](native-components-ios). You should also familiarise yourself with the [native code for web views](https://github.com/react-native-webview/react-native-webview/blob/master/apple/RNCWebViewManager.mm), as you will have to use this as a reference when implementing new features—although a deep understanding is not required.
+
+## Native Code
+
+Like for regular native components, you need a view manager and an web view.
+
+For the view, you'll need to make a subclass of `RCTWebView`.
+
+```objc
+// RCTCustomWebView.h
+#import
+
+@interface RCTCustomWebView : RCTWebView
+
+@end
+
+// RCTCustomWebView.m
+#import "RCTCustomWebView.h"
+
+@interface RCTCustomWebView ()
+
+@end
+
+@implementation RCTCustomWebView { }
+
+@end
+```
+
+For the view manager, you need to make a subclass `RCTWebViewManager`. You must still include:
+
+- `(UIView *)view` that returns your custom view
+- The `RCT_EXPORT_MODULE()` tag
+
+```objc
+// RCTCustomWebViewManager.h
+#import
+
+@interface RCTCustomWebViewManager : RCTWebViewManager
+
+@end
+
+// RCTCustomWebViewManager.m
+#import "RCTCustomWebViewManager.h"
+#import "RCTCustomWebView.h"
+
+@interface RCTCustomWebViewManager ()
+
+@end
+
+@implementation RCTCustomWebViewManager { }
+
+RCT_EXPORT_MODULE()
+
+- (UIView *)view
+{
+ RCTCustomWebView *webView = [RCTCustomWebView new];
+ webView.delegate = self;
+ return webView;
+}
+
+@end
+```
+
+### Adding New Events and Properties
+
+Adding new properties and events is the same as regular UI components. For properties, you define an `@property` in the header. For events, you define a `RCTDirectEventBlock` in the view's `@interface`.
+
+```objc
+// RCTCustomWebView.h
+@property (nonatomic, copy) NSString *finalUrl;
+
+// RCTCustomWebView.m
+@interface RCTCustomWebView ()
+
+@property (nonatomic, copy) RCTDirectEventBlock onNavigationCompleted;
+
+@end
+```
+
+Then expose it in the view manager's `@implementation`.
+
+```objc
+// RCTCustomWebViewManager.m
+RCT_EXPORT_VIEW_PROPERTY(onNavigationCompleted, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(finalUrl, NSString)
+```
+
+### Extending Existing Events
+
+You should refer to [RCTWebView.mm](https://github.com/react-native-webview/react-native-webview/blob/master/apple/RNCWebView.mm) in the React Native WebView codebase to see what handlers are available and how they are implemented. You can extend any methods here to provide extra functionality.
+
+By default, most methods aren't exposed from RCTWebView. If you need to expose them, you need to create an [Objective C category](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html), and then expose all the methods you need to use.
+
+```objc
+// RCTWebView+Custom.h
+#import
+
+@interface RCTWebView (Custom)
+- (BOOL)webView:(__unused UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
+- (NSMutableDictionary *)baseEvent;
+@end
+```
+
+Once these are exposed, you can reference them in your custom web view class.
+
+```objc
+// RCTCustomWebView.m
+
+// Remember to import the category file.
+#import "RCTWebView+Custom.h"
+
+- (BOOL)webView:(__unused UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
+ navigationType:(UIWebViewNavigationType)navigationType
+{
+ BOOL allowed = [super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
+
+ if (allowed) {
+ NSString* url = request.URL.absoluteString;
+ if (url && [url isEqualToString:_finalUrl]) {
+ if (_onNavigationCompleted) {
+ NSMutableDictionary *event = [self baseEvent];
+ _onNavigationCompleted(event);
+ }
+ }
+ }
+
+ return allowed;
+}
+```
+
+## JavaScript Interface
+
+To use your custom web view, you'll need to create a class for it. Your class must:
+
+- Export all the prop types from `WebView.propTypes`
+- Return a `WebView` component with the prop `nativeConfig.component` set to your native component (see below)
+
+To get your native component, you must use `requireNativeComponent`: the same as for regular custom components. However, you must pass in an extra third argument, `WebView.extraNativeComponentConfig`. This third argument contains prop types that are only required for native code.
+
+```jsx
+import React, {Component, PropTypes} from 'react';
+import {
+ WebView,
+ requireNativeComponent,
+ NativeModules,
+} from 'react-native';
+const {CustomWebViewManager} = NativeModules;
+
+export default class CustomWebView extends Component {
+ static propTypes = WebView.propTypes;
+
+ render() {
+ return (
+
+ );
+ }
+}
+
+const RCTCustomWebView = requireNativeComponent(
+ 'RCTCustomWebView',
+ CustomWebView,
+ WebView.extraNativeComponentConfig,
+);
+```
+
+If you want to add custom props to your native component, you can use `nativeConfig.props` on the web view. For iOS, you should also set the `nativeConfig.viewManager` prop with your custom WebView ViewManager as in the example above.
+
+For events, the event handler must always be set to a function. This means it isn't safe to use the event handler directly from `this.props`, as the user might not have provided one. The standard approach is to create a event handler in your class, and then invoking the event handler given in `this.props` if it exists.
+
+If you are unsure how something should be implemented from the JS side, look at [WebView.ios.tsx](https://github.com/react-native-webview/react-native-webview/blob/master/src/WebView.ios.tsx) in the React Native source.
+
+```jsx
+export default class CustomWebView extends Component {
+ static propTypes = {
+ ...WebView.propTypes,
+ finalUrl: PropTypes.string,
+ onNavigationCompleted: PropTypes.func,
+ };
+
+ static defaultProps = {
+ finalUrl: 'about:blank',
+ };
+
+ _onNavigationCompleted = event => {
+ const {onNavigationCompleted} = this.props;
+ onNavigationCompleted && onNavigationCompleted(event);
+ };
+
+ render() {
+ return (
+
+ );
+ }
+}
+```
+
+Similar to regular native components, you must provide all your prop types in the component to have them forwarded on to the native component. However, if you have some prop types that are only used internally in component, you can add them to the `nativeOnly` property of the third argument previously mentioned. For event handlers, you have to use the value `true` instead of a regular prop type.
+
+For example, if you wanted to add an internal event handler called `onScrollToBottom`, you would use,
+
+```jsx
+const RCTCustomWebView = requireNativeComponent(
+ 'RCTCustomWebView',
+ CustomWebView,
+ {
+ ...WebView.extraNativeComponentConfig,
+ nativeOnly: {
+ ...WebView.extraNativeComponentConfig.nativeOnly,
+ onScrollToBottom: true,
+ },
+ },
+);
+```
diff --git a/website/versioned_docs/version-0.73.0/datepickerandroid.md b/website/versioned_docs/version-0.73.0/datepickerandroid.md
new file mode 100644
index 00000000000..77d213f6eb2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/datepickerandroid.md
@@ -0,0 +1,75 @@
+---
+id: datepickerandroid
+title: '🚧 DatePickerAndroid'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=datepicker) instead.
+
+Opens the standard Android date picker dialog.
+
+### Example
+
+```jsx
+try {
+ const {action, year, month, day} = await DatePickerAndroid.open(
+ {
+ // Use `new Date()` for current date.
+ // May 25 2020. Month 0 is January.
+ date: new Date(2020, 4, 25),
+ },
+ );
+ if (action !== DatePickerAndroid.dismissedAction) {
+ // Selected year, month (0-11), day
+ }
+} catch ({code, message}) {
+ console.warn('Cannot open date picker', message);
+}
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `open()`
+
+```jsx
+static open(options)
+```
+
+Opens the standard Android date picker dialog.
+
+The available keys for the `options` object are:
+
+- `date` (`Date` object or timestamp in milliseconds) - date to show by default
+- `minDate` (`Date` or timestamp in milliseconds) - minimum date that can be selected
+- `maxDate` (`Date` object or timestamp in milliseconds) - maximum date that can be selected
+- `mode` (`enum('calendar', 'spinner', 'default')`) - To set the date-picker mode to calendar/spinner/default
+ - 'calendar': Show a date picker in calendar mode.
+ - 'spinner': Show a date picker in spinner mode.
+ - 'default': Show a default native date picker(spinner/calendar) based on android versions.
+
+Returns a Promise which will be invoked an object containing `action`, `year`, `month` (0-11), `day` if the user picked a date. If the user dismissed the dialog, the Promise will still be resolved with action being `DatePickerAndroid.dismissedAction` and all the other keys being undefined. **Always** check whether the `action` is equal to `DatePickerAndroid.dateSetAction` before reading the values.
+
+Note the native date picker dialog has some UI glitches on Android 4 and lower when using the `minDate` and `maxDate` options.
+
+---
+
+### `dateSetAction()`
+
+```jsx
+static dateSetAction()
+```
+
+A date has been selected.
+
+---
+
+### `dismissedAction()`
+
+```jsx
+static dismissedAction()
+```
+
+The dialog has been dismissed.
diff --git a/website/versioned_docs/version-0.73.0/datepickerios.md b/website/versioned_docs/version-0.73.0/datepickerios.md
new file mode 100644
index 00000000000..4b9c9840c24
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/datepickerios.md
@@ -0,0 +1,162 @@
+---
+id: datepickerios
+title: '🚧 DatePickerIOS'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=datepicker) instead.
+
+Use `DatePickerIOS` to render a date/time picker (selector) on iOS. This is a controlled component, so you must hook in to the `onDateChange` callback and update the `date` prop in order for the component to update, otherwise the user's change will be reverted immediately to reflect `props.date` as the source of truth.
+
+### Example
+
+```SnackPlayer name=DatePickerIOS&supportedPlatforms=ios&disableLinting=true
+import React, {useState} from 'react';
+import {DatePickerIOS, View, StyleSheet} from 'react-native';
+
+const App = () => {
+ const [chosenDate, setChosenDate] = useState(new Date());
+
+ return (
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view.md#props).
+
+### `date`
+
+The currently selected date.
+
+| Type | Required |
+| ---- | -------- |
+| Date | Yes |
+
+---
+
+### `onChange`
+
+Date change handler.
+
+This is called when the user changes the date or time in the UI. The first and only argument is an Event. For getting the date the picker was changed to, use onDateChange instead.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onDateChange`
+
+Date change handler.
+
+This is called when the user changes the date or time in the UI. The first and only argument is a Date object representing the new date and time.
+
+| Type | Required |
+| -------- | -------- |
+| function | Yes |
+
+---
+
+### `maximumDate`
+
+Maximum date.
+
+Restricts the range of possible date/time values.
+
+| Type | Required |
+| ---- | -------- |
+| Date | No |
+
+Example with `maximumDate` set to December 31, 2017:
+
+
+
+---
+
+### `minimumDate`
+
+Minimum date.
+
+Restricts the range of possible date/time values.
+
+| Type | Required |
+| ---- | -------- |
+| Date | No |
+
+See [`maximumDate`](#maximumdate) for an example image.
+
+---
+
+### `minuteInterval`
+
+The interval at which minutes can be selected.
+
+| Type | Required |
+| ------------------------------------------ | -------- |
+| enum(1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30) | No |
+
+Example with `minuteInterval` set to `10`:
+
+
+
+---
+
+### `mode`
+
+The date picker mode.
+
+| Type | Required |
+| --------------------------------------------- | -------- |
+| enum('date', 'time', 'datetime', 'countdown') | No |
+
+Example with `mode` set to `date`, `time`, and `datetime`: 
+
+---
+
+### `locale`
+
+The locale for the date picker. Value needs to be a [Locale ID](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html).
+
+| Type | Required |
+| ------ | -------- |
+| String | No |
+
+---
+
+### `timeZoneOffsetInMinutes`
+
+Timezone offset in minutes.
+
+By default, the date picker will use the device's timezone. With this parameter, it is possible to force a certain timezone offset. For instance, to show times in Pacific Standard Time, pass -7 \* 60.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `initialDate`
+
+Provides an initial value that will change when the user starts selecting a date. It is useful for use-cases where you do not want to deal with listening to events and updating the date prop to keep the controlled state in sync. The controlled state has known bugs which causes it to go out of sync with native. The initialDate prop is intended to allow you to have native be source of truth.
+
+| Type | Required |
+| ---- | -------- |
+| Date | No |
diff --git a/website/versioned_docs/version-0.73.0/debugging-release-builds.md b/website/versioned_docs/version-0.73.0/debugging-release-builds.md
new file mode 100644
index 00000000000..bb7cedc4e8b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/debugging-release-builds.md
@@ -0,0 +1,97 @@
+---
+id: debugging-release-builds
+title: Debugging Release Builds
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Symbolicating a stack trace
+
+If a React Native app throws an unhandled exception in a release build, the output may be obfuscated and hard to read.
+
+```shell
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: Process: com.awesomeproject, PID: 18979 07-15 10:58:25.820 18979 18998 E AndroidRuntime: com.facebook.react.common.JavascriptException: Failed, js engine: hermes, stack:
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132161
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132084
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: f@1:131854
+07-15 10:58:25.820 18979 18998 E AndroidRuntime: anonymous@1:131119
+```
+
+In the above stack trace, entries like `p@1:132161` are minified function names and bytecode offsets. To debug these calls, we want to translate these into file, line, and function name, e.g. `AwesomeProject/App.js:54:initializeMap`. This is known as **symbolication.**
+
+You can symbolicate minified function names and bytecode like the above by passing the stack trace and a generated source map to [`metro-symbolicate`](http://npmjs.com/package/metro-symbolicate).
+
+### Enabling source maps
+
+Source maps are required to symbolicate stack traces. Make sure that source maps are enabled within the build config for the target platform.
+
+
+
+
+:::info
+On Android, source maps are **enabled** by default.
+:::
+
+To enable source map generation, ensure the following `hermesFlags` are present in `android/app/build.gradle`.
+
+```groovy
+react {
+ hermesFlags = ["-O", "-output-source-map"]
+}
+```
+
+If done correctly you should see the output location of the source map during Metro build output.
+
+```text
+Writing bundle output to:, android/app/build/generated/assets/react/release/index.android.bundle
+Writing sourcemap output to:, android/app/build/intermediates/sourcemaps/react/release/index.android.bundle.packager.map
+```
+
+
+
+
+:::info
+On iOS, source maps are **disabled** by default. Use the following instructions to enable them.
+:::
+
+To enable source map generation:
+
+- Open Xcode and edit the build phase "Bundle React Native code and images".
+- Above the other exports, add a `SOURCEMAP_FILE` entry with the desired output path.
+
+```diff
++ SOURCEMAP_FILE="$(pwd)/../main.jsbundle.map";
+ WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
+```
+
+If done correctly you should see the output location of the source map during Metro build output.
+
+```text
+Writing bundle output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle
+Writing sourcemap output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle.map
+```
+
+
+
+
+### Using `metro-symbolicate`
+
+With source maps being generated, we can now translate our stack traces.
+
+```shell
+# Print usage instructions
+npx metro-symbolicate
+
+# From a file containing the stack trace
+npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt
+
+# From adb logcat (Android)
+adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map
+```
+
+### Notes on source maps
+
+- Multiple source maps may be generated by the build process. Make sure to use the one in the location shown in the examples.
+- Make sure that the source map you use corresponds to the exact commit of the crashing app. Small changes in source code can cause large differences in offsets.
+- If `metro-symbolicate` exits immediately with success, make sure the input comes from a pipe or redirection and not from a terminal.
diff --git a/website/versioned_docs/version-0.73.0/debugging.md b/website/versioned_docs/version-0.73.0/debugging.md
new file mode 100644
index 00000000000..261050ba74c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/debugging.md
@@ -0,0 +1,148 @@
+---
+id: debugging
+title: Debugging Basics
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Accessing the Dev Menu
+
+React Native provides an in-app developer menu which offers several debugging options. You can access the Dev Menu by shaking your device or via keyboard shortcuts:
+
+- iOS Simulator: Cmd ⌘ + D (or Device > Shake)
+- Android emulators: Cmd ⌘ + M (macOS) or Ctrl + M (Windows and Linux)
+
+Alternatively for Android devices and emulators, you can run `adb shell input keyevent 82` in your terminal.
+
+
+
+:::note
+The Dev Menu is disabled in release (production) builds.
+:::
+
+## Opening the Debugger
+
+The debugger allows you to understand and debug how your JavaScript code is running, similar to a web browser.
+
+:::info
+**In Expo projects**, press j in the CLI to directly open the Hermes Debugger.
+:::
+
+
+
+
+Hermes supports the Chrome debugger by implementing the Chrome DevTools Protocol. This means Chrome's tools can be used to directly debug JavaScript running on Hermes, on an emulator or on a physical device.
+
+1. In a Chrome browser window, navigate to `chrome://inspect`.
+2. Use the "Configure..." button to add the dev server address (typically `localhost:8081`).
+3. You should now see a "Hermes React Native" target with an **"inspect"** link. Click this to open the debugger.
+
+
+
+
+
+
+[Flipper](https://fbflipper.com/) is a native debugging tool which provides JavaScript debugging capabilities for React Native via an embedded Chrome DevTools panel.
+
+To debug JavaScript code in Flipper, select **"Open Debugger"** from the Dev Menu. Learn more about Flipper [here](https://fbflipper.com/docs/features/react-native/).
+
+:::info
+To debug using Flipper, the Flipper app must be [installed on your system](https://fbflipper.com/docs/getting-started/).
+:::
+
+
+
+:::warning
+Debugging React Native apps with Flipper is [deprecated in React Native 0.73](https://github.com/react-native-community/discussions-and-proposals/pull/641). We will eventually remove out-of-the box support for JS debugging via Flipper.
+:::
+
+
+
+
+:::note
+**This is an experimental feature** and several features may not work reliably today. When this feature does launch in future, we intend for it to work more completely than the current debugging methods.
+:::
+
+The React Native team is working on a new JavaScript debugger experience, intended to replace Flipper, with a preview available as of React Native 0.73.
+
+The new debugger can be enabled via React Native CLI. This will also enable j to debug.
+
+```sh
+npx react-native start --experimental-debugger
+```
+
+When selecting **"Open Debugger"** in the Dev Menu, this will launch the new debugger using Google Chrome or Microsoft Edge.
+
+
+
+
+
+
+## React DevTools
+
+You can use React DevTools to inspect the React element tree, props, and state.
+
+```sh
+npx react-devtools
+```
+
+
+
+:::tip
+
+**Learn how to use React DevTools!**
+
+- [React DevTools guide](/docs/next/react-devtools)
+- [React Developer Tools on react.dev](https://react.dev/learn/react-developer-tools)
+
+:::
+
+## LogBox
+
+Errors and warnings in development builds are displayed in LogBox inside your app.
+
+
+
+:::note
+LogBox is disabled in release (production) builds.
+:::
+
+### Console Errors and Warnings
+
+Console errors and warnings are displayed as on-screen notifications with a red or yellow badge, and a notification count. To see more about an error or warning, tap the notification to see an expanded view and to paginate through other logs.
+
+LogBox notifications can be disabled using `LogBox.ignoreAllLogs()`. This can be useful when giving product demos, for example. Additionally, notifications can be disabled on a per-log basis via `LogBox.ignoreLogs()`. This can be useful for noisy warnings or those that cannot be fixed, e.g. in a third-party dependency.
+
+:::info
+Ignore logs as a last resort and create a task to fix any logs that are ignored.
+:::
+
+```js
+import {LogBox} from 'react-native';
+
+// Ignore log notification by message
+LogBox.ignoreLogs([
+ // Exact message
+ 'Warning: componentWillReceiveProps has been renamed',
+
+ // Substring or regex match
+ /GraphQL error: .*/,
+]);
+
+// Ignore all log notifications
+LogBox.ignoreAllLogs();
+```
+
+### Syntax Errors
+
+When a JavaScript syntax error occurs, LogBox will open with the location of the error. In this state, LogBox is not dismissable since your code cannot be executed. LogBox will automatically dismiss once the syntax error is fixed — either via Fast Refresh or after a manual reload.
+
+## Performance Monitor
+
+On Android and iOS, an in-app performance overlay can be toggled during development by selecting **"Perf Monitor"** in the Dev Menu. Learn more about this feature [here](/docs/performance).
+
+
+
+:::info
+The Performance Monitor runs in-app and is a guide. We recommend investigating the native tooling under Android Studio and Xcode for accurate performance measurements.
+:::
diff --git a/website/versioned_docs/version-0.73.0/devsettings.md b/website/versioned_docs/version-0.73.0/devsettings.md
new file mode 100644
index 00000000000..58cd4987e03
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/devsettings.md
@@ -0,0 +1,51 @@
+---
+id: devsettings
+title: DevSettings
+---
+
+The `DevSettings` module exposes methods for customizing settings for developers in development.
+
+---
+
+# Reference
+
+## Methods
+
+### `addMenuItem()`
+
+```tsx
+static addMenuItem(title: string, handler: () => any);
+```
+
+Add a custom menu item to the Dev Menu.
+
+**Parameters:**
+
+| Name | Type |
+| ------------------------------------------------------------ | -------- |
+| title
Required
| string |
+| handler
Required
| function |
+
+**Example:**
+
+```tsx
+DevSettings.addMenuItem('Show Secret Dev Screen', () => {
+ Alert.alert('Showing secret dev screen!');
+});
+```
+
+---
+
+### `reload()`
+
+```tsx
+static reload(reason?: string): void;
+```
+
+Reload the application. Can be invoked directly or on user interaction.
+
+**Example:**
+
+```tsx
+ DevSettings.reload()} />
+```
diff --git a/website/versioned_docs/version-0.73.0/dimensions.md b/website/versioned_docs/version-0.73.0/dimensions.md
new file mode 100644
index 00000000000..29c65c645a3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/dimensions.md
@@ -0,0 +1,147 @@
+---
+id: dimensions
+title: Dimensions
+---
+
+> [`useWindowDimensions`](usewindowdimensions) is the preferred API for React components. Unlike `Dimensions`, it updates as the window's dimensions update. This works nicely with the React paradigm.
+
+```tsx
+import {Dimensions} from 'react-native';
+```
+
+You can get the application window's width and height using the following code:
+
+```tsx
+const windowWidth = Dimensions.get('window').width;
+const windowHeight = Dimensions.get('window').height;
+```
+
+> Although dimensions are available immediately, they may change (e.g due to device rotation, foldable devices etc) so any rendering logic or styles that depend on these constants should try to call this function on every render, rather than caching the value (for example, using inline styles rather than setting a value in a `StyleSheet`).
+
+If you are targeting foldable devices or devices which can change the screen size or app window size, you can use the event listener available in the Dimensions module as shown in the below example.
+
+## Example
+
+```SnackPlayer name=Dimensions
+import React, {useState, useEffect} from 'react';
+import {View, StyleSheet, Text, Dimensions} from 'react-native';
+
+const windowDimensions = Dimensions.get('window');
+const screenDimensions = Dimensions.get('screen');
+
+const App = () => {
+ const [dimensions, setDimensions] = useState({
+ window: windowDimensions,
+ screen: screenDimensions,
+ });
+
+ useEffect(() => {
+ const subscription = Dimensions.addEventListener(
+ 'change',
+ ({window, screen}) => {
+ setDimensions({window, screen});
+ },
+ );
+ return () => subscription?.remove();
+ });
+
+ return (
+
+ Window Dimensions
+ {Object.entries(dimensions.window).map(([key, value]) => (
+
+ {key} - {value}
+
+ ))}
+ Screen Dimensions
+ {Object.entries(dimensions.screen).map(([key, value]) => (
+
+ {key} - {value}
+
+ ))}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ header: {
+ fontSize: 16,
+ marginVertical: 10,
+ },
+});
+
+export default App;
+```
+
+# Reference
+
+## Methods
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ type: 'change',
+ handler: ({
+ window,
+ screen,
+ }: DimensionsValue) => void,
+): EmitterSubscription;
+```
+
+Add an event handler. Supported events:
+
+- `change`: Fires when a property within the `Dimensions` object changes. The argument to the event handler is a [`DimensionsValue`](#dimensionsvalue) type object.
+
+---
+
+### `get()`
+
+```tsx
+static get(dim: 'window' | 'screen'): ScaledSize;
+```
+
+Initial dimensions are set before `runApplication` is called so they should be available before any other require's are run, but may be updated later.
+
+Example: `const {height, width} = Dimensions.get('window');`
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------------ | ------ | --------------------------------------------------------------------------------- |
+| dim
Required
| string | Name of dimension as defined when calling `set`. Returns value for the dimension. |
+
+> For Android the `window` dimension will exclude the size used by the `status bar` (if not translucent) and `bottom navigation bar`
+
+---
+
+## Type Definitions
+
+### DimensionsValue
+
+**Properties:**
+
+| Name | Type | Description |
+| ------ | ----------------------------------- | --------------------------------------- |
+| window | [ScaledSize](dimensions#scaledsize) | Size of the visible Application window. |
+| screen | [ScaledSize](dimensions#scaledsize) | Size of the device's screen. |
+
+### ScaledSize
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type |
+| --------- | ------ |
+| width | number |
+| height | number |
+| scale | number |
+| fontScale | number |
diff --git a/website/versioned_docs/version-0.73.0/direct-manipulation.md b/website/versioned_docs/version-0.73.0/direct-manipulation.md
new file mode 100644
index 00000000000..0760a1c7b71
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/direct-manipulation.md
@@ -0,0 +1,444 @@
+---
+id: direct-manipulation
+title: Direct Manipulation
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+It is sometimes necessary to make changes directly to a component without using state/props to trigger a re-render of the entire subtree. When using React in the browser for example, you sometimes need to directly modify a DOM node, and the same is true for views in mobile apps. `setNativeProps` is the React Native equivalent to setting properties directly on a DOM node.
+
+:::caution
+Use `setNativeProps` when frequent re-rendering creates a performance bottleneck!
+
+Direct manipulation will not be a tool that you reach for frequently. You will typically only be using it for creating continuous animations to avoid the overhead of rendering the component hierarchy and reconciling many views.
+`setNativeProps` is imperative and stores state in the native layer (DOM, UIView, etc.) and not within your React components, which makes your code more difficult to reason about.
+
+Before you use it, try to solve your problem with `setState` and [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action).
+:::
+
+## setNativeProps with TouchableOpacity
+
+[TouchableOpacity](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js) uses `setNativeProps` internally to update the opacity of its child component:
+
+```tsx
+const viewRef = useRef();
+const setOpacityTo = useCallback(value => {
+ // Redacted: animation related code
+ viewRef.current.setNativeProps({
+ opacity: value,
+ });
+}, []);
+```
+
+This allows us to write the following code and know that the child will have its opacity updated in response to taps, without the child having any knowledge of that fact or requiring any changes to its implementation:
+
+```tsx
+
+
+ Press me!
+
+
+```
+
+Let's imagine that `setNativeProps` was not available. One way that we might implement it with that constraint is to store the opacity value in the state, then update that value whenever `onPress` is fired:
+
+```tsx
+const [buttonOpacity, setButtonOpacity] = useState(1);
+return (
+ setButtonOpacity(0.5)}
+ onPressOut={() => setButtonOpacity(1)}>
+
+ Press me!
+
+
+);
+```
+
+This is computationally intensive compared to the original example - React needs to re-render the component hierarchy each time the opacity changes, even though other properties of the view and its children haven't changed. Usually this overhead isn't a concern but when performing continuous animations and responding to gestures, judiciously optimizing your components can improve your animations' fidelity.
+
+If you look at the implementation of `setNativeProps` in [NativeMethodsMixin](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js) you will notice that it is a wrapper around `RCTUIManager.updateView` - this is the exact same function call that results from re-rendering - see [receiveComponent in ReactNativeBaseComponent](https://github.com/facebook/react-native/blob/fb2ec1ea47c53c2e7b873acb1cb46192ac74274e/Libraries/Renderer/oss/ReactNativeRenderer-prod.js#L5793-L5813).
+
+## Composite components and setNativeProps
+
+Composite components are not backed by a native view, so you cannot call `setNativeProps` on them. Consider this example:
+
+
+
+
+```SnackPlayer name=setNativeProps%20with%20Composite%20Components&ext=js
+import React from 'react';
+import {Text, TouchableOpacity, View} from 'react-native';
+
+const MyButton = props => (
+
+ {props.label}
+
+);
+
+const App = () => (
+
+
+
+);
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=setNativeProps%20with%20Composite%20Components&ext=tsx
+import React from 'react';
+import {Text, TouchableOpacity, View} from 'react-native';
+
+const MyButton = (props: {label: string}) => (
+
+ {props.label}
+
+);
+
+const App = () => (
+
+
+
+);
+
+export default App;
+```
+
+
+
+
+If you run this you will immediately see this error: `Touchable child must either be native or forward setNativeProps to a native component`. This occurs because `MyButton` isn't directly backed by a native view whose opacity should be set. You can think about it like this: if you define a component with `createReactClass` you would not expect to be able to set a style prop on it and have that work - you would need to pass the style prop down to a child, unless you are wrapping a native component. Similarly, we are going to forward `setNativeProps` to a native-backed child component.
+
+#### Forward setNativeProps to a child
+
+Since the `setNativeProps` method exists on any ref to a `View` component, it is enough to forward a ref on your custom component to one of the `` components that it renders. This means that a call to `setNativeProps` on the custom component will have the same effect as if you called `setNativeProps` on the wrapped `View` component itself.
+
+
+
+
+```SnackPlayer name=Forwarding%20setNativeProps&ext=js
+import React from 'react';
+import {Text, TouchableOpacity, View} from 'react-native';
+
+const MyButton = React.forwardRef((props, ref) => (
+
+ {props.label}
+
+));
+
+const App = () => (
+
+
+
+);
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Forwarding%20setNativeProps&ext=tsx
+import React from 'react';
+import {Text, TouchableOpacity, View} from 'react-native';
+
+const MyButton = React.forwardRef((props, ref) => (
+
+ {props.label}
+
+));
+
+const App = () => (
+
+
+
+);
+
+export default App;
+```
+
+
+
+
+You can now use `MyButton` inside of `TouchableOpacity`!
+
+You may have noticed that we passed all of the props down to the child view using `{...props}`. The reason for this is that `TouchableOpacity` is actually a composite component, and so in addition to depending on `setNativeProps` on its child, it also requires that the child perform touch handling. To do this, it passes on [various props](view.md#onmoveshouldsetresponder) that call back to the `TouchableOpacity` component. `TouchableHighlight`, in contrast, is backed by a native view and only requires that we implement `setNativeProps`.
+
+## setNativeProps to edit TextInput value
+
+Another very common use case of `setNativeProps` is to edit the value of the TextInput. The `controlled` prop of TextInput can sometimes drop characters when the `bufferDelay` is low and the user types very quickly. Some developers prefer to skip this prop entirely and instead use `setNativeProps` to directly manipulate the TextInput value when necessary. For example, the following code demonstrates editing the input when you tap a button:
+
+
+
+
+```SnackPlayer name=Clear%20text&ext=js
+import React from 'react';
+import {useCallback, useRef} from 'react';
+import {
+ StyleSheet,
+ TextInput,
+ Text,
+ TouchableOpacity,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const inputRef = useRef(null);
+ const editText = useCallback(() => {
+ inputRef.current.setNativeProps({text: 'Edited Text'});
+ }, []);
+
+ return (
+
+
+
+ Edit text
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ input: {
+ height: 50,
+ width: 200,
+ marginHorizontal: 20,
+ borderWidth: 1,
+ borderColor: '#ccc',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Clear%20text&ext=tsx
+import React from 'react';
+import {useCallback, useRef} from 'react';
+import {
+ StyleSheet,
+ TextInput,
+ Text,
+ TouchableOpacity,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const inputRef = useRef(null);
+ const editText = useCallback(() => {
+ inputRef.current?.setNativeProps({text: 'Edited Text'});
+ }, []);
+
+ return (
+
+
+
+ Edit text
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ input: {
+ height: 50,
+ width: 200,
+ marginHorizontal: 20,
+ borderWidth: 1,
+ borderColor: '#ccc',
+ },
+});
+
+export default App;
+```
+
+
+
+
+You can use the [`clear`](textinput#clear) method to clear the `TextInput` which clears the current input text using the same approach.
+
+## Avoiding conflicts with the render function
+
+If you update a property that is also managed by the render function, you might end up with some unpredictable and confusing bugs because anytime the component re-renders and that property changes, whatever value was previously set from `setNativeProps` will be completely ignored and overridden.
+
+## setNativeProps & shouldComponentUpdate
+
+By [intelligently applying `shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#avoid-reconciliation) you can avoid the unnecessary overhead involved in reconciling unchanged component subtrees, to the point where it may be performant enough to use `setState` instead of `setNativeProps`.
+
+## Other native methods
+
+The methods described here are available on most of the default components provided by React Native. Note, however, that they are _not_ available on composite components that aren't directly backed by a native view. This will generally include most components that you define in your own app.
+
+### measure(callback)
+
+Determines the location on screen, width, and height in the viewport of the given view and returns the values via an async callback. If successful, the callback will be called with the following arguments:
+
+- x
+- y
+- width
+- height
+- pageX
+- pageY
+
+Note that these measurements are not available until after the rendering has been completed in native. If you need the measurements as soon as possible and you don't need `pageX` and `pageY`, consider using the [`onLayout`](view.md#onlayout) property instead.
+
+Also the width and height returned by `measure()` are the width and height of the component in the viewport. If you need the actual size of the component, consider using the [`onLayout`](view.md#onlayout) property instead.
+
+### measureInWindow(callback)
+
+Determines the location of the given view in the window and returns the values via an async callback. If the React root view is embedded in another native view, this will give you the absolute coordinates. If successful, the callback will be called with the following arguments:
+
+- x
+- y
+- width
+- height
+
+### measureLayout(relativeToNativeComponentRef, onSuccess, onFail)
+
+Like `measure()`, but measures the view relative to an ancestor, specified with `relativeToNativeComponentRef` reference. This means that the returned coordinates are relative to the origin `x`, `y` of the ancestor view.
+
+:::note
+This method can also be called with a `relativeToNativeNode` handler (instead of reference), but this variant is deprecated.
+:::
+
+
+
+
+```SnackPlayer name=measureLayout%20example&supportedPlatforms=android,ios&ext=js
+import React, {useEffect, useRef, useState} from 'react';
+import {Text, View, StyleSheet} from 'react-native';
+
+const App = () => {
+ const textContainerRef = useRef(null);
+ const textRef = useRef(null);
+ const [measure, setMeasure] = useState(null);
+
+ useEffect(() => {
+ if (textRef.current && textContainerRef.current) {
+ textRef.current.measureLayout(
+ textContainerRef.current,
+ (left, top, width, height) => {
+ setMeasure({left, top, width, height});
+ },
+ );
+ }
+ }, [measure]);
+
+ return (
+
+
+ Where am I? (relative to the text container)
+
+ {JSON.stringify(measure)}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ textContainer: {
+ backgroundColor: '#61dafb',
+ justifyContent: 'center',
+ alignItems: 'center',
+ padding: 12,
+ },
+ measure: {
+ textAlign: 'center',
+ padding: 12,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=measureLayout%20example&ext=tsx
+import React, {useEffect, useRef, useState} from 'react';
+import {Text, View, StyleSheet} from 'react-native';
+
+type Measurements = {
+ left: number;
+ top: number;
+ width: number;
+ height: number;
+};
+
+const App = () => {
+ const textContainerRef = useRef(null);
+ const textRef = useRef(null);
+ const [measure, setMeasure] = useState(null);
+
+ useEffect(() => {
+ if (textRef.current && textContainerRef.current) {
+ textRef.current?.measureLayout(
+ textContainerRef.current,
+ (left, top, width, height) => {
+ setMeasure({left, top, width, height});
+ },
+ () => {
+ console.error('measurement failed');
+ },
+ );
+ }
+ }, [measure]);
+
+ return (
+
+
+ Where am I? (relative to the text container)
+
+ {JSON.stringify(measure)}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ textContainer: {
+ backgroundColor: '#61dafb',
+ justifyContent: 'center',
+ alignItems: 'center',
+ padding: 12,
+ },
+ measure: {
+ textAlign: 'center',
+ padding: 12,
+ },
+});
+
+export default App;
+```
+
+
+
+
+### focus()
+
+Requests focus for the given input or view. The exact behavior triggered will depend on the platform and type of view.
+
+### blur()
+
+Removes focus from an input or view. This is the opposite of `focus()`.
diff --git a/website/versioned_docs/version-0.73.0/drawerlayoutandroid.md b/website/versioned_docs/version-0.73.0/drawerlayoutandroid.md
new file mode 100644
index 00000000000..2bc57c62cdc
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/drawerlayoutandroid.md
@@ -0,0 +1,328 @@
+---
+id: drawerlayoutandroid
+title: DrawerLayoutAndroid
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+React component that wraps the platform `DrawerLayout` (Android only). The Drawer (typically used for navigation) is rendered with `renderNavigationView` and direct children are the main view (where your content goes). The navigation view is initially not visible on the screen, but can be pulled in from the side of the window specified by the `drawerPosition` prop and its width can be set by the `drawerWidth` prop.
+
+## Example
+
+
+
+
+```SnackPlayer name=DrawerLayoutAndroid%20Component%20Example&supportedPlatforms=android&ext=js
+import React, {useRef, useState} from 'react';
+import {
+ Button,
+ DrawerLayoutAndroid,
+ Text,
+ StyleSheet,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const drawer = useRef(null);
+ const [drawerPosition, setDrawerPosition] = useState('left');
+ const changeDrawerPosition = () => {
+ if (drawerPosition === 'left') {
+ setDrawerPosition('right');
+ } else {
+ setDrawerPosition('left');
+ }
+ };
+
+ const navigationView = () => (
+
+ I'm in the Drawer!
+ drawer.current.closeDrawer()}
+ />
+
+ );
+
+ return (
+
+
+ Drawer on the {drawerPosition}!
+ changeDrawerPosition()}
+ />
+
+ Swipe from the side or press button below to see it!
+
+ drawer.current.openDrawer()}
+ />
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 16,
+ },
+ navigationContainer: {
+ backgroundColor: '#ecf0f1',
+ },
+ paragraph: {
+ padding: 16,
+ fontSize: 15,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=DrawerLayoutAndroid%20Component%20Example&supportedPlatforms=android&ext=tsx
+import React, {useRef, useState} from 'react';
+import {
+ Button,
+ DrawerLayoutAndroid,
+ Text,
+ StyleSheet,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const drawer = useRef(null);
+ const [drawerPosition, setDrawerPosition] = useState<'left' | 'right'>(
+ 'left',
+ );
+ const changeDrawerPosition = () => {
+ if (drawerPosition === 'left') {
+ setDrawerPosition('right');
+ } else {
+ setDrawerPosition('left');
+ }
+ };
+
+ const navigationView = () => (
+
+ I'm in the Drawer!
+ drawer.current?.closeDrawer()}
+ />
+
+ );
+
+ return (
+
+
+ Drawer on the {drawerPosition}!
+ changeDrawerPosition()}
+ />
+
+ Swipe from the side or press button below to see it!
+
+ drawer.current?.openDrawer()}
+ />
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 16,
+ },
+ navigationContainer: {
+ backgroundColor: '#ecf0f1',
+ },
+ paragraph: {
+ padding: 16,
+ fontSize: 15,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+### `drawerBackgroundColor`
+
+Specifies the background color of the drawer. The default value is `white`. If you want to set the opacity of the drawer, use rgba. Example:
+
+```tsx
+return (
+
+);
+```
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+---
+
+### `drawerLockMode`
+
+Specifies the lock mode of the drawer. The drawer can be locked in 3 states:
+
+- unlocked (default), meaning that the drawer will respond (open/close) to touch gestures.
+- locked-closed, meaning that the drawer will stay closed and not respond to gestures.
+- locked-open, meaning that the drawer will stay opened and not respond to gestures. The drawer may still be opened and closed programmatically (`openDrawer`/`closeDrawer`).
+
+| Type | Required |
+| ------------------------------------------------ | -------- |
+| enum('unlocked', 'locked-closed', 'locked-open') | No |
+
+---
+
+### `drawerPosition`
+
+Specifies the side of the screen from which the drawer will slide in. By default it is set to `left`.
+
+| Type | Required |
+| --------------------- | -------- |
+| enum('left', 'right') | No |
+
+---
+
+### `drawerWidth`
+
+Specifies the width of the drawer, more precisely the width of the view that be pulled in from the edge of the window.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `keyboardDismissMode`
+
+Determines whether the keyboard gets dismissed in response to a drag.
+
+- 'none' (the default), drags do not dismiss the keyboard.
+- 'on-drag', the keyboard is dismissed when a drag begins.
+
+| Type | Required |
+| ----------------------- | -------- |
+| enum('none', 'on-drag') | No |
+
+---
+
+### `onDrawerClose`
+
+Function called whenever the navigation view has been closed.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onDrawerOpen`
+
+Function called whenever the navigation view has been opened.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onDrawerSlide`
+
+Function called whenever there is an interaction with the navigation view.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onDrawerStateChanged`
+
+Function called when the drawer state has changed. The drawer can be in 3 states:
+
+- idle, meaning there is no interaction with the navigation view happening at the time
+- dragging, meaning there is currently an interaction with the navigation view
+- settling, meaning that there was an interaction with the navigation view, and the navigation view is now finishing its closing or opening animation
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `renderNavigationView`
+
+The navigation view that will be rendered to the side of the screen and can be pulled in.
+
+| Type | Required |
+| -------- | -------- |
+| function | Yes |
+
+---
+
+### `statusBarBackgroundColor`
+
+Make the drawer take the entire screen and draw the background of the status bar to allow it to open over the status bar. It will only have an effect on API 21+.
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+## Methods
+
+### `closeDrawer()`
+
+```tsx
+closeDrawer();
+```
+
+Closes the drawer.
+
+---
+
+### `openDrawer()`
+
+```tsx
+openDrawer();
+```
+
+Opens the drawer.
diff --git a/website/versioned_docs/version-0.73.0/dynamiccolorios.md b/website/versioned_docs/version-0.73.0/dynamiccolorios.md
new file mode 100644
index 00000000000..d42afdb13e9
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/dynamiccolorios.md
@@ -0,0 +1,55 @@
+---
+id: dynamiccolorios
+title: DynamicColorIOS
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+The `DynamicColorIOS` function is a platform color type specific to iOS.
+
+```tsx
+DynamicColorIOS({
+ light: color,
+ dark: color,
+ highContrastLight: color, // (optional) will fallback to "light" if not provided
+ highContrastDark: color, // (optional) will fallback to "dark" if not provided
+});
+```
+
+`DynamicColorIOS` takes a single argument as an object with two mandatory keys: `dark` and `light`, and two optional keys `highContrastLight` and `highContrastDark`. These correspond to the colors you want to use for "light mode" and "dark mode" on iOS, and when high contrast accessibility mode is enabled, high contrast version of them.
+
+At runtime, the system will choose which of the colors to display depending on the current system appearance and accessibility settings. Dynamic colors are useful for branding colors or other app specific colors that still respond automatically to system setting changes.
+
+#### Developer notes
+
+
+
+
+
+> If you’re familiar with `@media (prefers-color-scheme: dark)` in CSS, this is similar! Only instead of defining all the colors in a media query, you define which color to use under what circumstances right there where you're using it. Neat!
+
+
+
+
+> The `DynamicColorIOS` function is similar to the iOS native methods [`UIColor colorWithDynamicProvider:`](https://developer.apple.com/documentation/uikit/uicolor/3238040-colorwithdynamicprovider)
+
+
+
+
+## Example
+
+```tsx
+import {DynamicColorIOS} from 'react-native';
+
+const customDynamicTextColor = DynamicColorIOS({
+ dark: 'lightskyblue',
+ light: 'midnightblue',
+});
+
+const customContrastDynamicTextColor = DynamicColorIOS({
+ dark: 'darkgray',
+ light: 'lightgray',
+ highContrastDark: 'black',
+ highContrastLight: 'white',
+});
+```
diff --git a/website/versioned_docs/version-0.73.0/easing.md b/website/versioned_docs/version-0.73.0/easing.md
new file mode 100644
index 00000000000..0bd05189658
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/easing.md
@@ -0,0 +1,558 @@
+---
+id: easing
+title: Easing
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+The `Easing` module implements common easing functions. This module is used by [`Animated.timing()`](animated.md#timing) to convey physically believable motion in animations.
+
+You can find a visualization of some common easing functions at https://easings.net/
+
+### Predefined animations
+
+The `Easing` module provides several predefined animations through the following methods:
+
+- [`back`](easing.md#back) provides a basic animation where the object goes slightly back before moving forward
+- [`bounce`](easing.md#bounce) provides a bouncing animation
+- [`ease`](easing.md#ease) provides a basic inertial animation
+- [`elastic`](easing.md#elastic) provides a basic spring interaction
+
+### Standard functions
+
+Three standard easing functions are provided:
+
+- [`linear`](easing.md#linear)
+- [`quad`](easing.md#quad)
+- [`cubic`](easing.md#cubic)
+
+The [`poly`](easing.md#poly) function can be used to implement quartic, quintic, and other higher power functions.
+
+### Additional functions
+
+Additional mathematical functions are provided by the following methods:
+
+- [`bezier`](easing.md#bezier) provides a cubic bezier curve
+- [`circle`](easing.md#circle) provides a circular function
+- [`sin`](easing.md#sin) provides a sinusoidal function
+- [`exp`](easing.md#exp) provides an exponential function
+
+The following helpers are used to modify other easing functions.
+
+- [`in`](easing.md#in) runs an easing function forwards
+- [`inOut`](easing.md#inout) makes any easing function symmetrical
+- [`out`](easing.md#out) runs an easing function backwards
+
+## Example
+
+
+
+
+```SnackPlayer name=Easing%20Demo&ext=js
+import React from 'react';
+import {
+ Animated,
+ Easing,
+ SectionList,
+ StatusBar,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View,
+} from 'react-native';
+
+const App = () => {
+ let opacity = new Animated.Value(0);
+
+ const animate = easing => {
+ opacity.setValue(0);
+ Animated.timing(opacity, {
+ toValue: 1,
+ duration: 1200,
+ easing,
+ useNativeDriver: true,
+ }).start();
+ };
+
+ const size = opacity.interpolate({
+ inputRange: [0, 1],
+ outputRange: [0, 80],
+ });
+
+ const animatedStyles = [
+ styles.box,
+ {
+ opacity,
+ width: size,
+ height: size,
+ },
+ ];
+
+ return (
+
+
+ Press rows below to preview the Easing!
+
+
+
+ item.title}
+ renderItem={({item}) => (
+ animate(item.easing)}
+ style={styles.listRow}>
+ {item.title}
+
+ )}
+ renderSectionHeader={({section: {title}}) => (
+ {title}
+ )}
+ />
+
+ );
+};
+
+const SECTIONS = [
+ {
+ title: 'Predefined animations',
+ data: [
+ {title: 'Bounce', easing: Easing.bounce},
+ {title: 'Ease', easing: Easing.ease},
+ {title: 'Elastic', easing: Easing.elastic(4)},
+ ],
+ },
+ {
+ title: 'Standard functions',
+ data: [
+ {title: 'Linear', easing: Easing.linear},
+ {title: 'Quad', easing: Easing.quad},
+ {title: 'Cubic', easing: Easing.cubic},
+ ],
+ },
+ {
+ title: 'Additional functions',
+ data: [
+ {
+ title: 'Bezier',
+ easing: Easing.bezier(0, 2, 1, -1),
+ },
+ {title: 'Circle', easing: Easing.circle},
+ {title: 'Sin', easing: Easing.sin},
+ {title: 'Exp', easing: Easing.exp},
+ ],
+ },
+ {
+ title: 'Combinations',
+ data: [
+ {
+ title: 'In + Bounce',
+ easing: Easing.in(Easing.bounce),
+ },
+ {
+ title: 'Out + Exp',
+ easing: Easing.out(Easing.exp),
+ },
+ {
+ title: 'InOut + Elastic',
+ easing: Easing.inOut(Easing.elastic(1)),
+ },
+ ],
+ },
+];
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#20232a',
+ },
+ title: {
+ marginTop: 10,
+ textAlign: 'center',
+ color: '#61dafb',
+ },
+ boxContainer: {
+ height: 160,
+ alignItems: 'center',
+ },
+ box: {
+ marginTop: 32,
+ borderRadius: 4,
+ backgroundColor: '#61dafb',
+ },
+ list: {
+ backgroundColor: '#fff',
+ },
+ listHeader: {
+ paddingHorizontal: 8,
+ paddingVertical: 4,
+ backgroundColor: '#f4f4f4',
+ color: '#999',
+ fontSize: 12,
+ textTransform: 'uppercase',
+ },
+ listRow: {
+ padding: 8,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Easing%20Demo&ext=tsx
+import React from 'react';
+import {
+ Animated,
+ Easing,
+ SectionList,
+ StatusBar,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View,
+} from 'react-native';
+import type {EasingFunction} from 'react-native';
+
+const App = () => {
+ let opacity = new Animated.Value(0);
+
+ const animate = (easing: EasingFunction) => {
+ opacity.setValue(0);
+ Animated.timing(opacity, {
+ toValue: 1,
+ duration: 1200,
+ easing,
+ useNativeDriver: true,
+ }).start();
+ };
+
+ const size = opacity.interpolate({
+ inputRange: [0, 1],
+ outputRange: [0, 80],
+ });
+
+ const animatedStyles = [
+ styles.box,
+ {
+ opacity,
+ width: size,
+ height: size,
+ },
+ ];
+
+ return (
+
+
+ Press rows below to preview the Easing!
+
+
+
+ item.title}
+ renderItem={({item}) => (
+ animate(item.easing)}
+ style={styles.listRow}>
+ {item.title}
+
+ )}
+ renderSectionHeader={({section: {title}}) => (
+ {title}
+ )}
+ />
+
+ );
+};
+
+const SECTIONS = [
+ {
+ title: 'Predefined animations',
+ data: [
+ {title: 'Bounce', easing: Easing.bounce},
+ {title: 'Ease', easing: Easing.ease},
+ {title: 'Elastic', easing: Easing.elastic(4)},
+ ],
+ },
+ {
+ title: 'Standard functions',
+ data: [
+ {title: 'Linear', easing: Easing.linear},
+ {title: 'Quad', easing: Easing.quad},
+ {title: 'Cubic', easing: Easing.cubic},
+ ],
+ },
+ {
+ title: 'Additional functions',
+ data: [
+ {
+ title: 'Bezier',
+ easing: Easing.bezier(0, 2, 1, -1),
+ },
+ {title: 'Circle', easing: Easing.circle},
+ {title: 'Sin', easing: Easing.sin},
+ {title: 'Exp', easing: Easing.exp},
+ ],
+ },
+ {
+ title: 'Combinations',
+ data: [
+ {
+ title: 'In + Bounce',
+ easing: Easing.in(Easing.bounce),
+ },
+ {
+ title: 'Out + Exp',
+ easing: Easing.out(Easing.exp),
+ },
+ {
+ title: 'InOut + Elastic',
+ easing: Easing.inOut(Easing.elastic(1)),
+ },
+ ],
+ },
+];
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#20232a',
+ },
+ title: {
+ marginTop: 10,
+ textAlign: 'center',
+ color: '#61dafb',
+ },
+ boxContainer: {
+ height: 160,
+ alignItems: 'center',
+ },
+ box: {
+ marginTop: 32,
+ borderRadius: 4,
+ backgroundColor: '#61dafb',
+ },
+ list: {
+ backgroundColor: '#fff',
+ },
+ listHeader: {
+ paddingHorizontal: 8,
+ paddingVertical: 4,
+ backgroundColor: '#f4f4f4',
+ color: '#999',
+ fontSize: 12,
+ textTransform: 'uppercase',
+ },
+ listRow: {
+ padding: 8,
+ },
+});
+
+export default App;
+```
+
+
+
+
+---
+
+# Reference
+
+## Methods
+
+### `step0()`
+
+```tsx
+static step0(n: number);
+```
+
+A stepping function, returns 1 for any positive value of `n`.
+
+---
+
+### `step1()`
+
+```tsx
+static step1(n: number);
+```
+
+A stepping function, returns 1 if `n` is greater than or equal to 1.
+
+---
+
+### `linear()`
+
+```tsx
+static linear(t: number);
+```
+
+A linear function, `f(t) = t`. Position correlates to elapsed time one to one.
+
+https://cubic-bezier.com/#0,0,1,1
+
+---
+
+### `ease()`
+
+```tsx
+static ease(t: number);
+```
+
+A basic inertial interaction, similar to an object slowly accelerating to speed.
+
+https://cubic-bezier.com/#.42,0,1,1
+
+---
+
+### `quad()`
+
+```tsx
+static quad(t: number);
+```
+
+A quadratic function, `f(t) = t * t`. Position equals the square of elapsed time.
+
+https://easings.net/#easeInQuad
+
+---
+
+### `cubic()`
+
+```tsx
+static cubic(t: number);
+```
+
+A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed time.
+
+https://easings.net/#easeInCubic
+
+---
+
+### `poly()`
+
+```tsx
+static poly(n: number);
+```
+
+A power function. Position is equal to the Nth power of elapsed time.
+
+n = 4: https://easings.net/#easeInQuart n = 5: https://easings.net/#easeInQuint
+
+---
+
+### `sin()`
+
+```tsx
+static sin(t: number);
+```
+
+A sinusoidal function.
+
+https://easings.net/#easeInSine
+
+---
+
+### `circle()`
+
+```tsx
+static circle(t: number);
+```
+
+A circular function.
+
+https://easings.net/#easeInCirc
+
+---
+
+### `exp()`
+
+```tsx
+static exp(t: number);
+```
+
+An exponential function.
+
+https://easings.net/#easeInExpo
+
+---
+
+### `elastic()`
+
+```tsx
+static elastic(bounciness: number);
+```
+
+A basic elastic interaction, similar to a spring oscillating back and forth.
+
+Default bounciness is 1, which overshoots a little bit once. 0 bounciness doesn't overshoot at all, and bounciness of N > 1 will overshoot about N times.
+
+https://easings.net/#easeInElastic
+
+---
+
+### `back()`
+
+```tsx
+static back(s)
+```
+
+Use with `Animated.parallel()` to create a basic effect where the object animates back slightly as the animation starts.
+
+---
+
+### `bounce()`
+
+```tsx
+static bounce(t: number);
+```
+
+Provides a basic bouncing effect.
+
+https://easings.net/#easeInBounce
+
+---
+
+### `bezier()`
+
+```tsx
+static bezier(x1: number, y1: number, x2: number, y2: number);
+```
+
+Provides a cubic bezier curve, equivalent to CSS Transitions' `transition-timing-function`.
+
+A useful tool to visualize cubic bezier curves can be found at https://cubic-bezier.com/
+
+---
+
+### `in()`
+
+```tsx
+static in(easing: number);
+```
+
+Runs an easing function forwards.
+
+---
+
+### `out()`
+
+```tsx
+static out(easing: number);
+```
+
+Runs an easing function backwards.
+
+---
+
+### `inOut()`
+
+```tsx
+static inOut(easing: number);
+```
+
+Makes any easing function symmetrical. The easing function will run forwards for half of the duration, then backwards for the rest of the duration.
diff --git a/website/versioned_docs/version-0.73.0/fast-refresh.md b/website/versioned_docs/version-0.73.0/fast-refresh.md
new file mode 100644
index 00000000000..53f60ac249d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/fast-refresh.md
@@ -0,0 +1,47 @@
+---
+id: fast-refresh
+title: Fast Refresh
+---
+
+Fast Refresh is a React Native feature that allows you to get near-instant feedback for changes in your React components. Fast Refresh is enabled by default, and you can toggle "Enable Fast Refresh" in the [React Native Dev Menu](/docs/debugging#accessing-the-in-app-developer-menu). With Fast Refresh enabled, most edits should be visible within a second or two.
+
+## How It Works
+
+- If you edit a module that **only exports React component(s)**, Fast Refresh will update the code only for that module, and re-render your component. You can edit anything in that file, including styles, rendering logic, event handlers, or effects.
+- If you edit a module with exports that _aren't_ React components, Fast Refresh will re-run both that module, and the other modules importing it. So if both `Button.js` and `Modal.js` import `Theme.js`, editing `Theme.js` will update both components.
+- Finally, if you **edit a file** that's **imported by modules outside of the React tree**, Fast Refresh **will fall back to doing a full reload**. You might have a file which renders a React component but also exports a value that is imported by a **non-React component**. For example, maybe your component also exports a constant, and a non-React utility module imports it. In that case, consider migrating the constant to a separate file and importing it into both files. This will re-enable Fast Refresh to work. Other cases can usually be solved in a similar way.
+
+## Error Resilience
+
+If you make a **syntax error** during a Fast Refresh session, you can fix it and save the file again. The redbox will disappear. Modules with syntax errors are prevented from running, so you won't need to reload the app.
+
+If you make a **runtime error during the module initialization** (for example, typing `Style.create` instead of `StyleSheet.create`), the Fast Refresh session will continue once you fix the error. The redbox will disappear, and the module will be updated.
+
+If you make a mistake that leads to a **runtime error inside your component**, the Fast Refresh session will _also_ continue after you fix the error. In that case, React will remount your application using the updated code.
+
+If you have [error boundaries](https://reactjs.org/docs/error-boundaries.html) in your app (which is a good idea for graceful failures in production), they will retry rendering on the next edit after a redbox. In that sense, having an error boundary can prevent you from always getting kicked out to the root app screen. However, keep in mind that error boundaries shouldn't be _too_ granular. They are used by React in production, and should always be designed intentionally.
+
+## Limitations
+
+Fast Refresh tries to preserve local React state in the component you're editing, but only if it's safe to do so. Here's a few reasons why you might see local state being reset on every edit to a file:
+
+- Local state is not preserved for class components (only function components and Hooks preserve state).
+- The module you're editing might have _other_ exports in addition to a React component.
+- Sometimes, a module would export the result of calling higher-order component like `createNavigationContainer(MyScreen)`. If the returned component is a class, state will be reset.
+
+In the longer term, as more of your codebase moves to function components and Hooks, you can expect state to be preserved in more cases.
+
+## Tips
+
+- Fast Refresh preserves React local state in function components (and Hooks) by default.
+- Sometimes you might want to _force_ the state to be reset, and a component to be remounted. For example, this can be handy if you're tweaking an animation that only happens on mount. To do this, you can add `// @refresh reset` anywhere in the file you're editing. This directive is local to the file, and instructs Fast Refresh to remount components defined in that file on every edit.
+
+## Fast Refresh and Hooks
+
+When possible, Fast Refresh attempts to preserve the state of your component between edits. In particular, `useState` and `useRef` preserve their previous values as long as you don't change their arguments or the order of the Hook calls.
+
+Hooks with dependencies—such as `useEffect`, `useMemo`, and `useCallback`—will _always_ update during Fast Refresh. Their list of dependencies will be ignored while Fast Refresh is happening.
+
+For example, when you edit `useMemo(() => x * 2, [x])` to `useMemo(() => x * 10, [x])`, it will re-run even though `x` (the dependency) has not changed. If React didn't do that, your edit wouldn't reflect on the screen!
+
+Sometimes, this can lead to unexpected results. For example, even a `useEffect` with an empty array of dependencies would still re-run once during Fast Refresh. However, writing code resilient to an occasional re-running of `useEffect` is a good practice even without Fast Refresh. This makes it easier for you to later introduce new dependencies to it.
diff --git a/website/versioned_docs/version-0.73.0/flatlist.md b/website/versioned_docs/version-0.73.0/flatlist.md
new file mode 100644
index 00000000000..f3300038d34
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/flatlist.md
@@ -0,0 +1,863 @@
+---
+id: flatlist
+title: FlatList
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+A performant interface for rendering basic, flat lists, supporting the most handy features:
+
+- Fully cross-platform.
+- Optional horizontal mode.
+- Configurable viewability callbacks.
+- Header support.
+- Footer support.
+- Separator support.
+- Pull to Refresh.
+- Scroll loading.
+- ScrollToIndex support.
+- Multiple column support.
+
+If you need section support, use [``](sectionlist.md).
+
+## Example
+
+
+
+
+```SnackPlayer name=flatlist-simple&ext=js
+import React from 'react';
+import {
+ SafeAreaView,
+ View,
+ FlatList,
+ StyleSheet,
+ Text,
+ StatusBar,
+} from 'react-native';
+
+const DATA = [
+ {
+ id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
+ title: 'First Item',
+ },
+ {
+ id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
+ title: 'Second Item',
+ },
+ {
+ id: '58694a0f-3da1-471f-bd96-145571e29d72',
+ title: 'Third Item',
+ },
+];
+
+const Item = ({title}) => (
+
+ {title}
+
+);
+
+const App = () => {
+ return (
+
+ }
+ keyExtractor={item => item.id}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: StatusBar.currentHeight || 0,
+ },
+ item: {
+ backgroundColor: '#f9c2ff',
+ padding: 20,
+ marginVertical: 8,
+ marginHorizontal: 16,
+ },
+ title: {
+ fontSize: 32,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=flatlist-simple&ext=tsx
+import React from 'react';
+import {
+ SafeAreaView,
+ View,
+ FlatList,
+ StyleSheet,
+ Text,
+ StatusBar,
+} from 'react-native';
+
+const DATA = [
+ {
+ id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
+ title: 'First Item',
+ },
+ {
+ id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
+ title: 'Second Item',
+ },
+ {
+ id: '58694a0f-3da1-471f-bd96-145571e29d72',
+ title: 'Third Item',
+ },
+];
+
+type ItemProps = {title: string};
+
+const Item = ({title}: ItemProps) => (
+
+ {title}
+
+);
+
+const App = () => {
+ return (
+
+ }
+ keyExtractor={item => item.id}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: StatusBar.currentHeight || 0,
+ },
+ item: {
+ backgroundColor: '#f9c2ff',
+ padding: 20,
+ marginVertical: 8,
+ marginHorizontal: 16,
+ },
+ title: {
+ fontSize: 32,
+ },
+});
+
+export default App;
+```
+
+
+
+
+To render multiple columns, use the [`numColumns`](flatlist.md#numcolumns) prop. Using this approach instead of a `flexWrap` layout can prevent conflicts with the item height logic.
+
+More complex, selectable example below.
+
+- By passing `extraData={selectedId}` to `FlatList` we make sure `FlatList` itself will re-render when the state changes. Without setting this prop, `FlatList` would not know it needs to re-render any items because it is a `PureComponent` and the prop comparison will not show any changes.
+- `keyExtractor` tells the list to use the `id`s for the react keys instead of the default `key` property.
+
+
+
+
+```SnackPlayer name=flatlist-selectable&ext=js
+import React, {useState} from 'react';
+import {
+ FlatList,
+ SafeAreaView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+} from 'react-native';
+
+const DATA = [
+ {
+ id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
+ title: 'First Item',
+ },
+ {
+ id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
+ title: 'Second Item',
+ },
+ {
+ id: '58694a0f-3da1-471f-bd96-145571e29d72',
+ title: 'Third Item',
+ },
+];
+
+const Item = ({item, onPress, backgroundColor, textColor}) => (
+
+ {item.title}
+
+);
+
+const App = () => {
+ const [selectedId, setSelectedId] = useState();
+
+ const renderItem = ({item}) => {
+ const backgroundColor = item.id === selectedId ? '#6e3b6e' : '#f9c2ff';
+ const color = item.id === selectedId ? 'white' : 'black';
+
+ return (
+ setSelectedId(item.id)}
+ backgroundColor={backgroundColor}
+ textColor={color}
+ />
+ );
+ };
+
+ return (
+
+ item.id}
+ extraData={selectedId}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: StatusBar.currentHeight || 0,
+ },
+ item: {
+ padding: 20,
+ marginVertical: 8,
+ marginHorizontal: 16,
+ },
+ title: {
+ fontSize: 32,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=flatlist-selectable&ext=tsx
+import React, {useState} from 'react';
+import {
+ FlatList,
+ SafeAreaView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+} from 'react-native';
+
+type ItemData = {
+ id: string;
+ title: string;
+};
+
+const DATA: ItemData[] = [
+ {
+ id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
+ title: 'First Item',
+ },
+ {
+ id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
+ title: 'Second Item',
+ },
+ {
+ id: '58694a0f-3da1-471f-bd96-145571e29d72',
+ title: 'Third Item',
+ },
+];
+
+type ItemProps = {
+ item: ItemData;
+ onPress: () => void;
+ backgroundColor: string;
+ textColor: string;
+};
+
+const Item = ({item, onPress, backgroundColor, textColor}: ItemProps) => (
+
+ {item.title}
+
+);
+
+const App = () => {
+ const [selectedId, setSelectedId] = useState();
+
+ const renderItem = ({item}: {item: ItemData}) => {
+ const backgroundColor = item.id === selectedId ? '#6e3b6e' : '#f9c2ff';
+ const color = item.id === selectedId ? 'white' : 'black';
+
+ return (
+ setSelectedId(item.id)}
+ backgroundColor={backgroundColor}
+ textColor={color}
+ />
+ );
+ };
+
+ return (
+
+ item.id}
+ extraData={selectedId}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: StatusBar.currentHeight || 0,
+ },
+ item: {
+ padding: 20,
+ marginVertical: 8,
+ marginHorizontal: 16,
+ },
+ title: {
+ fontSize: 32,
+ },
+});
+
+export default App;
+```
+
+
+
+
+This is a convenience wrapper around [``](virtualizedlist.md), and thus inherits its props (as well as those of [``](scrollview.md)) that aren't explicitly listed here, along with the following caveats:
+
+- Internal state is not preserved when content scrolls out of the render window. Make sure all your data is captured in the item data or external stores like Flux, Redux, or Relay.
+- This is a `PureComponent` which means that it will not re-render if `props` remain shallow-equal. Make sure that everything your `renderItem` function depends on is passed as a prop (e.g. `extraData`) that is not `===` after updates, otherwise your UI may not update on changes. This includes the `data` prop and parent component state.
+- In order to constrain memory and enable smooth scrolling, content is rendered asynchronously offscreen. This means it's possible to scroll faster than the fill rate and momentarily see blank content. This is a tradeoff that can be adjusted to suit the needs of each application, and we are working on improving it behind the scenes.
+- By default, the list looks for a `key` prop on each item and uses that for the React key. Alternatively, you can provide a custom `keyExtractor` prop.
+
+---
+
+# Reference
+
+## Props
+
+### [VirtualizedList Props](virtualizedlist.md#props)
+
+Inherits [VirtualizedList Props](virtualizedlist.md#props).
+
+---
+
+###
Required
**`renderItem`**
+
+```tsx
+renderItem({
+ item: ItemT,
+ index: number,
+ separators: {
+ highlight: () => void;
+ unhighlight: () => void;
+ updateProps: (select: 'leading' | 'trailing', newProps: any) => void;
+ }
+}): JSX.Element;
+```
+
+Takes an item from `data` and renders it into the list.
+
+Provides additional metadata like `index` if you need it, as well as a more generic `separators.updateProps` function which let you set whatever props you want to change the rendering of either the leading separator or trailing separator in case the more common `highlight` and `unhighlight` (which set the `highlighted: boolean` prop) are insufficient for your use case.
+
+| Type |
+| -------- |
+| function |
+
+- `item` (Object): The item from `data` being rendered.
+- `index` (number): The index corresponding to this item in the `data` array.
+- `separators` (Object)
+ - `highlight` (Function)
+ - `unhighlight` (Function)
+ - `updateProps` (Function)
+ - `select` (enum('leading', 'trailing'))
+ - `newProps` (Object)
+
+Example usage:
+
+```tsx
+ (
+
+ ))
+ }
+ data={[{title: 'Title Text', key: 'item1'}]}
+ renderItem={({item, index, separators}) => (
+ this._onPress(item)}
+ onShowUnderlay={separators.highlight}
+ onHideUnderlay={separators.unhighlight}>
+
+ {item.title}
+
+
+ )}
+/>
+```
+
+---
+
+###
Required
**`data`**
+
+An array (or array-like list) of items to render. Other data types can be used by targetting [`VirtualizedList`](virtualizedlist.md) directly.
+
+| Type |
+| --------- |
+| ArrayLike |
+
+---
+
+### `ItemSeparatorComponent`
+
+Rendered in between each item, but not at the top or bottom. By default, `highlighted` and `leadingItem` props are provided. `renderItem` provides `separators.highlight`/`unhighlight` which will update the `highlighted` prop, but you can also add custom props with `separators.updateProps`. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ---------------------------- |
+| component, function, element |
+
+---
+
+### `ListEmptyComponent`
+
+Rendered when the list is empty. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `ListFooterComponent`
+
+Rendered at the bottom of all the items. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `ListFooterComponentStyle`
+
+Styling for internal View for `ListFooterComponent`.
+
+| Type |
+| ------------------------------ |
+| [View Style](view-style-props) |
+
+---
+
+### `ListHeaderComponent`
+
+Rendered at the top of all the items. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `ListHeaderComponentStyle`
+
+Styling for internal View for `ListHeaderComponent`.
+
+| Type |
+| ------------------------------ |
+| [View Style](view-style-props) |
+
+---
+
+### `columnWrapperStyle`
+
+Optional custom style for multi-item rows generated when `numColumns > 1`.
+
+| Type |
+| ------------------------------ |
+| [View Style](view-style-props) |
+
+---
+
+### `extraData`
+
+A marker property for telling the list to re-render (since it implements `PureComponent`). If any of your `renderItem`, Header, Footer, etc. functions depend on anything outside of the `data` prop, stick it here and treat it immutably.
+
+| Type |
+| ---- |
+| any |
+
+---
+
+### `getItemLayout`
+
+```tsx
+(data, index) => {length: number, offset: number, index: number}
+```
+
+`getItemLayout` is an optional optimization that allows skipping the measurement of dynamic content if you know the size (height or width) of items ahead of time. `getItemLayout` is efficient if you have fixed size items, for example:
+
+```tsx
+ getItemLayout={(data, index) => (
+ {length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
+ )}
+```
+
+Adding `getItemLayout` can be a great performance boost for lists of several hundred items. Remember to include separator length (height or width) in your offset calculation if you specify `ItemSeparatorComponent`.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `horizontal`
+
+If `true`, renders items next to each other horizontally instead of stacked vertically.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `initialNumToRender`
+
+How many items to render in the initial batch. This should be enough to fill the screen but not much more. Note these items will never be unmounted as part of the windowed rendering in order to improve perceived performance of scroll-to-top actions.
+
+| Type | Default |
+| ------ | ------- |
+| number | `10` |
+
+---
+
+### `initialScrollIndex`
+
+Instead of starting at the top with the first item, start at `initialScrollIndex`. This disables the "scroll to top" optimization that keeps the first `initialNumToRender` items always rendered and immediately renders the items starting at this initial index. Requires `getItemLayout` to be implemented.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `inverted`
+
+Reverses the direction of scroll. Uses scale transforms of `-1`.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `keyExtractor`
+
+```tsx
+(item: ItemT, index: number) => string;
+```
+
+Used to extract a unique key for a given item at the specified index. Key is used for caching and as the react key to track item re-ordering. The default extractor checks `item.key`, then `item.id`, and then falls back to using the index, like React does.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `numColumns`
+
+Multiple columns can only be rendered with `horizontal={false}` and will zig-zag like a `flexWrap` layout. Items should all be the same height - masonry layouts are not supported.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `onRefresh`
+
+```tsx
+() => void;
+```
+
+If provided, a standard RefreshControl will be added for "Pull to Refresh" functionality. Make sure to also set the `refreshing` prop correctly.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onViewableItemsChanged`
+
+Called when the viewability of rows changes, as defined by the `viewabilityConfig` prop.
+
+| Type |
+| ----------------------------------------------------------------------------------------------------- |
+| `md (callback: {changed: [ViewToken](viewtoken)[], viewableItems: [ViewToken](viewtoken)[]} => void;` |
+
+---
+
+### `progressViewOffset`
+
+Set this when offset is needed for the loading indicator to show correctly.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `refreshing`
+
+Set this true while waiting for new data from a refresh.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `removeClippedSubviews`
+
+This may improve scroll performance for large lists. On Android the default value is `true`.
+
+> Note: May have bugs (missing content) in some circumstances - use at your own risk.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `viewabilityConfig`
+
+See [`ViewabilityHelper.js`](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Lists/ViewabilityHelper.js) for flow type and further documentation.
+
+| Type |
+| ----------------- |
+| ViewabilityConfig |
+
+`viewabilityConfig` takes a type `ViewabilityConfig` an object with following properties
+
+| Property | Type |
+| -------------------------------- | ------- |
+| minimumViewTime | number |
+| viewAreaCoveragePercentThreshold | number |
+| itemVisiblePercentThreshold | number |
+| waitForInteraction | boolean |
+
+At least one of the `viewAreaCoveragePercentThreshold` or `itemVisiblePercentThreshold` is required. This needs to be done in the `constructor` to avoid following error ([ref](https://github.com/facebook/react-native/issues/17408)):
+
+```
+ Error: Changing viewabilityConfig on the fly is not supported
+```
+
+```tsx
+constructor (props) {
+ super(props)
+
+ this.viewabilityConfig = {
+ waitForInteraction: true,
+ viewAreaCoveragePercentThreshold: 95
+ }
+}
+```
+
+```tsx
+;
+```
+
+Provides a reference to the underlying scroll component
+
+---
+
+### `getScrollResponder()`
+
+```tsx
+getScrollResponder(): ScrollResponderMixin;
+```
+
+Provides a handle to the underlying scroll responder.
+
+---
+
+### `getScrollableNode()`
+
+```tsx
+getScrollableNode(): any;
+```
+
+Provides a handle to the underlying scroll node.
+
+### `scrollToEnd()`
+
+```tsx
+scrollToEnd(params?: {animated?: boolean});
+```
+
+Scrolls to the end of the content. May be janky without `getItemLayout` prop.
+
+**Parameters:**
+
+| Name | Type |
+| ------ | ------ |
+| params | object |
+
+Valid `params` keys are:
+
+- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`.
+
+---
+
+### `scrollToIndex()`
+
+```tsx
+scrollToIndex: (params: {
+ index: number;
+ animated?: boolean;
+ viewOffset?: number;
+ viewPosition?: number;
+});
+```
+
+Scrolls to the item at the specified index such that it is positioned in the viewable area such that `viewPosition` 0 places it at the top, 1 at the bottom, and 0.5 centered in the middle.
+
+> Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` prop.
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ------ |
+| params
Required
| object |
+
+Valid `params` keys are:
+
+- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`.
+- 'index' (number) - The index to scroll to. Required.
+- 'viewOffset' (number) - A fixed number of pixels to offset the final target position.
+- 'viewPosition' (number) - A value of `0` places the item specified by index at the top, `1` at the bottom, and `0.5` centered in the middle.
+
+---
+
+### `scrollToItem()`
+
+```tsx
+scrollToItem(params: {
+ animated?: ?boolean,
+ item: Item,
+ viewPosition?: number,
+});
+```
+
+Requires linear scan through data - use `scrollToIndex` instead if possible.
+
+> Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` prop.
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ------ |
+| params
Required
| object |
+
+Valid `params` keys are:
+
+- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`.
+- 'item' (object) - The item to scroll to. Required.
+- 'viewPosition' (number)
+
+---
+
+### `scrollToOffset()`
+
+```tsx
+scrollToOffset(params: {
+ offset: number;
+ animated?: boolean;
+});
+```
+
+Scroll to a specific content pixel offset in the list.
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ------ |
+| params
Required
| object |
+
+Valid `params` keys are:
+
+- 'offset' (number) - The offset to scroll to. In case of `horizontal` being true, the offset is the x-value, in any other case the offset is the y-value. Required.
+- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`.
diff --git a/website/versioned_docs/version-0.73.0/flexbox.md b/website/versioned_docs/version-0.73.0/flexbox.md
new file mode 100644
index 00000000000..a3d90da2c8e
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/flexbox.md
@@ -0,0 +1,2868 @@
+---
+id: flexbox
+title: Layout with Flexbox
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+A component can specify the layout of its children using the Flexbox algorithm. Flexbox is designed to provide a consistent layout on different screen sizes.
+
+You will normally use a combination of `flexDirection`, `alignItems`, and `justifyContent` to achieve the right layout.
+
+:::caution
+Flexbox works the same way in React Native as it does in CSS on the web, with a few exceptions.
+The defaults are different, with `flexDirection` defaulting to `column` instead of `row`, `alignContent` defaulting to `flex-start` instead of `stretch`, `flexShrink` defaulting to `0` instead of `1`, the `flex` parameter only supporting a single number.
+:::
+
+## Flex
+
+[`flex`](layout-props#flex) will define how your items are going to **“fill”** over the available space along your main axis. Space will be divided according to each element's flex property.
+
+In the following example, the red, orange, and green views are all children in the container view that has `flex: 1` set. The red view uses `flex: 1` , the orange view uses `flex: 2`, and the green view uses `flex: 3` . **1+2+3 = 6**, which means that the red view will get `1/6` of the space, the orange `2/6` of the space, and the green `3/6` of the space.
+
+```SnackPlayer name=Flex%20Example
+import React from 'react';
+import {StyleSheet, View} from 'react-native';
+
+const Flex = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 20,
+ },
+});
+
+export default Flex;
+```
+
+## Flex Direction
+
+[`flexDirection`](layout-props#flexdirection) controls the direction in which the children of a node are laid out. This is also referred to as the main axis. The cross axis is the axis perpendicular to the main axis, or the axis which the wrapping lines are laid out in.
+
+- `column` (**default value**) Align children from top to bottom. If wrapping is enabled, then the next line will start to the right of the first item on the top of the container.
+
+- `row` Align children from left to right. If wrapping is enabled, then the next line will start under the first item on the left of the container.
+
+- `column-reverse` Align children from bottom to top. If wrapping is enabled, then the next line will start to the right of the first item on the bottom of the container.
+
+- `row-reverse` Align children from right to left. If wrapping is enabled, then the next line will start under the first item on the right of the container.
+
+You can learn more [here](https://yogalayout.com/docs/flex-direction).
+
+
+
+
+```SnackPlayer name=Flex%20Direction&ext=js
+import React, {useState} from 'react';
+import {StyleSheet, Text, TouchableOpacity, View} from 'react-native';
+
+const FlexDirectionBasics = () => {
+ const [flexDirection, setflexDirection] = useState('column');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default FlexDirectionBasics;
+```
+
+
+
+
+```SnackPlayer name=Flex%20Direction&ext=tsx
+import React, {useState} from 'react';
+import {StyleSheet, Text, TouchableOpacity, View} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const FlexDirectionBasics = () => {
+ const [flexDirection, setflexDirection] = useState('column');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default FlexDirectionBasics;
+```
+
+
+
+
+## Layout Direction
+
+Layout [`direction`](layout-props#direction) specifies the direction in which children and text in a hierarchy should be laid out. Layout direction also affects what edge `start` and `end` refer to. By default, React Native lays out with LTR layout direction. In this mode `start` refers to left and `end` refers to right.
+
+- `LTR` (**default value**) Text and children are laid out from left to right. Margin and padding applied to the start of an element are applied on the left side.
+
+- `RTL` Text and children are laid out from right to left. Margin and padding applied to the start of an element are applied on the right side.
+
+
+
+
+```SnackPlayer name=Flex%20Direction&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const DirectionLayout = () => {
+ const [direction, setDirection] = useState('ltr');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default DirectionLayout;
+```
+
+
+
+
+```SnackPlayer name=Flex%20Direction&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const DirectionLayout = () => {
+ const [direction, setDirection] = useState('ltr');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default DirectionLayout;
+```
+
+
+
+
+## Justify Content
+
+[`justifyContent`](layout-props#justifycontent) describes how to align children within the main axis of their container. For example, you can use this property to center a child horizontally within a container with `flexDirection` set to `row` or vertically within a container with `flexDirection` set to `column`.
+
+- `flex-start`(**default value**) Align children of a container to the start of the container's main axis.
+
+- `flex-end` Align children of a container to the end of the container's main axis.
+
+- `center` Align children of a container in the center of the container's main axis.
+
+- `space-between` Evenly space off children across the container's main axis, distributing the remaining space between the children.
+
+- `space-around` Evenly space off children across the container's main axis, distributing the remaining space around the children. Compared to `space-between`, using `space-around` will result in space being distributed to the beginning of the first child and end of the last child.
+
+- `space-evenly` Evenly distribute children within the alignment container along the main axis. The spacing between each pair of adjacent items, the main-start edge and the first item, and the main-end edge and the last item, are all exactly the same.
+
+You can learn more [here](https://yogalayout.com/docs/justify-content).
+
+
+
+
+```SnackPlayer name=Justify%20Content&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const JustifyContentBasics = () => {
+ const [justifyContent, setJustifyContent] = useState('flex-start');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default JustifyContentBasics;
+```
+
+
+
+
+```SnackPlayer name=Justify%20Content&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const JustifyContentBasics = () => {
+ const [justifyContent, setJustifyContent] = useState('flex-start');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default JustifyContentBasics;
+```
+
+
+
+
+## Align Items
+
+[`alignItems`](layout-props#alignitems) describes how to align children along the cross axis of their container. It is very similar to `justifyContent` but instead of applying to the main axis, `alignItems` applies to the cross axis.
+
+- `stretch` (**default value**) Stretch children of a container to match the `height` of the container's cross axis.
+
+- `flex-start` Align children of a container to the start of the container's cross axis.
+
+- `flex-end` Align children of a container to the end of the container's cross axis.
+
+- `center` Align children of a container in the center of the container's cross axis.
+
+- `baseline` Align children of a container along a common baseline. Individual children can be set to be the reference baseline for their parents.
+
+:::info
+For `stretch` to have an effect, children must not have a fixed dimension along the secondary axis. In the following example, setting `alignItems: stretch` does nothing until the `width: 50` is removed from the children.
+:::
+
+You can learn more [here](https://yogalayout.com/docs/align-items).
+
+
+
+
+```SnackPlayer name=Align%20Items&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const AlignItemsLayout = () => {
+ const [alignItems, setAlignItems] = useState('stretch');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignItemsLayout;
+```
+
+
+
+
+```SnackPlayer name=Align%20Items&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const AlignItemsLayout = () => {
+ const [alignItems, setAlignItems] = useState('stretch');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignItemsLayout;
+```
+
+
+
+
+## Align Self
+
+[`alignSelf`](layout-props#alignself) has the same options and effect as `alignItems` but instead of affecting the children within a container, you can apply this property to a single child to change its alignment within its parent. `alignSelf` overrides any option set by the parent with `alignItems`.
+
+
+
+
+```SnackPlayer name=Align%20Self&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const AlignSelfLayout = () => {
+ const [alignSelf, setAlignSelf] = useState('stretch');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignSelfLayout;
+```
+
+
+
+
+```SnackPlayer name=Align%20Self&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+import type {FlexAlignType} from 'react-native';
+
+const AlignSelfLayout = () => {
+ const [alignSelf, setAlignSelf] = useState('stretch');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: FlexAlignType[];
+ selectedValue: string;
+ setSelectedValue: (value: FlexAlignType) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignSelfLayout;
+```
+
+
+
+
+## Align Content
+
+[alignContent](layout-props#aligncontent) defines the distribution of lines along the cross-axis. This only has effect when items are wrapped to multiple lines using `flexWrap`.
+
+- `flex-start` (**default value**) Align wrapped lines to the start of the container's cross axis.
+
+- `flex-end` Align wrapped lines to the end of the container's cross axis.
+
+- `stretch` (_default value when using Yoga on the web_) Stretch wrapped lines to match the height of the container's cross axis.
+
+- `center` Align wrapped lines in the center of the container's cross axis.
+
+- `space-between` Evenly space wrapped lines across the container's cross axis, distributing the remaining space between the lines.
+
+- `space-around` Evenly space wrapped lines across the container's cross axis, distributing the remaining space around the lines. Compared to `space-between`, using `space-around` will result in space being distributed to the beginning of the first line and the end of the last line.
+
+You can learn more [here](https://yogalayout.com/docs/align-content).
+
+
+
+
+```SnackPlayer name=Align%20Content&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const AlignContentLayout = () => {
+ const [alignContent, setAlignContent] = useState('flex-start');
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ flexWrap: 'wrap',
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignContentLayout;
+```
+
+
+
+
+```SnackPlayer name=Align%20Content&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const AlignContentLayout = () => {
+ const [alignContent, setAlignContent] = useState('flex-start');
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ flexWrap: 'wrap',
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default AlignContentLayout;
+```
+
+
+
+
+## Flex Wrap
+
+The [`flexWrap`](layout-props#flexwrap) property is set on containers and it controls what happens when children overflow the size of the container along the main axis. By default, children are forced into a single line (which can shrink elements). If wrapping is allowed, items are wrapped into multiple lines along the main axis if needed.
+
+When wrapping lines, `alignContent` can be used to specify how the lines are placed in the container. Learn more [here](https://yogalayout.com/docs/flex-wrap).
+
+
+
+
+```SnackPlayer name=Flex%20Wrap&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const FlexWrapLayout = () => {
+ const [flexWrap, setFlexWrap] = useState('wrap');
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default FlexWrapLayout;
+```
+
+
+
+
+```SnackPlayer name=Flex%20Wrap&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const FlexWrapLayout = () => {
+ const [flexWrap, setFlexWrap] = useState('wrap');
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: string[];
+ selectedValue: string;
+ setSelectedValue: (value: string) => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default FlexWrapLayout;
+```
+
+
+
+
+## Flex Basis, Grow, and Shrink
+
+- [`flexBasis`](layout-props#flexbasis) is an axis-independent way of providing the default size of an item along the main axis. Setting the `flexBasis` of a child is similar to setting the `width` of that child if its parent is a container with `flexDirection: row` or setting the `height` of a child if its parent is a container with `flexDirection: column`. The `flexBasis` of an item is the default size of that item, the size of the item before any `flexGrow` and `flexShrink` calculations are performed.
+
+- [`flexGrow`](layout-props#flexgrow) describes how much space within a container should be distributed among its children along the main axis. After laying out its children, a container will distribute any remaining space according to the flex grow values specified by its children.
+
+ `flexGrow` accepts any floating point value >= 0, with 0 being the default value. A container will distribute any remaining space among its children weighted by the children’s `flexGrow` values.
+
+- [`flexShrink`](layout-props#flexshrink) describes how to shrink children along the main axis in the case in which the total size of the children overflows the size of the container on the main axis. `flexShrink` is very similar to `flexGrow` and can be thought of in the same way if any overflowing size is considered to be negative remaining space. These two properties also work well together by allowing children to grow and shrink as needed.
+
+ `flexShrink` accepts any floating point value >= 0, with 0 being the default value (on the web, the default is 1). A container will shrink its children weighted by the children’s `flexShrink` values.
+
+You can learn more [here](https://yogalayout.com/docs/flex).
+
+
+
+
+```SnackPlayer name=Flex%20Basis%2C%20Grow%2C%20and%20Shrink&ext=js
+import React, {useState} from 'react';
+import {View, Text, TextInput, StyleSheet} from 'react-native';
+
+const App = () => {
+ const [powderblue, setPowderblue] = useState({
+ flexGrow: 0,
+ flexShrink: 1,
+ flexBasis: 'auto',
+ });
+ const [skyblue, setSkyblue] = useState({
+ flexGrow: 1,
+ flexShrink: 0,
+ flexBasis: 100,
+ });
+ const [steelblue, setSteelblue] = useState({
+ flexGrow: 0,
+ flexShrink: 1,
+ flexBasis: 200,
+ });
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const BoxInfo = ({color, flexBasis, flexShrink, setStyle, flexGrow}) => (
+
+
+
+ Box
+
+
+ flexBasis
+
+ setStyle(value => ({
+ ...value,
+ flexBasis: isNaN(parseInt(fB, 10)) ? 'auto' : parseInt(fB, 10),
+ }))
+ }
+ />
+ flexShrink
+
+ setStyle(value => ({
+ ...value,
+ flexShrink: isNaN(parseInt(fS, 10)) ? undefined : parseInt(fS, 10),
+ }))
+ }
+ />
+ flexGrow
+
+ setStyle(value => ({
+ ...value,
+ flexGrow: isNaN(parseInt(fG, 10)) ? undefined : parseInt(fG, 10),
+ }))
+ }
+ />
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingHorizontal: 10,
+ },
+ box: {
+ flex: 1,
+ height: 50,
+ width: 50,
+ },
+ boxLabel: {
+ minWidth: 80,
+ padding: 8,
+ borderRadius: 4,
+ marginTop: 8,
+ },
+ label: {
+ marginTop: 6,
+ fontSize: 16,
+ fontWeight: '100',
+ },
+ previewContainer: {
+ flex: 1,
+ flexDirection: 'row',
+ backgroundColor: 'aliceblue',
+ },
+ row: {
+ flex: 1,
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ alignItems: 'center',
+ marginBottom: 10,
+ },
+ input: {
+ borderBottomWidth: 1,
+ paddingVertical: 3,
+ width: 50,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Flex%20Basis%2C%20Grow%2C%20and%20Shrink&ext=tsx
+import React, {useState} from 'react';
+import {View, Text, TextInput, StyleSheet} from 'react-native';
+import type {ViewStyle} from 'react-native';
+
+const App = () => {
+ const [powderblue, setPowderblue] = useState({
+ flexGrow: 0,
+ flexShrink: 1,
+ flexBasis: 'auto',
+ });
+ const [skyblue, setSkyblue] = useState({
+ flexGrow: 1,
+ flexShrink: 0,
+ flexBasis: 100,
+ });
+ const [steelblue, setSteelblue] = useState({
+ flexGrow: 0,
+ flexShrink: 1,
+ flexBasis: 200,
+ });
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+type BoxInfoProps = ViewStyle & {
+ color: string;
+ setStyle: React.Dispatch>;
+};
+
+const BoxInfo = ({
+ color,
+ flexBasis,
+ flexShrink,
+ setStyle,
+ flexGrow,
+}: BoxInfoProps) => (
+
+
+
+ Box
+
+
+ flexBasis
+
+ setStyle(value => ({
+ ...value,
+ flexBasis: isNaN(parseInt(fB, 10)) ? 'auto' : parseInt(fB, 10),
+ }))
+ }
+ />
+ flexShrink
+
+ setStyle(value => ({
+ ...value,
+ flexShrink: isNaN(parseInt(fS, 10)) ? undefined : parseInt(fS, 10),
+ }))
+ }
+ />
+ flexGrow
+
+ setStyle(value => ({
+ ...value,
+ flexGrow: isNaN(parseInt(fG, 10)) ? undefined : parseInt(fG, 10),
+ }))
+ }
+ />
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingHorizontal: 10,
+ },
+ box: {
+ flex: 1,
+ height: 50,
+ width: 50,
+ },
+ boxLabel: {
+ minWidth: 80,
+ padding: 8,
+ borderRadius: 4,
+ marginTop: 8,
+ },
+ label: {
+ marginTop: 6,
+ fontSize: 16,
+ fontWeight: '100',
+ },
+ previewContainer: {
+ flex: 1,
+ flexDirection: 'row',
+ backgroundColor: 'aliceblue',
+ },
+ row: {
+ flex: 1,
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ alignItems: 'center',
+ marginBottom: 10,
+ },
+ input: {
+ borderBottomWidth: 1,
+ paddingVertical: 3,
+ width: 50,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+## Row Gap, Column Gap and Gap
+
+- [`rowGap`](layout-props#rowgap) sets the size of the gap (gutter) between an element's rows.
+
+- [`columnGap`](layout-props#columngap) sets the size of the gap (gutter) between an element's columns.
+
+- [`gap`](layout-props#gap) sets the size of the gap (gutter) between rows and columns. It is a shorthand for `rowGap` and `columnGap`.
+
+You can use `flexWrap` and `alignContent` alongwith `gap` to add consistent spacing between items.
+
+
+
+
+```SnackPlayer name=Row%20Gap%20and%20Column%20Gap&ext=js
+import React, {useState} from 'react';
+import {View, Text, StyleSheet, TextInput} from 'react-native';
+
+const RowGapAndColumnGap = () => {
+ const [rowGap, setRowGap] = useState(10);
+ const [columnGap, setColumnGap] = useState(10);
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ children,
+ handleColumnGapChange,
+ handleRowGapChange,
+ rowGap,
+ columnGap,
+}) => (
+
+
+
+ Row Gap
+ handleRowGapChange(Number(v))}
+ />
+
+
+ Column Gap
+ handleColumnGapChange(Number(v))}
+ />
+
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ itemsCenter: {alignItems: 'center'},
+ inputContainer: {
+ gap: 4,
+ flexDirection: 'row',
+ justifyContent: 'space-around',
+ },
+ previewContainer: {padding: 10, flex: 1},
+ input: {
+ borderBottomWidth: 1,
+ paddingVertical: 3,
+ width: 50,
+ textAlign: 'center',
+ },
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ flexWrap: 'wrap',
+ alignContent: 'flex-start',
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ box1: {
+ backgroundColor: 'orangered',
+ },
+ box2: {
+ backgroundColor: 'orange',
+ },
+ box3: {
+ backgroundColor: 'mediumseagreen',
+ },
+ box4: {
+ backgroundColor: 'deepskyblue',
+ },
+ box5: {
+ backgroundColor: 'mediumturquoise',
+ },
+});
+
+export default RowGapAndColumnGap;
+```
+
+
+
+
+```SnackPlayer name=Row%20Gap%20and%20Column%20Gap&ext=tsx
+import React, {useState} from 'react';
+import {View, Text, StyleSheet, TextInput} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const RowGapAndColumnGap = () => {
+ const [rowGap, setRowGap] = useState(10);
+ const [columnGap, setColumnGap] = useState(10);
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ columnGap: number;
+ handleColumnGapChange: (gap: number) => void;
+ rowGap: number;
+ handleRowGapChange: (gap: number) => void;
+}>;
+
+const PreviewLayout = ({
+ children,
+ handleColumnGapChange,
+ handleRowGapChange,
+ rowGap,
+ columnGap,
+}: PreviewLayoutProps) => (
+
+
+
+ Row Gap
+ handleRowGapChange(Number(v))}
+ />
+
+
+ Column Gap
+ handleColumnGapChange(Number(v))}
+ />
+
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ itemsCenter: {alignItems: 'center'},
+ inputContainer: {
+ gap: 4,
+ flexDirection: 'row',
+ justifyContent: 'space-around',
+ },
+ previewContainer: {padding: 10, flex: 1},
+ input: {
+ borderBottomWidth: 1,
+ paddingVertical: 3,
+ width: 50,
+ textAlign: 'center',
+ },
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ maxHeight: 400,
+ flexWrap: 'wrap',
+ alignContent: 'flex-start',
+ },
+ box: {
+ width: 50,
+ height: 80,
+ },
+ box1: {
+ backgroundColor: 'orangered',
+ },
+ box2: {
+ backgroundColor: 'orange',
+ },
+ box3: {
+ backgroundColor: 'mediumseagreen',
+ },
+ box4: {
+ backgroundColor: 'deepskyblue',
+ },
+ box5: {
+ backgroundColor: 'mediumturquoise',
+ },
+});
+
+export default RowGapAndColumnGap;
+```
+
+
+
+
+## Width and Height
+
+The `width` property specifies the width of an element's content area. Similarly, the `height` property specifies the height of an element's content area.
+
+Both `width` and `height` can take the following values:
+
+- `auto` (**default value**) React Native calculates the width/height for the element based on its content, whether that is other children, text, or an image.
+
+- `pixels` Defines the width/height in absolute pixels. Depending on other styles set on the component, this may or may not be the final dimension of the node.
+
+- `percentage` Defines the width or height in percentage of its parent's width or height, respectively.
+
+
+
+
+```SnackPlayer name=Width%20and%20Height&ext=js
+import React, {useState} from 'react';
+import {
+ View,
+ SafeAreaView,
+ TouchableOpacity,
+ Text,
+ StyleSheet,
+} from 'react-native';
+
+const WidthHeightBasics = () => {
+ const [widthType, setWidthType] = useState('auto');
+ const [heightType, setHeightType] = useState('auto');
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ children,
+ widthType,
+ heightType,
+ widthValues,
+ heightValues,
+ setWidthType,
+ setHeightType,
+}) => (
+
+
+ width
+ {widthValues.map(value => (
+ setWidthType(value)}
+ style={[styles.button, widthType === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+
+ height
+ {heightValues.map(value => (
+ setHeightType(value)}
+ style={[styles.button, heightType === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ padding: 8,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginRight: 10,
+ marginBottom: 10,
+ },
+ selected: {
+ backgroundColor: 'coral',
+ shadowOpacity: 0,
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default WidthHeightBasics;
+```
+
+
+
+
+```SnackPlayer name=Width%20and%20Height&ext=tsx
+import React, {useState} from 'react';
+import {
+ View,
+ SafeAreaView,
+ TouchableOpacity,
+ Text,
+ StyleSheet,
+} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+type Dimension = 'auto' | `${number}%` | number;
+
+const WidthHeightBasics = () => {
+ const [widthType, setWidthType] = useState('auto');
+ const [heightType, setHeightType] = useState('auto');
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ widthType: Dimension;
+ heightType: Dimension;
+ widthValues: Dimension[];
+ heightValues: Dimension[];
+ setWidthType: (value: Dimension) => void;
+ setHeightType: (value: Dimension) => void;
+}>;
+
+const PreviewLayout = ({
+ children,
+ widthType,
+ heightType,
+ widthValues,
+ heightValues,
+ setWidthType,
+ setHeightType,
+}: PreviewLayoutProps) => (
+
+
+ width
+ {widthValues.map(value => (
+ setWidthType(value)}
+ style={[styles.button, widthType === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+
+ height
+ {heightValues.map(value => (
+ setHeightType(value)}
+ style={[styles.button, heightType === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ padding: 8,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginRight: 10,
+ marginBottom: 10,
+ },
+ selected: {
+ backgroundColor: 'coral',
+ shadowOpacity: 0,
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default WidthHeightBasics;
+```
+
+
+
+
+## Absolute & Relative Layout
+
+The `position` type of an element defines how it is positioned within its parent.
+
+- `relative` (**default value**) By default, an element is positioned relatively. This means an element is positioned according to the normal flow of the layout, and then offset relative to that position based on the values of `top`, `right`, `bottom`, and `left`. The offset does not affect the position of any sibling or parent elements.
+
+- `absolute` When positioned absolutely, an element doesn't take part in the normal layout flow. It is instead laid out independent of its siblings. The position is determined based on the `top`, `right`, `bottom`, and `left` values.
+
+
+
+
+```SnackPlayer name=Absolute%20%26%20Relative%20Layout&ext=js
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+
+const PositionLayout = () => {
+ const [position, setPosition] = useState('relative');
+
+ return (
+
+
+
+
+
+ );
+};
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default PositionLayout;
+```
+
+
+
+
+```SnackPlayer name=Absolute%20%26%20Relative%20Layout&ext=tsx
+import React, {useState} from 'react';
+import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
+import type {PropsWithChildren} from 'react';
+
+const PositionLayout = () => {
+ const [position, setPosition] = useState<'relative' | 'absolute'>('relative');
+
+ return (
+
+
+
+
+
+ );
+};
+
+type PreviewLayoutProps = PropsWithChildren<{
+ label: string;
+ values: Array<'relative' | 'absolute'>;
+ selectedValue: string;
+ setSelectedValue: (value: 'relative' | 'absolute') => void;
+}>;
+
+const PreviewLayout = ({
+ label,
+ children,
+ values,
+ selectedValue,
+ setSelectedValue,
+}: PreviewLayoutProps) => (
+
+ {label}
+
+ {values.map(value => (
+ setSelectedValue(value)}
+ style={[styles.button, selectedValue === value && styles.selected]}>
+
+ {value}
+
+
+ ))}
+
+ {children}
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 8,
+ backgroundColor: 'aliceblue',
+ minHeight: 200,
+ },
+ box: {
+ width: 50,
+ height: 50,
+ },
+ row: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ button: {
+ paddingHorizontal: 8,
+ paddingVertical: 6,
+ borderRadius: 4,
+ backgroundColor: 'oldlace',
+ alignSelf: 'flex-start',
+ marginHorizontal: '1%',
+ marginBottom: 6,
+ minWidth: '48%',
+ textAlign: 'center',
+ },
+ selected: {
+ backgroundColor: 'coral',
+ borderWidth: 0,
+ },
+ buttonLabel: {
+ fontSize: 12,
+ fontWeight: '500',
+ color: 'coral',
+ },
+ selectedLabel: {
+ color: 'white',
+ },
+ label: {
+ textAlign: 'center',
+ marginBottom: 10,
+ fontSize: 24,
+ },
+});
+
+export default PositionLayout;
+```
+
+
+
+
+## Going Deeper
+
+Check out the interactive [yoga playground](https://yogalayout.com/playground) that you can use to get a better understanding of flexbox.
+
+We've covered the basics, but there are many other styles you may need for layouts. The full list of props that control layout is documented [here](./layout-props.md).
+
+Additionally, you can see some examples from [Wix Engineers](https://medium.com/wix-engineering/the-full-react-native-layout-cheat-sheet-a4147802405c).
diff --git a/website/versioned_docs/version-0.73.0/gesture-responder-system.md b/website/versioned_docs/version-0.73.0/gesture-responder-system.md
new file mode 100644
index 00000000000..e30fc80373c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/gesture-responder-system.md
@@ -0,0 +1,66 @@
+---
+id: gesture-responder-system
+title: Gesture Responder System
+---
+
+The gesture responder system manages the lifecycle of gestures in your app. A touch can go through several phases as the app determines what the user's intention is. For example, the app needs to determine if the touch is scrolling, sliding on a widget, or tapping. This can even change during the duration of a touch. There can also be multiple simultaneous touches.
+
+The touch responder system is needed to allow components to negotiate these touch interactions without any additional knowledge about their parent or child components.
+
+### Best Practices
+
+To make your app feel great, every action should have the following attributes:
+
+- Feedback/highlighting- show the user what is handling their touch, and what will happen when they release the gesture
+- Cancel-ability- when making an action, the user should be able to abort it mid-touch by dragging their finger away
+
+These features make users more comfortable while using an app, because it allows people to experiment and interact without fear of making mistakes.
+
+### TouchableHighlight and Touchable\*
+
+The responder system can be complicated to use. So we have provided an abstract `Touchable` implementation for things that should be "tappable". This uses the responder system and allows you to configure tap interactions declaratively. Use `TouchableHighlight` anywhere where you would use a button or link on web.
+
+## Responder Lifecycle
+
+A view can become the touch responder by implementing the correct negotiation methods. There are two methods to ask the view if it wants to become responder:
+
+- `View.props.onStartShouldSetResponder: evt => true,` - Does this view want to become responder on the start of a touch?
+- `View.props.onMoveShouldSetResponder: evt => true,` - Called for every touch move on the View when it is not the responder: does this view want to "claim" touch responsiveness?
+
+If the View returns true and attempts to become the responder, one of the following will happen:
+
+- `View.props.onResponderGrant: evt => {}` - The View is now responding for touch events. This is the time to highlight and show the user what is happening
+- `View.props.onResponderReject: evt => {}` - Something else is the responder right now and will not release it
+
+If the view is responding, the following handlers can be called:
+
+- `View.props.onResponderMove: evt => {}` - The user is moving their finger
+- `View.props.onResponderRelease: evt => {}` - Fired at the end of the touch, ie "touchUp"
+- `View.props.onResponderTerminationRequest: evt => true` - Something else wants to become responder. Should this view release the responder? Returning true allows release
+- `View.props.onResponderTerminate: evt => {}` - The responder has been taken from the View. Might be taken by other views after a call to `onResponderTerminationRequest`, or might be taken by the OS without asking (happens with control center/ notification center on iOS)
+
+`evt` is a synthetic touch event with the following form:
+
+- `nativeEvent`
+ - `changedTouches` - Array of all touch events that have changed since the last event
+ - `identifier` - The ID of the touch
+ - `locationX` - The X position of the touch, relative to the element
+ - `locationY` - The Y position of the touch, relative to the element
+ - `pageX` - The X position of the touch, relative to the root element
+ - `pageY` - The Y position of the touch, relative to the root element
+ - `target` - The node id of the element receiving the touch event
+ - `timestamp` - A time identifier for the touch, useful for velocity calculation
+ - `touches` - Array of all current touches on the screen
+
+### Capture ShouldSet Handlers
+
+`onStartShouldSetResponder` and `onMoveShouldSetResponder` are called with a bubbling pattern, where the deepest node is called first. That means that the deepest component will become responder when multiple Views return true for `*ShouldSetResponder` handlers. This is desirable in most cases, because it makes sure all controls and buttons are usable.
+
+However, sometimes a parent will want to make sure that it becomes responder. This can be handled by using the capture phase. Before the responder system bubbles up from the deepest component, it will do a capture phase, firing `on*ShouldSetResponderCapture`. So if a parent View wants to prevent the child from becoming responder on a touch start, it should have a `onStartShouldSetResponderCapture` handler which returns true.
+
+- `View.props.onStartShouldSetResponderCapture: evt => true,`
+- `View.props.onMoveShouldSetResponderCapture: evt => true,`
+
+### PanResponder
+
+For higher-level gesture interpretation, check out [PanResponder](panresponder.md).
diff --git a/website/versioned_docs/version-0.73.0/getting-started.md b/website/versioned_docs/version-0.73.0/getting-started.md
new file mode 100644
index 00000000000..07fad84c79a
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/getting-started.md
@@ -0,0 +1,168 @@
+---
+id: environment-setup
+title: Setting up the development environment
+hide_table_of_contents: true
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+import GuideLinuxAndroid from './\_getting-started-linux-android.md'; import GuideMacOSAndroid from './\_getting-started-macos-android.md'; import GuideWindowsAndroid from './\_getting-started-windows-android.md'; import GuideMacOSIOS from './\_getting-started-macos-ios.md';
+
+This page will help you install and build your first React Native app.
+
+**If you are new to mobile development**, the easiest way to get started is with Expo Go. Expo is a set of tools and services built around React Native and, while it has many [features](https://docs.expo.dev), the most relevant feature for us right now is that it can get you writing a React Native app within minutes. You will only need a recent version of Node.js and a phone or emulator. If you'd like to try out React Native directly in your web browser before installing any tools, you can try out [Snack](https://snack.expo.dev/).
+
+**If you are already familiar with mobile development**, you may want to use React Native CLI. It requires Xcode or Android Studio to get started. If you already have one of these tools installed, you should be able to get up and running within a few minutes. If they are not installed, you should expect to spend about an hour installing and configuring them.
+
+
+
+
+Run the following command to create a new React Native project called "AwesomeProject":
+
+
+
+
+```shell
+npx create-expo-app AwesomeProject
+
+cd AwesomeProject
+npx expo start
+```
+
+
+
+
+```shell
+yarn create expo-app AwesomeProject
+
+cd AwesomeProject
+yarn expo start
+```
+
+
+
+
+This will start a development server for you.
+
+
Running your React Native application
+
+Install the [Expo Go](https://expo.dev/client) app on your iOS or Android phone and connect to the same wireless network as your computer. On Android, use the Expo Go app to scan the QR code from your terminal to open your project. On iOS, use the built-in QR code scanner of the default iOS Camera app.
+
+
Modifying your app
+
+Now that you have successfully run the app, let's modify it. Open `App.js` in your text editor of choice and edit some lines. The application should reload automatically once you save your changes.
+
+
That's it!
+
+Congratulations! You've successfully run and modified your first React Native app.
+
+
+
+
Now what?
+
+Expo also has [docs](https://docs.expo.dev) you can reference if you have questions specific to the tool. You can also ask for help on the [Expo Discord](https://chat.expo.dev).
+
+If you have a problem with Expo, before creating a new issue, please see if there's an existing issue about it in the [Expo issues](https://github.com/expo/expo/issues).
+
+If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).
+
+
Running your app on a simulator or virtual device
+
+Expo Go allows you to run your React Native app on a physical device without installing iOS and Android native SDKs. If you want to run your app on the iOS Simulator or an Android Virtual Device, please refer to the instructions for "React Native CLI Quickstart" to learn how to install Xcode or set up your Android development environment.
+
+Once you've set these up, you can launch your app on an Android Virtual Device by running `npm run android`, or on the iOS Simulator by running `npm run ios` (macOS only).
+
+
Caveats
+
+The Expo Go app is a great tool to get started — it exists to help developers quickly get projects off the ground, to experiment with ideas (such as on [Snack](https://snack.expo.dev/)) and share their work with minimal friction. Expo Go makes this possible by including a feature-rich native runtime made up of every module in the [Expo SDK](https://docs.expo.dev/versions/latest/), so all you need to do to use a module is install the package with `npx expo install` and reload your app.
+
+The tradeoff is that the Expo Go app does not allow you to add custom native code — you can only use native modules built into the Expo SDK. There are many great libraries available outside of the Expo SDK, and you may even want to build your own native library. You can leverage these libraries with [development builds](https://docs.expo.dev/develop/development-builds/introduction/), or by using ["prebuild"](https://docs.expo.dev/workflow/prebuild/) to generate the native projects, or both. [Learn more about adding native code to projects created with `create-expo-app`](https://docs.expo.dev/workflow/customizing/).
+
+`create-expo-app` configures your project to use the most recent React Native version that is supported by the Expo SDK. The Expo Go app usually gains support for a given React Native version with new SDK versions (released quarterly). You can check [this document](https://docs.expo.dev/versions/latest/#each-expo-sdk-version-depends-on-a) to find out what versions are supported.
+
+If you're integrating React Native into an existing project, [you can use the Expo SDK](https://docs.expo.dev/bare/installing-expo-modules/) and [development builds](https://docs.expo.dev/develop/development-builds/introduction/), but you will need to set up a native development environment. Select "React Native CLI Quickstart" above for instructions on configuring a native build environment for React Native.
+
+
+
+
+
Follow these instructions if you need to build native code in your project. For example, if you are integrating React Native into an existing application, or if you ran "prebuild" from Expo to generate your project's native code, you'll need this section.
+
+The instructions are a bit different depending on your development operating system, and whether you want to start developing for iOS or Android. If you want to develop for both Android and iOS, that's fine - you can pick one to start with, since the setup is a bit different.
+
+#### Development OS
+
+
+
+
+#### Target OS
+
+
+
+
+[//]: # 'macOS, Android'
+
+
+
+
+
+
+[//]: # 'macOS, iOS'
+
+
+
+
+
+
+
+
+
+#### Target OS
+
+
+
+
+[//]: # 'Windows, Android'
+
+
+
+
+
+
+[//]: # 'Windows, iOS'
+
+## Unsupported
+
+> A Mac is required to build projects with native code for iOS. You can follow the **Expo Go Quickstart** to learn how to build your app using Expo instead.
+
+
+
+
+
+
+
+#### Target OS
+
+
+
+
+[//]: # 'Linux, Android'
+
+
+
+
+
+
+[//]: # 'Linux, iOS'
+
+## Unsupported
+
+> A Mac is required to build projects with native code for iOS. You can follow the **Expo Go Quickstart** to learn how to build your app using Expo instead.
+
+
+
+
+
+
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/handling-text-input.md b/website/versioned_docs/version-0.73.0/handling-text-input.md
new file mode 100644
index 00000000000..532f051c799
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/handling-text-input.md
@@ -0,0 +1,41 @@
+---
+id: handling-text-input
+title: Handling Text Input
+---
+
+[`TextInput`](textinput#content) is a [Core Component](intro-react-native-components) that allows the user to enter text. It has an `onChangeText` prop that takes a function to be called every time the text changed, and an `onSubmitEditing` prop that takes a function to be called when the text is submitted.
+
+For example, let's say that as the user types, you're translating their words into a different language. In this new language, every single word is written the same way: 🍕. So the sentence "Hello there Bob" would be translated as "🍕 🍕 🍕".
+
+```SnackPlayer name=Handling%20Text%20Input
+import React, {useState} from 'react';
+import {Text, TextInput, View} from 'react-native';
+
+const PizzaTranslator = () => {
+ const [text, setText] = useState('');
+ return (
+
+ setText(newText)}
+ defaultValue={text}
+ />
+
+ {text
+ .split(' ')
+ .map(word => word && '🍕')
+ .join(' ')}
+
+
+ );
+};
+
+export default PizzaTranslator;
+```
+
+In this example, we store `text` in the state, because it changes over time.
+
+There are a lot more things you might want to do with a text input. For example, you could validate the text inside while the user types. For more detailed examples, see the [React docs on controlled components](https://react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable), or the [reference docs for TextInput](textinput.md).
+
+Text input is one of the ways the user interacts with the app. Next, let's look at another type of input and [learn how to handle touches](handling-touches.md).
diff --git a/website/versioned_docs/version-0.73.0/handling-touches.md b/website/versioned_docs/version-0.73.0/handling-touches.md
new file mode 100644
index 00000000000..dd4c2156c27
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/handling-touches.md
@@ -0,0 +1,185 @@
+---
+id: handling-touches
+title: Handling Touches
+---
+
+Users interact with mobile apps mainly through touch. They can use a combination of gestures, such as tapping on a button, scrolling a list, or zooming on a map. React Native provides components to handle all sorts of common gestures, as well as a comprehensive [gesture responder system](gesture-responder-system.md) to allow for more advanced gesture recognition, but the one component you will most likely be interested in is the basic Button.
+
+## Displaying a basic button
+
+[Button](button.md) provides a basic button component that is rendered nicely on all platforms. The minimal example to display a button looks like this:
+
+```tsx
+ {
+ console.log('You tapped the button!');
+ }}
+ title="Press Me"
+/>
+```
+
+This will render a blue label on iOS, and a blue rounded rectangle with light text on Android. Pressing the button will call the "onPress" function, which in this case displays an alert popup. If you like, you can specify a "color" prop to change the color of your button.
+
+
+
+Go ahead and play around with the `Button` component using the example below. You can select which platform your app is previewed in by clicking on the toggle in the bottom right and then clicking on "Tap to Play" to preview the app.
+
+```SnackPlayer name=Button%20Basics
+import React, {Component} from 'react';
+import {Alert, Button, StyleSheet, View} from 'react-native';
+
+export default class ButtonBasics extends Component {
+ _onPressButton() {
+ Alert.alert('You tapped the button!');
+ }
+
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ buttonContainer: {
+ margin: 20,
+ },
+ alternativeLayoutButtonContainer: {
+ margin: 20,
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ },
+});
+```
+
+## Touchables
+
+If the basic button doesn't look right for your app, you can build your own button using any of the "Touchable" components provided by React Native. The "Touchable" components provide the capability to capture tapping gestures, and can display feedback when a gesture is recognized. These components do not provide any default styling, however, so you will need to do a bit of work to get them looking nicely in your app.
+
+Which "Touchable" component you use will depend on what kind of feedback you want to provide:
+
+- Generally, you can use [**TouchableHighlight**](touchablehighlight.md) anywhere you would use a button or link on web. The view's background will be darkened when the user presses down on the button.
+
+- You may consider using [**TouchableNativeFeedback**](touchablenativefeedback.md) on Android to display ink surface reaction ripples that respond to the user's touch.
+
+- [**TouchableOpacity**](touchableopacity.md) can be used to provide feedback by reducing the opacity of the button, allowing the background to be seen through while the user is pressing down.
+
+- If you need to handle a tap gesture but you don't want any feedback to be displayed, use [**TouchableWithoutFeedback**](touchablewithoutfeedback.md).
+
+In some cases, you may want to detect when a user presses and holds a view for a set amount of time. These long presses can be handled by passing a function to the `onLongPress` props of any of the "Touchable" components.
+
+Let's see all of these in action:
+
+```SnackPlayer name=Touchables
+import React, {Component} from 'react';
+import {
+ Alert,
+ Platform,
+ StyleSheet,
+ Text,
+ TouchableHighlight,
+ TouchableOpacity,
+ TouchableNativeFeedback,
+ TouchableWithoutFeedback,
+ View,
+} from 'react-native';
+
+export default class Touchables extends Component {
+ _onPressButton() {
+ Alert.alert('You tapped the button!');
+ }
+
+ _onLongPressButton() {
+ Alert.alert('You long-pressed the button!');
+ }
+
+ render() {
+ return (
+
+
+
+ TouchableHighlight
+
+
+
+
+ TouchableOpacity
+
+
+
+
+
+ TouchableNativeFeedback{' '}
+ {Platform.OS !== 'android' ? '(Android only)' : ''}
+
+
+
+
+
+ TouchableWithoutFeedback
+
+
+
+
+ Touchable with Long Press
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ paddingTop: 60,
+ alignItems: 'center',
+ },
+ button: {
+ marginBottom: 30,
+ width: 260,
+ alignItems: 'center',
+ backgroundColor: '#2196F3',
+ },
+ buttonText: {
+ textAlign: 'center',
+ padding: 20,
+ color: 'white',
+ },
+});
+```
+
+## Scrolling and swiping
+
+Gestures commonly used on devices with touchable screens include swipes and pans. These allow the user to scroll through a list of items, or swipe through pages of content. For these, check out the [ScrollView](scrollview.md) Core Component.
+
+## Known issues
+
+- [react-native#29308](https://github.com/facebook/react-native/issues/29308#issuecomment-792864162): The touch area never extends past the parent view bounds and on Android negative margin is not supported.
diff --git a/website/versioned_docs/version-0.73.0/headless-js-android.md b/website/versioned_docs/version-0.73.0/headless-js-android.md
new file mode 100644
index 00000000000..d4ec452583b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/headless-js-android.md
@@ -0,0 +1,396 @@
+---
+id: headless-js-android
+title: Headless JS
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+
+Headless JS is a way to run tasks in JavaScript while your app is in the background. It can be used, for example, to sync fresh data, handle push notifications, or play music.
+
+## The JS API
+
+A task is an async function that you register on `AppRegistry`, similar to registering React applications:
+
+```tsx
+import {AppRegistry} from 'react-native';
+AppRegistry.registerHeadlessTask('SomeTaskName', () =>
+ require('SomeTaskName'),
+);
+```
+
+Then, in `SomeTaskName.js`:
+
+```tsx
+module.exports = async taskData => {
+ // do stuff
+};
+```
+
+You can do anything in your task such as network requests, timers and so on, as long as it doesn't touch UI. Once your task completes (i.e. the promise is resolved), React Native will go into "paused" mode (unless there are other tasks running, or there is a foreground app).
+
+## The Platform API
+
+Yes, this does still require some native code, but it's pretty thin. You need to extend `HeadlessJsTaskService` and override `getTaskConfig`, e.g.:
+
+
+
+
+```java
+package com.your_application_name;
+
+import android.content.Intent;
+import android.os.Bundle;
+import com.facebook.react.HeadlessJsTaskService;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.jstasks.HeadlessJsTaskConfig;
+import javax.annotation.Nullable;
+
+public class MyTaskService extends HeadlessJsTaskService {
+
+ @Override
+ protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ return new HeadlessJsTaskConfig(
+ "SomeTaskName",
+ Arguments.fromBundle(extras),
+ 5000, // timeout in milliseconds for the task
+ false // optional: defines whether or not the task is allowed in foreground. Default is false
+ );
+ }
+ return null;
+ }
+}
+```
+
+
+
+
+```kotlin
+package com.your_application_name;
+
+import android.content.Intent
+import com.facebook.react.HeadlessJsTaskService
+import com.facebook.react.bridge.Arguments
+import com.facebook.react.jstasks.HeadlessJsTaskConfig
+
+class MyTaskService : HeadlessJsTaskService() {
+ override fun getTaskConfig(intent: Intent): HeadlessJsTaskConfig? {
+ return intent.extras?.let {
+ HeadlessJsTaskConfig(
+ "SomeTaskName",
+ Arguments.fromBundle(it),
+ 5000, // timeout for the task
+ false // optional: defines whether or not the task is allowed in foreground.
+ // Default is false
+ )
+ }
+ }
+}
+
+```
+
+
+
+
+Then add the service to your `AndroidManifest.xml` file inside the `application` tag:
+
+```
+
+```
+
+Now, whenever you [start your service][0], e.g. as a periodic task or in response to some system event / broadcast, JS will spin up, run your task, then spin down.
+
+Example:
+
+
+
+
+```java
+Intent service = new Intent(getApplicationContext(), MyTaskService.class);
+Bundle bundle = new Bundle();
+
+bundle.putString("foo", "bar");
+service.putExtras(bundle);
+
+getApplicationContext().startService(service);
+```
+
+
+
+
+```kotlin
+val service = Intent(applicationContext, MyTaskService::class.java)
+val bundle = Bundle()
+
+bundle.putString("foo", "bar")
+
+service.putExtras(bundle)
+
+applicationContext.startService(service)
+```
+
+
+
+
+## Retries
+
+By default, the headless JS task will not perform any retries. In order to do so, you need to create a `HeadlessJsRetryPolicy` and throw a specific `Error`.
+
+`LinearCountingRetryPolicy` is an implementation of `HeadlessJsRetryPolicy` that allows you to specify a maximum number of retries with a fixed delay between each attempt. If that does not suit your needs then you can implement your own `HeadlessJsRetryPolicy`. These policies can be passed as an extra argument to the `HeadlessJsTaskConfig` constructor, e.g.
+
+
+
+
+```java
+HeadlessJsRetryPolicy retryPolicy = new LinearCountingRetryPolicy(
+ 3, // Max number of retry attempts
+ 1000 // Delay between each retry attempt
+);
+
+return new HeadlessJsTaskConfig(
+ 'SomeTaskName',
+ Arguments.fromBundle(extras),
+ 5000,
+ false,
+ retryPolicy
+);
+```
+
+
+
+
+```kotlin
+val retryPolicy: HeadlessJsTaskRetryPolicy =
+ LinearCountingRetryPolicy(
+ 3, // Max number of retry attempts
+ 1000 // Delay between each retry attempt
+ )
+
+return HeadlessJsTaskConfig("SomeTaskName", Arguments.fromBundle(extras), 5000, false, retryPolicy)
+```
+
+
+
+
+A retry attempt will only be made when a specific `Error` is thrown. Inside a headless JS task, you can import the error and throw it when a retry attempt is required.
+
+Example:
+
+```tsx
+import {HeadlessJsTaskError} from 'HeadlessJsTask';
+
+module.exports = async taskData => {
+ const condition = ...;
+ if (!condition) {
+ throw new HeadlessJsTaskError();
+ }
+};
+```
+
+If you wish all errors to cause a retry attempt, you will need to catch them and throw the above error.
+
+## Caveats
+
+- By default, your app will crash if you try to run a task while the app is in the foreground. This is to prevent developers from shooting themselves in the foot by doing a lot of work in a task and slowing the UI. You can pass a fourth `boolean` argument to control this behaviour.
+- If you start your service from a `BroadcastReceiver`, make sure to call `HeadlessJsTaskService.acquireWakeLockNow()` before returning from `onReceive()`.
+
+## Example Usage
+
+Service can be started from Java API. First you need to decide when the service should be started and implement your solution accordingly. Here is an example that reacts to network connection change.
+
+Following lines shows part of Android manifest file for registering broadcast receiver.
+
+```xml
+
+
+
+
+
+```
+
+Broadcast receiver then handles intent that was broadcasted in onReceive function. This is a great place to check whether your app is on foreground or not. If app is not on foreground we can prepare our intent to be started, with no information or additional information bundled using `putExtra` (keep in mind bundle can handle only parcelable values). In the end service is started and wakelock is acquired.
+
+
+
+
+```java
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.os.Build;
+
+import com.facebook.react.HeadlessJsTaskService;
+
+public class NetworkChangeReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ /**
+ This part will be called every time network connection is changed
+ e.g. Connected -> Not Connected
+ **/
+ if (!isAppOnForeground((context))) {
+ /**
+ We will start our service and send extra info about
+ network connections
+ **/
+ boolean hasInternet = isNetworkAvailable(context);
+ Intent serviceIntent = new Intent(context, MyTaskService.class);
+ serviceIntent.putExtra("hasInternet", hasInternet);
+ context.startService(serviceIntent);
+ HeadlessJsTaskService.acquireWakeLockNow(context);
+ }
+ }
+
+ private boolean isAppOnForeground(Context context) {
+ /**
+ We need to check if app is in foreground otherwise the app will crash.
+ https://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not
+ **/
+ ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ List appProcesses =
+ activityManager.getRunningAppProcesses();
+ if (appProcesses == null) {
+ return false;
+ }
+ final String packageName = context.getPackageName();
+ for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
+ if (appProcess.importance ==
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
+ appProcess.processName.equals(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isNetworkAvailable(Context context) {
+ ConnectivityManager cm = (ConnectivityManager)
+ context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ Network networkCapabilities = cm.getActiveNetwork();
+
+ if(networkCapabilities == null) {
+ return false;
+ }
+
+ NetworkCapabilities actNw = cm.getNetworkCapabilities(networkCapabilities);
+
+ if(actNw == null) {
+ return false;
+ }
+
+ if(actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ // deprecated in API level 29
+ NetworkInfo netInfo = cm.getActiveNetworkInfo();
+ return (netInfo != null && netInfo.isConnected());
+ }
+}
+```
+
+
+
+
+```kotlin
+import android.app.ActivityManager
+import android.app.ActivityManager.RunningAppProcessInfo
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+import android.os.Build
+import com.facebook.react.HeadlessJsTaskService
+
+class NetworkChangeReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent?) {
+ /**
+ * This part will be called every time network connection is changed e.g. Connected -> Not
+ * Connected
+ */
+ if (!isAppOnForeground(context)) {
+ /** We will start our service and send extra info about network connections */
+ val hasInternet = isNetworkAvailable(context)
+ val serviceIntent = Intent(context, MyTaskService::class.java)
+ serviceIntent.putExtra("hasInternet", hasInternet)
+ context.startService(serviceIntent)
+ HeadlessJsTaskService.acquireWakeLockNow(context)
+ }
+ }
+
+ private fun isAppOnForeground(context: Context): Boolean {
+ /**
+ * We need to check if app is in foreground otherwise the app will crash.
+ * https://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not
+ */
+ val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+ val appProcesses = activityManager.runningAppProcesses ?: return false
+ val packageName: String = context.getPackageName()
+ for (appProcess in appProcesses) {
+ if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
+ appProcess.processName == packageName
+ ) {
+ return true
+ }
+ }
+ return false
+ }
+
+ companion object {
+ fun isNetworkAvailable(context: Context): Boolean {
+ val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ var result = false
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ val networkCapabilities = cm.activeNetwork ?: return false
+
+ val actNw = cm.getNetworkCapabilities(networkCapabilities) ?: return false
+
+ result =
+ when {
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
+ actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
+ else -> false
+ }
+
+ return result
+ } else {
+ cm.run {
+ // deprecated in API level 29
+ cm.activeNetworkInfo?.run {
+ result =
+ when (type) {
+ ConnectivityManager.TYPE_WIFI -> true
+ ConnectivityManager.TYPE_MOBILE -> true
+ ConnectivityManager.TYPE_ETHERNET -> true
+ else -> false
+ }
+ }
+ }
+ }
+ return result
+ }
+ }
+}
+
+```
+
+
+
+
+[0]: https://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)
diff --git a/website/versioned_docs/version-0.73.0/height-and-width.md b/website/versioned_docs/version-0.73.0/height-and-width.md
new file mode 100644
index 00000000000..485667831cd
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/height-and-width.md
@@ -0,0 +1,121 @@
+---
+id: height-and-width
+title: Height and Width
+---
+
+A component's height and width determine its size on the screen.
+
+## Fixed Dimensions
+
+The general way to set the dimensions of a component is by adding a fixed `width` and `height` to style. All dimensions in React Native are unitless, and represent density-independent pixels.
+
+```SnackPlayer name=Height%20and%20Width
+import React from 'react';
+import {View} from 'react-native';
+
+const FixedDimensionsBasics = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default FixedDimensionsBasics;
+```
+
+Setting dimensions this way is common for components whose size should always be fixed to a number of points and not calculated based on screen size.
+
+:::caution
+There is no universal mapping from points to physical units of measurement. This means that a component with fixed dimensions might not have the same physical size, across different devices and screen sizes. However, this difference is unnoticeable for most use cases.
+:::
+
+## Flex Dimensions
+
+Use `flex` in a component's style to have the component expand and shrink dynamically based on available space. Normally you will use `flex: 1`, which tells a component to fill all available space, shared evenly amongst other components with the same parent. The larger the `flex` given, the higher the ratio of space a component will take compared to its siblings.
+
+:::info
+A component can only expand to fill available space if its parent has dimensions greater than `0`. If a parent does not have either a fixed `width` and `height` or `flex`, the parent will have dimensions of `0` and the `flex` children will not be visible.
+:::
+
+```SnackPlayer name=Flex%20Dimensions
+import React from 'react';
+import {View} from 'react-native';
+
+const FlexDimensionsBasics = () => {
+ return (
+ // Try removing the `flex: 1` on the parent View.
+ // The parent will not have dimensions, so the children can't expand.
+ // What if you add `height: 300` instead of `flex: 1`?
+
+
+
+
+
+ );
+};
+
+export default FlexDimensionsBasics;
+```
+
+After you can control a component's size, the next step is to [learn how to lay it out on the screen](flexbox.md).
+
+## Percentage Dimensions
+
+If you want to fill a certain portion of the screen, but you _don't_ want to use the `flex` layout, you _can_ use **percentage values** in the component's style. Similar to flex dimensions, percentage dimensions require parent with a defined size.
+
+```SnackPlayer name=Percentage%20Dimensions
+import React from 'react';
+import {View} from 'react-native';
+
+const PercentageDimensionsBasics = () => {
+ // Try removing the `height: '100%'` on the parent View.
+ // The parent will not have dimensions, so the children can't expand.
+ return (
+
+
+
+
+
+ );
+};
+
+export default PercentageDimensionsBasics;
+```
diff --git a/website/versioned_docs/version-0.73.0/hermes.md b/website/versioned_docs/version-0.73.0/hermes.md
new file mode 100644
index 00000000000..22947188df3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/hermes.md
@@ -0,0 +1,249 @@
+---
+id: hermes
+title: Using Hermes
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+
+
+[Hermes](https://hermesengine.dev) is an open-source JavaScript engine optimized for React Native. For many apps, using Hermes will result in improved start-up time, decreased memory usage, and smaller app size when compared to JavaScriptCore.
+Hermes is used by default by React Native and no additional configuration is required to enable it.
+
+## Bundled Hermes
+
+React Native comes with a **bundled version** of Hermes.
+We will be building a version of Hermes for you whenever we release a new version of React Native. This will make sure you're consuming a version of Hermes which is fully compatible with the version of React Native you're using.
+
+Historically, we had problems with matching versions of Hermes with versions of React Native. This fully eliminates this problem, and offers users a JS engine that is compatible with the specific React Native version.
+
+This change is fully transparent to users of React Native. You can still disable Hermes using the command described in this page.
+You can [read more about the technical implementation on this page](/architecture/bundled-hermes).
+
+## Confirming Hermes is in use
+
+If you've recently created a new app from scratch, you should see if Hermes is enabled in the welcome view:
+
+
+
+A `HermesInternal` global variable will be available in JavaScript that can be used to verify that Hermes is in use:
+
+```jsx
+const isHermes = () => !!global.HermesInternal;
+```
+
+:::caution
+If you are using a non-standard way of loading the JS bundle, it is possible that the `HermesInternal` variable is available but you aren't using the highly optimised pre-compiled bytecode.
+Confirm that you are using the `.hbc` file and also benchmark the before/after as detailed below.
+:::
+
+To see the benefits of Hermes, try making a release build/deployment of your app to compare. For example; from the root of your project:
+
+
+
+
+[//]: # 'Android'
+
+
+
+
+```shell
+npm run android -- --mode="release"
+```
+
+
+
+
+```shell
+yarn android --mode release
+```
+
+
+
+
+
+
+
+[//]: # 'iOS'
+
+
+
+
+```shell
+npm run ios -- --mode="Release"
+```
+
+
+
+
+```shell
+yarn ios --mode Release
+```
+
+
+
+
+
+
+
+This will compile JavaScript to bytecode during build time which will improve your app's startup speed on device.
+
+## Debugging JS on Hermes using Google Chrome's DevTools
+
+Hermes supports the Chrome debugger by implementing the Chrome inspector protocol. This means Chrome's tools can be used to directly debug JavaScript running on Hermes, on an emulator or on a real, physical, device.
+
+:::info
+Note that this is very different with the deprecated "Remote JS Debugging" from the In-App Dev Menu documented in the [Debugging](debugging#remote-debugging) section, which actually runs the JS code on Chrome's V8 on your development machine (laptop or desktop) instead of connecting to the JS engine running the app on your device.
+:::
+
+Chrome connects to Hermes running on device via Metro, so you'll need to know where Metro is listening. Typically this will be on `localhost:8081`, but this is [configurable](https://facebook.github.io/metro/docs/configuration). When running `yarn start` the address is written to stdout on startup.
+
+Once you know where the Metro server is listening, you can connect with Chrome using the following steps:
+
+1. Navigate to `chrome://inspect` in a Chrome browser instance.
+
+2. Use the `Configure...` button to add the Metro server address (typically `localhost:8081` as described above).
+
+
+
+
+
+3. You should now see a "Hermes React Native" target with an "inspect" link which can be used to bring up debugger. If you don't see the "inspect" link, make sure the Metro server is running. 
+
+4. You can now use the Chrome debug tools. For example, to breakpoint the next time some JavaScript is run, click on the pause button and trigger an action in your app which would cause JavaScript to execute. 
+
+## Enabling Hermes on Older Versions of React Native
+
+Hermes is the default engine as of React Native 0.70. This section explains how to enable Hermes on older versions of React Native.
+First, ensure you're using at least version 0.60.4 of React Native to enable Hermes on Android or 0.64 of React Native to enable Hermes on iOS.
+
+If you have an existing app based on an earlier version of React Native, you will have to upgrade it first. See [Upgrading to new React Native Versions](/docs/upgrading) for how to do this. After upgrading the app, make sure everything works before trying to switch to Hermes.
+
+:::caution Note for React Native compatibility
+Each Hermes release is aimed at a specific RN version. The rule of thumb is to always follow [Hermes releases](https://github.com/facebook/hermes/releases) strictly.
+Version mismatch can result in instant crash of your apps in the worst case scenario.
+:::
+
+:::info Note for Windows users
+Hermes requires [Microsoft Visual C++ 2015 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145).
+:::
+
+### Android
+
+Edit your `android/gradle.properties` file and make sure `hermesEnabled` is true:
+
+```diff
+# Use this property to enable or disable the Hermes JS engine.
+# If set to false, you will be using JSC instead.
+hermesEnabled=true
+```
+
+:::note
+This property was added in React Native 0.71. If you can't find it in your `gradle.properties` file, please refer to the documentation for the corresponding React Native version you're using.
+:::
+
+Also, if you're using ProGuard, you will need to add these rules in `proguard-rules.pro` :
+
+```
+-keep class com.facebook.hermes.unicode.** { *; }
+-keep class com.facebook.jni.** { *; }
+```
+
+Next, if you've already built your app at least once, clean the build:
+
+```shell
+$ cd android && ./gradlew clean
+```
+
+That's it! You should now be able to develop and deploy your app as usual:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+### iOS
+
+Since React Native 0.64, Hermes also runs on iOS. To enable Hermes for iOS, edit your `ios/Podfile` file and make the change illustrated below:
+
+```diff
+ use_react_native!(
+ :path => config[:reactNativePath],
+ # to enable hermes on iOS, change `false` to `true` and then install pods
+ # By default, Hermes is disabled on Old Architecture, and enabled on New Architecture.
+ # You can enable/disable it manually by replacing `flags[:hermes_enabled]` with `true` or `false`.
+- :hermes_enabled => flags[:hermes_enabled],
++ :hermes_enabled => true
+ )
+```
+
+By default, you will be using Hermes if you're on the New Architecture. By specifying a value such
+as `true` or `false` you can enable/disable Hermes as you wish.
+
+Once you've configured it, you can install the Hermes pods with:
+
+```shell
+$ cd ios && pod install
+```
+
+That's it! You should now be able to develop and deploy your app as usual:
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+## Switching back to JavaScriptCore
+
+React Native also supports using JavaScriptCore as the [JavaScript engine](javascript-environment). Follow these instructions to opt-out of Hermes.
+
+### Android
+
+Edit your `android/gradle.properties` file and flip `hermesEnabled` back to false:
+
+```diff
+# Use this property to enable or disable the Hermes JS engine.
+# If set to false, you will be using JSC instead.
+hermesEnabled=false
+```
+
+### iOS
+
+Edit your `ios/Podfile` file and make the change illustrated below:
+
+```diff
+ use_react_native!(
+ :path => config[:reactNativePath],
+ # Hermes is now enabled by default. Disable by setting this flag to false.
+ # Upcoming versions of React Native may rely on get_default_flags(), but
+ # we make it explicit here to aid in the React Native upgrade process.
+- :hermes_enabled => flags[:hermes_enabled],
++ :hermes_enabled => false,
+ )
+```
diff --git a/website/versioned_docs/version-0.73.0/image-style-props.md b/website/versioned_docs/version-0.73.0/image-style-props.md
new file mode 100644
index 00000000000..8a37c6442bc
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/image-style-props.md
@@ -0,0 +1,387 @@
+---
+id: image-style-props
+title: Image Style Props
+---
+
+## Examples
+
+### Image Resize Mode
+
+```SnackPlayer name=Image%20Resize%20Modes%20Example
+import React from 'react';
+import {View, Image, Text, StyleSheet} from 'react-native';
+
+const DisplayAnImageWithStyle = () => {
+ return (
+
+
+
+ resizeMode : cover
+
+
+
+ resizeMode : contain
+
+
+
+ resizeMode : stretch
+
+
+
+ resizeMode : repeat
+
+
+
+ resizeMode : center
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ height: '100%',
+ textAlign: 'center',
+ },
+});
+
+export default DisplayAnImageWithStyle;
+```
+
+### Image Border
+
+```SnackPlayer name=Style%20BorderWidth%20and%20BorderColor%20Example
+import React from 'react';
+import {View, Image, StyleSheet, Text} from 'react-native';
+
+const DisplayAnImageWithStyle = () => {
+ return (
+
+
+ borderColor & borderWidth
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ textAlign: 'center',
+ },
+});
+
+export default DisplayAnImageWithStyle;
+```
+
+### Image Border Radius
+
+```SnackPlayer name=Style%20Border%20Radius%20Example
+import React from 'react';
+import {View, Image, StyleSheet, Text} from 'react-native';
+
+const DisplayAnImageWithStyle = () => {
+ return (
+
+
+
+ borderTopRightRadius
+
+
+
+ borderBottomRightRadius
+
+
+
+ borderBottomLeftRadius
+
+
+
+ borderTopLeftRadius
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ height: '100%',
+ textAlign: 'center',
+ },
+});
+
+export default DisplayAnImageWithStyle;
+```
+
+### Image Tint
+
+```SnackPlayer name=Style%20tintColor%20Function%20Component
+import React from 'react';
+import {View, Image, StyleSheet, Text} from 'react-native';
+
+const DisplayAnImageWithStyle = () => {
+ return (
+
+
+ tintColor
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ textAlign: 'center',
+ },
+});
+
+export default DisplayAnImageWithStyle;
+```
+
+# Reference
+
+## Props
+
+### `backfaceVisibility`
+
+The property defines whether or not the back face of a rotated image should be visible.
+
+| Type | Default |
+| ----------------------------- | ----------- |
+| enum(`'visible'`, `'hidden'`) | `'visible'` |
+
+---
+
+### `backgroundColor`
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `borderBottomLeftRadius`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `borderBottomRightRadius`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `borderColor`
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `borderRadius`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `borderTopLeftRadius`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `borderTopRightRadius`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `borderWidth`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `opacity`
+
+Set an opacity value for the image. The number should be in the range from `0.0` to `1.0`.
+
+| Type | Default |
+| ------ | ------- |
+| number | `1.0` |
+
+---
+
+### `overflow`
+
+| Type | Default |
+| ----------------------------- | ----------- |
+| enum(`'visible'`, `'hidden'`) | `'visible'` |
+
+---
+
+### `overlayColor`
Android
+
+When the image has rounded corners, specifying an overlayColor will cause the remaining space in the corners to be filled with a solid color. This is useful in cases which are not supported by the Android implementation of rounded corners:
+
+- Certain resize modes, such as `'contain'`
+- Animated GIFs
+
+A typical way to use this prop is with images displayed on a solid background and setting the `overlayColor` to the same color as the background.
+
+For details of how this works under the hood, see [Fresco documentation](https://frescolib.org/docs/rounded-corners-and-circles.html).
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `resizeMode`
+
+Determines how to resize the image when the frame doesn't match the raw image dimensions. Defaults to `cover`.
+
+- `cover`: Scale the image uniformly (maintain the image's aspect ratio) so that:
+
+ - Both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding)
+ - At least one dimension of the scaled image will be equal to the corresponding dimension of the view (minus padding)
+
+- `contain`: Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding).
+
+- `stretch`: Scale width and height independently, This may change the aspect ratio of the src.
+
+- `repeat`: Repeat the image to cover the frame of the view. The image will keep its size and aspect ratio, unless it is larger than the view, in which case it will be scaled down uniformly so that it is contained in the view.
+
+- `center`: Center the image in the view along both dimensions. If the image is larger than the view, scale it down uniformly so that it is contained in the view.
+
+| Type | Default |
+| ----------------------------------------------------------------- | --------- |
+| enum(`'cover'`, `'contain'`, `'stretch'`, `'repeat'`, `'center'`) | `'cover'` |
+
+---
+
+### `objectFit`
+
+Determines how to resize the image when the frame doesn't match the raw image dimensions.
+
+| Type | Default |
+| ------------------------------------------------------ | --------- |
+| enum(`'cover'`, `'contain'`, `'fill'`, `'scale-down'`) | `'cover'` |
+
+---
+
+### `tintColor`
+
+Changes the color of all the non-transparent pixels to the tintColor.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
diff --git a/website/versioned_docs/version-0.73.0/image.md b/website/versioned_docs/version-0.73.0/image.md
new file mode 100644
index 00000000000..e02bb762a2c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/image.md
@@ -0,0 +1,629 @@
+---
+id: image
+title: Image
+---
+
+A React component for displaying different types of images, including network images, static resources, temporary local images, and images from local disk, such as the camera roll.
+
+This example shows fetching and displaying an image from local storage as well as one from network and even from data provided in the `'data:'` uri scheme.
+
+> Note that for network and data images, you will need to manually specify the dimensions of your image!
+
+## Examples
+
+```SnackPlayer name=Example
+import React from 'react';
+import {View, Image, StyleSheet} from 'react-native';
+
+const styles = StyleSheet.create({
+ container: {
+ paddingTop: 50,
+ },
+ tinyLogo: {
+ width: 50,
+ height: 50,
+ },
+ logo: {
+ width: 66,
+ height: 58,
+ },
+});
+
+const DisplayAnImage = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default DisplayAnImage;
+```
+
+You can also add `style` to an image:
+
+```SnackPlayer name=Example
+import React from 'react';
+import {View, Image, StyleSheet} from 'react-native';
+
+const styles = StyleSheet.create({
+ container: {
+ paddingTop: 50,
+ },
+ stretch: {
+ width: 50,
+ height: 200,
+ resizeMode: 'stretch',
+ },
+});
+
+const DisplayAnImageWithStyle = () => {
+ return (
+
+
+
+ );
+};
+
+export default DisplayAnImageWithStyle;
+```
+
+## GIF and WebP support on Android
+
+When building your own native code, GIF and WebP are not supported by default on Android.
+
+You will need to add some optional modules in `android/app/build.gradle`, depending on the needs of your app.
+
+```groovy
+dependencies {
+ // If your app supports Android versions before Ice Cream Sandwich (API level 14)
+ implementation 'com.facebook.fresco:animated-base-support:1.3.0'
+
+ // For animated GIF support
+ implementation 'com.facebook.fresco:animated-gif:2.5.0'
+
+ // For WebP support, including animated WebP
+ implementation 'com.facebook.fresco:animated-webp:2.5.0'
+ implementation 'com.facebook.fresco:webpsupport:2.5.0'
+
+ // For WebP support, without animations
+ implementation 'com.facebook.fresco:webpsupport:2.5.0'
+}
+```
+
+> Note: the version listed above may not be updated in time. Please check [`ReactAndroid/gradle.properties`](https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/gradle.properties) in the main repo to see which fresco version is being used in a specific tagged version.
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view#props).
+
+---
+
+### `accessible`
+
+When true, indicates the image is an accessibility element.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `accessibilityLabel`
+
+The text that's read by the screen reader when the user interacts with the image.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `alt`
+
+A string that defines an alternative text description of the image, which will be read by the screen reader when the user interacts with it. Using this will automatically mark this element as accessible.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `blurRadius`
+
+blurRadius: the blur radius of the blur filter added to the image.
+
+| Type |
+| ------ |
+| number |
+
+> Tip: On IOS, you will need to increase `blurRadius` by more than `5`.
+
+---
+
+### `capInsets`
iOS
+
+When the image is resized, the corners of the size specified by `capInsets` will stay a fixed size, but the center content and borders of the image will be stretched. This is useful for creating resizable rounded buttons, shadows, and other resizable assets. More info in the [official Apple documentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/instm/UIImage/resizableImageWithCapInsets).
+
+| Type |
+| ------------ |
+| [Rect](rect) |
+
+---
+
+### `crossOrigin`
+
+A string of a keyword specifying the CORS mode to use when fetching the image resource. It works similar to crossorigin attribute in HTML.
+
+- `anonymous`: No exchange of user credentials in the image request.
+- `use-credentials`: Sets `Access-Control-Allow-Credentials` header value to `true` in the image request.
+
+| Type | Default |
+| ---------------------------------------- | ------------- |
+| enum(`'anonymous'`, `'use-credentials'`) | `'anonymous'` |
+
+---
+
+### `defaultSource`
+
+A static image to display while loading the image source.
+
+| Type |
+| -------------------------------- |
+| [ImageSource](image#imagesource) |
+
+> **Note:** On Android, the default source prop is ignored on debug builds.
+
+---
+
+### `fadeDuration`
Android
+
+Fade animation duration in milliseconds.
+
+| Type | Default |
+| ------ | ------- |
+| number | `300` |
+
+---
+
+### `height`
+
+Height of the image component.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `loadingIndicatorSource`
+
+Similarly to `source`, this property represents the resource used to render the loading indicator for the image. The loading indicator is displayed until image is ready to be displayed, typically after the image is downloaded.
+
+| Type |
+| ----------------------------------------------------- |
+| [ImageSource](image#imagesource) (`uri` only), number |
+
+---
+
+### `onError`
+
+Invoked on load error.
+
+| Type |
+| ----------------------------------- |
+| (`{nativeEvent: {error} }`) => void |
+
+---
+
+### `onLayout`
+
+Invoked on mount and on layout changes.
+
+| Type |
+| ------------------------------------------------------- |
+| `md ({nativeEvent: [LayoutEvent](layoutevent)} => void` |
+
+---
+
+### `onLoad`
+
+Invoked when load completes successfully.
+
+**Example:** `onLoad={({nativeEvent: {source: {width, height}}}) => setImageRealSize({width, height})}`
+
+| Type |
+| ------------------------------------------------------------------- |
+| `md ({nativeEvent: [ImageLoadEvent](image#imageloadevent)} => void` |
+
+---
+
+### `onLoadEnd`
+
+Invoked when load either succeeds or fails.
+
+| Type |
+| ---------- |
+| () => void |
+
+---
+
+### `onLoadStart`
+
+Invoked on load start.
+
+**Example:** `onLoadStart={() => this.setState({loading: true})}`
+
+| Type |
+| ---------- |
+| () => void |
+
+---
+
+### `onPartialLoad`
iOS
+
+Invoked when a partial load of the image is complete. The definition of what constitutes a "partial load" is loader specific though this is meant for progressive JPEG loads.
+
+| Type |
+| ---------- |
+| () => void |
+
+---
+
+### `onProgress`
+
+Invoked on download progress.
+
+| Type |
+| ------------------------------------------- |
+| (`{nativeEvent: {loaded, total} }`) => void |
+
+---
+
+### `progressiveRenderingEnabled`
+
+The mechanism that should be used to resize the image when the image's dimensions differ from the image view's dimensions. Defaults to `auto`.
+
+- `auto`: Use heuristics to pick between `resize` and `scale`.
+
+- `resize`: A software operation which changes the encoded image in memory before it gets decoded. This should be used instead of `scale` when the image is much larger than the view.
+
+- `scale`: The image gets drawn downscaled or upscaled. Compared to `resize`, `scale` is faster (usually hardware accelerated) and produces higher quality images. This should be used if the image is smaller than the view. It should also be used if the image is slightly bigger than the view.
+
+More details about `resize` and `scale` can be found at https://frescolib.org/docs/resizing.
+
+| Type | Default |
+| ------------------------------------- | -------- |
+| enum(`'auto'`, `'resize'`, `'scale'`) | `'auto'` |
+
+---
+
+### `referrerPolicy`
+
+A string indicating which referrer to use when fetching the resource. Sets the value for `Referrer-Policy` header in the image request. Works similar to `referrerpolicy` attribute in HTML.
+
+| Type | Default |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
+| enum(`'no-referrer'`, `'no-referrer-when-downgrade'`, `'origin'`, `'origin-when-cross-origin'`, `'same-origin'`, `'strict-origin'`, `'strict-origin-when-cross-origin'`, `'unsafe-url'`) | `'strict-origin-when-cross-origin'` |
+
+---
+
+### `resizeMode`
+
+Determines how to resize the image when the frame doesn't match the raw image dimensions. Defaults to `cover`.
+
+- `cover`: Scale the image uniformly (maintain the image's aspect ratio) so that
+
+ - both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding)
+ - at least one dimension of the scaled image will be equal to the corresponding dimension of the view (minus padding)
+
+- `contain`: Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding).
+
+- `stretch`: Scale width and height independently, This may change the aspect ratio of the src.
+
+- `repeat`: Repeat the image to cover the frame of the view. The image will keep its size and aspect ratio, unless it is larger than the view, in which case it will be scaled down uniformly so that it is contained in the view.
+
+- `center`: Center the image in the view along both dimensions. If the image is larger than the view, scale it down uniformly so that it is contained in the view.
+
+| Type | Default |
+| ----------------------------------------------------------------- | --------- |
+| enum(`'cover'`, `'contain'`, `'stretch'`, `'repeat'`, `'center'`) | `'cover'` |
+
+---
+
+### `source`
+
+The image source (either a remote URL or a local file resource).
+
+This prop can also contain several remote URLs, specified together with their width and height and potentially with scale/other URI arguments. The native side will then choose the best `uri` to display based on the measured size of the image container. A `cache` property can be added to control how networked request interacts with the local cache. (For more information see [Cache Control for Images](images#cache-control-ios-only)).
+
+The currently supported formats are `png`, `jpg`, `jpeg`, `bmp`, `gif`, `webp`, `psd` (iOS only). In addition, iOS supports several RAW image formats. Refer to Apple's documentation for the current list of supported camera models (for iOS 12, see https://support.apple.com/en-ca/HT208967).
+
+| Type |
+| -------------------------------- |
+| [ImageSource](image#imagesource) |
+
+---
+
+### `src`
+
+A string representing the remote URL of the image. This prop has precedence over `source` prop.
+
+**Example:** `src={'https://reactnative.dev/img/tiny_logo.png'}`
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `srcSet`
+
+A string representing comma separated list of possible candidate image source. Each image source contains a URL of an image and a pixel density descriptor. If no descriptor is specified, it defaults to descriptor of `1x`.
+
+If `srcSet` does not contain a `1x` descriptor, the value in `src` is used as image source with `1x` descriptor (if provided).
+
+This prop has precedence over both the `src` and `source` props.
+
+**Example:** `srcSet={'https://reactnative.dev/img/tiny_logo.png 1x, https://reactnative.dev/img/header_logo.svg 2x'}`
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `style`
+
+| Type |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [Image Style Props](image-style-props#props), [Layout Props](layout-props#props), [Shadow Props](shadow-props#props), [Transforms](transforms#props) |
+
+---
+
+### `testID`
+
+A unique identifier for this element to be used in UI Automation testing scripts.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `tintColor`
+
+Changes the color of all non-transparent pixels to the `tintColor`.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `width`
+
+Width of the image component.
+
+| Type |
+| ------ |
+| number |
+
+## Methods
+
+### `abortPrefetch()`
| number | Request id as returned by `prefetch()`. |
+
+---
+
+### `getSize()`
+
+```tsx
+static getSize(
+ uri: string,
+ success: (width: number, height: number) => void,
+ failure?: (error: any) => void,
+): any;
+```
+
+Retrieve the width and height (in pixels) of an image prior to displaying it. This method can fail if the image cannot be found, or fails to download.
+
+In order to retrieve the image dimensions, the image may first need to be loaded or downloaded, after which it will be cached. This means that in principle you could use this method to preload images, however it is not optimized for that purpose, and may in future be implemented in a way that does not fully load/download the image data. A proper, supported way to preload images will be provided as a separate API.
+
+**Parameters:**
+
+|
Name
| Type | Description |
+| -------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------- |
+| uri
Required
| string | The location of the image. |
+| success
Required
| function | The function that will be called if the image was successfully found and width and height retrieved. |
+| failure | function | The function that will be called if there was an error, such as failing to retrieve the image. |
+
+---
+
+### `getSizeWithHeaders()`
+
+```tsx
+static getSizeWithHeaders(
+ uri: string,
+ headers: {[index: string]: string},
+ success: (width: number, height: number) => void,
+ failure?: (error: any) => void,
+): any;
+```
+
+Retrieve the width and height (in pixels) of an image prior to displaying it with the ability to provide the headers for the request. This method can fail if the image cannot be found, or fails to download. It also does not work for static image resources.
+
+In order to retrieve the image dimensions, the image may first need to be loaded or downloaded, after which it will be cached. This means that in principle you could use this method to preload images, however it is not optimized for that purpose, and may in future be implemented in a way that does not fully load/download the image data. A proper, supported way to preload images will be provided as a separate API.
+
+**Parameters:**
+
+|
Name
| Type | Description |
+| -------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------- |
+| uri
Required
| string | The location of the image. |
+| headers
Required
| object | The headers for the request. |
+| success
Required
| function | The function that will be called if the image was successfully found and width and height retrieved. |
+| failure | function | The function that will be called if there was an error, such as failing to retrieve the image. |
+
+---
+
+### `prefetch()`
+
+```tsx
+await Image.prefetch(url);
+```
+
+Prefetches a remote image for later use by downloading it to the disk cache. Returns a promise which resolves to a boolean.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ---------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------ |
+| url
Required
| string | The remote location of the image. |
+| callback | function
Android
| The function that will be called with the `requestId`. |
+
+---
+
+### `queryCache()`
+
+```tsx
+static queryCache(
+ urls: string[],
+): Promise>;
+```
+
+Perform cache interrogation. Returns a promise which resolves to a mapping from URL to cache status, such as "disk", "memory" or "disk/memory". If a requested URL is not in the mapping, it means it's not in the cache.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ----------------------------------------------------- | ----- | ------------------------------------------ |
+| urls
Required
| array | List of image URLs to check the cache for. |
+
+---
+
+### `resolveAssetSource()`
+
+```tsx
+static resolveAssetSource(source: ImageSourcePropType): {
+ height: number;
+ width: number;
+ scale: number;
+ uri: string;
+};
+```
+
+Resolves an asset reference into an object which has the properties `uri`, `scale`, `width`, and `height`.
+
+**Parameters:**
+
+|
| [ImageSource](image#imagesource), number | A number (opaque type returned by `require('./foo.png')`) or an ImageSource. |
+
+## Type Definitions
+
+### ImageCacheEnum
iOS
+
+Enum which can be used to set the cache handling or stategy for the potentially cached responses.
+
+| Type | Default |
+| ------------------------------------------------------------------ | ----------- |
+| enum(`'default'`, `'reload'`, `'force-cache'`, `'only-if-cached'`) | `'default'` |
+
+- `default`: Use the native platforms default strategy.
+- `reload`: The data for the URL will be loaded from the originating source. No existing cache data should be used to satisfy a URL load request.
+- `force-cache`: The existing cached data will be used to satisfy the request, regardless of its age or expiration date. If there is no existing data in the cache corresponding the request, the data is loaded from the originating source.
+- `only-if-cached`: The existing cache data will be used to satisfy a request, regardless of its age or expiration date. If there is no existing data in the cache corresponding to a URL load request, no attempt is made to load the data from the originating source, and the load is considered to have failed.
+
+### ImageLoadEvent
+
+Object returned in the `onLoad` callback.
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type | Description |
+| ------ | ------ | ----------------------------------- |
+| source | object | The [source object](#source-object) |
+
+#### Source Object
+
+**Properties:**
+
+| Name | Type | Description |
+| ------ | ------ | ------------------------------------------------------------ |
+| width | number | The width of loaded image. |
+| height | number | The height of loaded image. |
+| uri | string | A string representing the resource identifier for the image. |
+
+### ImageSource
+
+| Type |
+| -------------------------------- |
+| object, array of objects, number |
+
+**Properties (if passing as object or array of objects):**
+
+|
Name
| Type | Description |
+| -------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| uri | string | A string representing the resource identifier for the image, which could be an http address, a local file path, or the name of a static image resource. |
+| width | number | Can be specified if known at build time, in which case the value will be used to set the default `` component dimension. |
+| height | number | Can be specified if known at build time, in which case the value will be used to set the default `` component dimension. |
+| scale | number | Used to indicate the scale factor of the image. Defaults to `1.0` if unspecified, meaning that one image pixel equates to one display point / DIP. |
+| bundle
iOS
| string | The iOS asset bundle which the image is included in. This will default to `[NSBundle mainBundle]` if not set. |
+| method | string | The HTTP Method to use. Defaults to `'GET'` if not specified. |
+| headers | object | An object representing the HTTP headers to send along with the request for a remote image. |
+| body | string | The HTTP body to send with the request. This must be a valid UTF-8 string, and will be sent exactly as specified, with no additional encoding (e.g. URL-escaping or base64) applied. |
+| cache
iOS
| [ImageCacheEnum](image#imagecacheenum-ios) | Determines how the requests handles potentially cached responses. |
+
+**If passing a number:**
+
+- `number` - opaque type returned by something like `require('./image.jpg')`.
diff --git a/website/versioned_docs/version-0.73.0/imagebackground.md b/website/versioned_docs/version-0.73.0/imagebackground.md
new file mode 100644
index 00000000000..d3de9ae8b8d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/imagebackground.md
@@ -0,0 +1,83 @@
+---
+id: imagebackground
+title: ImageBackground
+---
+
+A common feature request from developers familiar with the web is `background-image`. To handle this use case, you can use the `` component, which has the same props as ``, and add whatever children to it you would like to layer on top of it.
+
+You might not want to use `` in some cases, since the implementation is basic. Refer to ``'s [source code](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Image/ImageBackground.js) for more insight, and create your own custom component when needed.
+
+Note that you must specify some width and height style attributes.
+
+## Example
+
+```SnackPlayer name=ImageBackground
+import React from 'react';
+import {ImageBackground, StyleSheet, Text, View} from 'react-native';
+
+const image = {uri: 'https://legacy.reactjs.org/logo-og.png'};
+
+const App = () => (
+
+
+ Inside
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ image: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ text: {
+ color: 'white',
+ fontSize: 42,
+ lineHeight: 84,
+ fontWeight: 'bold',
+ textAlign: 'center',
+ backgroundColor: '#000000c0',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [Image Props](image.md#props)
+
+Inherits [Image Props](image.md#props).
+
+---
+
+### `imageStyle`
+
+| Type |
+| ----------------------------------- |
+| [Image Style](image-style-props.md) |
+
+---
+
+### `imageRef`
+
+Allows to set a reference to the inner `Image` component
+
+| Type |
+| ----------------------------------------------------- |
+| [Ref](https://reactjs.org/docs/refs-and-the-dom.html) |
+
+---
+
+### `style`
+
+| Type |
+| --------------------------------- |
+| [View Style](view-style-props.md) |
diff --git a/website/versioned_docs/version-0.73.0/imagepickerios.md b/website/versioned_docs/version-0.73.0/imagepickerios.md
new file mode 100644
index 00000000000..1fd3f7c96f3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/imagepickerios.md
@@ -0,0 +1,79 @@
+---
+id: imagepickerios
+title: '🚧 ImagePickerIOS'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=image+picker) instead.
+
+---
+
+# Reference
+
+## Methods
+
+### `canRecordVideos()`
+
+```jsx
+static canRecordVideos(callback)
+```
+
+---
+
+### `canUseCamera()`
+
+```jsx
+static canUseCamera(callback)
+```
+
+---
+
+### `openCameraDialog()`
+
+```jsx
+static openCameraDialog(config, successCallback, cancelCallback)
+```
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| --------------- | -------- | -------- | ----------- |
+| config | object | No | See below. |
+| successCallback | function | No | See below. |
+| cancelCallback | function | No | See below. |
+
+`config` is an object containing:
+
+- `videoMode` : An optional boolean value that defaults to false.
+
+`successCallback` is an optional callback function that's invoked when the select dialog is opened successfully. It will include the following data:
+
+- `[string, number, number]`
+
+`cancelCallback` is an optional callback function that's invoked when the camera dialog is canceled.
+
+---
+
+### `openSelectDialog()`
+
+```jsx
+static openSelectDialog(config, successCallback, cancelCallback)
+```
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| --------------- | -------- | -------- | ----------- |
+| config | object | No | See below. |
+| successCallback | function | No | See below. |
+| cancelCallback | function | No | See below. |
+
+`config` is an object containing:
+
+- `showImages` : An optional boolean value that defaults to false.
+- `showVideos`: An optional boolean value that defaults to false.
+
+`successCallback` is an optional callback function that's invoked when the select dialog is opened successfully. It will include the following data:
+
+- `[string, number, number]`
+
+`cancelCallback` is an optional callback function that's invoked when the select dialog is canceled.
diff --git a/website/versioned_docs/version-0.73.0/images.md b/website/versioned_docs/version-0.73.0/images.md
new file mode 100644
index 00000000000..46ec9f90fff
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/images.md
@@ -0,0 +1,248 @@
+---
+id: images
+title: Images
+---
+
+## Static Image Resources
+
+React Native provides a unified way of managing images and other media assets in your Android and iOS apps. To add a static image to your app, place it somewhere in your source code tree and reference it like this:
+
+```tsx
+
+```
+
+The image name is resolved the same way JS modules are resolved. In the example above, the bundler will look for `my-icon.png` in the same folder as the component that requires it.
+
+You can use the `@2x` and `@3x` suffixes to provide images for different screen densities. If you have the following file structure:
+
+```
+.
+├── button.js
+└── img
+ ├── check.png
+ ├── check@2x.png
+ └── check@3x.png
+```
+
+...and `button.js` code contains:
+
+```tsx
+
+```
+
+...the bundler will bundle and serve the image corresponding to device's screen density. For example, `check@2x.png`, will be used on an iPhone 7, while`check@3x.png` will be used on an iPhone 7 Plus or a Nexus 5. If there is no image matching the screen density, the closest best option will be selected.
+
+On Windows, you might need to restart the bundler if you add new images to your project.
+
+Here are some benefits that you get:
+
+1. Same system on Android and iOS.
+2. Images live in the same folder as your JavaScript code. Components are self-contained.
+3. No global namespace, i.e. you don't have to worry about name collisions.
+4. Only the images that are actually used will be packaged into your app.
+5. Adding and changing images doesn't require app recompilation, you can refresh the simulator as you normally do.
+6. The bundler knows the image dimensions, no need to duplicate it in the code.
+7. Images can be distributed via [npm](https://www.npmjs.com/) packages.
+
+In order for this to work, the image name in `require` has to be known statically.
+
+```tsx
+// GOOD
+;
+
+// BAD
+const icon = this.props.active
+ ? 'my-icon-active'
+ : 'my-icon-inactive';
+;
+
+// GOOD
+const icon = this.props.active
+ ? require('./my-icon-active.png')
+ : require('./my-icon-inactive.png');
+;
+```
+
+Note that image sources required this way include size (width, height) info for the Image. If you need to scale the image dynamically (i.e. via flex), you may need to manually set `{width: undefined, height: undefined}` on the style attribute.
+
+## Static Non-Image Resources
+
+The `require` syntax described above can be used to statically include audio, video or document files in your project as well. Most common file types are supported including `.mp3`, `.wav`, `.mp4`, `.mov`, `.html` and `.pdf`. See [bundler defaults](https://github.com/facebook/metro/blob/master/packages/metro-config/src/defaults/defaults.js#L14-L44) for the full list.
+
+You can add support for other types by adding an [`assetExts` resolver option](https://facebook.github.io/metro/docs/configuration#resolver-options) in your [Metro configuration](https://facebook.github.io/metro/docs/configuration).
+
+A caveat is that videos must use absolute positioning instead of `flexGrow`, since size info is not currently passed for non-image assets. This limitation doesn't occur for videos that are linked directly into Xcode or the Assets folder for Android.
+
+## Images From Hybrid App's Resources
+
+If you are building a hybrid app (some UIs in React Native, some UIs in platform code) you can still use images that are already bundled into the app.
+
+For images included via Xcode asset catalogs or in the Android drawable folder, use the image name without the extension:
+
+```tsx
+
+```
+
+For images in the Android assets folder, use the `asset:/` scheme:
+
+```tsx
+
+```
+
+These approaches provide no safety checks. It's up to you to guarantee that those images are available in the application. Also you have to specify image dimensions manually.
+
+## Network Images
+
+Many of the images you will display in your app will not be available at compile time, or you will want to load some dynamically to keep the binary size down. Unlike with static resources, _you will need to manually specify the dimensions of your image_. It's highly recommended that you use https as well in order to satisfy [App Transport Security](publishing-to-app-store.md#1-enable-app-transport-security) requirements on iOS.
+
+```tsx
+// GOOD
+
+
+// BAD
+
+```
+
+### Network Requests for Images
+
+If you would like to set such things as the HTTP-Verb, Headers or a Body along with the image request, you may do this by defining these properties on the source object:
+
+```tsx
+
+```
+
+## Uri Data Images
+
+Sometimes, you might be getting encoded image data from a REST API call. You can use the `'data:'` uri scheme to use these images. Same as for network resources, _you will need to manually specify the dimensions of your image_.
+
+:::info
+This is recommended for very small and dynamic images only, like icons in a list from a DB.
+:::
+
+```tsx
+// include at least width and height!
+
+```
+
+### Cache Control (iOS Only)
+
+In some cases you might only want to display an image if it is already in the local cache, i.e. a low resolution placeholder until a higher resolution is available. In other cases you do not care if the image is outdated and are willing to display an outdated image to save bandwidth. The `cache` source property gives you control over how the network layer interacts with the cache.
+
+- `default`: Use the native platforms default strategy.
+- `reload`: The data for the URL will be loaded from the originating source. No existing cache data should be used to satisfy a URL load request.
+- `force-cache`: The existing cached data will be used to satisfy the request, regardless of its age or expiration date. If there is no existing data in the cache corresponding the request, the data is loaded from the originating source.
+- `only-if-cached`: The existing cache data will be used to satisfy a request, regardless of its age or expiration date. If there is no existing data in the cache corresponding to a URL load request, no attempt is made to load the data from the originating source, and the load is considered to have failed.
+
+```tsx
+
+```
+
+## Local Filesystem Images
+
+See [CameraRoll](https://github.com/react-native-community/react-native-cameraroll) for an example of using local resources that are outside of `Images.xcassets`.
+
+### Best Camera Roll Image
+
+iOS saves multiple sizes for the same image in your Camera Roll, it is very important to pick the one that's as close as possible for performance reasons. You wouldn't want to use the full quality 3264x2448 image as source when displaying a 200x200 thumbnail. If there's an exact match, React Native will pick it, otherwise it's going to use the first one that's at least 50% bigger in order to avoid blur when resizing from a close size. All of this is done by default so you don't have to worry about writing the tedious (and error prone) code to do it yourself.
+
+## Why Not Automatically Size Everything?
+
+_In the browser_ if you don't give a size to an image, the browser is going to render a 0x0 element, download the image, and then render the image based with the correct size. The big issue with this behavior is that your UI is going to jump all around as images load, this makes for a very bad user experience.
+
+_In React Native_ this behavior is intentionally not implemented. It is more work for the developer to know the dimensions (or aspect ratio) of the remote image in advance, but we believe that it leads to a better user experience. Static images loaded from the app bundle via the `require('./my-icon.png')` syntax _can be automatically sized_ because their dimensions are available immediately at the time of mounting.
+
+For example, the result of `require('./my-icon.png')` might be:
+
+```tsx
+{"__packager_asset":true,"uri":"my-icon.png","width":591,"height":573}
+```
+
+## Source as an object
+
+In React Native, one interesting decision is that the `src` attribute is named `source` and doesn't take a string but an object with a `uri` attribute.
+
+```tsx
+
+```
+
+On the infrastructure side, the reason is that it allows us to attach metadata to this object. For example if you are using `require('./my-icon.png')`, then we add information about its actual location and size (don't rely on this fact, it might change in the future!). This is also future proofing, for example we may want to support sprites at some point, instead of outputting `{uri: ...}`, we can output `{uri: ..., crop: {left: 10, top: 50, width: 20, height: 40}}` and transparently support spriting on all the existing call sites.
+
+On the user side, this lets you annotate the object with useful attributes such as the dimension of the image in order to compute the size it's going to be displayed in. Feel free to use it as your data structure to store more information about your image.
+
+## Background Image via Nesting
+
+A common feature request from developers familiar with the web is `background-image`. To handle this use case, you can use the `` component, which has the same props as ``, and add whatever children to it you would like to layer on top of it.
+
+You might not want to use `` in some cases, since the implementation is basic. Refer to ``'s [documentation](imagebackground.md) for more insight, and create your own custom component when needed.
+
+```tsx
+return (
+
+ Inside
+
+);
+```
+
+Note that you must specify some width and height style attributes.
+
+## iOS Border Radius Styles
+
+Please note that the following corner specific, border radius style properties might be ignored by iOS's image component:
+
+- `borderTopLeftRadius`
+- `borderTopRightRadius`
+- `borderBottomLeftRadius`
+- `borderBottomRightRadius`
+
+## Off-thread Decoding
+
+Image decoding can take more than a frame-worth of time. This is one of the major sources of frame drops on the web because decoding is done in the main thread. In React Native, image decoding is done in a different thread. In practice, you already need to handle the case when the image is not downloaded yet, so displaying the placeholder for a few more frames while it is decoding does not require any code change.
+
+## Configuring iOS Image Cache Limits
+
+On iOS, we expose an API to override React Native's default image cache limits. This should be called from within your native AppDelegate code (e.g. within `didFinishLaunchingWithOptions`).
+
+```objectivec
+RCTSetImageCacheLimits(4*1024*1024, 200*1024*1024);
+```
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------------- | ------ | -------- | ----------------------- |
+| imageSizeLimit | number | Yes | Image cache size limit. |
+| totalCostLimit | number | Yes | Total cache cost limit. |
+
+In the above code example the image size limit is set to 4 MB and the total cost limit is set to 200 MB.
diff --git a/website/versioned_docs/version-0.73.0/improvingux.md b/website/versioned_docs/version-0.73.0/improvingux.md
new file mode 100644
index 00000000000..462f5f0ce1c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/improvingux.md
@@ -0,0 +1,596 @@
+---
+id: improvingux
+title: Improving User Experience
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Configure text inputs
+
+Entering text on touch phone is a challenge - small screen, software keyboard. But based on what kind of data you need, you can make it easier by properly configuring the text inputs:
+
+- Focus the first field automatically
+- Use placeholder text as an example of expected data format
+- Enable or disable autocapitalization and autocorrect
+- Choose keyboard type (e.g. email, numeric)
+- Make sure the return button focuses the next field or submits the form
+
+Check out [`TextInput` docs](textinput.md) for more configuration options.
+
+
+
+
+```SnackPlayer name=TextInput%20form%20example&ext=js
+import React, {useState, useRef} from 'react';
+import {
+ Alert,
+ Text,
+ StatusBar,
+ TextInput,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ const emailInput = useRef(null);
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+
+ const submit = () => {
+ Alert.alert(
+ `Welcome, ${name}! Confirmation email has been sent to ${email}`,
+ );
+ };
+
+ return (
+
+
+
+
+ This demo shows how using available TextInput customizations can make
+ forms much easier to use. Try completing the form and notice that
+ different fields have specific optimizations and the return key
+ changes from focusing next input to submitting the form.
+
+
+ setName(text)}
+ placeholder="Full Name"
+ autoFocus={true}
+ autoCapitalize="words"
+ autoCorrect={true}
+ keyboardType="default"
+ returnKeyType="next"
+ onSubmitEditing={() => emailInput.current.focus()}
+ blurOnSubmit={false}
+ />
+ setEmail(text)}
+ ref={emailInput}
+ placeholder="email@example.com"
+ autoCapitalize="none"
+ autoCorrect={false}
+ keyboardType="email-address"
+ returnKeyType="send"
+ onSubmitEditing={submit}
+ blurOnSubmit={true}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ header: {
+ paddingTop: 64,
+ padding: 20,
+ backgroundColor: '#282c34',
+ },
+ description: {
+ fontSize: 14,
+ color: 'white',
+ },
+ input: {
+ margin: 20,
+ marginBottom: 0,
+ height: 34,
+ paddingHorizontal: 10,
+ borderRadius: 4,
+ borderColor: '#ccc',
+ borderWidth: 1,
+ fontSize: 16,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=TextInput%20form%20example&ext=tsx
+import React, {useState, useRef} from 'react';
+import {
+ Alert,
+ Text,
+ StatusBar,
+ TextInput,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ const emailInput = useRef(null);
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+
+ const submit = () => {
+ Alert.alert(
+ `Welcome, ${name}! Confirmation email has been sent to ${email}`,
+ );
+ };
+
+ return (
+
+
+
+
+ This demo shows how using available TextInput customizations can make
+ forms much easier to use. Try completing the form and notice that
+ different fields have specific optimizations and the return key
+ changes from focusing next input to submitting the form.
+
+
+ setName(text)}
+ placeholder="Full Name"
+ autoFocus={true}
+ autoCapitalize="words"
+ autoCorrect={true}
+ keyboardType="default"
+ returnKeyType="next"
+ onSubmitEditing={() => emailInput.current?.focus()}
+ blurOnSubmit={false}
+ />
+ setEmail(text)}
+ ref={emailInput}
+ placeholder="email@example.com"
+ autoCapitalize="none"
+ autoCorrect={false}
+ keyboardType="email-address"
+ returnKeyType="send"
+ onSubmitEditing={submit}
+ blurOnSubmit={true}
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ header: {
+ paddingTop: 64,
+ padding: 20,
+ backgroundColor: '#282c34',
+ },
+ description: {
+ fontSize: 14,
+ color: 'white',
+ },
+ input: {
+ margin: 20,
+ marginBottom: 0,
+ height: 34,
+ paddingHorizontal: 10,
+ borderRadius: 4,
+ borderColor: '#ccc',
+ borderWidth: 1,
+ fontSize: 16,
+ },
+});
+
+export default App;
+```
+
+
+
+
+## Manage layout when keyboard is visible
+
+Software keyboard takes almost half of the screen. If you have interactive elements that can get covered by the keyboard, make sure they are still accessible by using the [`KeyboardAvoidingView` component](keyboardavoidingview.md).
+
+
+
+
+```SnackPlayer name=KeyboardAvoidingView%20example&ext=js
+import React, {useState, useRef} from 'react';
+import {
+ Alert,
+ Text,
+ Button,
+ StatusBar,
+ TextInput,
+ KeyboardAvoidingView,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ const emailInput = useRef(null);
+ const [email, setEmail] = useState('');
+
+ const submit = () => {
+ emailInput.current.blur();
+ Alert.alert(`Confirmation email has been sent to ${email}`);
+ };
+
+ return (
+
+
+
+
+ This demo shows how to avoid covering important UI elements with the
+ software keyboard. Focus the email input below and notice that the
+ Sign Up button and the text adjusted positions to make sure they are
+ not hidden under the keyboard.
+
+
+
+ setEmail(text)}
+ ref={emailInput}
+ placeholder="email@example.com"
+ autoCapitalize="none"
+ autoCorrect={false}
+ keyboardType="email-address"
+ returnKeyType="send"
+ onSubmitEditing={submit}
+ blurOnSubmit={true}
+ />
+
+
+ Some important legal fine print here
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ header: {
+ paddingTop: 64,
+ padding: 20,
+ backgroundColor: '#282c34',
+ },
+ description: {
+ fontSize: 14,
+ color: 'white',
+ },
+ input: {
+ margin: 20,
+ marginBottom: 0,
+ height: 34,
+ paddingHorizontal: 10,
+ borderRadius: 4,
+ borderColor: '#ccc',
+ borderWidth: 1,
+ fontSize: 16,
+ },
+ legal: {
+ margin: 10,
+ color: '#333',
+ fontSize: 12,
+ textAlign: 'center',
+ },
+ form: {
+ flex: 1,
+ justifyContent: 'space-between',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=KeyboardAvoidingView%20example&ext=tsx
+import React, {useState, useRef} from 'react';
+import {
+ Alert,
+ Text,
+ Button,
+ StatusBar,
+ TextInput,
+ KeyboardAvoidingView,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ const emailInput = useRef(null);
+ const [email, setEmail] = useState('');
+
+ const submit = () => {
+ emailInput.current?.blur();
+ Alert.alert(`Confirmation email has been sent to ${email}`);
+ };
+
+ return (
+
+
+
+
+ This demo shows how to avoid covering important UI elements with the
+ software keyboard. Focus the email input below and notice that the
+ Sign Up button and the text adjusted positions to make sure they are
+ not hidden under the keyboard.
+
+
+
+ setEmail(text)}
+ ref={emailInput}
+ placeholder="email@example.com"
+ autoCapitalize="none"
+ autoCorrect={false}
+ keyboardType="email-address"
+ returnKeyType="send"
+ onSubmitEditing={submit}
+ blurOnSubmit={true}
+ />
+
+
+ Some important legal fine print here
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ header: {
+ paddingTop: 64,
+ padding: 20,
+ backgroundColor: '#282c34',
+ },
+ description: {
+ fontSize: 14,
+ color: 'white',
+ },
+ input: {
+ margin: 20,
+ marginBottom: 0,
+ height: 34,
+ paddingHorizontal: 10,
+ borderRadius: 4,
+ borderColor: '#ccc',
+ borderWidth: 1,
+ fontSize: 16,
+ },
+ legal: {
+ margin: 10,
+ color: '#333',
+ fontSize: 12,
+ textAlign: 'center',
+ },
+ form: {
+ flex: 1,
+ justifyContent: 'space-between',
+ },
+});
+
+export default App;
+```
+
+
+
+
+## Make tappable areas larger
+
+On mobile phones it's hard to be very precise when pressing buttons. Make sure all interactive elements are 44x44 or larger. One way to do this is to leave enough space for the element, `padding`, `minWidth` and `minHeight` style values can be useful for that. Alternatively, you can use [`hitSlop` prop](touchablewithoutfeedback.md#hitslop) to increase interactive area without affecting the layout. Here's a demo:
+
+```SnackPlayer name=HitSlop%20example
+import React from 'react';
+import {
+ Text,
+ StatusBar,
+ TouchableOpacity,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const App = () => {
+ return (
+
+
+
+
+ This demo shows how using hitSlop can make interactive elements much
+ easier to tap without changing their layout and size. Try pressing
+ each button quickly multiple times and notice which one is easier to
+ hit.
+
+
+
+
+ Without hitSlop
+
+
+
+
+ With hitSlop
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ header: {
+ paddingTop: 64,
+ padding: 20,
+ backgroundColor: '#282c34',
+ },
+ description: {
+ fontSize: 14,
+ color: 'white',
+ },
+ content: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ label: {
+ fontSize: 18,
+ color: '#336699',
+ textAlign: 'center',
+ borderColor: '#ddd',
+ borderWidth: 1,
+ },
+ separator: {
+ height: 50,
+ },
+ preview: {
+ padding: 20,
+ backgroundColor: '#f6f6f6',
+ },
+});
+
+export default App;
+```
+
+## Use Android Ripple
+
+Android API 21+ uses the material design ripple to provide user with feedback when they touch an interactable area on the screen. React Native exposes this through the [`TouchableNativeFeedback` component](touchablenativefeedback.md). Using this touchable effect instead of opacity or highlight will often make your app feel much more fitting on the platform. That said, you need to be careful when using it because it doesn't work on iOS or on Android API < 21, so you will need to fallback to using one of the other Touchable components on iOS. You can use a library like [react-native-platform-touchable](https://github.com/react-community/react-native-platform-touchable) to handle the platform differences for you.
+
+```SnackPlayer name=Android%20Ripple%20example&supportedPlatforms=android
+import React from 'react';
+import {
+ TouchableNativeFeedback,
+ TouchableOpacity,
+ TouchableHighlight,
+ Platform,
+ Text,
+ View,
+ StyleSheet,
+} from 'react-native';
+
+const SUPPORTS_NATIVE_FEEDBACK =
+ Platform.OS === 'android' && Platform.Version >= 21;
+
+const noop = () => {};
+const defaultHitSlop = {top: 15, bottom: 15, right: 15, left: 15};
+
+const ButtonsWithNativeFeedback = () => (
+
+
+
+ This is a ripple respecting borders
+
+
+
+
+
+ This is ripple without borders, this is more useful for icons, eg: in
+ tab bar
+
+
+
+
+);
+
+const Buttons = () => (
+
+
+ This is opacity
+
+
+ This is highlight
+
+
+);
+
+const App = () => (
+
+ {SUPPORTS_NATIVE_FEEDBACK ? : }
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingTop: 64,
+ backgroundColor: '#fff',
+ },
+ buttonContainer: {
+ margin: 24,
+ },
+ text: {
+ fontSize: 20,
+ color: '#fff',
+ fontWeight: 'bold',
+ },
+ button: {
+ padding: 25,
+ borderRadius: 5,
+ backgroundColor: '#000',
+ marginBottom: 30,
+ },
+});
+
+export default App;
+```
+
+## Screen orientation lock
+
+Multiple screen orientations should work fine by default unless you're using `Dimensions` API and don't handle orientation changes. If you don't want to support multiple screen orientations, you can lock the screen orientation to either portrait or landscape.
+
+On iOS, in the General tab and Deployment Info section of Xcode enable the Device Orientation you want to support (ensure you have selected iPhone from the Devices menu when making the changes). For Android, open the AndroidManifest.xml file and within the activity element add `'android:screenOrientation="portrait"'` to lock to portrait or `'android:screenOrientation="landscape"'` to lock to landscape.
+
+# Learn more
+
+[Material Design](https://material.io/) and [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines) are great resources for learning more about designing for mobile platforms.
diff --git a/website/versioned_docs/version-0.73.0/inputaccessoryview.md b/website/versioned_docs/version-0.73.0/inputaccessoryview.md
new file mode 100644
index 00000000000..fdf4917a5e2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/inputaccessoryview.md
@@ -0,0 +1,78 @@
+---
+id: inputaccessoryview
+title: InputAccessoryView
+---
+
+A component which enables customization of the keyboard input accessory view on iOS. The input accessory view is displayed above the keyboard whenever a `TextInput` has focus. This component can be used to create custom toolbars.
+
+To use this component wrap your custom toolbar with the InputAccessoryView component, and set a `nativeID`. Then, pass that `nativeID` as the `inputAccessoryViewID` of whatever `TextInput` you desire. A basic example:
+
+```SnackPlayer name=InputAccessoryView&supportedPlatforms=ios
+import React, {useState} from 'react';
+import {Button, InputAccessoryView, ScrollView, TextInput} from 'react-native';
+
+const App = () => {
+ const inputAccessoryViewID = 'uniqueID';
+ const initialText = '';
+ const [text, setText] = useState(initialText);
+
+ return (
+ <>
+
+
+
+
+ setText(initialText)} title="Clear text" />
+
+ >
+ );
+};
+
+export default App;
+```
+
+This component can also be used to create sticky text inputs (text inputs which are anchored to the top of the keyboard). To do this, wrap a `TextInput` with the `InputAccessoryView` component, and don't set a `nativeID`. For an example, look at [InputAccessoryViewExample.js](https://github.com/facebook/react-native/blob/main/packages/rn-tester/js/examples/InputAccessoryView/InputAccessoryViewExample.js).
+
+---
+
+# Reference
+
+## Props
+
+### `backgroundColor`
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `nativeID`
+
+An ID which is used to associate this `InputAccessoryView` to specified TextInput(s).
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `style`
+
+| Type |
+| --------------------------------- |
+| [View Style](view-style-props.md) |
+
+# Known issues
+
+- [react-native#18997](https://github.com/facebook/react-native/issues/18997): Doesn't support multiline `TextInput`
+- [react-native#20157](https://github.com/facebook/react-native/issues/20157): Can't use with a bottom tab bar
diff --git a/website/versioned_docs/version-0.73.0/integration-with-android-fragment.md b/website/versioned_docs/version-0.73.0/integration-with-android-fragment.md
new file mode 100644
index 00000000000..8ff8cb01094
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/integration-with-android-fragment.md
@@ -0,0 +1,309 @@
+---
+id: integration-with-android-fragment
+title: Integration with an Android Fragment
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+The guide for [Integration with Existing Apps](https://reactnative.dev/docs/integration-with-existing-apps) details how to integrate a full-screen React Native app into an existing Android app as an Activity. To use React Native components within Fragments in an existing app requires some additional setup. The benefit of this is that it allows for a native app to integrate React Native components alongside native fragments in an Activity.
+
+### 1. Add React Native to your app
+
+Follow the guide for [Integration with Existing Apps](https://reactnative.dev/docs/integration-with-existing-apps) until the Code integration section. Continue to follow Step 1. Create an `index.android.js` file and Step 2. Add your React Native code from this section.
+
+### 2. Integrating your App with a React Native Fragment
+
+You can render your React Native component into a Fragment instead of a full screen React Native Activity. The component may be termed a "screen" or "fragment" and it will function in the same manner as an Android fragment, likely containing child components. These components can be placed in a `/fragments` folder and the child components used to compose the fragment can be placed in a `/components` folder.
+
+You will need to implement the `ReactApplication` interface in your main Application Java/Kotlin class. If you have created a new project from Android Studio with a default activity, you will need to create a new class (e.g. `MyReactApplication.java` or `MyReactApplication.kt`). If it is an existing class you can find this main class in your `AndroidManifest.xml` file. Under the `` tag you should see a property `android:name` e.g. `android:name=".MyReactApplication"`. This value is the class you want to implement and provide the required methods to.
+
+Ensure your main Application class implements ReactApplication:
+
+
+
+
+```kotlin
+class MyReactApplication: Application(), ReactApplication {...}
+```
+
+
+
+
+```java
+public class MyReactApplication extends Application implements ReactApplication {...}
+```
+
+
+
+
+Override the required methods `getUseDeveloperSupport`, `getPackages` and `getReactNativeHost`:
+
+
+
+
+```kotlin
+class MyReactApplication : Application(), ReactApplication {
+ override fun onCreate() {
+ super.onCreate()
+ SoLoader.init(this, false)
+ }
+ private val reactNativeHost =
+ object : DefaultReactNativeHost(this) {
+ override fun getUseDeveloperSupport() = BuildConfig.DEBUG
+ override fun getPackages(): List {
+ val packages = PackageList(this).getPackages().toMutableList()
+ // Packages that cannot be autolinked yet can be added manually here
+ return packages
+ }
+ }
+ override fun getReactNativeHost(): ReactNativeHost = reactNativeHost
+}
+```
+
+
+
+
+```java
+public class MyReactApplication extends Application implements ReactApplication {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ SoLoader.init(this, false);
+ }
+
+ private final ReactNativeHost mReactNativeHost = new DefaultReactNativeHost(this) {
+ @Override
+ public boolean getUseDeveloperSupport() {
+ return BuildConfig.DEBUG;
+ }
+
+ protected List getPackages() {
+ List packages = new PackageList(this).getPackages();
+ // Packages that cannot be autolinked yet can be added manually here
+ return packages;
+ }
+ };
+
+ @Override
+ public ReactNativeHost getReactNativeHost() {
+ return mReactNativeHost;
+ }
+}
+```
+
+
+
+
+If you are using Android Studio, use Alt + Enter to add all missing imports in your class. Alternatively these are the required imports to include manually:
+
+
+
+
+```kotlin
+import android.app.Application
+
+import com.facebook.react.PackageList
+import com.facebook.react.ReactApplication
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.defaults.DefaultReactNativeHost
+import com.facebook.soloader.SoLoader
+```
+
+
+
+
+```java
+import android.app.Application;
+
+import com.facebook.react.PackageList;
+import com.facebook.react.ReactApplication;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.defaults.DefaultReactNativeHost;
+import com.facebook.soloader.SoLoader;
+
+import java.util.List;
+```
+
+
+
+
+Perform a "Sync Project files with Gradle" operation.
+
+### Step 3. Add a FrameLayout for the React Native Fragment
+
+You will now add your React Native Fragment to an Activity. For a new project this Activity will be `MainActivity` but it could be any Activity and more fragments can be added to additional Activities as you integrate more React Native components into your app.
+
+First add the React Native Fragment to your Activity's layout. For example `main_activity.xml` in the `res/layouts` folder.
+
+Add a `` with an id, width and height. This is the layout you will find and render your React Native Fragment into.
+
+```xml
+
+```
+
+### Step 4. Add a React Native Fragment to the FrameLayout
+
+To add your React Native Fragment to your layout you need to have an Activity. As mentioned in a new project this will be `MainActivity`. In this Activity add a button and an event listener. On button click you will render your React Native Fragment.
+
+Modify your Activity layout to add the button:
+
+```xml
+
+```
+
+Now in your Activity class (e.g. `MainActivity.java` or `MainActivity.kt`) you need to add an `OnClickListener` for the button, instantiate your `ReactFragment` and add it to the frame layout.
+
+Add the button field to the top of your Activity:
+
+
+
+
+```kotlin
+private lateinit var button: Button
+```
+
+
+
+
+```java
+private Button mButton;
+```
+
+
+
+
+Update your Activity's `onCreate` method as follows:
+
+
+
+
+```kotlin
+override fun onCreate(savedInstanceState: Bundle) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.main_activity)
+ button = findViewById(R.id.button)
+ button.setOnClickListener {
+ val reactNativeFragment = ReactFragment.Builder()
+ .setComponentName("HelloWorld")
+ .setLaunchOptions(getLaunchOptions("test message"))
+ .build()
+ getSupportFragmentManager()
+ .beginTransaction()
+ .add(R.id.reactNativeFragment, reactNativeFragment)
+ .commit()
+ }
+}
+```
+
+
+
+
+```java
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main_activity);
+
+ mButton = findViewById(R.id.button);
+ mButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ Fragment reactNativeFragment = new ReactFragment.Builder()
+ .setComponentName("HelloWorld")
+ .setLaunchOptions(getLaunchOptions("test message"))
+ .build();
+
+ getSupportFragmentManager()
+ .beginTransaction()
+ .add(R.id.reactNativeFragment, reactNativeFragment)
+ .commit();
+
+ }
+ });
+}
+```
+
+
+
+
+In the code above `Fragment reactNativeFragment = new ReactFragment.Builder()` creates the ReactFragment and `getSupportFragmentManager().beginTransaction().add()` adds the Fragment to the Frame Layout.
+
+If you are using a starter kit for React Native, replace the "HelloWorld" string with the one in your `index.js` or `index.android.js` file (it’s the first argument to the AppRegistry.registerComponent() method).
+
+Add the `getLaunchOptions` method which will allow you to pass props through to your component. This is optional and you can remove `setLaunchOptions` if you don't need to pass any props.
+
+
+
+
+```kotlin
+private fun getLaunchOptions(message: String) = Bundle().apply {
+ putString("message", message)
+}
+
+```
+
+
+
+
+```java
+private Bundle getLaunchOptions(String message) {
+ Bundle initialProperties = new Bundle();
+ initialProperties.putString("message", message);
+ return initialProperties;
+}
+```
+
+
+
+
+Add all missing imports in your Activity class. Be careful to use your package’s BuildConfig and not the one from the facebook package! Alternatively these are the required imports to include manually:
+
+
+
+
+```kotlin
+import android.app.Application
+
+import com.facebook.react.ReactApplication
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.shell.MainReactPackage
+import com.facebook.soloader.SoLoader
+
+```
+
+
+
+
+```java
+import android.app.Application;
+
+import com.facebook.react.ReactApplication;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.shell.MainReactPackage;
+import com.facebook.soloader.SoLoader;
+```
+
+
+
+
+Perform a "Sync Project files with Gradle" operation.
+
+### Step 5. Test your integration
+
+Make sure you run `yarn` to install your react-native dependencies and run `yarn native` to start the metro bundler. Run your android app in Android Studio and it should load the JavaScript code from the development server and display it in your React Native Fragment in the Activity.
+
+### Step 6. Additional setup - Native modules
+
+You may need to call out to existing Java/Kotlin code from your react component. Native modules allow you to call out to native code and run methods in your native app. Follow the setup here [native-modules-android](/docs/native-modules-android)
diff --git a/website/versioned_docs/version-0.73.0/integration-with-existing-apps.md b/website/versioned_docs/version-0.73.0/integration-with-existing-apps.md
new file mode 100644
index 00000000000..237a9d39ce8
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/integration-with-existing-apps.md
@@ -0,0 +1,38 @@
+---
+id: integration-with-existing-apps
+title: Integration with Existing Apps
+hide_table_of_contents: true
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
+
+import IntegrationJava from './\_integration-with-existing-apps-java.md'; import IntegrationObjC from './\_integration-with-existing-apps-objc.md'; import IntegrationSwift from './\_integration-with-existing-apps-swift.md'; import
+IntegrationKotlin from './\_integration-with-existing-apps-kotlin.md';
+
+React Native is great when you are starting a new mobile app from scratch. However, it also works well for adding a single view or user flow to existing native applications. With a few steps, you can add new React Native based features, screens, views, etc.
+
+The specific steps are different depending on what platform you're targeting.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/interactionmanager.md b/website/versioned_docs/version-0.73.0/interactionmanager.md
new file mode 100644
index 00000000000..ea5b15c7919
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/interactionmanager.md
@@ -0,0 +1,410 @@
+---
+id: interactionmanager
+title: InteractionManager
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+InteractionManager allows long-running work to be scheduled after any interactions/animations have completed. In particular, this allows JavaScript animations to run smoothly.
+
+Applications can schedule tasks to run after interactions with the following:
+
+```tsx
+InteractionManager.runAfterInteractions(() => {
+ // ...long-running synchronous task...
+});
+```
+
+Compare this to other scheduling alternatives:
+
+- `requestAnimationFrame()` for code that animates a view over time.
+- `setImmediate/setTimeout()` run code later, note this may delay animations.
+- `runAfterInteractions()` run code later, without delaying active animations.
+
+The touch handling system considers one or more active touches to be an 'interaction' and will delay `runAfterInteractions()` callbacks until all touches have ended or been cancelled.
+
+InteractionManager also allows applications to register animations by creating an interaction 'handle' on animation start, and clearing it upon completion:
+
+```tsx
+const handle = InteractionManager.createInteractionHandle();
+// run animation... (`runAfterInteractions` tasks are queued)
+// later, on animation completion:
+InteractionManager.clearInteractionHandle(handle);
+// queued tasks run if all handles were cleared
+```
+
+`runAfterInteractions` takes either a plain callback function, or a `PromiseTask` object with a `gen` method that returns a `Promise`. If a `PromiseTask` is supplied, then it is fully resolved (including asynchronous dependencies that also schedule more tasks via `runAfterInteractions`) before starting on the next task that might have been queued up synchronously earlier.
+
+By default, queued tasks are executed together in a loop in one `setImmediate` batch. If `setDeadline` is called with a positive number, then tasks will only be executed until the deadline (in terms of js event loop run time) approaches, at which point execution will yield via setTimeout, allowing events such as touches to start interactions and block queued tasks from executing, making apps more responsive.
+
+---
+
+## Example
+
+### Basic
+
+
+
+
+```SnackPlayer name=InteractionManager%20Function%20Component%20Basic%20Example&supportedPlatforms=ios,android&ext=js
+import React, {useState, useEffect} from 'react';
+import {
+ Alert,
+ Animated,
+ InteractionManager,
+ Platform,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const instructions = Platform.select({
+ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
+ android:
+ 'Double tap R on your keyboard to reload,\n' +
+ 'Shake or press menu button for dev menu',
+});
+
+const useFadeIn = (duration = 5000) => {
+ const [opacity] = useState(new Animated.Value(0));
+
+ // Running the animation when the component is mounted
+ useEffect(() => {
+ // Animated.timing() create a interaction handle by default, if you want to disabled that
+ // behaviour you can set isInteraction to false to disabled that.
+ Animated.timing(opacity, {
+ toValue: 1,
+ duration,
+ useNativeDriver: true,
+ }).start();
+ }, [duration, opacity]);
+
+ return opacity;
+};
+
+const Ball = ({onShown}) => {
+ const opacity = useFadeIn();
+
+ // Running a method after the animation
+ useEffect(() => {
+ const interactionPromise = InteractionManager.runAfterInteractions(() =>
+ onShown(),
+ );
+ return () => interactionPromise.cancel();
+ }, [onShown]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ {instructions}
+ Alert.alert('Animation is done')} />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ ball: {
+ width: 100,
+ height: 100,
+ backgroundColor: 'salmon',
+ borderRadius: 100,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=InteractionManager%20Function%20Component%20Basic%20Example&supportedPlatforms=ios,android&ext=tsx
+import React, {useState, useEffect} from 'react';
+import {
+ Alert,
+ Animated,
+ InteractionManager,
+ Platform,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const instructions = Platform.select({
+ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
+ android:
+ 'Double tap R on your keyboard to reload,\n' +
+ 'Shake or press menu button for dev menu',
+});
+
+const useFadeIn = (duration = 5000) => {
+ const [opacity] = useState(new Animated.Value(0));
+
+ // Running the animation when the component is mounted
+ useEffect(() => {
+ // Animated.timing() create a interaction handle by default, if you want to disabled that
+ // behaviour you can set isInteraction to false to disabled that.
+ Animated.timing(opacity, {
+ toValue: 1,
+ duration,
+ useNativeDriver: true,
+ }).start();
+ }, [duration, opacity]);
+
+ return opacity;
+};
+
+type BallProps = {
+ onShown: () => void;
+};
+
+const Ball = ({onShown}: BallProps) => {
+ const opacity = useFadeIn();
+
+ // Running a method after the animation
+ useEffect(() => {
+ const interactionPromise = InteractionManager.runAfterInteractions(() =>
+ onShown(),
+ );
+ return () => interactionPromise.cancel();
+ }, [onShown]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ {instructions}
+ Alert.alert('Animation is done')} />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ ball: {
+ width: 100,
+ height: 100,
+ backgroundColor: 'salmon',
+ borderRadius: 100,
+ },
+});
+
+export default App;
+```
+
+
+
+
+### Advanced
+
+
+
+
+```SnackPlayer name=InteractionManager%20Function%20Component%20Advanced%20Example&supportedPlatforms=ios,android&ext=js
+import React, {useEffect} from 'react';
+import {
+ Alert,
+ Animated,
+ InteractionManager,
+ Platform,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const instructions = Platform.select({
+ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
+ android:
+ 'Double tap R on your keyboard to reload,\n' +
+ 'Shake or press menu button for dev menu',
+});
+
+// You can create a custom interaction/animation and add
+// support for InteractionManager
+const useCustomInteraction = (timeLocked = 2000) => {
+ useEffect(() => {
+ const handle = InteractionManager.createInteractionHandle();
+
+ setTimeout(
+ () => InteractionManager.clearInteractionHandle(handle),
+ timeLocked,
+ );
+
+ return () => InteractionManager.clearInteractionHandle(handle);
+ }, [timeLocked]);
+};
+
+const Ball = ({onInteractionIsDone}) => {
+ useCustomInteraction();
+
+ // Running a method after the interaction
+ useEffect(() => {
+ InteractionManager.runAfterInteractions(() => onInteractionIsDone());
+ }, [onInteractionIsDone]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ {instructions}
+ Alert.alert('Interaction is done')} />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ ball: {
+ width: 100,
+ height: 100,
+ backgroundColor: 'salmon',
+ borderRadius: 100,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=InteractionManager%20Function%20Component%20Advanced%20Example&supportedPlatforms=ios,android&ext=tsx
+import React, {useEffect} from 'react';
+import {
+ Alert,
+ Animated,
+ InteractionManager,
+ Platform,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const instructions = Platform.select({
+ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
+ android:
+ 'Double tap R on your keyboard to reload,\n' +
+ 'Shake or press menu button for dev menu',
+});
+
+// You can create a custom interaction/animation and add
+// support for InteractionManager
+const useCustomInteraction = (timeLocked = 2000) => {
+ useEffect(() => {
+ const handle = InteractionManager.createInteractionHandle();
+
+ setTimeout(
+ () => InteractionManager.clearInteractionHandle(handle),
+ timeLocked,
+ );
+
+ return () => InteractionManager.clearInteractionHandle(handle);
+ }, [timeLocked]);
+};
+
+type BallProps = {
+ onInteractionIsDone: () => void;
+};
+
+const Ball = ({onInteractionIsDone}: BallProps) => {
+ useCustomInteraction();
+
+ // Running a method after the interaction
+ useEffect(() => {
+ InteractionManager.runAfterInteractions(() => onInteractionIsDone());
+ }, [onInteractionIsDone]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ {instructions}
+ Alert.alert('Interaction is done')} />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ ball: {
+ width: 100,
+ height: 100,
+ backgroundColor: 'salmon',
+ borderRadius: 100,
+ },
+});
+
+export default App;
+```
+
+
+
+
+> **Note**: `InteractionManager.runAfterInteractions()` is not working properly on web. It triggers immediately without waiting until the interaction is finished.
+
+# Reference
+
+## Methods
+
+### `runAfterInteractions()`
+
+```tsx
+static runAfterInteractions(task?: (() => any) | SimpleTask | PromiseTask);
+```
+
+Schedule a function to run after all interactions have completed. Returns a cancellable "promise".
+
+---
+
+### `createInteractionHandle()`
+
+```tsx
+static createInteractionHandle(): Handle;
+```
+
+Notify manager that an interaction has started.
+
+---
+
+### `clearInteractionHandle()`
+
+```tsx
+static clearInteractionHandle(handle: Handle);
+```
+
+Notify manager that an interaction has completed.
+
+---
+
+### `setDeadline()`
+
+```tsx
+static setDeadline(deadline: number);
+```
+
+A positive number will use setTimeout to schedule any tasks after the eventLoopRunningTime hits the deadline value, otherwise all tasks will be executed in one setImmediate batch (default).
diff --git a/website/versioned_docs/version-0.73.0/intro-react-native-components.md b/website/versioned_docs/version-0.73.0/intro-react-native-components.md
new file mode 100644
index 00000000000..62bdcc4ec55
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/intro-react-native-components.md
@@ -0,0 +1,84 @@
+---
+id: intro-react-native-components
+title: Core Components and Native Components
+description: 'React Native lets you compose app interfaces using Native Components. Conveniently, it comes with a set of these components for you to get started with right now—the Core Components!'
+---
+
+import ThemedImage from '@theme/ThemedImage';
+
+React Native is an open source framework for building Android and iOS applications using [React](https://reactjs.org/) and the app platform’s native capabilities. With React Native, you use JavaScript to access your platform’s APIs as well as to describe the appearance and behavior of your UI using React components: bundles of reusable, nestable code. You can learn more about React in the next section. But first, let’s cover how components work in React Native.
+
+## Views and mobile development
+
+In Android and iOS development, a **view** is the basic building block of UI: a small rectangular element on the screen which can be used to display text, images, or respond to user input. Even the smallest visual elements of an app, like a line of text or a button, are kinds of views. Some kinds of views can contain other views. It’s views all the way down!
+
+
+
+ Just a sampling of the many views used in Android and iOS apps.
+
+
+## Native Components
+
+In Android development, you write views in Kotlin or Java; in iOS development, you use Swift or Objective-C. With React Native, you can invoke these views with JavaScript using React components. At runtime, React Native creates the corresponding Android and iOS views for those components. Because React Native components are backed by the same views as Android and iOS, React Native apps look, feel, and perform like any other apps. We call these platform-backed components **Native Components.**
+
+React Native comes with a set of essential, ready-to-use Native Components you can use to start building your app today. These are React Native's **Core Components**.
+
+React Native also lets you build your own Native Components for [Android](native-components-android.md) and [iOS](native-components-ios.md) to suit your app’s unique needs. We also have a thriving ecosystem of these **community-contributed components.** Check out [Native Directory](https://reactnative.directory) to find what the community has been creating.
+
+## Core Components
+
+React Native has many Core Components for everything from controls to activity indicators. You can find them all [documented in the API section](components-and-apis). You will mostly work with the following Core Components:
+
+| React Native UI Component | Android View | iOS View | Web Analog | Description |
+| ------------------------- | -------------- | ---------------- | ----------------------- | ----------------------------------------------------------------------------------------------------- |
+| `` | `` | `` | A non-scrolling `
` | A container that supports layout with flexbox, style, some touch handling, and accessibility controls |
+| `` | `` | `` | `
` | Displays, styles, and nests strings of text and even handles touch events |
+| `` | `` | `` | `` | Displays different types of images |
+| `` | `` | `` | `
` | A generic scrolling container that can contain multiple components and views |
+| `` | `` | `` | `` | Allows the user to enter text |
+
+In the next section, you will start combining these Core Components to learn about how React works. Have a play with them here now!
+
+```SnackPlayer name=Hello%20World
+import React from 'react';
+import {View, Text, Image, ScrollView, TextInput} from 'react-native';
+
+const App = () => {
+ return (
+
+ Some text
+
+ Some more text
+
+
+
+
+ );
+};
+
+export default App;
+```
+
+---
+
+Because React Native uses the same API structure as React components, you’ll need to understand React component APIs to get started. The [next section](intro-react) makes for a quick introduction or refresher on the topic. However, if you’re already familiar with React, feel free to [skip ahead](handling-text-input).
+
+
diff --git a/website/versioned_docs/version-0.73.0/intro-react.md b/website/versioned_docs/version-0.73.0/intro-react.md
new file mode 100644
index 00000000000..3b92f78268b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/intro-react.md
@@ -0,0 +1,467 @@
+---
+id: intro-react
+title: React Fundamentals
+description: To understand React Native fully, you need a solid foundation in React. This short introduction to React can help you get started or get refreshed.
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+React Native runs on [React](https://react.dev/), a popular open source library for building user interfaces with JavaScript. To make the most of React Native, it helps to understand React itself. This section can get you started or can serve as a refresher course.
+
+We’re going to cover the core concepts behind React:
+
+- components
+- JSX
+- props
+- state
+
+If you want to dig deeper, we encourage you to check out [React’s official documentation](https://react.dev/learn).
+
+## Your first component
+
+The rest of this introduction to React uses cats in its examples: friendly, approachable creatures that need names and a cafe to work in. Here is your very first Cat component:
+
+```SnackPlayer name=Your%20Cat
+import React from 'react';
+import {Text} from 'react-native';
+
+const Cat = () => {
+ return Hello, I am your cat!;
+};
+
+export default Cat;
+```
+
+Here is how you do it: To define your `Cat` component, first use JavaScript’s [`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) to import React and React Native’s [`Text`](/docs/next/text) Core Component:
+
+```tsx
+import React from 'react';
+import {Text} from 'react-native';
+```
+
+Your component starts as a function:
+
+```tsx
+const Cat = () => {};
+```
+
+You can think of components as blueprints. Whatever a function component returns is rendered as a **React element.** React elements let you describe what you want to see on the screen.
+
+Here the `Cat` component will render a `` element:
+
+```tsx
+const Cat = () => {
+ return Hello, I am your cat!;
+};
+```
+
+You can export your function component with JavaScript’s [`export default`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export) for use throughout your app like so:
+
+```tsx
+const Cat = () => {
+ return Hello, I am your cat!;
+};
+
+export default Cat;
+```
+
+> This is one of many ways to export your component. This kind of export works well with the Snack Player. However, depending on your app’s file structure, you might need to use a different convention. This [handy cheatsheet on JavaScript imports and exports](https://medium.com/dailyjs/javascript-module-cheatsheet-7bd474f1d829) can help.
+
+Now take a closer look at that `return` statement. `Hello, I am your cat!` is using a kind of JavaScript syntax that makes writing elements convenient: JSX.
+
+## JSX
+
+React and React Native use **JSX,** a syntax that lets you write elements inside JavaScript like so: `Hello, I am your cat!`. The React docs have [a comprehensive guide to JSX](https://react.dev/learn/writing-markup-with-jsx) you can refer to learn even more. Because JSX is JavaScript, you can use variables inside it. Here you are declaring a name for the cat, `name`, and embedding it with curly braces inside ``.
+
+```SnackPlayer name=Curly%20Braces
+import React from 'react';
+import {Text} from 'react-native';
+
+const Cat = () => {
+ const name = 'Maru';
+ return Hello, I am {name}!;
+};
+
+export default Cat;
+```
+
+Any JavaScript expression will work between curly braces, including function calls like `{getFullName("Rum", "Tum", "Tugger")}`:
+
+
+
+
+```SnackPlayer name=Curly%20Braces&ext=js
+import React from 'react';
+import {Text} from 'react-native';
+
+const getFullName = (firstName, secondName, thirdName) => {
+ return firstName + ' ' + secondName + ' ' + thirdName;
+};
+
+const Cat = () => {
+ return Hello, I am {getFullName('Rum', 'Tum', 'Tugger')}!;
+};
+
+export default Cat;
+```
+
+
+
+
+```SnackPlayer name=Curly%20Braces&ext=tsx
+import React from 'react';
+import {Text} from 'react-native';
+
+const getFullName = (
+ firstName: string,
+ secondName: string,
+ thirdName: string,
+) => {
+ return firstName + ' ' + secondName + ' ' + thirdName;
+};
+
+const Cat = () => {
+ return Hello, I am {getFullName('Rum', 'Tum', 'Tugger')}!;
+};
+
+export default Cat;
+```
+
+
+
+
+You can think of curly braces as creating a portal into JS functionality in your JSX!
+
+> Because JSX is included in the React library, it won’t work if you don’t have `import React from 'react'` at the top of your file!
+
+## Custom Components
+
+You’ve already met [React Native’s Core Components](intro-react-native-components). React lets you nest these components inside each other to create new components. These nestable, reusable components are at the heart of the React paradigm.
+
+For example, you can nest [`Text`](text) and [`TextInput`](textinput) inside a [`View`](view) below, and React Native will render them together:
+
+```SnackPlayer name=Custom%20Components
+import React from 'react';
+import {Text, TextInput, View} from 'react-native';
+
+const Cat = () => {
+ return (
+
+ Hello, I am...
+
+
+ );
+};
+
+export default Cat;
+```
+
+#### Developer notes
+
+
+
+
+
+> If you’re familiar with web development, `` and `` might remind you of HTML! You can think of them as the `
` and `
` tags of application development.
+
+
+
+
+> On Android, you usually put your views inside `LinearLayout`, `FrameLayout`, `RelativeLayout`, etc. to define how the view’s children will be arranged on the screen. In React Native, `View` uses Flexbox for its children’s layout. You can learn more in [our guide to layout with Flexbox](flexbox).
+
+
+
+
+You can render this component multiple times and in multiple places without repeating your code by using ``:
+
+```SnackPlayer name=Multiple%20Components
+import React from 'react';
+import {Text, View} from 'react-native';
+
+const Cat = () => {
+ return (
+
+ I am also a cat!
+
+ );
+};
+
+const Cafe = () => {
+ return (
+
+ Welcome!
+
+
+
+
+ );
+};
+
+export default Cafe;
+```
+
+Any component that renders other components is a **parent component.** Here, `Cafe` is the parent component and each `Cat` is a **child component.**
+
+You can put as many cats in your cafe as you like. Each `` renders a unique element—which you can customize with props.
+
+## Props
+
+**Props** is short for “properties”. Props let you customize React components. For example, here you pass each `` a different `name` for `Cat` to render:
+
+
+
+
+```SnackPlayer name=Multiple%20Props&ext=js
+import React from 'react';
+import {Text, View} from 'react-native';
+
+const Cat = props => {
+ return (
+
+ Hello, I am {props.name}!
+
+ );
+};
+
+const Cafe = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default Cafe;
+```
+
+
+
+
+```SnackPlayer name=Multiple%20Props&ext=tsx
+import React from 'react';
+import {Text, View} from 'react-native';
+
+type CatProps = {
+ name: string;
+};
+
+const Cat = (props: CatProps) => {
+ return (
+
+ Hello, I am {props.name}!
+
+ );
+};
+
+const Cafe = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default Cafe;
+```
+
+
+
+
+Most of React Native’s Core Components can be customized with props, too. For example, when using [`Image`](image), you pass it a prop named [`source`](image#source) to define what image it shows:
+
+```SnackPlayer name=Props
+import React from 'react';
+import {Text, View, Image} from 'react-native';
+
+const CatApp = () => {
+ return (
+
+
+ Hello, I am your cat!
+
+ );
+};
+
+export default CatApp;
+```
+
+`Image` has [many different props](image#props), including [`style`](image#style), which accepts a JS object of design and layout related property-value pairs.
+
+> Notice the double curly braces `{{ }}` surrounding `style`‘s width and height. In JSX, JavaScript values are referenced with `{}`. This is handy if you are passing something other than a string as props, like an array or number: ``. However, JS objects are **_also_** denoted with curly braces: `{width: 200, height: 200}`. Therefore, to pass a JS object in JSX, you must wrap the object in **another pair** of curly braces: `{{width: 200, height: 200}}`
+
+You can build many things with props and the Core Components [`Text`](text), [`Image`](image), and [`View`](view)! But to build something interactive, you’ll need state.
+
+## State
+
+While you can think of props as arguments you use to configure how components render, **state** is like a component’s personal data storage. State is useful for handling data that changes over time or that comes from user interaction. State gives your components memory!
+
+> As a general rule, use props to configure a component when it renders. Use state to keep track of any component data that you expect to change over time.
+
+The following example takes place in a cat cafe where two hungry cats are waiting to be fed. Their hunger, which we expect to change over time (unlike their names), is stored as state. To feed the cats, press their buttons—which will update their state.
+
+You can add state to a component by calling [React’s `useState` Hook](https://react.dev/learn/state-a-components-memory). A Hook is a kind of function that lets you “hook into” React features. For example, `useState` is a Hook that lets you add state to function components. You can learn more about [other kinds of Hooks in the React documentation.](https://react.dev/reference/react)
+
+
+
+
+```SnackPlayer name=State&ext=js
+import React, {useState} from 'react';
+import {Button, Text, View} from 'react-native';
+
+const Cat = props => {
+ const [isHungry, setIsHungry] = useState(true);
+
+ return (
+
+
+ I am {props.name}, and I am {isHungry ? 'hungry' : 'full'}!
+
+ {
+ setIsHungry(false);
+ }}
+ disabled={!isHungry}
+ title={isHungry ? 'Pour me some milk, please!' : 'Thank you!'}
+ />
+
+ );
+};
+
+const Cafe = () => {
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default Cafe;
+```
+
+
+
+
+```SnackPlayer name=State&ext=tsx
+import React, {useState} from 'react';
+import {Button, Text, View} from 'react-native';
+
+type CatProps = {
+ name: string;
+};
+
+const Cat = (props: CatProps) => {
+ const [isHungry, setIsHungry] = useState(true);
+
+ return (
+
+
+ I am {props.name}, and I am {isHungry ? 'hungry' : 'full'}!
+
+ {
+ setIsHungry(false);
+ }}
+ disabled={!isHungry}
+ title={isHungry ? 'Pour me some milk, please!' : 'Thank you!'}
+ />
+
+ );
+};
+
+const Cafe = () => {
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default Cafe;
+```
+
+
+
+
+First, you will want to import `useState` from React like so:
+
+```tsx
+import React, {useState} from 'react';
+```
+
+Then you declare the component’s state by calling `useState` inside its function. In this example, `useState` creates an `isHungry` state variable:
+
+```tsx
+const Cat = (props: CatProps) => {
+ const [isHungry, setIsHungry] = useState(true);
+ // ...
+};
+```
+
+> You can use `useState` to track any kind of data: strings, numbers, Booleans, arrays, objects. For example, you can track the number of times a cat has been petted with `const [timesPetted, setTimesPetted] = useState(0)`!
+
+Calling `useState` does two things:
+
+- it creates a “state variable” with an initial value—in this case the state variable is `isHungry` and its initial value is `true`
+- it creates a function to set that state variable’s value—`setIsHungry`
+
+It doesn’t matter what names you use. But it can be handy to think of the pattern as `[, ] = useState()`.
+
+Next you add the [`Button`](button) Core Component and give it an `onPress` prop:
+
+```tsx
+ {
+ setIsHungry(false);
+ }}
+ //..
+/>
+```
+
+Now, when someone presses the button, `onPress` will fire, calling the `setIsHungry(false)`. This sets the state variable `isHungry` to `false`. When `isHungry` is false, the `Button`’s `disabled` prop is set to `true` and its `title` also changes:
+
+```tsx
+
+```
+
+> You might’ve noticed that although `isHungry` is a [const](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/const), it is seemingly reassignable! What is happening is when a state-setting function like `setIsHungry` is called, its component will re-render. In this case the `Cat` function will run again—and this time, `useState` will give us the next value of `isHungry`.
+
+Finally, put your cats inside a `Cafe` component:
+
+```tsx
+const Cafe = () => {
+ return (
+ <>
+
+
+ >
+ );
+};
+```
+
+> See the `<>` and `>` above? These bits of JSX are [fragments](https://react.dev/reference/react/Fragment). Adjacent JSX elements must be wrapped in an enclosing tag. Fragments let you do that without nesting an extra, unnecessary wrapping element like `View`.
+
+---
+
+Now that you’ve covered both React and React Native’s Core Components, let’s dive deeper on some of these core components by looking at [handling ``](handling-text-input).
diff --git a/website/versioned_docs/version-0.73.0/introduction.md b/website/versioned_docs/version-0.73.0/introduction.md
new file mode 100644
index 00000000000..0122df1b2d4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/introduction.md
@@ -0,0 +1,83 @@
+---
+id: getting-started
+title: Introduction
+description: This helpful guide lays out the prerequisites for learning React Native, using these docs, and setting up your environment.
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+ Welcome to the very start of your React Native journey! If you're looking for environment setup instructions, they've moved to their own section. Continue reading for an introduction to the documentation, Native Components, React, and more!
+
+
+
+Many different kinds of people use React Native: from advanced iOS developers to React beginners, to people getting started programming for the first time in their career. These docs were written for all learners, no matter their experience level or background.
+
+## How to use these docs
+
+You can start here and read through these docs linearly like a book; or you can read the specific sections you need. Already familiar with React? You can skip [that section](intro-react)—or read it for a light refresher.
+
+## Prerequisites
+
+To work with React Native, you will need to have an understanding of JavaScript fundamentals. If you’re new to JavaScript or need a refresher, you can [dive in](https://developer.mozilla.org/en-US/docs/Web/JavaScript) or [brush up](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) at Mozilla Developer Network.
+
+> While we do our best to assume no prior knowledge of React, Android, or iOS development, these are valuable topics of study for the aspiring React Native developer. Where sensible, we have linked to resources and articles that go more in depth.
+
+## Interactive examples
+
+This introduction lets you get started immediately in your browser with interactive examples like this one:
+
+```SnackPlayer name=Hello%20World
+import React from 'react';
+import {Text, View} from 'react-native';
+
+const YourApp = () => {
+ return (
+
+ Try editing me! 🎉
+
+ );
+};
+
+export default YourApp;
+```
+
+The above is a Snack Player. It’s a handy tool created by Expo to embed and run React Native projects and share how they render in platforms like Android and iOS. The code is live and editable, so you can play directly with it in your browser. Go ahead and try changing the "Try editing me!" text above to "Hello, world!"
+
+> Optionally, if you want to setup a local development environment, [you can follow our guide to setting up your environment on your local machine](environment-setup) and paste the code examples into your `App.js` file there. (If you are a web developer, you may already have a local environment set up for mobile browser testing!)
+
+## Developer Notes
+
+People from many different development backgrounds are learning React Native. You may have experience with a range of technologies, from web to Android to iOS and more. We try to write for developers from all backgrounds. Sometimes we provide explanations specific to one platform or another like so:
+
+
+
+
+
+> Android developers may be familiar with this concept.
+
+
+
+
+> iOS developers may be familiar with this concept.
+
+
+
+
+> Web developers may be familiar with this concept.
+
+
+
+
+## Formatting
+
+Menu paths are written in bold and use carets to navigate submenus. Example: **Android Studio > Preferences**
+
+---
+
+Now that you know how this guide works, it's time to get to know the foundation of React Native: [Native Components](intro-react-native-components.md).
diff --git a/website/versioned_docs/version-0.73.0/javascript-environment.md b/website/versioned_docs/version-0.73.0/javascript-environment.md
new file mode 100644
index 00000000000..acce6f8bc69
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/javascript-environment.md
@@ -0,0 +1,109 @@
+---
+id: javascript-environment
+title: JavaScript Environment
+---
+
+import TableRow from '@site/core/TableRowWithCodeBlock';
+
+## JavaScript Runtime
+
+When using React Native, you're going to be running your JavaScript code in up to three environments:
+
+- In most cases, React Native will use [Hermes](hermes), an open-source JavaScript engine optimized for React Native.
+- If Hermes is disabled, React Native will use [JavaScriptCore](https://trac.webkit.org/wiki/JavaScriptCore), the JavaScript engine that powers Safari. Note that on iOS, JavaScriptCore does not use JIT due to the absence of writable executable memory in iOS apps.
+- When using Chrome debugging, all JavaScript code runs within Chrome itself, communicating with native code via WebSockets. Chrome uses [V8](https://v8.dev/) as its JavaScript engine.
+
+While these environments are very similar, you may end up hitting some inconsistencies. It is best to avoid relying on specifics of any runtime.
+
+## JavaScript Syntax Transformers
+
+Syntax transformers make writing code more enjoyable by allowing you to use new JavaScript syntax without having to wait for support on all interpreters.
+
+React Native ships with the [Babel JavaScript compiler](https://babeljs.io). Check [Babel documentation](https://babeljs.io/docs/plugins/#transform-plugins) on its supported transformations for more details.
+
+A full list of React Native's enabled transformations can be found in [@react-native/babel-preset](https://github.com/facebook/react-native/tree/main/packages/react-native-babel-preset).
+
+
+
+
Transformation
Code
+
+
+
ECMAScript 5
+
+
ECMAScript 2015 (ES6)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ECMAScript 2016 (ES7)
+
+
ECMAScript 2017 (ES8)
+
+
+
ECMAScript 2018 (ES9)
+
+
ECMAScript 2019 (ES10)
+
+
ECMAScript 2020 (ES11)
+
+
+
+
ECMAScript 2022 (ES13)
+
+
Stage 1 Proposal
+
+
Miscellaneous
+
+
+
+
+
+
+
+
+
+
+## Polyfills
+
+Many standard functions are also available on all the supported JavaScript runtimes.
+
+#### Browser
+
+- [CommonJS `require`](https://nodejs.org/docs/latest/api/modules.html)
+- `md [console.{log, warn, error, info, trace, table, group, groupEnd}](https://developer.chrome.com/devtools/docs/console-api)`
+- [`XMLHttpRequest`, `fetch`](network.md#content)
+- [`{set, clear}{Timeout, Interval, Immediate}, {request, cancel}AnimationFrame`](timers.md#content)
+
+#### ECMAScript 2015 (ES6)
+
+- [`Array.from`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from)
+- `md Array.prototype.{[find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find), [findIndex](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)}`
+- [`Object.assign`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+- `md String.prototype.{[startsWith](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith), [endsWith](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith), [repeat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat), [includes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes)}`
+
+#### ECMAScript 2016 (ES7)
+
+- `md Array.prototype.[includes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)`
+
+#### ECMAScript 2017 (ES8)
+
+- `md Object.{[entries](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries), [values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values)}`
+
+#### Specific
+
+- `__DEV__`
diff --git a/website/versioned_docs/version-0.73.0/keyboard.md b/website/versioned_docs/version-0.73.0/keyboard.md
new file mode 100644
index 00000000000..b386c37dfdd
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/keyboard.md
@@ -0,0 +1,141 @@
+---
+id: keyboard
+title: Keyboard
+---
+
+`Keyboard` module to control keyboard events.
+
+### Usage
+
+The Keyboard module allows you to listen for native events and react to them, as well as make changes to the keyboard, like dismissing it.
+
+```SnackPlayer name=Keyboard%20Example&supportedPlatforms=ios,android
+import React, {useState, useEffect} from 'react';
+import {Keyboard, Text, TextInput, StyleSheet, View} from 'react-native';
+
+const Example = () => {
+ const [keyboardStatus, setKeyboardStatus] = useState('');
+
+ useEffect(() => {
+ const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
+ setKeyboardStatus('Keyboard Shown');
+ });
+ const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
+ setKeyboardStatus('Keyboard Hidden');
+ });
+
+ return () => {
+ showSubscription.remove();
+ hideSubscription.remove();
+ };
+ }, []);
+
+ return (
+
+
+ {keyboardStatus}
+
+ );
+};
+
+const style = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 36,
+ },
+ input: {
+ padding: 10,
+ borderWidth: 0.5,
+ borderRadius: 4,
+ },
+ status: {
+ padding: 10,
+ textAlign: 'center',
+ },
+});
+
+export default Example;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `addListener()`
+
+```tsx
+static addListener: (
+ eventType: KeyboardEventName,
+ listener: KeyboardEventListener,
+) => EmitterSubscription;
+```
+
+The `addListener` function connects a JavaScript function to an identified native keyboard notification event.
+
+This function then returns the reference to the listener.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------ |
+| eventName
Required
| string | The string that identifies the event you're listening for. See the list below. |
+| callback
Required
| function | The function to be called when the event fires |
+
+**`eventName`**
+
+This can be any of the following:
+
+- `keyboardWillShow`
+- `keyboardDidShow`
+- `keyboardWillHide`
+- `keyboardDidHide`
+- `keyboardWillChangeFrame`
+- `keyboardDidChangeFrame`
+
+> Note that only `keyboardDidShow` and `keyboardDidHide` events are available on Android. The events will not be fired when using Android 10 and under if your activity has `android:windowSoftInputMode` set to `adjustNothing`.
+
+---
+
+### `dismiss()`
+
+```tsx
+static dismiss();
+```
+
+Dismisses the active keyboard and removes focus.
+
+---
+
+### `scheduleLayoutAnimation`
+
+```tsx
+static scheduleLayoutAnimation(event: KeyboardEvent);
+```
+
+Useful for syncing TextInput (or other keyboard accessory view) size of position changes with keyboard movements.
+
+---
+
+### `isVisible()`
+
+```tsx
+static isVisible(): boolean;
+```
+
+Whether the keyboard is last known to be visible.
+
+---
+
+### `metrics()`
+
+```tsx
+static metrics(): KeyboardMetrics | undefined;
+```
+
+Return the metrics of the soft-keyboard if visible.
diff --git a/website/versioned_docs/version-0.73.0/keyboardavoidingview.md b/website/versioned_docs/version-0.73.0/keyboardavoidingview.md
new file mode 100644
index 00000000000..b77375008f8
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/keyboardavoidingview.md
@@ -0,0 +1,120 @@
+---
+id: keyboardavoidingview
+title: KeyboardAvoidingView
+---
+
+This component will automatically adjust its height, position, or bottom padding based on the keyboard height to remain visible while the virtual keyboard is displayed.
+
+## Example
+
+```SnackPlayer name=KeyboardAvoidingView&supportedPlatforms=android,ios
+import React from 'react';
+import {
+ View,
+ KeyboardAvoidingView,
+ TextInput,
+ StyleSheet,
+ Text,
+ Platform,
+ TouchableWithoutFeedback,
+ Button,
+ Keyboard,
+} from 'react-native';
+
+const KeyboardAvoidingComponent = () => {
+ return (
+
+
+
+ Header
+
+
+ null} />
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ inner: {
+ padding: 24,
+ flex: 1,
+ justifyContent: 'space-around',
+ },
+ header: {
+ fontSize: 36,
+ marginBottom: 48,
+ },
+ textInput: {
+ height: 40,
+ borderColor: '#000000',
+ borderBottomWidth: 1,
+ marginBottom: 36,
+ },
+ btnContainer: {
+ backgroundColor: 'white',
+ marginTop: 12,
+ },
+});
+
+export default KeyboardAvoidingComponent;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+### `behavior`
+
+Specify how to react to the presence of the keyboard.
+
+> Android and iOS both interact with this prop differently. On both iOS and Android, setting `behavior` is recommended.
+
+| Type |
+| ------------------------------------------- |
+| enum(`'height'`, `'position'`, `'padding'`) |
+
+---
+
+### `contentContainerStyle`
+
+The style of the content container (View) when behavior is `'position'`.
+
+| Type |
+| --------------------------------- |
+| [View Style](view-style-props.md) |
+
+---
+
+### `enabled`
+
+Enabled or disabled KeyboardAvoidingView.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `true` |
+
+---
+
+### `keyboardVerticalOffset`
+
+This is the distance between the top of the user screen and the react native view, may be non-zero in some use cases.
+
+| Type | Default |
+| ------ | ------- |
+| number | `0` |
diff --git a/website/versioned_docs/version-0.73.0/layout-props.md b/website/versioned_docs/version-0.73.0/layout-props.md
new file mode 100644
index 00000000000..2e1281fc355
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/layout-props.md
@@ -0,0 +1,996 @@
+---
+id: layout-props
+title: Layout Props
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+> More detailed examples about those properties can be found on the [Layout with Flexbox](flexbox) page.
+
+### Example
+
+The following example shows how different properties can affect or shape a React Native layout. You can try for example to add or remove squares from the UI while changing the values of the property `flexWrap`.
+
+
+
+
+```SnackPlayer name=LayoutProps%20Example&ext=js
+import React, {useState} from 'react';
+import {
+ Button,
+ ScrollView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const flexDirections = ['row', 'row-reverse', 'column', 'column-reverse'];
+ const justifyContents = [
+ 'flex-start',
+ 'flex-end',
+ 'center',
+ 'space-between',
+ 'space-around',
+ 'space-evenly',
+ ];
+ const alignItemsArr = [
+ 'flex-start',
+ 'flex-end',
+ 'center',
+ 'stretch',
+ 'baseline',
+ ];
+ const wraps = ['nowrap', 'wrap', 'wrap-reverse'];
+ const directions = ['inherit', 'ltr', 'rtl'];
+ const [flexDirection, setFlexDirection] = useState(0);
+ const [justifyContent, setJustifyContent] = useState(0);
+ const [alignItems, setAlignItems] = useState(0);
+ const [direction, setDirection] = useState(0);
+ const [wrap, setWrap] = useState(0);
+
+ const hookedStyles = {
+ flexDirection: flexDirections[flexDirection],
+ justifyContent: justifyContents[justifyContent],
+ alignItems: alignItemsArr[alignItems],
+ direction: directions[direction],
+ flexWrap: wraps[wrap],
+ };
+
+ const changeSetting = (value, options, setterFunction) => {
+ if (value === options.length - 1) {
+ setterFunction(0);
+ return;
+ }
+ setterFunction(value + 1);
+ };
+ const [squares, setSquares] = useState([, , ]);
+ return (
+ <>
+
+
+ {squares.map(elem => elem)}
+
+
+
+
+
+ changeSetting(flexDirection, flexDirections, setFlexDirection)
+ }
+ />
+ {flexDirections[flexDirection]}
+
+
+
+ changeSetting(
+ justifyContent,
+ justifyContents,
+ setJustifyContent,
+ )
+ }
+ />
+ {justifyContents[justifyContent]}
+
+
+
+ changeSetting(alignItems, alignItemsArr, setAlignItems)
+ }
+ />
+ {alignItemsArr[alignItems]}
+
+
+ changeSetting(direction, directions, setDirection)}
+ />
+ {directions[direction]}
+
+
+ changeSetting(wrap, wraps, setWrap)}
+ />
+ {wraps[wrap]}
+
+
+ setSquares([...squares, ])}
+ />
+
+
+
+ setSquares(squares.filter((v, i) => i !== squares.length - 1))
+ }
+ />
+
+
+
+ >
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ height: '50%',
+ },
+ playingSpace: {
+ backgroundColor: 'white',
+ borderColor: 'blue',
+ borderWidth: 3,
+ },
+ controlSpace: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ backgroundColor: '#F5F5F5',
+ },
+ buttonView: {
+ width: '50%',
+ padding: 10,
+ },
+ text: {textAlign: 'center'},
+});
+
+const Square = () => (
+
+);
+
+const randomHexColor = () => {
+ return '#000000'.replace(/0/g, () => {
+ return Math.round(Math.random() * 16).toString(16);
+ });
+};
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=LayoutProps%20Example&ext=tsx
+import React, {useState} from 'react';
+import {
+ Button,
+ ScrollView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const App = () => {
+ const flexDirections = [
+ 'row',
+ 'row-reverse',
+ 'column',
+ 'column-reverse',
+ ] as const;
+ const justifyContents = [
+ 'flex-start',
+ 'flex-end',
+ 'center',
+ 'space-between',
+ 'space-around',
+ 'space-evenly',
+ ] as const;
+ const alignItemsArr = [
+ 'flex-start',
+ 'flex-end',
+ 'center',
+ 'stretch',
+ 'baseline',
+ ] as const;
+ const wraps = ['nowrap', 'wrap', 'wrap-reverse'] as const;
+ const directions = ['inherit', 'ltr', 'rtl'] as const;
+ const [flexDirection, setFlexDirection] = useState(0);
+ const [justifyContent, setJustifyContent] = useState(0);
+ const [alignItems, setAlignItems] = useState(0);
+ const [direction, setDirection] = useState(0);
+ const [wrap, setWrap] = useState(0);
+
+ const hookedStyles = {
+ flexDirection: flexDirections[flexDirection],
+ justifyContent: justifyContents[justifyContent],
+ alignItems: alignItemsArr[alignItems],
+ direction: directions[direction],
+ flexWrap: wraps[wrap],
+ };
+
+ const changeSetting = (
+ value: number,
+ options: readonly unknown[],
+ setterFunction: (index: number) => void,
+ ) => {
+ if (value === options.length - 1) {
+ setterFunction(0);
+ return;
+ }
+ setterFunction(value + 1);
+ };
+ const [squares, setSquares] = useState([, , ]);
+ return (
+ <>
+
+
+ {squares.map(elem => elem)}
+
+
+
+
+
+ changeSetting(flexDirection, flexDirections, setFlexDirection)
+ }
+ />
+ {flexDirections[flexDirection]}
+
+
+
+ changeSetting(
+ justifyContent,
+ justifyContents,
+ setJustifyContent,
+ )
+ }
+ />
+ {justifyContents[justifyContent]}
+
+
+
+ changeSetting(alignItems, alignItemsArr, setAlignItems)
+ }
+ />
+ {alignItemsArr[alignItems]}
+
+
+ changeSetting(direction, directions, setDirection)}
+ />
+ {directions[direction]}
+
+
+ changeSetting(wrap, wraps, setWrap)}
+ />
+ {wraps[wrap]}
+
+
+ setSquares([...squares, ])}
+ />
+
+
+
+ setSquares(squares.filter((v, i) => i !== squares.length - 1))
+ }
+ />
+
+
+
+ >
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ height: '50%',
+ },
+ playingSpace: {
+ backgroundColor: 'white',
+ borderColor: 'blue',
+ borderWidth: 3,
+ },
+ controlSpace: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ backgroundColor: '#F5F5F5',
+ },
+ buttonView: {
+ width: '50%',
+ padding: 10,
+ },
+ text: {textAlign: 'center'},
+});
+
+const Square = () => (
+
+);
+
+const randomHexColor = () => {
+ return '#000000'.replace(/0/g, () => {
+ return Math.round(Math.random() * 16).toString(16);
+ });
+};
+
+export default App;
+```
+
+
+
+
+---
+
+# Reference
+
+## Props
+
+### `alignContent`
+
+`alignContent` controls how rows align in the cross direction, overriding the `alignContent` of the parent. See https://developer.mozilla.org/en-US/docs/Web/CSS/align-content for more details.
+
+| Type | Required |
+| ------------------------------------------------------------------------------------ | -------- |
+| enum('flex-start', 'flex-end', 'center', 'stretch', 'space-between', 'space-around') | No |
+
+---
+
+### `alignItems`
+
+`alignItems` aligns children in the cross direction. For example, if children are flowing vertically, `alignItems` controls how they align horizontally. It works like `align-items` in CSS (default: stretch). See https://developer.mozilla.org/en-US/docs/Web/CSS/align-items for more details.
+
+| Type | Required |
+| --------------------------------------------------------------- | -------- |
+| enum('flex-start', 'flex-end', 'center', 'stretch', 'baseline') | No |
+
+---
+
+### `alignSelf`
+
+`alignSelf` controls how a child aligns in the cross direction, overriding the `alignItems` of the parent. It works like `align-self` in CSS (default: auto). See https://developer.mozilla.org/en-US/docs/Web/CSS/align-self for more details.
+
+| Type | Required |
+| ----------------------------------------------------------------------- | -------- |
+| enum('auto', 'flex-start', 'flex-end', 'center', 'stretch', 'baseline') | No |
+
+---
+
+### `aspectRatio`
+
+Aspect ratio controls the size of the undefined dimension of a node. See https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio for more details.
+
+- On a node with a set width/height, aspect ratio controls the size of the unset dimension
+- On a node with a set flex basis, aspect ratio controls the size of the node in the cross axis if unset
+- On a node with a measure function, aspect ratio works as though the measure function measures the flex basis
+- On a node with flex grow/shrink, aspect ratio controls the size of the node in the cross axis if unset
+- Aspect ratio takes min/max dimensions into account
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `borderBottomWidth`
+
+`borderBottomWidth` works like `border-bottom-width` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-width for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderEndWidth`
+
+When direction is `ltr`, `borderEndWidth` is equivalent to `borderRightWidth`. When direction is `rtl`, `borderEndWidth` is equivalent to `borderLeftWidth`.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderLeftWidth`
+
+`borderLeftWidth` works like `border-left-width` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/border-left-width for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderRightWidth`
+
+`borderRightWidth` works like `border-right-width` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/border-right-width for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderStartWidth`
+
+When direction is `ltr`, `borderStartWidth` is equivalent to `borderLeftWidth`. When direction is `rtl`, `borderStartWidth` is equivalent to `borderRightWidth`.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderTopWidth`
+
+`borderTopWidth` works like `border-top-width` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/border-top-width for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `borderWidth`
+
+`borderWidth` works like `border-width` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/border-width for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `bottom`
+
+`bottom` is the number of logical pixels to offset the bottom edge of this component.
+
+It works similarly to `bottom` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/bottom for more details of how `bottom` affects layout.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `columnGap`
+
+`columnGap` works like `column-gap` in CSS. Only pixel units are supported in React Native. See https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `direction`
+
+`direction` specifies the directional flow of the user interface. The default is `inherit`, except for root node which will have value based on the current locale. See https://yogalayout.com/docs/layout-direction for more details.
+
+| Type | Required | Platform |
+| ----------------------------- | -------- | -------- |
+| enum('inherit', 'ltr', 'rtl') | No | iOS |
+
+---
+
+### `display`
+
+`display` sets the display type of this component.
+
+It works similarly to `display` in CSS but only supports 'flex' and 'none'. 'flex' is the default.
+
+| Type | Required |
+| -------------------- | -------- |
+| enum('none', 'flex') | No |
+
+---
+
+### `end`
+
+When the direction is `ltr`, `end` is equivalent to `right`. When the direction is `rtl`, `end` is equivalent to `left`.
+
+This style takes precedence over the `left` and `right` styles.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `flex`
+
+In React Native `flex` does not work the same way that it does in CSS. `flex` is a number rather than a string, and it works according to the [Yoga](https://github.com/facebook/yoga) layout engine.
+
+When `flex` is a positive number, it makes the component flexible, and it will be sized proportional to its flex value. So a component with `flex` set to 2 will take twice the space as a component with `flex` set to 1. `flex: ` equates to `flexGrow: , flexShrink: 1, flexBasis: 0`.
+
+When `flex` is 0, the component is sized according to `width` and `height`, and it is inflexible.
+
+When `flex` is -1, the component is normally sized according to `width` and `height`. However, if there's not enough space, the component will shrink to its `minWidth` and `minHeight`.
+
+`flexGrow`, `flexShrink`, and `flexBasis` work the same as in CSS.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `flexBasis`
+
+`flexBasis` is an axis-independent way of providing the default size of an item along the main axis. Setting the `flexBasis` of a child is similar to setting the `width` of that child if its parent is a container with `flexDirection: row` or setting the `height` of a child if its parent is a container with `flexDirection: column`. The `flexBasis` of an item is the default size of that item, the size of the item before any `flexGrow` and `flexShrink` calculations are performed.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `flexDirection`
+
+`flexDirection` controls which directions children of a container go. `row` goes left to right, `column` goes top to bottom, and you may be able to guess what the other two do. It works like `flex-direction` in CSS, except the default is `column`. See https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction for more details.
+
+| Type | Required |
+| ------------------------------------------------------ | -------- |
+| enum('row', 'row-reverse', 'column', 'column-reverse') | No |
+
+---
+
+### `flexGrow`
+
+`flexGrow` describes how any space within a container should be distributed among its children along the main axis. After laying out its children, a container will distribute any remaining space according to the flex grow values specified by its children.
+
+`flexGrow` accepts any floating point value >= 0, with 0 being the default value. A container will distribute any remaining space among its children weighted by the children’s `flexGrow` values.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `flexShrink`
+
+[`flexShrink`](layout-props#flexshrink) describes how to shrink children along the main axis in the case in which the total size of the children overflows the size of the container on the main axis. `flexShrink` is very similar to `flexGrow` and can be thought of in the same way if any overflowing size is considered to be negative remaining space. These two properties also work well together by allowing children to grow and shrink as needed.
+
+`flexShrink` accepts any floating point value >= 0, with 0 being the default value. A container will shrink its children weighted by the children’s `flexShrink` values.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `flexWrap`
+
+`flexWrap` controls whether children can wrap around after they hit the end of a flex container. It works like `flex-wrap` in CSS (default: nowrap). See https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap for more details. Note it does not work anymore with `alignItems: stretch` (the default), so you may want to use `alignItems: flex-start` for example (breaking change details: https://github.com/facebook/react-native/releases/tag/v0.28.0).
+
+| Type | Required |
+| -------------------------------------- | -------- |
+| enum('wrap', 'nowrap', 'wrap-reverse') | No |
+
+---
+
+### `gap`
+
+`gap` works like `gap` in CSS. Only pixel units are supported in React Native. See https://developer.mozilla.org/en-US/docs/Web/CSS/gap for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `height`
+
+`height` sets the height of this component.
+
+It works similarly to `height` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported. See https://developer.mozilla.org/en-US/docs/Web/CSS/height for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `justifyContent`
+
+`justifyContent` aligns children in the main direction. For example, if children are flowing vertically, `justifyContent` controls how they align vertically. It works like `justify-content` in CSS (default: flex-start). See https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content for more details.
+
+| Type | Required |
+| ----------------------------------------------------------------------------------------- | -------- |
+| enum('flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly') | No |
+
+---
+
+### `left`
+
+`left` is the number of logical pixels to offset the left edge of this component.
+
+It works similarly to `left` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/left for more details of how `left` affects layout.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `margin`
+
+Setting `margin` has the same effect as setting each of `marginTop`, `marginLeft`, `marginBottom`, and `marginRight`. See https://developer.mozilla.org/en-US/docs/Web/CSS/margin for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginBottom`
+
+`marginBottom` works like `margin-bottom` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginEnd`
+
+When direction is `ltr`, `marginEnd` is equivalent to `marginRight`. When direction is `rtl`, `marginEnd` is equivalent to `marginLeft`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginHorizontal`
+
+Setting `marginHorizontal` has the same effect as setting both `marginLeft` and `marginRight`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginLeft`
+
+`marginLeft` works like `margin-left` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginRight`
+
+`marginRight` works like `margin-right` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginStart`
+
+When direction is `ltr`, `marginStart` is equivalent to `marginLeft`. When direction is `rtl`, `marginStart` is equivalent to `marginRight`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginTop`
+
+`marginTop` works like `margin-top` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `marginVertical`
+
+Setting `marginVertical` has the same effect as setting both `marginTop` and `marginBottom`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `maxHeight`
+
+`maxHeight` is the maximum height for this component, in logical pixels.
+
+It works similarly to `max-height` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/max-height for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `maxWidth`
+
+`maxWidth` is the maximum width for this component, in logical pixels.
+
+It works similarly to `max-width` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/max-width for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `minHeight`
+
+`minHeight` is the minimum height for this component, in logical pixels.
+
+It works similarly to `min-height` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/min-height for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `minWidth`
+
+`minWidth` is the minimum width for this component, in logical pixels.
+
+It works similarly to `min-width` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/min-width for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `overflow`
+
+`overflow` controls how children are measured and displayed. `overflow: hidden` causes views to be clipped while `overflow: scroll` causes views to be measured independently of their parents' main axis. It works like `overflow` in CSS (default: visible). See https://developer.mozilla.org/en/docs/Web/CSS/overflow for more details.
+
+| Type | Required |
+| ----------------------------------- | -------- |
+| enum('visible', 'hidden', 'scroll') | No |
+
+---
+
+### `padding`
+
+Setting `padding` has the same effect as setting each of `paddingTop`, `paddingBottom`, `paddingLeft`, and `paddingRight`. See https://developer.mozilla.org/en-US/docs/Web/CSS/padding for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingBottom`
+
+`paddingBottom` works like `padding-bottom` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/padding-bottom for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingEnd`
+
+When direction is `ltr`, `paddingEnd` is equivalent to `paddingRight`. When direction is `rtl`, `paddingEnd` is equivalent to `paddingLeft`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingHorizontal`
+
+Setting `paddingHorizontal` is like setting both of `paddingLeft` and `paddingRight`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingLeft`
+
+`paddingLeft` works like `padding-left` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/padding-left for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingRight`
+
+`paddingRight` works like `padding-right` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/padding-right for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingStart`
+
+When direction is `ltr`, `paddingStart` is equivalent to `paddingLeft`. When direction is `rtl`, `paddingStart` is equivalent to `paddingRight`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `paddingTop`
+
+`paddingTop` works like `padding-top` in CSS. See https://developer.mozilla.org/en-US/docs/Web/CSS/padding-top for more details.
+
+| Type | Required |
+| --------------- | -------- |
+| number, ,string | No |
+
+---
+
+### `paddingVertical`
+
+Setting `paddingVertical` is like setting both of `paddingTop` and `paddingBottom`.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `position`
+
+`position` in React Native is similar to regular CSS, but everything is set to `relative` by default, so `absolute` positioning is always relative to the parent.
+
+If you want to position a child using specific numbers of logical pixels relative to its parent, set the child to have `absolute` position.
+
+If you want to position a child relative to something that is not its parent, don't use styles for that. Use the component tree.
+
+See https://github.com/facebook/yoga for more details on how `position` differs between React Native and CSS.
+
+| Type | Required |
+| ---------------------------- | -------- |
+| enum('absolute', 'relative') | No |
+
+---
+
+### `right`
+
+`right` is the number of logical pixels to offset the right edge of this component.
+
+It works similarly to `right` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/right for more details of how `right` affects layout.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `rowGap`
+
+`rowGap` works like `row-gap` in CSS. Only pixel units are supported in React Native. See https://developer.mozilla.org/en-US/docs/Web/CSS/row-gap for more details.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `start`
+
+When the direction is `ltr`, `start` is equivalent to `left`. When the direction is `rtl`, `start` is equivalent to `right`.
+
+This style takes precedence over the `left`, `right`, and `end` styles.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `top`
+
+`top` is the number of logical pixels to offset the top edge of this component.
+
+It works similarly to `top` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported.
+
+See https://developer.mozilla.org/en-US/docs/Web/CSS/top for more details of how `top` affects layout.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `width`
+
+`width` sets the width of this component.
+
+It works similarly to `width` in CSS, but in React Native you must use points or percentages. Ems and other units are not supported. See https://developer.mozilla.org/en-US/docs/Web/CSS/width for more details.
+
+| Type | Required |
+| -------------- | -------- |
+| number, string | No |
+
+---
+
+### `zIndex`
+
+`zIndex` controls which components display on top of others. Normally, you don't use `zIndex`. Components render according to their order in the document tree, so later components draw over earlier ones. `zIndex` may be useful if you have animations or custom modal interfaces where you don't want this behavior.
+
+It works like the CSS `z-index` property - components with a larger `zIndex` will render on top. Think of the z-direction like it's pointing from the phone into your eyeball. See https://developer.mozilla.org/en-US/docs/Web/CSS/z-index for more details.
+
+On iOS, `zIndex` may require `View`s to be siblings of each other for it to work as expected.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
diff --git a/website/versioned_docs/version-0.73.0/layoutanimation.md b/website/versioned_docs/version-0.73.0/layoutanimation.md
new file mode 100644
index 00000000000..4d6ab6c8abb
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/layoutanimation.md
@@ -0,0 +1,354 @@
+---
+id: layoutanimation
+title: LayoutAnimation
+---
+
+Automatically animates views to their new positions when the next layout happens.
+
+A common way to use this API is to call it before updating the state hook in functional components and calling `setState` in class components.
+
+Note that in order to get this to work on **Android** you need to set the following flags via `UIManager`:
+
+```js
+if (Platform.OS === 'android') {
+ if (UIManager.setLayoutAnimationEnabledExperimental) {
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+ }
+}
+```
+
+## Example
+
+```SnackPlayer name=LayoutAnimation&supportedPlatforms=android,ios
+import React, {useState} from 'react';
+import {
+ LayoutAnimation,
+ Platform,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ UIManager,
+ View,
+} from 'react-native';
+
+if (
+ Platform.OS === 'android' &&
+ UIManager.setLayoutAnimationEnabledExperimental
+) {
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+}
+const App = () => {
+ const [expanded, setExpanded] = useState(false);
+
+ return (
+
+ {
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
+ setExpanded(!expanded);
+ }}>
+ Press me to {expanded ? 'collapse' : 'expand'}!
+
+ {expanded && (
+
+ I disappear sometimes!
+
+ )}
+
+ );
+};
+
+const style = StyleSheet.create({
+ tile: {
+ backgroundColor: 'lightgrey',
+ borderWidth: 0.5,
+ borderColor: '#d6d7da',
+ },
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ overflow: 'hidden',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `configureNext()`
+
+```tsx
+static configureNext(
+ config: LayoutAnimationConfig,
+ onAnimationDidEnd?: () => void,
+ onAnimationDidFail?: () => void,
+);
+```
+
+Schedules an animation to happen on the next layout.
+
+#### Parameters:
+
+| Name | Type | Required | Description |
+| ------------------ | -------- | -------- | ----------------------------------- |
+| config | object | Yes | See config description below. |
+| onAnimationDidEnd | function | No | Called when the animation finished. |
+| onAnimationDidFail | function | No | Called when the animation failed. |
+
+The `config` parameter is an object with the keys below. [`create`](layoutanimation.md#create) returns a valid object for `config`, and the [`Presets`](layoutanimation.md#presets) objects can also all be passed as the `config`.
+
+- `duration` in milliseconds
+- `create`, optional config for animating in new views
+- `update`, optional config for animating views that have been updated
+- `delete`, optional config for animating views as they are removed
+
+The config that's passed to `create`, `update`, or `delete` has the following keys:
+
+- `type`, the [animation type](layoutanimation.md#types) to use
+- `property`, the [layout property](layoutanimation.md#properties) to animate (optional, but recommended for `create` and `delete`)
+- `springDamping` (number, optional and only for use with `type: Type.spring`)
+- `initialVelocity` (number, optional)
+- `delay` (number, optional)
+- `duration` (number, optional)
+
+---
+
+### `create()`
+
+```tsx
+static create(duration, type, creationProp)
+```
+
+Helper that creates an object (with `create`, `update`, and `delete` fields) to pass into [`configureNext`](layoutanimation.md#configurenext). The `type` parameter is an [animation type](layoutanimation.md#types), and the `creationProp` parameter is a [layout property](layoutanimation.md#properties).
+
+**Example:**
+
+```SnackPlayer name=LayoutAnimation&supportedPlatforms=android,ios
+import React, {useState} from 'react';
+import {
+ View,
+ Platform,
+ UIManager,
+ LayoutAnimation,
+ StyleSheet,
+ Button,
+} from 'react-native';
+
+if (
+ Platform.OS === 'android' &&
+ UIManager.setLayoutAnimationEnabledExperimental
+) {
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+}
+
+const App = () => {
+ const [boxPosition, setBoxPosition] = useState('left');
+
+ const toggleBox = () => {
+ LayoutAnimation.configureNext({
+ duration: 500,
+ create: {type: 'linear', property: 'opacity'},
+ update: {type: 'spring', springDamping: 0.4},
+ delete: {type: 'linear', property: 'opacity'},
+ });
+ setBoxPosition(boxPosition === 'left' ? 'right' : 'left');
+ };
+
+ return (
+
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'flex-start',
+ justifyContent: 'center',
+ },
+ box: {
+ height: 100,
+ width: 100,
+ borderRadius: 5,
+ margin: 8,
+ backgroundColor: 'blue',
+ },
+ moveRight: {
+ alignSelf: 'flex-end',
+ height: 200,
+ width: 200,
+ },
+ buttonContainer: {
+ alignSelf: 'center',
+ },
+});
+
+export default App;
+```
+
+## Properties
+
+### Types
+
+An enumeration of animation types to be used in the [`create`](layoutanimation.md#create) method, or in the `create`/`update`/`delete` configs for [`configureNext`](layoutanimation.md#configurenext). (example usage: `LayoutAnimation.Types.easeIn`)
+
+| Types |
+| ------------- |
+| spring |
+| linear |
+| easeInEaseOut |
+| easeIn |
+| easeOut |
+| keyboard |
+
+---
+
+### Properties
+
+An enumeration of layout properties to be animated to be used in the [`create`](layoutanimation.md#create) method, or in the `create`/`update`/`delete` configs for [`configureNext`](layoutanimation.md#configurenext). (example usage: `LayoutAnimation.Properties.opacity`)
+
+| Properties |
+| ---------- |
+| opacity |
+| scaleX |
+| scaleY |
+| scaleXY |
+
+---
+
+### Presets
+
+A set of predefined animation configs to pass into [`configureNext`](layoutanimation.md#configurenext).
+
+| Presets | Value |
+| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| easeInEaseOut | `create(300, 'easeInEaseOut', 'opacity')` |
+| linear | `create(500, 'linear', 'opacity')` |
+| spring | `{duration: 700, create: {type: 'linear', property: 'opacity'}, update: {type: 'spring', springDamping: 0.4}, delete: {type: 'linear', property: 'opacity'} }` |
+
+---
+
+### `easeInEaseOut`
+
+Calls `configureNext()` with `Presets.easeInEaseOut`.
+
+---
+
+### `linear`
+
+Calls `configureNext()` with `Presets.linear`.
+
+---
+
+### `spring`
+
+Calls `configureNext()` with `Presets.spring`.
+
+**Example:**
+
+```SnackPlayer name=LayoutAnimation&supportedPlatforms=android,ios
+import React, {useState} from 'react';
+import {
+ View,
+ Platform,
+ UIManager,
+ LayoutAnimation,
+ StyleSheet,
+ Button,
+} from 'react-native';
+
+if (
+ Platform.OS === 'android' &&
+ UIManager.setLayoutAnimationEnabledExperimental
+) {
+ UIManager.setLayoutAnimationEnabledExperimental(true);
+}
+
+const App = () => {
+ const [firstBoxPosition, setFirstBoxPosition] = useState('left');
+ const [secondBoxPosition, setSecondBoxPosition] = useState('left');
+ const [thirdBoxPosition, setThirdBoxPosition] = useState('left');
+
+ const toggleFirstBox = () => {
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
+ setFirstBoxPosition(firstBoxPosition === 'left' ? 'right' : 'left');
+ };
+
+ const toggleSecondBox = () => {
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.linear);
+ setSecondBoxPosition(secondBoxPosition === 'left' ? 'right' : 'left');
+ };
+
+ const toggleThirdBox = () => {
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
+ setThirdBoxPosition(thirdBoxPosition === 'left' ? 'right' : 'left');
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'flex-start',
+ justifyContent: 'center',
+ },
+ box: {
+ height: 100,
+ width: 100,
+ borderRadius: 5,
+ margin: 8,
+ backgroundColor: 'blue',
+ },
+ moveRight: {
+ alignSelf: 'flex-end',
+ },
+ buttonContainer: {
+ alignSelf: 'center',
+ },
+});
+
+export default App;
+```
diff --git a/website/versioned_docs/version-0.73.0/layoutevent.md b/website/versioned_docs/version-0.73.0/layoutevent.md
new file mode 100644
index 00000000000..b0fda8501db
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/layoutevent.md
@@ -0,0 +1,72 @@
+---
+id: layoutevent
+title: LayoutEvent Object Type
+---
+
+`LayoutEvent` object is returned in the callback as a result of component layout change, for example `onLayout` in [View](view) component.
+
+## Example
+
+```js
+{
+ layout: {
+ width: 520,
+ height: 70.5,
+ x: 0,
+ y: 42.5
+ },
+ target: 1127
+}
+```
+
+## Keys and values
+
+### `height`
+
+Height of the component after the layout changes.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `width`
+
+Width of the component after the layout changes.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `x`
+
+Component X coordinate inside the parent component.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `y`
+
+Component Y coordinate inside the parent component.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `target`
+
+The node id of the element receiving the PressEvent.
+
+| Type | Optional |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+## Used by
+
+- [`Image`](image)
+- [`Pressable`](pressable)
+- [`ScrollView`](scrollview)
+- [`Text`](text)
+- [`TextInput`](textinput)
+- [`TouchableWithoutFeedback`](touchablewithoutfeedback)
+- [`View`](view)
diff --git a/website/versioned_docs/version-0.73.0/libraries.md b/website/versioned_docs/version-0.73.0/libraries.md
new file mode 100644
index 00000000000..8713df32244
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/libraries.md
@@ -0,0 +1,118 @@
+---
+id: libraries
+title: Using Libraries
+author: Brent Vatne
+authorURL: 'https://twitter.com/notbrent'
+description: This guide introduces React Native developers to finding, installing, and using third-party libraries in their apps.
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+React Native provides a set of built-in [Core Components and APIs](./components-and-apis) ready to use in your app. You're not limited to the components and APIs bundled with React Native. React Native has a community of thousands of developers. If the Core Components and APIs don't have what you are looking for, you may be able to find and install a library from the community to add the functionality to your app.
+
+## Selecting a Package Manager
+
+React Native libraries are typically installed from the [npm registry](https://www.npmjs.com/) using a Node.js package manager such as [npm CLI](https://docs.npmjs.com/cli/npm) or [Yarn Classic](https://classic.yarnpkg.com/en/).
+
+If you have Node.js installed on your computer then you already have the npm CLI installed. Some developers prefer to use Yarn Classic for slightly faster install times and additional advanced features like Workspaces. Both tools work great with React Native. We will assume npm for the rest of this guide for simplicity of explanation.
+
+> 💡 The terms "library" and "package" are used interchangeably in the JavaScript community.
+
+## Installing a Library
+
+To install a library in your project, navigate to your project directory in your terminal and run the installation command. Let's try this with `react-native-webview`:
+
+
+
+
+```shell
+npm install react-native-webview
+```
+
+
+
+
+```shell
+yarn add react-native-webview
+```
+
+
+
+
+The library that we installed includes native code, and we need to link to our app before we use it.
+
+## Linking Native Code on iOS
+
+React Native uses CocoaPods to manage iOS project dependencies and most React Native libraries follow this same convention. If a library you are using does not, then please refer to their README for additional instruction. In most cases, the following instructions will apply.
+
+Run `pod install` in our `ios` directory in order to link it to our native iOS project. A shortcut for doing this without switching to the `ios` directory is to run `npx pod-install`.
+
+```bash
+npx pod-install
+```
+
+Once this is complete, re-build the app binary to start using your new library:
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+## Linking Native Code on Android
+
+React Native uses Gradle to manage Android project dependencies. After you install a library with native dependencies, you will need to re-build the app binary to use your new library:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+## Finding Libraries
+
+[React Native Directory](https://reactnative.directory) is a searchable database of libraries built specifically for React Native. This is the first place to look for a library for your React Native app.
+
+Many of the libraries you will find on the directory are from [React Native Community](https://github.com/react-native-community/) or [Expo](https://docs.expo.dev/versions/latest/).
+
+Libraries built by the React Native Community are driven by volunteers and individuals at companies that depend on React Native. They often support iOS, tvOS, Android, Windows, but this varies across projects. Many of the libraries in this organization were once React Native Core Components and APIs.
+
+Libraries built by Expo are all written in TypeScript and support iOS, Android, and `react-native-web` wherever possible.
+
+After React Native Directory, the [npm registry](https://www.npmjs.com/) is the next best place if you can't find a library specifically for React Native on the directory. The npm registry is the definitive source for JavaScript libraries, but the libraries that it lists may not all be compatible with React Native. React Native is one of many JavaScript programming environments, including Node.js, web browsers, Electron, and more, and npm includes libraries that work for all of these environments.
+
+## Determining Library Compatibility
+
+### Does it work with React Native?
+
+Usually libraries built _specifically for other platforms_ will not work with React Native. Examples include `react-select` which is built for the web and specifically targets `react-dom`, and `rimraf` which is built for Node.js and interacts with your computer file system. Other libraries like `lodash` use only JavaScript language features and work in any environment. You will gain a sense for this over time, but until then the easiest way to find out is to try it yourself. You can remove packages using `npm uninstall` if it turns out that it does not work in React Native.
+
+### Does it work for the platforms that my app supports?
+
+[React Native Directory](https://reactnative.directory) allows you to filter by platform compatibility, such as iOS, Android, Web, and Windows. If the library you would like to use is not currently listed there, refer to the README for the library to learn more.
+
+### Does it work with my app version of React Native?
+
+The latest version of a library is typically compatible with the latest version of React Native. If you are using an older version, you should refer to the README to know which version of the library you should install. You can install a particular version of the library by running `npm install @`, for example: `npm install @react-native-community/netinfo@^2.0.0`.
diff --git a/website/versioned_docs/version-0.73.0/linking-libraries-ios.md b/website/versioned_docs/version-0.73.0/linking-libraries-ios.md
new file mode 100644
index 00000000000..c7d23a5d596
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/linking-libraries-ios.md
@@ -0,0 +1,57 @@
+---
+id: linking-libraries-ios
+title: Linking Libraries
+---
+
+Not every app uses all the native capabilities, and including the code to support all those features would impact the binary size... But we still want to support adding these features whenever you need them.
+
+With that in mind we exposed many of these features as independent static libraries.
+
+For most of the libs it will be as quick as dragging two files, sometimes a third step will be necessary, but no more than that.
+
+:::note
+All the libraries we ship with React Native live in the `Libraries` folder in the root of the repository. Some of them are pure JavaScript, and you only need to `require` it.
+Other libraries also rely on some native code, in that case you'll have to add these files to your app, otherwise the app will throw an error as soon as you try to use the library.
+:::
+
+## Here are the few steps to link your libraries that contain native code
+
+### Automatic linking
+
+Install a library with native dependencies:
+
+```shell
+npm install --save
+```
+
+:::info
+`--save` or `--save-dev` flag is very important for this step. React Native will link your libs based on `dependencies` and `devDependencies` in your `package.json` file.
+:::
+
+That's it! Next time you build your app the native code will be linked thanks to the [autolinking](https://github.com/react-native-community/cli/blob/main/docs/autolinking.md) mechanism.
+
+### Manual linking
+
+#### Step 1
+
+If the library has native code, there must be an `.xcodeproj` file inside its folder. Drag this file to your project on Xcode (usually under the `Libraries` group on Xcode);
+
+
+
+#### Step 2
+
+Click on your main project file (the one that represents the `.xcodeproj`) select `Build Phases` and drag the static library from the `Products` folder inside the Library you are importing to `Link Binary With Libraries`
+
+
+
+#### Step 3
+
+Not every library will need this step, what you need to consider is:
+
+_Do I need to know the contents of the library at compile time?_
+
+What that means is, are you using this library on the native side or only in JavaScript? If you are only using it in JavaScript, you are good to go!
+
+If you do need to call it from native, then we need to know the library's headers. To achieve that you have to go to your project's file, select `Build Settings` and search for `Header Search Paths`. There you should include the path to your library. (This documentation used to recommend using `recursive`, but this is no longer recommended, as it can cause subtle build failures, especially with CocoaPods.)
+
+
diff --git a/website/versioned_docs/version-0.73.0/linking.md b/website/versioned_docs/version-0.73.0/linking.md
new file mode 100644
index 00000000000..70de35ac923
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/linking.md
@@ -0,0 +1,657 @@
+---
+id: linking
+title: Linking
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+`Linking` gives you a general interface to interact with both incoming and outgoing app links.
+
+Every Link (URL) has a URL Scheme, some websites are prefixed with `https://` or `http://` and the `http` is the URL Scheme. Let's call it scheme for short.
+
+In addition to `https`, you're likely also familiar with the `mailto` scheme. When you open a link with the mailto scheme, your operating system will open an installed mail application. Similarly, there are schemes for making phone calls and sending SMS. Read more about [built-in URL](#built-in-url-schemes) schemes below.
+
+Like using the mailto scheme, it's possible to link to other applications by using custom url schemes. For example, when you get a **Magic Link** email from Slack, the **Launch Slack** button is an anchor tag with an href that looks something like: `slack://secret/magic-login/other-secret`. Like with Slack, you can tell the operating system that you want to handle a custom scheme. When the Slack app opens, it receives the URL that was used to open it. This is often referred to as deep linking. Read more about how to [get the deep link](#get-the-deep-link) into your app.
+
+Custom URL scheme isn't the only way to open your application on mobile. You don't want to use a custom URL scheme in links in the email because then the links would be broken on desktop. Instead, you want to use a regular `https` links such as `https://www.myapp.io/records/1234546`. and on mobile you want that link open your app. Android calls it **Deep Links** (Universal Links - iOS).
+
+### Built-in URL Schemes
+
+As mentioned in the introduction, there are some URL schemes for core functionality that exist on every platform. The following is a non-exhaustive list, but covers the most commonly used schemes.
+
+| Scheme | Description | iOS | Android |
+| ---------------- | ------------------------------------------ | --- | ------- |
+| `mailto` | Open mail app, eg: mailto: support@expo.io | ✅ | ✅ |
+| `tel` | Open phone app, eg: tel:+123456789 | ✅ | ✅ |
+| `sms` | Open SMS app, eg: sms:+123456789 | ✅ | ✅ |
+| `https` / `http` | Open web browser app, eg: https://expo.io | ✅ | ✅ |
+
+### Enabling Deep Links
+
+
+
Projects with Native Code Only
+
+ The following section only applies to projects with native code exposed. If you are using the managed Expo workflow, see the guide on Linking in the Expo documentation for the appropriate alternative.
+
+
+
+If you want to enable deep links in your app, please read the below guide:
+
+
+
+
+> For instructions on how to add support for deep linking on Android, refer to [Enabling Deep Links for App Content - Add Intent Filters for Your Deep Links](https://developer.android.com/training/app-indexing/deep-linking.html#adding-filters).
+
+If you wish to receive the intent in an existing instance of MainActivity, you may set the `launchMode` of MainActivity to `singleTask` in `AndroidManifest.xml`. See [``](https://developer.android.com/guide/topics/manifest/activity-element.html) documentation for more information.
+
+```xml
+
+```
+
+
+
+
+> **NOTE:** On iOS, you'll need to add the `LinkingIOS` folder into your header search paths as described in step 3 [here](linking-libraries-ios#step-3). If you also want to listen to incoming app links during your app's execution, you'll need to add the following lines to your `*AppDelegate.m`:
+
+```objectivec
+// iOS 9.x or newer
+#import
+
+- (BOOL)application:(UIApplication *)application
+ openURL:(NSURL *)url
+ options:(NSDictionary *)options
+{
+ return [RCTLinkingManager application:application openURL:url options:options];
+}
+```
+
+If you're targeting iOS 8.x or older, you can use the following code instead:
+
+```objectivec
+// iOS 8.x or older
+#import
+
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
+{
+ return [RCTLinkingManager application:application openURL:url
+ sourceApplication:sourceApplication annotation:annotation];
+}
+```
+
+If your app is using [Universal Links](https://developer.apple.com/ios/universal-links/), you'll need to add the following code as well:
+
+```objectivec
+- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
+ restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler
+{
+ return [RCTLinkingManager application:application
+ continueUserActivity:userActivity
+ restorationHandler:restorationHandler];
+}
+```
+
+
+
+
+### Handling Deep Links
+
+There are two ways to handle URLs that open your app.
+
+#### 1. If the app is already open, the app is foregrounded and a Linking 'url' event is fired
+
+You can handle these events with `Linking.addEventListener('url', callback)` - it calls `callback({url})` with the linked URL
+
+#### 2. If the app is not already open, it is opened and the url is passed in as the initialURL
+
+You can handle these events with `Linking.getInitialURL()` - it returns a Promise that resolves to the URL, if there is one.
+
+---
+
+## Example
+
+### Open Links and Deep Links (Universal Links)
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=js
+import React, {useCallback} from 'react';
+import {Alert, Button, Linking, StyleSheet, View} from 'react-native';
+
+const supportedURL = 'https://google.com';
+
+const unsupportedURL = 'slack://open?team=123456';
+
+const OpenURLButton = ({url, children}) => {
+ const handlePress = useCallback(async () => {
+ // Checking if the link is supported for links with custom URL scheme.
+ const supported = await Linking.canOpenURL(url);
+
+ if (supported) {
+ // Opening the link with some app, if the URL scheme is "http" the web link should be opened
+ // by some browser in the mobile
+ await Linking.openURL(url);
+ } else {
+ Alert.alert(`Don't know how to open this URL: ${url}`);
+ }
+ }, [url]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ Open Supported URL
+ Open Unsupported URL
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=tsx
+import React, {useCallback} from 'react';
+import {Alert, Button, Linking, StyleSheet, View} from 'react-native';
+
+const supportedURL = 'https://google.com';
+
+const unsupportedURL = 'slack://open?team=123456';
+
+type OpenURLButtonProps = {
+ url: string;
+ children: string;
+};
+
+const OpenURLButton = ({url, children}: OpenURLButtonProps) => {
+ const handlePress = useCallback(async () => {
+ // Checking if the link is supported for links with custom URL scheme.
+ const supported = await Linking.canOpenURL(url);
+
+ if (supported) {
+ // Opening the link with some app, if the URL scheme is "http" the web link should be opened
+ // by some browser in the mobile
+ await Linking.openURL(url);
+ } else {
+ Alert.alert(`Don't know how to open this URL: ${url}`);
+ }
+ }, [url]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ Open Supported URL
+ Open Unsupported URL
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+### Open Custom Settings
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=js
+import React, {useCallback} from 'react';
+import {Button, Linking, StyleSheet, View} from 'react-native';
+
+const OpenSettingsButton = ({children}) => {
+ const handlePress = useCallback(async () => {
+ // Open the custom settings if the app has one
+ await Linking.openSettings();
+ }, []);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ Open Settings
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=tsx
+import React, {useCallback} from 'react';
+import {Button, Linking, StyleSheet, View} from 'react-native';
+
+type OpenSettingsButtonProps = {
+ children: string;
+};
+
+const OpenSettingsButton = ({children}: OpenSettingsButtonProps) => {
+ const handlePress = useCallback(async () => {
+ // Open the custom settings if the app has one
+ await Linking.openSettings();
+ }, []);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+ Open Settings
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+### Get the Deep Link
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=js
+import React, {useState, useEffect} from 'react';
+import {Linking, StyleSheet, Text, View} from 'react-native';
+
+const useInitialURL = () => {
+ const [url, setUrl] = useState(null);
+ const [processing, setProcessing] = useState(true);
+
+ useEffect(() => {
+ const getUrlAsync = async () => {
+ // Get the deep link used to open the app
+ const initialUrl = await Linking.getInitialURL();
+
+ // The setTimeout is just for testing purpose
+ setTimeout(() => {
+ setUrl(initialUrl);
+ setProcessing(false);
+ }, 1000);
+ };
+
+ getUrlAsync();
+ }, []);
+
+ return {url, processing};
+};
+
+const App = () => {
+ const {url: initialUrl, processing} = useInitialURL();
+
+ return (
+
+
+ {processing
+ ? 'Processing the initial url from a deep link'
+ : `The deep link is: ${initialUrl || 'None'}`}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=ios,android&ext=tsx
+import React, {useState, useEffect} from 'react';
+import {Linking, StyleSheet, Text, View} from 'react-native';
+
+const useInitialURL = () => {
+ const [url, setUrl] = useState(null);
+ const [processing, setProcessing] = useState(true);
+
+ useEffect(() => {
+ const getUrlAsync = async () => {
+ // Get the deep link used to open the app
+ const initialUrl = await Linking.getInitialURL();
+
+ // The setTimeout is just for testing purpose
+ setTimeout(() => {
+ setUrl(initialUrl);
+ setProcessing(false);
+ }, 1000);
+ };
+
+ getUrlAsync();
+ }, []);
+
+ return {url, processing};
+};
+
+const App = () => {
+ const {url: initialUrl, processing} = useInitialURL();
+
+ return (
+
+
+ {processing
+ ? 'Processing the initial url from a deep link'
+ : `The deep link is: ${initialUrl || 'None'}`}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+### Send Intents (Android)
+
+
+
+
+```SnackPlayer name=Linking%20Example&supportedPlatforms=android&ext=js
+import React, {useCallback} from 'react';
+import {Alert, Button, Linking, StyleSheet, View} from 'react-native';
+
+const SendIntentButton = ({action, extras, children}) => {
+ const handlePress = useCallback(async () => {
+ try {
+ await Linking.sendIntent(action, extras);
+ } catch (e) {
+ Alert.alert(e.message);
+ }
+ }, [action, extras]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+
+ Power Usage Summary
+
+
+ App Notification Settings
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Linking%20Example&ext=tsx
+import React, {useCallback} from 'react';
+import {Alert, Button, Linking, StyleSheet, View} from 'react-native';
+
+type SendIntentButtonProps = {
+ action: string;
+ children: string;
+ extras?: Array<{
+ key: string;
+ value: string | number | boolean;
+ }>;
+};
+
+const SendIntentButton = ({
+ action,
+ extras,
+ children,
+}: SendIntentButtonProps) => {
+ const handlePress = useCallback(async () => {
+ try {
+ await Linking.sendIntent(action, extras);
+ } catch (e: any) {
+ Alert.alert(e.message);
+ }
+ }, [action, extras]);
+
+ return ;
+};
+
+const App = () => {
+ return (
+
+
+ Power Usage Summary
+
+
+ App Notification Settings
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default App;
+```
+
+
+
+
+# Reference
+
+## Methods
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ type: 'url',
+ handler: (event: {url: string}) => void,
+): EmitterSubscription;
+```
+
+Add a handler to Linking changes by listening to the `url` event type and providing the handler.
+
+---
+
+### `canOpenURL()`
+
+```tsx
+static canOpenURL(url: string): Promise;
+```
+
+Determine whether or not an installed app can handle a given URL.
+
+The method returns a `Promise` object. When it is determined whether or not the given URL can be handled, the promise is resolved and the first parameter is whether or not it can be opened.
+
+The `Promise` will reject on Android if it was impossible to check if the URL can be opened or when targetting Android 11 (SDK 30) if you didn't specify the relevant intent queries in `AndroidManifest.xml`. Similarly on iOS, the promise will reject if you didn't add the specific scheme in the `LSApplicationQueriesSchemes` key inside `Info.plist` (see bellow).
+
+**Parameters:**
+
+| Name | Type | Description |
+| -------------------------------------------------------- | ------ | ---------------- |
+| url
Required
| string | The URL to open. |
+
+> For web URLs, the protocol (`"http://"`, `"https://"`) must be set accordingly!
+
+> This method has limitations on iOS 9+. From [the official Apple documentation](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl):
+>
+> - If your app is linked against an earlier version of iOS but is running in iOS 9.0 or later, you can call this method up to 50 times. After reaching that limit, subsequent calls always resolve to `false`. If the user reinstalls or upgrades the app, iOS resets the limit.
+>
+> As of iOS 9, your app also needs to provide the `LSApplicationQueriesSchemes` key inside `Info.plist` or `canOpenURL()` will always resolve to `false`.
+
+> When targeting Android 11 (SDK 30) you must specify the intents for the schemes you want to handle in `AndroidManifest.xml`. A list of common intents can be found [here](https://developer.android.com/guide/components/intents-common).
+>
+> For example to handle `https` schemes the following needs to be added to your manifest:
+>
+> ```
+>
+>
+>
+>
+>
+>
+>
+>
+> ```
+
+---
+
+### `getInitialURL()`
+
+```tsx
+static getInitialURL(): Promise;
+```
+
+If the app launch was triggered by an app link, it will give the link url, otherwise it will give `null`.
+
+> To support deep linking on Android, refer https://developer.android.com/training/app-indexing/deep-linking.html#handling-intents
+
+> getInitialURL may return `null` while debugging is enabled. Disable the debugger to ensure it gets passed.
+
+---
+
+### `openSettings()`
+
+```tsx
+static openSettings(): Promise;
+```
+
+Open the Settings app and displays the app’s custom settings, if it has any.
+
+---
+
+### `openURL()`
+
+```tsx
+static openURL(url: string): Promise;
+```
+
+Try to open the given `url` with any of the installed apps.
+
+You can use other URLs, like a location (e.g. "geo:37.484847,-122.148386" on Android or "https://maps.apple.com/?ll=37.484847,-122.148386" on iOS), a contact, or any other URL that can be opened with the installed apps.
+
+The method returns a `Promise` object. If the user confirms the open dialog or the url automatically opens, the promise is resolved. If the user cancels the open dialog or there are no registered applications for the url, the promise is rejected.
+
+**Parameters:**
+
+| Name | Type | Description |
+| -------------------------------------------------------- | ------ | ---------------- |
+| url
Required
| string | The URL to open. |
+
+> This method will fail if the system doesn't know how to open the specified URL. If you're passing in a non-http(s) URL, it's best to check `canOpenURL()` first.
+
+> For web URLs, the protocol (`"http://"`, `"https://"`) must be set accordingly!
+
+> This method may behave differently in a simulator e.g. `"tel:"` links are not able to be handled in the iOS simulator as there's no access to the dialer app.
+
+---
+
+### `sendIntent()`
Android
+
+```tsx
+static sendIntent(
+ action: string,
+ extras?: Array<{key: string; value: string | number | boolean}>,
+): Promise;
+```
+
+Launch an Android intent with extras.
+
+**Parameters:**
+
+| Name | Type |
+| ----------------------------------------------------------- | ---------------------------------------------------------- |
+| action
Required
| string |
+| extras | `Array<{key: string, value: string | number | boolean}>` |
diff --git a/website/versioned_docs/version-0.73.0/metro.md b/website/versioned_docs/version-0.73.0/metro.md
new file mode 100644
index 00000000000..42ea16ca033
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/metro.md
@@ -0,0 +1,104 @@
+---
+id: metro
+title: Metro
+---
+
+React Native uses [Metro](https://facebook.github.io/metro/) to build your JavaScript code and assets.
+
+## Configuring Metro
+
+Configuration options for Metro can be customized in your project's `metro.config.js` file. This can export either:
+
+- **An object (recommended)** that will be merged on top of Metro's internal config defaults.
+- [**A function**](#advanced-using-a-config-function) that will be called with Metro's internal config defaults and should return a final config object.
+
+:::tip
+Please see [**Configuring Metro**](https://facebook.github.io/metro/docs/configuration) on the Metro website for documentation on all available config options.
+:::
+
+In React Native, your Metro config should extend either [`@react-native/metro-config`](https://www.npmjs.com/package/@react-native/metro-config) or [`@expo/metro-config`](https://www.npmjs.com/package/@expo/metro-config). These packages contain essential defaults necessary to build and run React Native apps.
+
+Below is the default `metro.config.js` file in a React Native template project:
+
+
+```js
+const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+
+/**
+ * Metro configuration
+ * https://facebook.github.io/metro/docs/configuration
+ *
+ * @type {import('metro-config').MetroConfig}
+ */
+const config = {};
+
+module.exports = mergeConfig(getDefaultConfig(__dirname), config);
+```
+
+Metro options you wish to customize can be done so within the `config` object.
+
+### Advanced: Using a config function
+
+Exporting a config function is an opt-in to managing the final config yourself — **Metro will not apply any internal defaults**. This pattern can be useful when needing to read the base default config object from Metro or to set options dynamically.
+
+:::info
+**From `@react-native/metro-config` 0.72.1**, it is no longer necessary to use a config function to access the complete default config. See the **Tip** section below.
+:::
+
+
+```js
+const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+
+module.exports = function (baseConfig) {
+ const defaultConfig = mergeConfig(baseConfig, getDefaultConfig(__dirname));
+ const {resolver: {assetExts, sourceExts}} = defaultConfig;
+
+ return mergeConfig(
+ defaultConfig,
+ {
+ resolver: {
+ assetExts: assetExts.filter(ext => ext !== 'svg'),
+ sourceExts: [...sourceExts, 'svg'],
+ },
+ },
+ );
+};
+```
+
+:::tip
+Using a config function is for advanced use cases. A simpler method than the above, e.g. for customising `sourceExts`, would be to read these defaults from `@react-native/metro-config`.
+
+**Alternative**
+
+
+```js
+const defaultConfig = getDefaultConfig(__dirname);
+
+const config = {
+ resolver: {
+ sourceExts: [...defaultConfig.resolver.sourceExts, 'svg'],
+ },
+};
+
+module.exports = mergeConfig(defaultConfig, config);
+```
+
+**However!**, we recommend copying and editing when overriding these config values — placing the source of truth in your config file.
+
+✅ **Recommended**
+
+
+```js
+const config = {
+ resolver: {
+ sourceExts: ['js', 'ts', 'tsx', 'svg'],
+ },
+};
+```
+
+:::
+
+## Learn more about Metro
+
+- [Metro website](https://facebook.github.io/metro/)
+- [Video: "Metro & React Native DevX" talk at App.js 2023](https://www.youtube.com/watch?v=c9D4pg0y9cI)
diff --git a/website/versioned_docs/version-0.73.0/modal.md b/website/versioned_docs/version-0.73.0/modal.md
new file mode 100644
index 00000000000..2a363f97cf3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/modal.md
@@ -0,0 +1,233 @@
+---
+id: modal
+title: Modal
+---
+
+The Modal component is a basic way to present content above an enclosing view.
+
+## Example
+
+```SnackPlayer name=Modal&supportedPlatforms=android,ios
+import React, {useState} from 'react';
+import {Alert, Modal, StyleSheet, Text, Pressable, View} from 'react-native';
+
+const App = () => {
+ const [modalVisible, setModalVisible] = useState(false);
+ return (
+
+ {
+ Alert.alert('Modal has been closed.');
+ setModalVisible(!modalVisible);
+ }}>
+
+
+ Hello World!
+ setModalVisible(!modalVisible)}>
+ Hide Modal
+
+
+
+
+ setModalVisible(true)}>
+ Show Modal
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ centeredView: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginTop: 22,
+ },
+ modalView: {
+ margin: 20,
+ backgroundColor: 'white',
+ borderRadius: 20,
+ padding: 35,
+ alignItems: 'center',
+ shadowColor: '#000',
+ shadowOffset: {
+ width: 0,
+ height: 2,
+ },
+ shadowOpacity: 0.25,
+ shadowRadius: 4,
+ elevation: 5,
+ },
+ button: {
+ borderRadius: 20,
+ padding: 10,
+ elevation: 2,
+ },
+ buttonOpen: {
+ backgroundColor: '#F194FF',
+ },
+ buttonClose: {
+ backgroundColor: '#2196F3',
+ },
+ textStyle: {
+ color: 'white',
+ fontWeight: 'bold',
+ textAlign: 'center',
+ },
+ modalText: {
+ marginBottom: 15,
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+### `animated`
+
+> **Deprecated.** Use the [`animationType`](modal.md#animationtype) prop instead.
+
+---
+
+### `animationType`
+
+The `animationType` prop controls how the modal animates.
+
+Possible values:
+
+- `slide` slides in from the bottom,
+- `fade` fades into view,
+- `none` appears without an animation.
+
+| Type | Default |
+| ----------------------------------- | ------- |
+| enum(`'none'`, `'slide'`, `'fade'`) | `none` |
+
+---
+
+### `hardwareAccelerated`
Android
+
+The `hardwareAccelerated` prop controls whether to force hardware acceleration for the underlying window.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `onDismiss`
iOS
+
+The `onDismiss` prop allows passing a function that will be called once the modal has been dismissed.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onOrientationChange`
iOS
+
+The `onOrientationChange` callback is called when the orientation changes while the modal is being displayed. The orientation provided is only 'portrait' or 'landscape'. This callback is also called on initial render, regardless of the current orientation.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onRequestClose`
+
+The `onRequestClose` callback is called when the user taps the hardware back button on Android or the menu button on Apple TV. Because of this required prop, be aware that `BackHandler` events will not be emitted as long as the modal is open.
+On iOS, this callback is called when a Modal is being dismissed using a drag gesture when `presentationStyle` is `pageSheet or formSheet`
+
+| Type |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| function
Required
Android
TV
function
iOS
|
+
+---
+
+### `onShow`
+
+The `onShow` prop allows passing a function that will be called once the modal has been shown.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `presentationStyle`
iOS
+
+The `presentationStyle` prop controls how the modal appears (generally on larger devices such as iPad or plus-sized iPhones). See https://developer.apple.com/reference/uikit/uimodalpresentationstyle for details.
+
+Possible values:
+
+- `fullScreen` covers the screen completely
+- `pageSheet` covers portrait-width view centered (only on larger devices)
+- `formSheet` covers narrow-width view centered (only on larger devices)
+- `overFullScreen` covers the screen completely, but allows transparency
+
+| Type | Default |
+| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
+| enum(`'fullScreen'`, `'pageSheet'`, `'formSheet'`, `'overFullScreen'`) | `fullScreen` if `transparent={false}``overFullScreen` if `transparent={true}` |
+
+---
+
+### `statusBarTranslucent`
Android
+
+The `statusBarTranslucent` prop determines whether your modal should go under the system statusbar.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `supportedOrientations`
iOS
+
+The `supportedOrientations` prop allows the modal to be rotated to any of the specified orientations. On iOS, the modal is still restricted by what's specified in your app's Info.plist's UISupportedInterfaceOrientations field.
+
+> When using `presentationStyle` of `pageSheet` or `formSheet`, this property will be ignored by iOS.
+
+| Type | Default |
+| -------------------------------------------------------------------------------------------------------------- | -------------- |
+| array of enums(`'portrait'`, `'portrait-upside-down'`, `'landscape'`, `'landscape-left'`, `'landscape-right'`) | `['portrait']` |
+
+---
+
+### `transparent`
+
+The `transparent` prop determines whether your modal will fill the entire view. Setting this to `true` will render the modal over a transparent background.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `visible`
+
+The `visible` prop determines whether your modal is visible.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
diff --git a/website/versioned_docs/version-0.73.0/more-resources.md b/website/versioned_docs/version-0.73.0/more-resources.md
new file mode 100644
index 00000000000..e2f26e8f877
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/more-resources.md
@@ -0,0 +1,43 @@
+---
+id: more-resources
+title: More Resources
+---
+
+There’s always more to learn: developer workflows, shipping to app stores, internationalization, security and more.
+
+## Where to go from here
+
+- [Set up your environment](environment-setup)
+- [Set up your development workflow](running-on-device)
+- [Design and layout your app](flexbox)
+- [Debug your app](debugging)
+- [Make your app cross platform](platform-specific-code)
+- [Get involved in the React Native community](/community/overview)
+
+## Dive deep
+
+- [React’s Documentation](https://react.dev/learn)
+- [MDN’s JavaScript tutorials, reference, and guides](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
+- [Android](https://developer.android.com/docs) and [iOS](https://developer.apple.com/documentation/uikit) platform docs
+
+## IDEs
+
+We recommend using the [VS Code](https://code.visualstudio.com/) code editor and its handy [React Native tools](https://marketplace.visualstudio.com/items?itemName=msjsdiag.vscode-react-native).
+
+## Platforms to try
+
+[Expo](https://docs.expo.dev/) is a framework of tools and services for React Native that focuses on helping you build, ship, and iterate on your app, to use preview deployment workflows that are popular with web development, and to automate your development workflows. Expo also makes it possible to build React Native apps without ever touching Xcode or Android Studio, and it doesn't get in the way if you want to use those tools.
+
+[Ignite](https://github.com/infinitered/ignite) is a starter kit CLI with several React Native boilerplates. The latest, Ignite Maverick, uses MobX-State-Tree for state management, React Navigation, and other common libraries.It has generators for screens, models, and more, and supports Expo out of the box. Ignite also comes with a component library that is tuned for custom designs, theming support, and testing. If you are looking for a preconfigured tech stack, Ignite could be perfect for you.
+
+## Example Apps
+
+Try out apps from the [Showcase](https://reactnative.dev/showcase) to see what React Native is capable of! Looking for something more hands on? Check out this [set of example apps on GitHub](https://github.com/ReactNativeNews/React-Native-Apps). You can look at their source code—try running one on a simulator or device.
+
+## Find, make, and share your own Native Components and TurboModules
+
+React Native has a community of thousands of developers like you making content, tools, tutorials—and Native Components!
+
+Can’t find what you’re looking for in the Core Components? Visit [React Native Directory](https://reactnative.directory) to find what the community has been creating.
+
+Interested in making your own Native Component or Module? Making modules for your own use case and sharing them with others on NPM and GitHub helps grow the React Native ecosystem and community! Read the guides to making your own Native Modules ([Android](native-modules-android.md), [iOS](native-modules-ios.md)) and Native Components ([Android](native-components-android.md), [iOS](native-components-ios.md)).
diff --git a/website/versioned_docs/version-0.73.0/native-components-android.md b/website/versioned_docs/version-0.73.0/native-components-android.md
new file mode 100644
index 00000000000..0d6a49ef860
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-components-android.md
@@ -0,0 +1,867 @@
+---
+id: native-components-android
+title: Android Native UI Components
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+
+
+
+There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like `ScrollView` and `TextInput`, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application.
+
+Like the native module guide, this too is a more advanced guide that assumes you are somewhat familiar with Android SDK programming. This guide will show you how to build a native UI component, walking you through the implementation of a subset of the existing `ImageView` component available in the core React Native library.
+
+## ImageView example
+
+For this example we are going to walk through the implementation requirements to allow the use of ImageViews in JavaScript.
+
+Native views are created and manipulated by extending `ViewManager` or more commonly `SimpleViewManager` . A `SimpleViewManager` is convenient in this case because it applies common properties such as background color, opacity, and Flexbox layout.
+
+These subclasses are essentially singletons - only one instance of each is created by the bridge. They send native views to the `NativeViewHierarchyManager`, which delegates back to them to set and update the properties of the views as necessary. The `ViewManagers` are also typically the delegates for the views, sending events back to JavaScript via the bridge.
+
+To send a view:
+
+1. Create the ViewManager subclass.
+2. Implement the `createViewInstance` method
+3. Expose view property setters using `@ReactProp` (or `@ReactPropGroup`) annotation
+4. Register the manager in `createViewManagers` of the applications package.
+5. Implement the JavaScript module
+
+### 1. Create the `ViewManager` subclass
+
+In this example we create view manager class `ReactImageManager` that extends `SimpleViewManager` of type `ReactImageView`. `ReactImageView` is the type of object managed by the manager, this will be the custom native view. Name returned by `getName` is used to reference the native view type from JavaScript.
+
+
+
+
+```kotlin
+class ReactImageManager(
+ private val callerContext: ReactApplicationContext
+) : SimpleViewManager() {
+
+ override fun getName() = REACT_CLASS
+
+ companion object {
+ const val REACT_CLASS = "RCTImageView"
+ }
+}
+```
+
+
+
+
+```java
+public class ReactImageManager extends SimpleViewManager {
+
+ public static final String REACT_CLASS = "RCTImageView";
+ ReactApplicationContext mCallerContext;
+
+ public ReactImageManager(ReactApplicationContext reactContext) {
+ mCallerContext = reactContext;
+ }
+
+ @Override
+ public String getName() {
+ return REACT_CLASS;
+ }
+}
+```
+
+
+
+
+### 2. Implement method `createViewInstance`
+
+Views are created in the `createViewInstance` method, the view should initialize itself in its default state, any properties will be set via a follow up call to `updateView.`
+
+
+
+
+```kotlin
+ override fun createViewInstance(context: ThemedReactContext) =
+ ReactImageView(context, Fresco.newDraweeControllerBuilder(), null, callerContext)
+```
+
+
+
+
+```java
+ @Override
+ public ReactImageView createViewInstance(ThemedReactContext context) {
+ return new ReactImageView(context, Fresco.newDraweeControllerBuilder(), null, mCallerContext);
+ }
+```
+
+
+
+
+### 3. Expose view property setters using `@ReactProp` (or `@ReactPropGroup`) annotation
+
+Properties that are to be reflected in JavaScript needs to be exposed as setter method annotated with `@ReactProp` (or `@ReactPropGroup`). Setter method should take view to be updated (of the current view type) as a first argument and property value as a second argument. Setter should be public and not return a value (i.e. return type should be `void` in Java or `Unit` in Kotlin). Property type sent to JS is determined automatically based on the type of value argument of the setter. The following type of values are currently supported (in Java): `boolean`, `int`, `float`, `double`, `String`, `Boolean`, `Integer`, `ReadableArray`, `ReadableMap`. The corresponding types in Kotlin are `Boolean`, `Int`, `Float`, `Double`, `String`, `ReadableArray`, `ReadableMap`.
+
+Annotation `@ReactProp` has one obligatory argument `name` of type `String`. Name assigned to the `@ReactProp` annotation linked to the setter method is used to reference the property on JS side.
+
+Except from `name`, `@ReactProp` annotation may take following optional arguments: `defaultBoolean`, `defaultInt`, `defaultFloat`. Those arguments should be of the corresponding type (accordingly `boolean`, `int`, `float` in Java and `Boolean`, `Int`, `Float` in Kotlin) and the value provided will be passed to the setter method in case when the property that the setter is referencing has been removed from the component. Note that "default" values are only provided for primitive types, in case when setter is of some complex type, `null` will be provided as a default value in case when corresponding property gets removed.
+
+Setter declaration requirements for methods annotated with `@ReactPropGroup` are different than for `@ReactProp`, please refer to the `@ReactPropGroup` annotation class docs for more information about it. **IMPORTANT!** in ReactJS updating the property value will result in setter method call. Note that one of the ways we can update component is by removing properties that have been set before. In that case setter method will be called as well to notify view manager that property has changed. In that case "default" value will be provided (for primitive types "default" value can be specified using `defaultBoolean`, `defaultFloat`, etc. arguments of `@ReactProp` annotation, for complex types setter will be called with value set to `null`).
+
+
+
+
+```kotlin
+ @ReactProp(name = "src")
+ fun setSrc(view: ReactImageView, sources: ReadableArray?) {
+ view.setSource(sources)
+ }
+
+ @ReactProp(name = "borderRadius", defaultFloat = 0f)
+ override fun setBorderRadius(view: ReactImageView, borderRadius: Float) {
+ view.setBorderRadius(borderRadius)
+ }
+
+ @ReactProp(name = ViewProps.RESIZE_MODE)
+ fun setResizeMode(view: ReactImageView, resizeMode: String?) {
+ view.setScaleType(ImageResizeMode.toScaleType(resizeMode))
+ }
+```
+
+
+
+
+```java
+ @ReactProp(name = "src")
+ public void setSrc(ReactImageView view, @Nullable ReadableArray sources) {
+ view.setSource(sources);
+ }
+
+ @ReactProp(name = "borderRadius", defaultFloat = 0f)
+ public void setBorderRadius(ReactImageView view, float borderRadius) {
+ view.setBorderRadius(borderRadius);
+ }
+
+ @ReactProp(name = ViewProps.RESIZE_MODE)
+ public void setResizeMode(ReactImageView view, @Nullable String resizeMode) {
+ view.setScaleType(ImageResizeMode.toScaleType(resizeMode));
+ }
+```
+
+
+
+
+### 4. Register the `ViewManager`
+
+The final step is to register the ViewManager to the application, this happens in a similar way to [Native Modules](native-modules-android.md), via the applications package member function `createViewManagers`.
+
+
+
+
+```kotlin
+ override fun createViewManagers(
+ reactContext: ReactApplicationContext
+ ) = listOf(ReactImageManager(reactContext))
+```
+
+
+
+
+```java
+ @Override
+ public List createViewManagers(
+ ReactApplicationContext reactContext) {
+ return Arrays.asList(
+ new ReactImageManager(reactContext)
+ );
+ }
+```
+
+
+
+
+### 5. Implement the JavaScript module
+
+The very final step is to create the JavaScript module that defines the interface layer between Java/Kotlin and JavaScript for the users of your new view. It is recommended for you to document the component interface in this module (e.g. using TypeScript, Flow, or plain old comments).
+
+```tsx title="ImageView.tsx"
+import {requireNativeComponent} from 'react-native';
+
+/**
+ * Composes `View`.
+ *
+ * - src: string
+ * - borderRadius: number
+ * - resizeMode: 'cover' | 'contain' | 'stretch'
+ */
+module.exports = requireNativeComponent('RCTImageView');
+```
+
+The `requireNativeComponent` function takes the name of the native view. Note that if your component needs to do anything more sophisticated (e.g. custom event handling), you should wrap the native component in another React component. This is illustrated in the `MyCustomView` example below.
+
+## Events
+
+So now we know how to expose native view components that we can control freely from JS, but how do we deal with events from the user, like pinch-zooms or panning? When a native event occurs the native code should issue an event to the JavaScript representation of the View, and the two views are linked with the value returned from the `getId()` method.
+
+
+
+
+```kotlin
+class MyCustomView(context: Context) : View(context) {
+ ...
+ fun onReceiveNativeEvent() {
+ val event = Arguments.createMap().apply {
+ putString("message", "MyMessage")
+ }
+ val reactContext = context as ReactContext
+ reactContext
+ .getJSModule(RCTEventEmitter::class.java)
+ .receiveEvent(id, "topChange", event)
+ }
+}
+```
+
+
+
+
+```java
+class MyCustomView extends View {
+ ...
+ public void onReceiveNativeEvent() {
+ WritableMap event = Arguments.createMap();
+ event.putString("message", "MyMessage");
+ ReactContext reactContext = (ReactContext)getContext();
+ reactContext
+ .getJSModule(RCTEventEmitter.class)
+ .receiveEvent(getId(), "topChange", event);
+ }
+}
+```
+
+
+
+
+To map the `topChange` event name to the `onChange` callback prop in JavaScript, register it by overriding the `getExportedCustomBubblingEventTypeConstants` method in your `ViewManager`:
+
+
+
+
+```kotlin
+class ReactImageManager : SimpleViewManager() {
+ ...
+ override fun getExportedCustomBubblingEventTypeConstants(): Map {
+ return mapOf(
+ "topChange" to mapOf(
+ "phasedRegistrationNames" to mapOf(
+ "bubbled" to "onChange"
+ )
+ )
+ )
+ }
+}
+```
+
+
+
+
+```java
+public class ReactImageManager extends SimpleViewManager {
+ ...
+ public Map getExportedCustomBubblingEventTypeConstants() {
+ return MapBuilder.builder().put(
+ "topChange",
+ MapBuilder.of(
+ "phasedRegistrationNames",
+ MapBuilder.of("bubbled", "onChange")
+ )
+ ).build();
+ }
+}
+```
+
+
+
+
+This callback is invoked with the raw event, which we typically process in the wrapper component to make a simpler API:
+
+```tsx title="MyCustomView.tsx"
+class MyCustomView extends React.Component {
+ constructor(props) {
+ super(props);
+ this._onChange = this._onChange.bind(this);
+ }
+ _onChange(event) {
+ if (!this.props.onChangeMessage) {
+ return;
+ }
+ this.props.onChangeMessage(event.nativeEvent.message);
+ }
+ render() {
+ return ;
+ }
+}
+MyCustomView.propTypes = {
+ /**
+ * Callback that is called continuously when the user is dragging the map.
+ */
+ onChangeMessage: PropTypes.func,
+ ...
+};
+
+const RCTMyCustomView = requireNativeComponent(`RCTMyCustomView`);
+```
+
+## Integration with an Android Fragment example
+
+In order to integrate existing Native UI elements to your React Native app, you might need to use Android Fragments to give you a more granular control over your native component than returning a `View` from your `ViewManager`. You will need this if you want to add custom logic that is tied to your view with the help of [lifecycle methods](https://developer.android.com/guide/fragments/lifecycle), such as `onViewCreated`, `onPause`, `onResume`. The following steps will show you how to do it:
+
+### 1. Create an example custom view
+
+First, let's create a `CustomView` class which extends `FrameLayout` (the content of this view can be any view that you'd like to render)
+
+
+
+
+```kotlin title="CustomView.kt"
+// replace with your package
+package com.mypackage
+
+import android.content.Context
+import android.graphics.Color
+import android.widget.FrameLayout
+import android.widget.TextView
+
+class CustomView(context: Context) : FrameLayout(context) {
+ init {
+ // set padding and background color
+ setPadding(16,16,16,16)
+ setBackgroundColor(Color.parseColor("#5FD3F3"))
+
+ // add default text view
+ addView(TextView(context).apply {
+ text = "Welcome to Android Fragments with React Native."
+ })
+ }
+}
+```
+
+
+
+
+```java title="CustomView.java"
+// replace with your package
+package com.mypackage;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+public class CustomView extends FrameLayout {
+ public CustomView(@NonNull Context context) {
+ super(context);
+ // set padding and background color
+ this.setPadding(16,16,16,16);
+ this.setBackgroundColor(Color.parseColor("#5FD3F3"));
+
+ // add default text view
+ TextView text = new TextView(context);
+ text.setText("Welcome to Android Fragments with React Native.");
+ this.addView(text);
+ }
+}
+```
+
+
+
+
+### 2. Create a `Fragment`
+
+
+
+
+```kotlin title="MyFragment.kt"
+// replace with your package
+package com.mypackage
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+
+// replace with your view's import
+import com.mypackage.CustomView
+
+class MyFragment : Fragment() {
+ private lateinit var customView: CustomView
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+ super.onCreateView(inflater, container, savedInstanceState)
+ customView = CustomView(requireNotNull(context))
+ return customView // this CustomView could be any view that you want to render
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ // do any logic that should happen in an `onCreate` method, e.g:
+ // customView.onCreate(savedInstanceState);
+ }
+
+ override fun onPause() {
+ super.onPause()
+ // do any logic that should happen in an `onPause` method
+ // e.g.: customView.onPause();
+ }
+
+ override fun onResume() {
+ super.onResume()
+ // do any logic that should happen in an `onResume` method
+ // e.g.: customView.onResume();
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ // do any logic that should happen in an `onDestroy` method
+ // e.g.: customView.onDestroy();
+ }
+}
+```
+
+
+
+
+```java title="MyFragment.java"
+// replace with your package
+package com.mypackage;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.fragment.app.Fragment;
+
+// replace with your view's import
+import com.mypackage.CustomView;
+
+public class MyFragment extends Fragment {
+ CustomView customView;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+ super.onCreateView(inflater, parent, savedInstanceState);
+ customView = new CustomView(this.getContext());
+ return customView; // this CustomView could be any view that you want to render
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ // do any logic that should happen in an `onCreate` method, e.g:
+ // customView.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ // do any logic that should happen in an `onPause` method
+ // e.g.: customView.onPause();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // do any logic that should happen in an `onResume` method
+ // e.g.: customView.onResume();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ // do any logic that should happen in an `onDestroy` method
+ // e.g.: customView.onDestroy();
+ }
+}
+```
+
+
+
+
+### 3. Create the `ViewManager` subclass
+
+
+
+
+```kotlin title="MyViewManager.kt"
+// replace with your package
+package com.mypackage
+
+import android.view.Choreographer
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.fragment.app.FragmentActivity
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.bridge.ReadableArray
+import com.facebook.react.uimanager.ThemedReactContext
+import com.facebook.react.uimanager.ViewGroupManager
+import com.facebook.react.uimanager.annotations.ReactPropGroup
+
+class MyViewManager(
+ private val reactContext: ReactApplicationContext
+) : ViewGroupManager() {
+ private var propWidth: Int? = null
+ private var propHeight: Int? = null
+
+ override fun getName() = REACT_CLASS
+
+ /**
+ * Return a FrameLayout which will later hold the Fragment
+ */
+ override fun createViewInstance(reactContext: ThemedReactContext) =
+ FrameLayout(reactContext)
+
+ /**
+ * Map the "create" command to an integer
+ */
+ override fun getCommandsMap() = mapOf("create" to COMMAND_CREATE)
+
+ /**
+ * Handle "create" command (called from JS) and call createFragment method
+ */
+ override fun receiveCommand(
+ root: FrameLayout,
+ commandId: String,
+ args: ReadableArray?
+ ) {
+ super.receiveCommand(root, commandId, args)
+ val reactNativeViewId = requireNotNull(args).getInt(0)
+
+ when (commandId.toInt()) {
+ COMMAND_CREATE -> createFragment(root, reactNativeViewId)
+ }
+ }
+
+ @ReactPropGroup(names = ["width", "height"], customType = "Style")
+ fun setStyle(view: FrameLayout, index: Int, value: Int) {
+ if (index == 0) propWidth = value
+ if (index == 1) propHeight = value
+ }
+
+ /**
+ * Replace your React Native view with a custom fragment
+ */
+ fun createFragment(root: FrameLayout, reactNativeViewId: Int) {
+ val parentView = root.findViewById(reactNativeViewId)
+ setupLayout(parentView)
+
+ val myFragment = MyFragment()
+ val activity = reactContext.currentActivity as FragmentActivity
+ activity.supportFragmentManager
+ .beginTransaction()
+ .replace(reactNativeViewId, myFragment, reactNativeViewId.toString())
+ .commit()
+ }
+
+ fun setupLayout(view: View) {
+ Choreographer.getInstance().postFrameCallback(object: Choreographer.FrameCallback {
+ override fun doFrame(frameTimeNanos: Long) {
+ manuallyLayoutChildren(view)
+ view.viewTreeObserver.dispatchOnGlobalLayout()
+ Choreographer.getInstance().postFrameCallback(this)
+ }
+ })
+ }
+
+ /**
+ * Layout all children properly
+ */
+ private fun manuallyLayoutChildren(view: View) {
+ // propWidth and propHeight coming from react-native props
+ val width = requireNotNull(propWidth)
+ val height = requireNotNull(propHeight)
+
+ view.measure(
+ View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
+ View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY))
+
+ view.layout(0, 0, width, height)
+ }
+
+ companion object {
+ private const val REACT_CLASS = "MyViewManager"
+ private const val COMMAND_CREATE = 1
+ }
+}
+```
+
+
+
+
+```java title="MyViewManager.java"
+// replace with your package
+package com.mypackage;
+
+import android.view.Choreographer;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.FragmentActivity;
+
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReadableArray;
+import com.facebook.react.common.MapBuilder;
+import com.facebook.react.uimanager.annotations.ReactProp;
+import com.facebook.react.uimanager.annotations.ReactPropGroup;
+import com.facebook.react.uimanager.ViewGroupManager;
+import com.facebook.react.uimanager.ThemedReactContext;
+
+import java.util.Map;
+
+public class MyViewManager extends ViewGroupManager {
+
+ public static final String REACT_CLASS = "MyViewManager";
+ public final int COMMAND_CREATE = 1;
+ private int propWidth;
+ private int propHeight;
+
+ ReactApplicationContext reactContext;
+
+ public MyViewManager(ReactApplicationContext reactContext) {
+ this.reactContext = reactContext;
+ }
+
+ @Override
+ public String getName() {
+ return REACT_CLASS;
+ }
+
+ /**
+ * Return a FrameLayout which will later hold the Fragment
+ */
+ @Override
+ public FrameLayout createViewInstance(ThemedReactContext reactContext) {
+ return new FrameLayout(reactContext);
+ }
+
+ /**
+ * Map the "create" command to an integer
+ */
+ @Nullable
+ @Override
+ public Map getCommandsMap() {
+ return MapBuilder.of("create", COMMAND_CREATE);
+ }
+
+ /**
+ * Handle "create" command (called from JS) and call createFragment method
+ */
+ @Override
+ public void receiveCommand(
+ @NonNull FrameLayout root,
+ String commandId,
+ @Nullable ReadableArray args
+ ) {
+ super.receiveCommand(root, commandId, args);
+ int reactNativeViewId = args.getInt(0);
+ int commandIdInt = Integer.parseInt(commandId);
+
+ switch (commandIdInt) {
+ case COMMAND_CREATE:
+ createFragment(root, reactNativeViewId);
+ break;
+ default: {}
+ }
+ }
+
+ @ReactPropGroup(names = {"width", "height"}, customType = "Style")
+ public void setStyle(FrameLayout view, int index, Integer value) {
+ if (index == 0) {
+ propWidth = value;
+ }
+
+ if (index == 1) {
+ propHeight = value;
+ }
+ }
+
+ /**
+ * Replace your React Native view with a custom fragment
+ */
+ public void createFragment(FrameLayout root, int reactNativeViewId) {
+ ViewGroup parentView = (ViewGroup) root.findViewById(reactNativeViewId);
+ setupLayout(parentView);
+
+ final MyFragment myFragment = new MyFragment();
+ FragmentActivity activity = (FragmentActivity) reactContext.getCurrentActivity();
+ activity.getSupportFragmentManager()
+ .beginTransaction()
+ .replace(reactNativeViewId, myFragment, String.valueOf(reactNativeViewId))
+ .commit();
+ }
+
+ public void setupLayout(View view) {
+ Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
+ @Override
+ public void doFrame(long frameTimeNanos) {
+ manuallyLayoutChildren(view);
+ view.getViewTreeObserver().dispatchOnGlobalLayout();
+ Choreographer.getInstance().postFrameCallback(this);
+ }
+ });
+ }
+
+ /**
+ * Layout all children properly
+ */
+ public void manuallyLayoutChildren(View view) {
+ // propWidth and propHeight coming from react-native props
+ int width = propWidth;
+ int height = propHeight;
+
+ view.measure(
+ View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
+ View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY));
+
+ view.layout(0, 0, width, height);
+ }
+}
+```
+
+
+
+
+### 4. Register the `ViewManager`
+
+
+
+
+```kotlin title="MyPackage.kt"
+// replace with your package
+package com.mypackage
+
+import com.facebook.react.ReactPackage
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.uimanager.ViewManager
+
+class MyPackage : ReactPackage {
+ ...
+ override fun createViewManagers(
+ reactContext: ReactApplicationContext
+ ) = listOf(MyViewManager(reactContext))
+}
+```
+
+
+
+
+```java title="MyPackage.java"
+// replace with your package
+package com.mypackage;
+
+import com.facebook.react.ReactPackage;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.uimanager.ViewManager;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class MyPackage implements ReactPackage {
+
+ @Override
+ public List createViewManagers(ReactApplicationContext reactContext) {
+ return Arrays.asList(
+ new MyViewManager(reactContext)
+ );
+ }
+
+}
+```
+
+
+
+
+### 5. Register the `Package`
+
+
+
+
+```kotlin title="MainApplication.kt"
+ override fun getPackages() = PackageList(this).packages.apply {
+ add(MyPackage())
+ }
+```
+
+
+
+
+```java title="MainApplication.java"
+ @Override
+ protected List getPackages() {
+ List packages = new PackageList(this).getPackages();
+ ...
+ packages.add(new MyPackage());
+ return packages;
+ }
+```
+
+
+
+
+### 6. Implement the JavaScript module
+
+I. Start with custom View manager:
+
+```tsx title="MyViewManager.tsx"
+import {requireNativeComponent} from 'react-native';
+
+export const MyViewManager =
+ requireNativeComponent('MyViewManager');
+```
+
+II. Then implement custom View calling the `create` method:
+
+```tsx title="MyView.tsx"
+import React, {useEffect, useRef} from 'react';
+import {
+ PixelRatio,
+ UIManager,
+ findNodeHandle,
+} from 'react-native';
+
+import {MyViewManager} from './my-view-manager';
+
+const createFragment = viewId =>
+ UIManager.dispatchViewManagerCommand(
+ viewId,
+ // we are calling the 'create' command
+ UIManager.MyViewManager.Commands.create.toString(),
+ [viewId],
+ );
+
+export const MyView = () => {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ const viewId = findNodeHandle(ref.current);
+ createFragment(viewId);
+ }, []);
+
+ return (
+
+ );
+};
+```
+
+If you want to expose property setters using `@ReactProp` (or `@ReactPropGroup`) annotation see the [ImageView example](#imageview-example) above.
diff --git a/website/versioned_docs/version-0.73.0/native-components-ios.md b/website/versioned_docs/version-0.73.0/native-components-ios.md
new file mode 100644
index 00000000000..c225df16b92
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-components-ios.md
@@ -0,0 +1,496 @@
+---
+id: native-components-ios
+title: iOS Native UI Components
+---
+
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+
+
+
+There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like `ScrollView` and `TextInput`, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application.
+
+Like the native module guide, this too is a more advanced guide that assumes you are somewhat familiar with iOS programming. This guide will show you how to build a native UI component, walking you through the implementation of a subset of the existing `MapView` component available in the core React Native library.
+
+## iOS MapView example
+
+Let's say we want to add an interactive Map to our app - might as well use [`MKMapView`](https://developer.apple.com/library/prerelease/mac/documentation/MapKit/Reference/MKMapView_Class/index.html), we only need to make it usable from JavaScript.
+
+Native views are created and manipulated by subclasses of `RCTViewManager`. These subclasses are similar in function to view controllers, but are essentially singletons - only one instance of each is created by the bridge. They expose native views to the `RCTUIManager`, which delegates back to them to set and update the properties of the views as necessary. The `RCTViewManager`s are also typically the delegates for the views, sending events back to JavaScript via the bridge.
+
+To expose a view you can:
+
+- Subclass `RCTViewManager` to create a manager for your component.
+- Add the `RCT_EXPORT_MODULE()` marker macro.
+- Implement the `-(UIView *)view` method.
+
+```objectivec title='RNTMapManager.m'
+#import
+
+#import
+
+@interface RNTMapManager : RCTViewManager
+@end
+
+@implementation RNTMapManager
+
+RCT_EXPORT_MODULE(RNTMap)
+
+- (UIView *)view
+{
+ return [[MKMapView alloc] init];
+}
+
+@end
+```
+
+:::note
+Do not attempt to set the `frame` or `backgroundColor` properties on the `UIView` instance that you expose through the `-view` method.
+React Native will overwrite the values set by your custom class in order to match your JavaScript component's layout props.
+If you need this granularity of control it might be better to wrap the `UIView` instance you want to style in another `UIView` and return the wrapper `UIView` instead.
+See [Issue 2948](https://github.com/facebook/react-native/issues/2948) for more context.
+:::
+
+:::info
+In the example above, we prefixed our class name with `RNT`. Prefixes are used to avoid name collisions with other frameworks.
+Apple frameworks use two-letter prefixes, and React Native uses `RCT` as a prefix. In order to avoid name collisions, we recommend using a three-letter prefix other than `RCT` in your own classes.
+:::
+
+Then you need a little bit of JavaScript to make this a usable React component:
+
+```tsx title="MapView.tsx"
+import {requireNativeComponent} from 'react-native';
+
+// requireNativeComponent automatically resolves 'RNTMap' to 'RNTMapManager'
+module.exports = requireNativeComponent('RNTMap');
+```
+
+```tsx title="MyApp.tsx"
+import MapView from './MapView.tsx';
+
+...
+
+render() {
+ return ;
+}
+```
+
+Make sure to use `RNTMap` here. We want to require the manager here, which will expose the view of our manager for use in JavaScript.
+
+:::note
+When rendering, don't forget to stretch the view, otherwise you'll be staring at a blank screen.
+:::
+
+```tsx
+ render() {
+ return ;
+ }
+```
+
+This is now a fully-functioning native map view component in JavaScript, complete with pinch-zoom and other native gesture support. We can't really control it from JavaScript yet, though :(
+
+## Properties
+
+The first thing we can do to make this component more usable is to bridge over some native properties. Let's say we want to be able to disable zooming and specify the visible region. Disabling zoom is a boolean, so we add this one line:
+
+```objectivec title='RNTMapManager.m'
+RCT_EXPORT_VIEW_PROPERTY(zoomEnabled, BOOL)
+```
+
+Note that we explicitly specify the type as `BOOL` - React Native uses `RCTConvert` under the hood to convert all sorts of different data types when talking over the bridge, and bad values will show convenient "RedBox" errors to let you know there is an issue ASAP. When things are straightforward like this, the whole implementation is taken care of for you by this macro.
+
+Now to actually disable zooming, we set the property in JS:
+
+```tsx title="MyApp.tsx"
+
+```
+
+To document the properties (and which values they accept) of our MapView component we'll add a wrapper component and document the interface with React `PropTypes`:
+
+```tsx title="MapView.tsx"
+import PropTypes from 'prop-types';
+import React from 'react';
+import {requireNativeComponent} from 'react-native';
+
+class MapView extends React.Component {
+ render() {
+ return ;
+ }
+}
+
+MapView.propTypes = {
+ /**
+ * A Boolean value that determines whether the user may use pinch
+ * gestures to zoom in and out of the map.
+ */
+ zoomEnabled: PropTypes.bool,
+};
+
+const RNTMap = requireNativeComponent('RNTMap');
+
+module.exports = MapView;
+```
+
+Now we have a nicely documented wrapper component to work with.
+
+Next, let's add the more complex `region` prop. We start by adding the native code:
+
+```objectivec title='RNTMapManager.m'
+RCT_CUSTOM_VIEW_PROPERTY(region, MKCoordinateRegion, MKMapView)
+{
+ [view setRegion:json ? [RCTConvert MKCoordinateRegion:json] : defaultView.region animated:YES];
+}
+```
+
+Ok, this is more complicated than the `BOOL` case we had before. Now we have a `MKCoordinateRegion` type that needs a conversion function, and we have custom code so that the view will animate when we set the region from JS. Within the function body that we provide, `json` refers to the raw value that has been passed from JS. There is also a `view` variable which gives us access to the manager's view instance, and a `defaultView` that we use to reset the property back to the default value if JS sends us a null sentinel.
+
+You could write any conversion function you want for your view - here is the implementation for `MKCoordinateRegion` via a category on `RCTConvert`. It uses an already existing category of ReactNative `RCTConvert+CoreLocation`:
+
+```objectivec title='RNTMapManager.m'
+#import "RCTConvert+Mapkit.h"
+```
+
+```objectivec title='RCTConvert+Mapkit.h'
+#import
+#import
+#import
+#import
+
+@interface RCTConvert (Mapkit)
+
++ (MKCoordinateSpan)MKCoordinateSpan:(id)json;
++ (MKCoordinateRegion)MKCoordinateRegion:(id)json;
+
+@end
+
+@implementation RCTConvert(MapKit)
+
++ (MKCoordinateSpan)MKCoordinateSpan:(id)json
+{
+ json = [self NSDictionary:json];
+ return (MKCoordinateSpan){
+ [self CLLocationDegrees:json[@"latitudeDelta"]],
+ [self CLLocationDegrees:json[@"longitudeDelta"]]
+ };
+}
+
++ (MKCoordinateRegion)MKCoordinateRegion:(id)json
+{
+ return (MKCoordinateRegion){
+ [self CLLocationCoordinate2D:json],
+ [self MKCoordinateSpan:json]
+ };
+}
+
+@end
+```
+
+These conversion functions are designed to safely process any JSON that the JS might throw at them by displaying "RedBox" errors and returning standard initialization values when missing keys or other developer errors are encountered.
+
+To finish up support for the `region` prop, we need to document it in `propTypes`:
+
+```tsx title="MapView.tsx"
+MapView.propTypes = {
+ /**
+ * A Boolean value that determines whether the user may use pinch
+ * gestures to zoom in and out of the map.
+ */
+ zoomEnabled: PropTypes.bool,
+
+ /**
+ * The region to be displayed by the map.
+ *
+ * The region is defined by the center coordinates and the span of
+ * coordinates to display.
+ */
+ region: PropTypes.shape({
+ /**
+ * Coordinates for the center of the map.
+ */
+ latitude: PropTypes.number.isRequired,
+ longitude: PropTypes.number.isRequired,
+
+ /**
+ * Distance between the minimum and the maximum latitude/longitude
+ * to be displayed.
+ */
+ latitudeDelta: PropTypes.number.isRequired,
+ longitudeDelta: PropTypes.number.isRequired,
+ }),
+};
+```
+
+```tsx title="MyApp.tsx"
+render() {
+ const region = {
+ latitude: 37.48,
+ longitude: -122.16,
+ latitudeDelta: 0.1,
+ longitudeDelta: 0.1,
+ };
+ return (
+
+ );
+}
+```
+
+Here you can see that the shape of the region is explicit in the JS documentation.
+
+## Events
+
+So now we have a native map component that we can control freely from JS, but how do we deal with events from the user, like pinch-zooms or panning to change the visible region?
+
+Until now we've only returned a `MKMapView` instance from our manager's `-(UIView *)view` method. We can't add new properties to `MKMapView` so we have to create a new subclass from `MKMapView` which we use for our View. We can then add a `onRegionChange` callback on this subclass:
+
+```objectivec title='RNTMapView.h'
+#import
+
+#import
+
+@interface RNTMapView: MKMapView
+
+@property (nonatomic, copy) RCTBubblingEventBlock onRegionChange;
+
+@end
+```
+
+```objectivec title='RNTMapView.m'
+#import "RNTMapView.h"
+
+@implementation RNTMapView
+
+@end
+```
+
+Note that all `RCTBubblingEventBlock` must be prefixed with `on`. Next, declare an event handler property on `RNTMapManager`, make it a delegate for all the views it exposes, and forward events to JS by calling the event handler block from the native view.
+
+```objectivec {9,17,31-48} title='RNTMapManager.m'
+#import
+#import
+
+#import "RNTMapView.h"
+#import "RCTConvert+Mapkit.h"
+
+@interface RNTMapManager : RCTViewManager
+@end
+
+@implementation RNTMapManager
+
+RCT_EXPORT_MODULE()
+
+RCT_EXPORT_VIEW_PROPERTY(zoomEnabled, BOOL)
+RCT_EXPORT_VIEW_PROPERTY(onRegionChange, RCTBubblingEventBlock)
+
+RCT_CUSTOM_VIEW_PROPERTY(region, MKCoordinateRegion, MKMapView)
+{
+ [view setRegion:json ? [RCTConvert MKCoordinateRegion:json] : defaultView.region animated:YES];
+}
+
+- (UIView *)view
+{
+ RNTMapView *map = [RNTMapView new];
+ map.delegate = self;
+ return map;
+}
+
+#pragma mark MKMapViewDelegate
+
+- (void)mapView:(RNTMapView *)mapView regionDidChangeAnimated:(BOOL)animated
+{
+ if (!mapView.onRegionChange) {
+ return;
+ }
+
+ MKCoordinateRegion region = mapView.region;
+ mapView.onRegionChange(@{
+ @"region": @{
+ @"latitude": @(region.center.latitude),
+ @"longitude": @(region.center.longitude),
+ @"latitudeDelta": @(region.span.latitudeDelta),
+ @"longitudeDelta": @(region.span.longitudeDelta),
+ }
+ });
+}
+@end
+```
+
+In the delegate method `-mapView:regionDidChangeAnimated:` the event handler block is called on the corresponding view with the region data. Calling the `onRegionChange` event handler block results in calling the same callback prop in JavaScript. This callback is invoked with the raw event, which we typically process in the wrapper component to simplify the API:
+
+```tsx title="MapView.tsx"
+class MapView extends React.Component {
+ _onRegionChange = event => {
+ if (!this.props.onRegionChange) {
+ return;
+ }
+
+ // process raw event...
+ this.props.onRegionChange(event.nativeEvent);
+ };
+ render() {
+ return (
+
+ );
+ }
+}
+MapView.propTypes = {
+ /**
+ * Callback that is called continuously when the user is dragging the map.
+ */
+ onRegionChange: PropTypes.func,
+ ...
+};
+```
+
+```tsx title="MyApp.tsx"
+class MyApp extends React.Component {
+ onRegionChange(event) {
+ // Do stuff with event.region.latitude, etc.
+ }
+
+ render() {
+ const region = {
+ latitude: 37.48,
+ longitude: -122.16,
+ latitudeDelta: 0.1,
+ longitudeDelta: 0.1,
+ };
+ return (
+
+ );
+ }
+}
+```
+
+## Handling multiple native views
+
+A React Native view can have more than one child view in the view tree eg.
+
+```tsx
+
+
+
+
+
+```
+
+In this example, the class `MyNativeView` is a wrapper for a `NativeComponent` and exposes methods, which will be called on the iOS platform. `MyNativeView` is defined in `MyNativeView.ios.js` and contains proxy methods of `NativeComponent`.
+
+When the user interacts with the component, like clicking the button, the `backgroundColor` of `MyNativeView` changes. In this case `UIManager` would not know which `MyNativeView` should be handled and which one should change `backgroundColor`. Below you will find a solution to this problem:
+
+```tsx
+
+
+
+ {
+ this.myNativeReference.callNativeMethod();
+ }}
+ />
+
+```
+
+Now the above component has a reference to a particular `MyNativeView` which allows us to use a specific instance of `MyNativeView`. Now the button can control which `MyNativeView` should change its `backgroundColor`. In this example let's assume that `callNativeMethod` changes `backgroundColor`.
+
+```tsx title="MyNativeView.ios.tsx"
+class MyNativeView extends React.Component {
+ callNativeMethod = () => {
+ UIManager.dispatchViewManagerCommand(
+ ReactNative.findNodeHandle(this),
+ UIManager.getViewManagerConfig('RNCMyNativeView').Commands
+ .callNativeMethod,
+ [],
+ );
+ };
+
+ render() {
+ return ;
+ }
+}
+```
+
+`callNativeMethod` is our custom iOS method which for example changes the `backgroundColor` which is exposed through `MyNativeView`. This method uses `UIManager.dispatchViewManagerCommand` which needs 3 parameters:
+
+- `(nonnull NSNumber \*)reactTag` - id of react view.
+- `commandID:(NSInteger)commandID` - Id of the native method that should be called
+- `commandArgs:(NSArray \*)commandArgs` - Args of the native method that we can pass from JS to native.
+
+```objectivec title='RNCMyNativeViewManager.m'
+#import
+#import
+#import
+
+RCT_EXPORT_METHOD(callNativeMethod:(nonnull NSNumber*) reactTag) {
+ [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) {
+ NativeView *view = viewRegistry[reactTag];
+ if (!view || ![view isKindOfClass:[NativeView class]]) {
+ RCTLogError(@"Cannot find NativeView with tag #%@", reactTag);
+ return;
+ }
+ [view callNativeMethod];
+ }];
+
+}
+```
+
+Here the `callNativeMethod` is defined in the `RNCMyNativeViewManager.m` file and contains only one parameter which is `(nonnull NSNumber*) reactTag`. This exported function will find a particular view using `addUIBlock` which contains the `viewRegistry` parameter and returns the component based on `reactTag` allowing it to call the method on the correct component.
+
+## Styles
+
+Since all our native react views are subclasses of `UIView`, most style attributes will work like you would expect out of the box. Some components will want a default style, however, for example `UIDatePicker` which is a fixed size. This default style is important for the layout algorithm to work as expected, but we also want to be able to override the default style when using the component. `DatePickerIOS` does this by wrapping the native component in an extra view, which has flexible styling, and using a fixed style (which is generated with constants passed in from native) on the inner native component:
+
+```tsx title="DatePickerIOS.ios.tsx"
+import {UIManager} from 'react-native';
+const RCTDatePickerIOSConsts = UIManager.RCTDatePicker.Constants;
+...
+ render: function() {
+ return (
+
+
+
+ );
+ }
+});
+
+const styles = StyleSheet.create({
+ rkDatePickerIOS: {
+ height: RCTDatePickerIOSConsts.ComponentHeight,
+ width: RCTDatePickerIOSConsts.ComponentWidth,
+ },
+});
+```
+
+The `RCTDatePickerIOSConsts` constants are exported from native by grabbing the actual frame of the native component like so:
+
+```objectivec title='RCTDatePickerManager.m'
+- (NSDictionary *)constantsToExport
+{
+ UIDatePicker *dp = [[UIDatePicker alloc] init];
+ [dp layoutIfNeeded];
+
+ return @{
+ @"ComponentHeight": @(CGRectGetHeight(dp.frame)),
+ @"ComponentWidth": @(CGRectGetWidth(dp.frame)),
+ @"DatePickerModes": @{
+ @"time": @(UIDatePickerModeTime),
+ @"date": @(UIDatePickerModeDate),
+ @"datetime": @(UIDatePickerModeDateAndTime),
+ }
+ };
+}
+```
+
+This guide covered many of the aspects of bridging over custom native components, but there is even more you might need to consider, such as custom hooks for inserting and laying out subviews. If you want to go even deeper, check out the [source code](https://github.com/facebook/react-native/tree/main/packages/react-native/React/Views) of some of the implemented components.
diff --git a/website/versioned_docs/version-0.73.0/native-debugging.md b/website/versioned_docs/version-0.73.0/native-debugging.md
new file mode 100644
index 00000000000..36638ef3d7a
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-debugging.md
@@ -0,0 +1,44 @@
+---
+id: native-debugging
+title: Native Debugging
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
Projects with Native Code Only
+
+ The following section only applies to projects with native code exposed. If you are using the managed Expo workflow, see the guide on prebuild to use this API.
+
+
+
+## Accessing native logs
+
+You can display the console logs for an iOS or Android app by using the following commands in a terminal while the app is running:
+
+```shell
+# For Android:
+npx react-native log-android
+# Or, for iOS:
+npx react-native log-ios
+```
+
+You may also access these through Debug > Open System Log… in the iOS Simulator or by running `adb logcat "*:S" ReactNative:V ReactNativeJS:V` in a terminal while an Android app is running on a device or emulator.
+
+:::info
+If you're using Expo CLI, console logs already appear in the same terminal output as the bundler.
+:::
+
+## Debugging native code
+
+When working with native code, such as when writing native modules, you can launch the app from Android Studio or Xcode and take advantage of the native debugging features (setting up breakpoints, etc.) as you would in case of building a standard native app.
+
+Another option is to run your application using the React Native CLI and attach the native debugger of the native IDE (Android Studio or Xcode) to the process.
+
+### Android Studio
+
+On Android Studio you can do this by going on the "Run" option on the menu bar, clicking on "Attach to Process..." and selecting the running React Native app.
+
+### Xcode
+
+On Xcode click on "Debug" on the top menu bar, select the "Attach to process" option, and select the application in the list of "Likely Targets".
diff --git a/website/versioned_docs/version-0.73.0/native-modules-android.md b/website/versioned_docs/version-0.73.0/native-modules-android.md
new file mode 100644
index 00000000000..846404f4fad
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-modules-android.md
@@ -0,0 +1,1179 @@
+---
+id: native-modules-android
+title: Android Native Modules
+---
+
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+Welcome to Native Modules for Android. Please start by reading the [Native Modules Intro](native-modules-intro) for an intro to what native modules are.
+
+## Create a Calendar Native Module
+
+In the following guide you will create a native module, `CalendarModule`, that will allow you to access Android’s calendar APIs from JavaScript. By the end, you will be able to call `CalendarModule.createCalendarEvent('Dinner Party', 'My House');` from JavaScript, invoking a Java/Kotlin method that creates a calendar event.
+
+### Setup
+
+To get started, open up the Android project within your React Native application in Android Studio. You can find your Android project here within a React Native app:
+
+
+
+ Image of where you can find your Android project
+
+
+We recommend using Android Studio to write your native code. Android studio is an IDE built for Android development and using it will help you resolve minor issues like code syntax errors quickly.
+
+We also recommend enabling [Gradle Daemon](https://docs.gradle.org/2.9/userguide/gradle_daemon.html) to speed up builds as you iterate on Java/Kotlin code.
+
+### Create A Custom Native Module File
+
+The first step is to create the (`CalendarModule.java` or `CalendarModule.kt`) Java/Kotlin file inside `android/app/src/main/java/com/your-app-name/` folder (the folder is the same for both Kotlin and Java). This Java/Kotlin file will contain your native module Java/Kotlin class.
+
+
+
+ Image of how to add the CalendarModuleClass
+
+
+Then add the following content:
+
+
+
+
+```java
+package com.your-apps-package-name; // replace your-apps-package-name with your app’s package name
+import com.facebook.react.bridge.NativeModule;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import java.util.Map;
+import java.util.HashMap;
+
+public class CalendarModule extends ReactContextBaseJavaModule {
+ CalendarModule(ReactApplicationContext context) {
+ super(context);
+ }
+}
+```
+
+
+
+
+```kotlin
+package com.your-apps-package-name; // replace your-apps-package-name with your app’s package name
+import com.facebook.react.bridge.NativeModule
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.bridge.ReactContext
+import com.facebook.react.bridge.ReactContextBaseJavaModule
+import com.facebook.react.bridge.ReactMethod
+
+class CalendarModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {...}
+```
+
+
+
+
+As you can see, your `CalendarModule` class extends the `ReactContextBaseJavaModule` class. For Android, Java/Kotlin native modules are written as classes that extend `ReactContextBaseJavaModule` and implement the functionality required by JavaScript.
+
+> It is worth noting that technically Java/Kotlin classes only need to extend the `BaseJavaModule` class or implement the `NativeModule` interface to be considered a Native Module by React Native.
+
+> However we recommend that you use `ReactContextBaseJavaModule`, as shown above. `ReactContextBaseJavaModule` gives access to the `ReactApplicationContext` (RAC), which is useful for Native Modules that need to hook into activity lifecycle methods. Using `ReactContextBaseJavaModule` will also make it easier to make your native module type-safe in the future. For native module type-safety, which is coming in future releases, React Native looks at each native module's JavaScript spec and generates an abstract base class that extends `ReactContextBaseJavaModule`.
+
+### Module Name
+
+All Java/Kotlin native modules in Android need to implement the `getName()` method. This method returns a string, which represents the name of the native module. The native module can then be accessed in JavaScript using its name. For example, in the below code snippet, `getName()` returns `"CalendarModule"`.
+
+
+
+
+```java
+// add to CalendarModule.java
+@Override
+public String getName() {
+ return "CalendarModule";
+}
+```
+
+
+
+
+```kotlin
+// add to CalendarModule.kt
+override fun getName() = "CalendarModule"
+```
+
+
+
+
+The native module can then be accessed in JS like this:
+
+```tsx
+const {CalendarModule} = ReactNative.NativeModules;
+```
+
+### Export a Native Method to JavaScript
+
+Next you will need to add a method to your native module that will create calendar events and can be invoked in JavaScript. All native module methods meant to be invoked from JavaScript must be annotated with `@ReactMethod`.
+
+Set up a method `createCalendarEvent()` for `CalendarModule` that can be invoked in JS through `CalendarModule.createCalendarEvent()`. For now, the method will take in a name and location as strings. Argument type options will be covered shortly.
+
+
+
+
+```java
+@ReactMethod
+public void createCalendarEvent(String name, String location) {
+}
+```
+
+
+
+
+```kotlin
+@ReactMethod fun createCalendarEvent(name: String, location: String) {}
+```
+
+
+
+
+Add a debug log in the method to confirm it has been invoked when you call it from your application. Below is an example of how you can import and use the [Log](https://developer.android.com/reference/android/util/Log) class from the Android util package:
+
+
+
+
+```java
+import android.util.Log;
+
+@ReactMethod
+public void createCalendarEvent(String name, String location) {
+ Log.d("CalendarModule", "Create event called with name: " + name
+ + " and location: " + location);
+}
+```
+
+
+
+
+```kotlin
+import android.util.Log
+
+@ReactMethod
+fun createCalendarEvent(name: String, location: String) {
+ Log.d("CalendarModule", "Create event called with name: $name and location: $location")
+}
+```
+
+
+
+
+Once you finish implementing the native module and hook it up in JavaScript, you can follow [these steps](https://developer.android.com/studio/debug/am-logcat.html) to view the logs from your app.
+
+### Synchronous Methods
+
+You can pass `isBlockingSynchronousMethod = true` to a native method to mark it as a synchronous method.
+
+
+
+
+```java
+@ReactMethod(isBlockingSynchronousMethod = true)
+```
+
+
+
+
+```kotlin
+@ReactMethod(isBlockingSynchronousMethod = true)
+```
+
+
+
+
+At the moment, we do not recommend this, since calling methods synchronously can have strong performance penalties and introduce threading-related bugs to your native modules. Additionally, please note that if you choose to enable `isBlockingSynchronousMethod`, your app can no longer use the Google Chrome debugger. This is because synchronous methods require the JS VM to share memory with the app. For the Google Chrome debugger, React Native runs inside the JS VM in Google Chrome, and communicates asynchronously with the mobile devices via WebSockets.
+
+### Register the Module (Android Specific)
+
+Once a native module is written, it needs to be registered with React Native. In order to do so, you need to add your native module to a `ReactPackage` and register the `ReactPackage` with React Native. During initialization, React Native will loop over all packages, and for each `ReactPackage`, register each native module within.
+
+React Native invokes the method `createNativeModules()` on a `ReactPackage` in order to get the list of native modules to register. For Android, if a module is not instantiated and returned in createNativeModules it will not be available from JavaScript.
+
+To add your Native Module to `ReactPackage`, first create a new Java/Kotlin Class named (`MyAppPackage.java` or `MyAppPackage.kt`) that implements `ReactPackage` inside the `android/app/src/main/java/com/your-app-name/` folder:
+
+Then add the following content:
+
+
+
+
+```java
+package com.your-app-name; // replace your-app-name with your app’s name
+import com.facebook.react.ReactPackage;
+import com.facebook.react.bridge.NativeModule;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.uimanager.ViewManager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class MyAppPackage implements ReactPackage {
+
+ @Override
+ public List createViewManagers(ReactApplicationContext reactContext) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List createNativeModules(
+ ReactApplicationContext reactContext) {
+ List modules = new ArrayList<>();
+
+ modules.add(new CalendarModule(reactContext));
+
+ return modules;
+ }
+
+}
+```
+
+
+
+
+```kotlin
+package com.your-app-name // replace your-app-name with your app’s name
+
+import android.view.View
+import com.facebook.react.ReactPackage
+import com.facebook.react.bridge.NativeModule
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.uimanager.ReactShadowNode
+import com.facebook.react.uimanager.ViewManager
+
+class MyAppPackage : ReactPackage {
+
+ override fun createViewManagers(
+ reactContext: ReactApplicationContext
+ ): MutableList>> = mutableListOf()
+
+ override fun createNativeModules(
+ reactContext: ReactApplicationContext
+ ): MutableList = listOf(CalendarModule(reactContext)).toMutableList()
+}
+```
+
+
+
+
+This file imports the native module you created, `CalendarModule`. It then instantiates `CalendarModule` within the `createNativeModules()` function and returns it as a list of `NativeModules` to register. If you add more native modules down the line, you can also instantiate them and add them to the list returned here.
+
+> It is worth noting that this way of registering native modules eagerly initializes all native modules when the application starts, which adds to the startup time of an application. You can use [TurboReactPackage](https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/TurboReactPackage.java) as an alternative. Instead of `createNativeModules`, which return a list of instantiated native module objects, TurboReactPackage implements a `getModule(String name, ReactApplicationContext rac)` method that creates the native module object, when required. TurboReactPackage is a bit more complicated to implement at the moment. In addition to implementing a `getModule()` method, you have to implement a `getReactModuleInfoProvider()` method, which returns a list of all the native modules the package can instantiate along with a function that instantiates them, example [here](https://github.com/facebook/react-native/blob/8ac467c51b94c82d81930b4802b2978c85539925/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java#L86-L165). Again, using TurboReactPackage will allow your application to have a faster startup time, but it is currently a bit cumbersome to write. So proceed with caution if you choose to use TurboReactPackages.
+
+To register the `CalendarModule` package, you must add `MyAppPackage` to the list of packages returned in ReactNativeHost's `getPackages()` method. Open up your `MainApplication.java` or `MainApplication.kt` file, which can be found in the following path: `android/app/src/main/java/com/your-app-name/`.
+
+Locate ReactNativeHost’s `getPackages()` method and add your package to the packages list `getPackages()` returns:
+
+
+
+
+```java
+@Override
+ protected List getPackages() {
+ @SuppressWarnings("UnnecessaryLocalVariable")
+ List packages = new PackageList(this).getPackages();
+ // below MyAppPackage is added to the list of packages returned
+ packages.add(new MyAppPackage());
+ return packages;
+ }
+```
+
+
+
+
+```kotlin
+override fun getPackages(): List =
+ PackageList(this).packages.apply {
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // packages.add(new MyReactNativePackage());
+ add(MyAppPackage())
+ }
+```
+
+
+
+
+You have now successfully registered your native module for Android!
+
+### Test What You Have Built
+
+At this point, you have set up the basic scaffolding for your native module in Android. Test that out by accessing the native module and invoking its exported method in JavaScript.
+
+Find a place in your application where you would like to add a call to the native module’s `createCalendarEvent()` method. Below is an example of a component, `NewModuleButton` you can add in your app. You can invoke the native module inside `NewModuleButton`'s `onPress()` function.
+
+```tsx
+import React from 'react';
+import {NativeModules, Button} from 'react-native';
+
+const NewModuleButton = () => {
+ const onPress = () => {
+ console.log('We will invoke the native module here!');
+ };
+
+ return (
+
+ );
+};
+
+export default NewModuleButton;
+```
+
+In order to access your native module from JavaScript you need to first import `NativeModules` from React Native:
+
+```tsx
+import {NativeModules} from 'react-native';
+```
+
+You can then access the `CalendarModule` native module off of `NativeModules`.
+
+```tsx
+const {CalendarModule} = NativeModules;
+```
+
+Now that you have the CalendarModule native module available, you can invoke your native method `createCalendarEvent()`. Below it is added to the `onPress()` method in `NewModuleButton`:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEvent('testName', 'testLocation');
+};
+```
+
+The final step is to rebuild the React Native app so that you can have the latest native code (with your new native module!) available. In your command line, where the react native application is located, run the following:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+### Building as You Iterate
+
+As you work through these guides and iterate on your native module, you will need to do a native rebuild of your application to access your most recent changes from JavaScript. This is because the code that you are writing sits within the native part of your application. While React Native’s metro bundler can watch for changes in JavaScript and rebuild on the fly for you, it will not do so for native code. So if you want to test your latest native changes you need to rebuild by using the above command.
+
+### Recap✨
+
+You should now be able to invoke your `createCalendarEvent()` method on your native module in the app. In our example this occurs by pressing the `NewModuleButton`. You can confirm this by viewing the log you set up in your `createCalendarEvent()` method. You can follow [these steps](https://developer.android.com/studio/debug/am-logcat.html) to view ADB logs in your app. You should then be able to search for your `Log.d` message (in our example “Create event called with name: testName and location: testLocation”) and see your message logged each time you invoke your native module method.
+
+
+
+ Image of ADB logs in Android Studio
+
+
+At this point you have created an Android native module and invoked its native method from JavaScript in your React Native application. You can read on to learn more about things like argument types available to a native module method and how to setup callbacks and promises.
+
+## Beyond a Calendar Native Module
+
+### Better Native Module Export
+
+Importing your native module by pulling it off of `NativeModules` like above is a bit clunky.
+
+To save consumers of your native module from needing to do that each time they want to access your native module, you can create a JavaScript wrapper for the module. Create a new JavaScript file named `CalendarModule.js` with the following content:
+
+```tsx
+/**
+* This exposes the native CalendarModule module as a JS module. This has a
+* function 'createCalendarEvent' which takes the following parameters:
+
+* 1. String name: A string representing the name of the event
+* 2. String location: A string representing the location of the event
+*/
+import {NativeModules} from 'react-native';
+const {CalendarModule} = NativeModules;
+export default CalendarModule;
+```
+
+This JavaScript file also becomes a good location for you to add any JavaScript side functionality. For example, if you use a type system like TypeScript you can add type annotations for your native module here. While React Native does not yet support Native to JS type safety, all your JS code will be type safe. Doing so will also make it easier for you to switch to type-safe native modules down the line. Below is an example of adding type safety to the CalendarModule:
+
+```tsx
+/**
+ * This exposes the native CalendarModule module as a JS module. This has a
+ * function 'createCalendarEvent' which takes the following parameters:
+ *
+ * 1. String name: A string representing the name of the event
+ * 2. String location: A string representing the location of the event
+ */
+import {NativeModules} from 'react-native';
+const {CalendarModule} = NativeModules;
+interface CalendarInterface {
+ createCalendarEvent(name: string, location: string): void;
+}
+export default CalendarModule as CalendarInterface;
+```
+
+In your other JavaScript files you can access the native module and invoke its method like this:
+
+```tsx
+import CalendarModule from './CalendarModule';
+CalendarModule.createCalendarEvent('foo', 'bar');
+```
+
+> This assumes that the place you are importing `CalendarModule` is in the same hierarchy as `CalendarModule.js`. Please update the relative import as necessary.
+
+### Argument Types
+
+When a native module method is invoked in JavaScript, React Native converts the arguments from JS objects to their Java/Kotlin object analogues. So for example, if your Java Native Module method accepts a double, in JS you need to call the method with a number. React Native will handle the conversion for you. Below is a list of the argument types supported for native module methods and the JavaScript equivalents they map to.
+
+| Java | Kotlin | JavaScript |
+| ------------- | ------------- | ---------- |
+| Boolean | Boolean | ?boolean |
+| boolean | | boolean |
+| Double | Double | ?number |
+| double | | number |
+| String | String | string |
+| Callback | Callback | Function |
+| Promise | Promise | Promise |
+| ReadableMap | ReadableMap | Object |
+| ReadableArray | ReadableArray | Array |
+
+> The following types are currently supported but will not be supported in TurboModules. Please avoid using them:
+>
+> - Integer Java/Kotlin -> ?number
+> - Float Java/Kotlin -> ?number
+> - int Java -> number
+> - float Java -> number
+
+For argument types not listed above, you will need to handle the conversion yourself. For example, in Android, `Date` conversion is not supported out of the box. You can handle the conversion to the `Date` type within the native method yourself like so:
+
+
+
+
+```java
+ String dateFormat = "yyyy-MM-dd";
+ SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
+ Calendar eStartDate = Calendar.getInstance();
+ try {
+ eStartDate.setTime(sdf.parse(startDate));
+ }
+
+```
+
+
+
+
+```kotlin
+ val dateFormat = "yyyy-MM-dd"
+ val sdf = SimpleDateFormat(dateFormat, Locale.US)
+ val eStartDate = Calendar.getInstance()
+ try {
+ sdf.parse(startDate)?.let {
+ eStartDate.time = it
+ }
+ }
+```
+
+
+
+
+### Exporting Constants
+
+A native module can export constants by implementing the native method `getConstants()`, which is available in JS. Below you will implement `getConstants()` and return a Map that contains a `DEFAULT_EVENT_NAME` constant you can access in JavaScript:
+
+
+
+
+```java
+@Override
+public Map getConstants() {
+ final Map constants = new HashMap<>();
+ constants.put("DEFAULT_EVENT_NAME", "New Event");
+ return constants;
+}
+```
+
+
+
+
+```kotlin
+override fun getConstants(): MutableMap =
+ hashMapOf("DEFAULT_EVENT_NAME" to "New Event")
+```
+
+
+
+
+The constant can then be accessed by invoking `getConstants` on the native module in JS:
+
+```tsx
+const {DEFAULT_EVENT_NAME} = CalendarModule.getConstants();
+console.log(DEFAULT_EVENT_NAME);
+```
+
+Technically it is possible to access constants exported in `getConstants()` directly off the native module object. This will no longer be supported with TurboModules, so we encourage the community to switch to the above approach to avoid necessary migration down the line.
+
+> That currently constants are exported only at initialization time, so if you change getConstants values at runtime it won't affect the JavaScript environment. This will change with Turbomodules. With Turbomodules, `getConstants()` will become a regular native module method, and each invocation will hit the native side.
+
+### Callbacks
+
+Native modules also support a unique kind of argument: a callback. Callbacks are used to pass data from Java/Kotlin to JavaScript for asynchronous methods. They can also be used to asynchronously execute JavaScript from the native side.
+
+In order to create a native module method with a callback, first import the `Callback` interface, and then add a new parameter to your native module method of type `Callback`. There are a couple of nuances with callback arguments that will soon be lifted with TurboModules. First off, you can only have two callbacks in your function arguments- a successCallback and a failureCallback. In addition, the last argument to a native module method call, if it's a function, is treated as the successCallback, and the second to last argument to a native module method call, if it's a function, is treated as the failure callback.
+
+
+
+
+```java
+import com.facebook.react.bridge.Callback;
+
+@ReactMethod
+public void createCalendarEvent(String name, String location, Callback callBack) {
+}
+```
+
+
+
+
+```kotlin
+import com.facebook.react.bridge.Callback
+
+@ReactMethod fun createCalendarEvent(name: String, location: String, callback: Callback) {}
+```
+
+
+
+
+You can invoke the callback in your Java/Kotlin method, providing whatever data you want to pass to JavaScript. Please note that you can only pass serializable data from native code to JavaScript. If you need to pass back a native object you can use `WriteableMaps`, if you need to use a collection use `WritableArrays`. It is also important to highlight that the callback is not invoked immediately after the native function completes. Below the ID of an event created in an earlier call is passed to the callback.
+
+
+
+
+```java
+ @ReactMethod
+ public void createCalendarEvent(String name, String location, Callback callBack) {
+ Integer eventId = ...
+ callBack.invoke(eventId);
+ }
+```
+
+
+
+
+```kotlin
+ @ReactMethod
+ fun createCalendarEvent(name: String, location: String, callback: Callback) {
+ val eventId = ...
+ callback.invoke(eventId)
+ }
+```
+
+
+
+
+This method could then be accessed in JavaScript using:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEvent(
+ 'Party',
+ 'My House',
+ eventId => {
+ console.log(`Created a new event with id ${eventId}`);
+ },
+ );
+};
+```
+
+Another important detail to note is that a native module method can only invoke one callback, one time. This means that you can either call a success callback or a failure callback, but not both, and each callback can only be invoked at most one time. A native module can, however, store the callback and invoke it later.
+
+There are two approaches to error handling with callbacks. The first is to follow Node’s convention and treat the first argument passed to the callback as an error object.
+
+
+
+
+```java
+ @ReactMethod
+ public void createCalendarEvent(String name, String location, Callback callBack) {
+ Integer eventId = ...
+ callBack.invoke(null, eventId);
+ }
+```
+
+
+
+
+```kotlin
+ @ReactMethod
+ fun createCalendarEvent(name: String, location: String, callback: Callback) {
+ val eventId = ...
+ callback.invoke(null, eventId)
+ }
+```
+
+
+
+
+In JavaScript, you can then check the first argument to see if an error was passed through:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEvent(
+ 'testName',
+ 'testLocation',
+ (error, eventId) => {
+ if (error) {
+ console.error(`Error found! ${error}`);
+ }
+ console.log(`event id ${eventId} returned`);
+ },
+ );
+};
+```
+
+Another option is to use an onSuccess and onFailure callback:
+
+
+
+
+```java
+@ReactMethod
+public void createCalendarEvent(String name, String location, Callback myFailureCallback, Callback mySuccessCallback) {
+}
+```
+
+
+
+
+```kotlin
+@ReactMethod
+ fun createCalendarEvent(
+ name: String,
+ location: String,
+ myFailureCallback: Callback,
+ mySuccessCallback: Callback
+ ) {}
+```
+
+
+
+
+Then in JavaScript you can add a separate callback for error and success responses:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEvent(
+ 'testName',
+ 'testLocation',
+ error => {
+ console.error(`Error found! ${error}`);
+ },
+ eventId => {
+ console.log(`event id ${eventId} returned`);
+ },
+ );
+};
+```
+
+### Promises
+
+Native modules can also fulfill a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), which can simplify your JavaScript, especially when using ES2016's [async/await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) syntax. When the last parameter of a native module Java/Kotlin method is a Promise, its corresponding JS method will return a JS Promise object.
+
+Refactoring the above code to use a promise instead of callbacks looks like this:
+
+
+
+
+```java
+import com.facebook.react.bridge.Promise;
+
+@ReactMethod
+public void createCalendarEvent(String name, String location, Promise promise) {
+ try {
+ Integer eventId = ...
+ promise.resolve(eventId);
+ } catch(Exception e) {
+ promise.reject("Create Event Error", e);
+ }
+}
+```
+
+
+
+
+```kotlin
+@ReactMethod
+fun createCalendarEvent(name: String, location: String, promise: Promise) {
+ try {
+ val eventId = ...
+ promise.resolve(eventId)
+ } catch (e: Throwable) {
+ promise.reject("Create Event Error", e)
+ }
+}
+```
+
+
+
+
+> Similar to callbacks, a native module method can either reject or resolve a promise (but not both) and can do so at most once. This means that you can either call a success callback or a failure callback, but not both, and each callback can only be invoked at most one time. A native module can, however, store the callback and invoke it later.
+
+The JavaScript counterpart of this method returns a Promise. This means you can use the `await` keyword within an async function to call it and wait for its result:
+
+```tsx
+const onSubmit = async () => {
+ try {
+ const eventId = await CalendarModule.createCalendarEvent(
+ 'Party',
+ 'My House',
+ );
+ console.log(`Created a new event with id ${eventId}`);
+ } catch (e) {
+ console.error(e);
+ }
+};
+```
+
+The reject method takes different combinations of the following arguments:
+
+
+
+
+```java
+String code, String message, WritableMap userInfo, Throwable throwable
+```
+
+
+
+
+```kotlin
+code: String, message: String, userInfo: WritableMap, throwable: Throwable
+```
+
+
+
+
+For more detail, you can find the `Promise.java` interface [here](https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Promise.java). If `userInfo` is not provided, ReactNative will set it to null. For the rest of the parameters React Native will use a default value. The `message` argument provides the error `message` shown at the top of an error call stack. Below is an example of the error message shown in JavaScript from the following reject call in Java/Kotlin.
+
+Java/Kotlin reject call:
+
+
+
+
+```java
+promise.reject("Create Event error", "Error parsing date", e);
+```
+
+
+
+
+```kotlin
+promise.reject("Create Event error", "Error parsing date", e)
+```
+
+
+
+
+Error message in React Native App when promise is rejected:
+
+
+
+ Image of error message
+
+
+### Sending Events to JavaScript
+
+Native modules can signal events to JavaScript without being invoked directly. For example, you might want to signal to JavaScript a reminder that a calendar event from the native Android calendar app will occur soon. The easiest way to do this is to use the `RCTDeviceEventEmitter` which can be obtained from the `ReactContext` as in the code snippet below.
+
+
+
+
+```java
+...
+import com.facebook.react.modules.core.DeviceEventManagerModule;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.bridge.Arguments;
+...
+private void sendEvent(ReactContext reactContext,
+ String eventName,
+ @Nullable WritableMap params) {
+ reactContext
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
+ .emit(eventName, params);
+}
+
+private int listenerCount = 0;
+
+@ReactMethod
+public void addListener(String eventName) {
+ if (listenerCount == 0) {
+ // Set up any upstream listeners or background tasks as necessary
+ }
+
+ listenerCount += 1;
+}
+
+@ReactMethod
+public void removeListeners(Integer count) {
+ listenerCount -= count;
+ if (listenerCount == 0) {
+ // Remove upstream listeners, stop unnecessary background tasks
+ }
+}
+...
+WritableMap params = Arguments.createMap();
+params.putString("eventProperty", "someValue");
+...
+sendEvent(reactContext, "EventReminder", params);
+```
+
+
+
+
+```kotlin
+...
+import com.facebook.react.bridge.WritableMap
+import com.facebook.react.bridge.Arguments
+import com.facebook.react.modules.core.DeviceEventManagerModule
+...
+
+private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {
+ reactContext
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
+ .emit(eventName, params)
+}
+
+private var listenerCount = 0
+
+@ReactMethod
+fun addListener(eventName: String) {
+ if (listenerCount == 0) {
+ // Set up any upstream listeners or background tasks as necessary
+ }
+
+ listenerCount += 1
+}
+
+@ReactMethod
+fun removeListeners(count: Int) {
+ listenerCount -= count
+ if (listenerCount == 0) {
+ // Remove upstream listeners, stop unnecessary background tasks
+ }
+}
+...
+val params = Arguments.createMap().apply {
+ putString("eventProperty", "someValue")
+}
+...
+sendEvent(reactContext, "EventReminder", params)
+```
+
+
+
+
+JavaScript modules can then register to receive events by `addListener` on the [NativeEventEmitter](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/EventEmitter/NativeEventEmitter.js) class.
+
+```tsx
+import {NativeEventEmitter, NativeModules} from 'react-native';
+...
+useEffect(() => {
+ const eventEmitter = new NativeEventEmitter(NativeModules.ToastExample);
+ let eventListener = eventEmitter.addListener('EventReminder', event => {
+ console.log(event.eventProperty) // "someValue"
+ });
+
+ // Removes the listener once unmounted
+ return () => {
+ eventListener.remove();
+ };
+ }, []);
+```
+
+### Getting Activity Result from startActivityForResult
+
+You'll need to listen to `onActivityResult` if you want to get results from an activity you started with `startActivityForResult`. To do this, you must extend `BaseActivityEventListener` or implement `ActivityEventListener`. The former is preferred as it is more resilient to API changes. Then, you need to register the listener in the module's constructor like so:
+
+
+
+
+```java
+reactContext.addActivityEventListener(mActivityResultListener);
+```
+
+
+
+
+```kotlin
+reactContext.addActivityEventListener(mActivityResultListener);
+```
+
+
+
+
+Now you can listen to `onActivityResult` by implementing the following method:
+
+
+
+
+```java
+@Override
+public void onActivityResult(
+ final Activity activity,
+ final int requestCode,
+ final int resultCode,
+ final Intent intent) {
+ // Your logic here
+}
+```
+
+
+
+
+```kotlin
+override fun onActivityResult(
+ activity: Activity?,
+ requestCode: Int,
+ resultCode: Int,
+ intent: Intent?
+) {
+ // Your logic here
+}
+```
+
+
+
+
+Let's implement a basic image picker to demonstrate this. The image picker will expose the method `pickImage` to JavaScript, which will return the path of the image when called.
+
+
+
+
+```kotlin
+public class ImagePickerModule extends ReactContextBaseJavaModule {
+
+ private static final int IMAGE_PICKER_REQUEST = 1;
+ private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
+ private static final String E_PICKER_CANCELLED = "E_PICKER_CANCELLED";
+ private static final String E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER";
+ private static final String E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND";
+
+ private Promise mPickerPromise;
+
+ private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
+
+ @Override
+ public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
+ if (requestCode == IMAGE_PICKER_REQUEST) {
+ if (mPickerPromise != null) {
+ if (resultCode == Activity.RESULT_CANCELED) {
+ mPickerPromise.reject(E_PICKER_CANCELLED, "Image picker was cancelled");
+ } else if (resultCode == Activity.RESULT_OK) {
+ Uri uri = intent.getData();
+
+ if (uri == null) {
+ mPickerPromise.reject(E_NO_IMAGE_DATA_FOUND, "No image data found");
+ } else {
+ mPickerPromise.resolve(uri.toString());
+ }
+ }
+
+ mPickerPromise = null;
+ }
+ }
+ }
+ };
+
+ ImagePickerModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+
+ // Add the listener for `onActivityResult`
+ reactContext.addActivityEventListener(mActivityEventListener);
+ }
+
+ @Override
+ public String getName() {
+ return "ImagePickerModule";
+ }
+
+ @ReactMethod
+ public void pickImage(final Promise promise) {
+ Activity currentActivity = getCurrentActivity();
+
+ if (currentActivity == null) {
+ promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist");
+ return;
+ }
+
+ // Store the promise to resolve/reject when picker returns data
+ mPickerPromise = promise;
+
+ try {
+ final Intent galleryIntent = new Intent(Intent.ACTION_PICK);
+
+ galleryIntent.setType("image/*");
+
+ final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image");
+
+ currentActivity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST);
+ } catch (Exception e) {
+ mPickerPromise.reject(E_FAILED_TO_SHOW_PICKER, e);
+ mPickerPromise = null;
+ }
+ }
+}
+```
+
+
+
+
+```kotlin
+class ImagePickerModule(reactContext: ReactApplicationContext) :
+ ReactContextBaseJavaModule(reactContext) {
+
+ private var pickerPromise: Promise? = null
+
+ private val activityEventListener =
+ object : BaseActivityEventListener() {
+ override fun onActivityResult(
+ activity: Activity?,
+ requestCode: Int,
+ resultCode: Int,
+ intent: Intent?
+ ) {
+ if (requestCode == IMAGE_PICKER_REQUEST) {
+ pickerPromise?.let { promise ->
+ when (resultCode) {
+ Activity.RESULT_CANCELED ->
+ promise.reject(E_PICKER_CANCELLED, "Image picker was cancelled")
+ Activity.RESULT_OK -> {
+ val uri = intent?.data
+
+ uri?.let { promise.resolve(uri.toString())}
+ ?: promise.reject(E_NO_IMAGE_DATA_FOUND, "No image data found")
+ }
+ }
+
+ pickerPromise = null
+ }
+ }
+ }
+ }
+
+ init {
+ reactContext.addActivityEventListener(activityEventListener)
+ }
+
+ override fun getName() = "ImagePickerModule"
+
+ @ReactMethod
+ fun pickImage(promise: Promise) {
+ val activity = currentActivity
+
+ if (activity == null) {
+ promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist")
+ return
+ }
+
+ pickerPromise = promise
+
+ try {
+ val galleryIntent = Intent(Intent.ACTION_PICK).apply { type = "image\/*" }
+
+ val chooserIntent = Intent.createChooser(galleryIntent, "Pick an image")
+
+ activity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST)
+ } catch (t: Throwable) {
+ pickerPromise?.reject(E_FAILED_TO_SHOW_PICKER, t)
+ pickerPromise = null
+ }
+ }
+
+ companion object {
+ const val IMAGE_PICKER_REQUEST = 1
+ const val E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST"
+ const val E_PICKER_CANCELLED = "E_PICKER_CANCELLED"
+ const val E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER"
+ const val E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND"
+ }
+}
+```
+
+
+
+
+### Listening to Lifecycle Events
+
+Listening to the activity's LifeCycle events such as `onResume`, `onPause` etc. is very similar to how `ActivityEventListener` was implemented. The module must implement `LifecycleEventListener`. Then, you need to register a listener in the module's constructor like so:
+
+
+
+
+```java
+reactContext.addLifecycleEventListener(this);
+```
+
+
+
+
+```kotlin
+reactContext.addLifecycleEventListener(this)
+```
+
+
+
+
+Now you can listen to the activity's LifeCycle events by implementing the following methods:
+
+
+
+
+```java
+@Override
+public void onHostResume() {
+ // Activity `onResume`
+}
+@Override
+public void onHostPause() {
+ // Activity `onPause`
+}
+@Override
+public void onHostDestroy() {
+ // Activity `onDestroy`
+}
+```
+
+
+
+
+```kotlin
+override fun onHostResume() {
+ // Activity `onResume`
+}
+
+override fun onHostPause() {
+ // Activity `onPause`
+}
+
+override fun onHostDestroy() {
+ // Activity `onDestroy`
+}
+```
+
+
+
+
+### Threading
+
+To date, on Android, all native module async methods execute on one thread. Native modules should not have any assumptions about what thread they are being called on, as the current assignment is subject to change in the future. If a blocking call is required, the heavy work should be dispatched to an internally managed worker thread, and any callbacks distributed from there.
diff --git a/website/versioned_docs/version-0.73.0/native-modules-intro.md b/website/versioned_docs/version-0.73.0/native-modules-intro.md
new file mode 100644
index 00000000000..35162726dfa
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-modules-intro.md
@@ -0,0 +1,29 @@
+---
+id: native-modules-intro
+title: Native Modules Intro
+---
+
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+
+
+
+Sometimes a React Native app needs to access a native platform API that is not available by default in JavaScript, for example the native APIs to access Apple or Google Pay. Maybe you want to reuse some existing Objective-C, Swift, Java or C++ libraries without having to reimplement it in JavaScript, or write some high performance, multi-threaded code for things like image processing.
+
+The NativeModule system exposes instances of Java/Objective-C/C++ (native) classes to JavaScript (JS) as JS objects, thereby allowing you to execute arbitrary native code from within JS. While we don't expect this feature to be part of the usual development process, it is essential that it exists. If React Native doesn't export a native API that your JS app needs you should be able to export it yourself!
+
+## Native Module Setup
+
+There are two ways to write a native module for your React Native application:
+
+1. Directly within your React Native application’s iOS/Android projects
+2. As a NPM package that can be installed as a dependency by your/other React Native applications
+
+This guide will first walk you through implementing a native module directly within a React Native application. However the native module you build in the following guide can be distributed as an NPM package. Check out the [Setting Up a Native Module as a NPM Package](native-modules-setup) guide if you are interested in doing so.
+
+## Getting Started
+
+In the following sections we will walk you through guides on how to build a native module directly within a React Native application. As a prerequisite, you will need a React Native application to work within. You can follow the steps [here](getting-started) to setup a React Native application if you do not already have one.
+
+Imagine that you want to access the iOS/Android native calendar APIs from JavaScript within a React Native application in order to create calendar events. React Native does not expose a JavaScript API to communicate with the native calendar libraries. However, through native modules, you can write native code that communicates with native calendar APIs. Then you can invoke that native code through JavaScript in your React Native application.
+
+In the following sections you will create such a Calendar native module for both [Android](native-modules-android) and [iOS](native-modules-ios).
diff --git a/website/versioned_docs/version-0.73.0/native-modules-ios.md b/website/versioned_docs/version-0.73.0/native-modules-ios.md
new file mode 100644
index 00000000000..b20d7aa33db
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-modules-ios.md
@@ -0,0 +1,618 @@
+---
+id: native-modules-ios
+title: iOS Native Modules
+---
+
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+Welcome to Native Modules for iOS. Please start by reading the [Native Modules Intro](native-modules-intro) for an intro to what native modules are.
+
+## Create a Calendar Native Module
+
+In the following guide you will create a native module, `CalendarModule`, that will allow you to access Apple's calendar APIs from JavaScript. By the end you will be able to call `CalendarModule.createCalendarEvent('Dinner Party', 'My House');` from JavaScript, invoking a native method that creates a calendar event.
+
+### Setup
+
+To get started, open up the iOS project within your React Native application in Xcode. You can find your iOS project here within a React Native app:
+
+
+
+ Image of where you can find your iOS project
+
+
+We recommend using Xcode to write your native code. Xcode is built for iOS development, and using it will help you to quickly resolve smaller errors like code syntax.
+
+### Create Custom Native Module Files
+
+The first step is to create our main custom native module header and implementation files. Create a new file called `RCTCalendarModule.h`
+
+
+
+ Image of creating a custom native module file within the same folder as AppDelegate
+
+
+and add the following to it:
+
+```objectivec
+// RCTCalendarModule.h
+#import
+@interface RCTCalendarModule : NSObject
+@end
+
+```
+
+You can use any name that fits the native module you are building. Name the class `RCTCalendarModule` since you are creating a calendar native module. Since ObjC does not have language-level support for namespaces like Java or C++, convention is to prepend the class name with a substring. This could be an abbreviation of your application name or your infra name. RCT, in this example, refers to React.
+
+As you can see below, the CalendarModule class implements the `RCTBridgeModule` protocol. A native module is an Objective-C class that implements the `RCTBridgeModule` protocol.
+
+Next up, let’s start implementing the native module. Create the corresponding implementation file, `RCTCalendarModule.m`, in the same folder and include the following content:
+
+```objectivec
+// RCTCalendarModule.m
+#import "RCTCalendarModule.h"
+
+@implementation RCTCalendarModule
+
+// To export a module named RCTCalendarModule
+RCT_EXPORT_MODULE();
+
+@end
+
+```
+
+### Module Name
+
+For now, your `RCTCalendarModule.m` native module only includes a `RCT_EXPORT_MODULE` macro, which exports and registers the native module class with React Native. The `RCT_EXPORT_MODULE` macro also takes an optional argument that specifies the name that the module will be accessible as in your JavaScript code.
+
+This argument is not a string literal. In the example below `RCT_EXPORT_MODULE(CalendarModuleFoo)` is passed, not `RCT_EXPORT_MODULE("CalendarModuleFoo")`.
+
+```objectivec
+// To export a module named CalendarModuleFoo
+RCT_EXPORT_MODULE(CalendarModuleFoo);
+```
+
+The native module can then be accessed in JS like this:
+
+```tsx
+const {CalendarModuleFoo} = ReactNative.NativeModules;
+```
+
+If you do not specify a name, the JavaScript module name will match the Objective-C class name, with any "RCT" or "RK" prefixes removed.
+
+Let's follow the example below and call `RCT_EXPORT_MODULE` without any arguments. As a result, the module will be exposed to React Native using the name `CalendarModule`, since that is the Objective-C class name, with RCT removed.
+
+```objectivec
+// Without passing in a name this will export the native module name as the Objective-C class name with “RCT” removed
+RCT_EXPORT_MODULE();
+```
+
+The native module can then be accessed in JS like this:
+
+```tsx
+const {CalendarModule} = ReactNative.NativeModules;
+```
+
+### Export a Native Method to JavaScript
+
+React Native will not expose any methods in a native module to JavaScript unless explicitly told to. This can be done using the `RCT_EXPORT_METHOD` macro. Methods written in the `RCT_EXPORT_METHOD` macro are asynchronous and the return type is therefore always void. In order to pass a result from a `RCT_EXPORT_METHOD` method to JavaScript you can use callbacks or emit events (covered below). Let’s go ahead and set up a native method for our `CalendarModule` native module using the `RCT_EXPORT_METHOD` macro. Call it `createCalendarEvent()` and for now have it take in name and location arguments as strings. Argument type options will be covered shortly.
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)name location:(NSString *)location)
+{
+}
+```
+
+> Please note that the `RCT_EXPORT_METHOD` macro will not be necessary with TurboModules unless your method relies on RCT argument conversion (see argument types below). Ultimately, React Native will remove `RCT_EXPORT_MACRO,` so we discourage people from using `RCTConvert`. Instead, you can do the argument conversion within the method body.
+
+Before you build out the `createCalendarEvent()` method’s functionality, add a console log in the method so you can confirm it has been invoked from JavaScript in your React Native application. Use the `RCTLog` APIs from React. Let’s import that header at the top of your file and then add the log call.
+
+```objectivec
+#import
+RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)name location:(NSString *)location)
+{
+ RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);
+}
+```
+
+### Synchronous Methods
+
+You can use the `RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD` to create a synchronous native method.
+
+```objectivec
+RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getName)
+{
+return [[UIDevice currentDevice] name];
+}
+```
+
+The return type of this method must be of object type (id) and should be serializable to JSON. This means that the hook can only return nil or JSON values (e.g. NSNumber, NSString, NSArray, NSDictionary).
+
+At the moment, we do not recommend using synchronous methods, since calling methods synchronously can have strong performance penalties and introduce threading-related bugs to your native modules. Additionally, please note that if you choose to use `RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD`, your app can no longer use the Google Chrome debugger. This is because synchronous methods require the JS VM to share memory with the app. For the Google Chrome debugger, React Native runs inside the JS VM in Google Chrome, and communicates asynchronously with the mobile devices via WebSockets.
+
+### Test What You Have Built
+
+At this point you have set up the basic scaffolding for your native module in iOS. Test that out by accessing the native module and invoking it’s exported method in JavaScript.
+
+Find a place in your application where you would like to add a call to the native module’s `createCalendarEvent()` method. Below is an example of a component, `NewModuleButton` you can add in your app. You can invoke the native module inside `NewModuleButton`'s `onPress()` function.
+
+```tsx
+import React from 'react';
+import {NativeModules, Button} from 'react-native';
+
+const NewModuleButton = () => {
+ const onPress = () => {
+ console.log('We will invoke the native module here!');
+ };
+
+ return (
+
+ );
+};
+
+export default NewModuleButton;
+```
+
+In order to access your native module from JavaScript you need to first import `NativeModules` from React Native:
+
+```tsx
+import {NativeModules} from 'react-native';
+```
+
+You can then access the `CalendarModule` native module off of `NativeModules`.
+
+```tsx
+const {CalendarModule} = NativeModules;
+```
+
+Now that you have the CalendarModule native module available, you can invoke your native method `createCalendarEvent()`. Below it is added to the `onPress()` method in `NewModuleButton`:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEvent('testName', 'testLocation');
+};
+```
+
+The final step is to rebuild the React Native app so that you can have the latest native code (with your new native module!) available. In your command line, where the react native application is located, run the following :
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+### Building as You Iterate
+
+As you work through these guides and iterate on your native module, you will need to do a native rebuild of your application to access your most recent changes from JavaScript. This is because the code that you are writing sits within the native part of your application. While React Native’s metro bundler can watch for changes in JavaScript and rebuild JS bundle on the fly for you, it will not do so for native code. So if you want to test your latest native changes you need to rebuild by using the above command.
+
+### Recap✨
+
+You should now be able to invoke your `createCalendarEvent()` method on your native module in JavaScript. Since you are using `RCTLog` in the function, you can confirm your native method is being invoked by [enabling debug mode in your app](https://reactnative.dev/docs/debugging#chrome-developer-tools) and looking at the JS console in Chrome or the mobile app debugger Flipper. You should see your `RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);` message each time you invoke the native module method.
+
+
+
+ Image of iOS logs in Flipper
+
+
+At this point you have created an iOS native module and invoked a method on it from JavaScript in your React Native application. You can read on to learn more about things like what argument types your native module method takes and how to setup callbacks and promises within your native module.
+
+## Beyond a Calendar Native Module
+
+### Better Native Module Export
+
+Importing your native module by pulling it off of `NativeModules` like above is a bit clunky.
+
+To save consumers of your native module from needing to do that each time they want to access your native module, you can create a JavaScript wrapper for the module. Create a new JavaScript file named NativeCalendarModule.js with the following content:
+
+```tsx
+/**
+* This exposes the native CalendarModule module as a JS module. This has a
+* function 'createCalendarEvent' which takes the following parameters:
+
+* 1. String name: A string representing the name of the event
+* 2. String location: A string representing the location of the event
+*/
+import {NativeModules} from 'react-native';
+const {CalendarModule} = NativeModules;
+export default CalendarModule;
+```
+
+This JavaScript file also becomes a good location for you to add any JavaScript side functionality. For example, if you use a type system like TypeScript you can add type annotations for your native module here. While React Native does not yet support Native to JS type safety, with these type annotations, all your JS code will be type safe. These annotations will also make it easier for you to switch to type-safe native modules down the line. Below is an example of adding type safety to the Calendar Module:
+
+```tsx
+/**
+ * This exposes the native CalendarModule module as a JS module. This has a
+ * function 'createCalendarEvent' which takes the following parameters:
+ *
+ * 1. String name: A string representing the name of the event
+ * 2. String location: A string representing the location of the event
+ */
+import {NativeModules} from 'react-native';
+const {CalendarModule} = NativeModules;
+interface CalendarInterface {
+ createCalendarEvent(name: string, location: string): void;
+}
+export default CalendarModule as CalendarInterface;
+```
+
+In your other JavaScript files you can access the native module and invoke its method like this:
+
+```tsx
+import NativeCalendarModule from './NativeCalendarModule';
+NativeCalendarModule.createCalendarEvent('foo', 'bar');
+```
+
+> Note this assumes that the place you are importing `CalendarModule` is in the same hierarchy as `CalendarModule.js`. Please update the relative import as necessary.
+
+### Argument Types
+
+When a native module method is invoked in JavaScript, React Native converts the arguments from JS objects to their Objective-C/Swift object analogues. So for example, if your Objective-C Native Module method accepts a NSNumber, in JS you need to call the method with a number. React Native will handle the conversion for you. Below is a list of the argument types supported for native module methods and the JavaScript equivalents they map to.
+
+| Objective-C | JavaScript |
+| --------------------------------------------- | ------------------ |
+| NSString | string, ?string |
+| BOOL | boolean |
+| double | number |
+| NSNumber | ?number |
+| NSArray | Array, ?Array |
+| NSDictionary | Object, ?Object |
+| RCTResponseSenderBlock | Function (success) |
+| RCTResponseSenderBlock, RCTResponseErrorBlock | Function (failure) |
+| RCTPromiseResolveBlock, RCTPromiseRejectBlock | Promise |
+
+> The following types are currently supported but will not be supported in TurboModules. Please avoid using them.
+>
+> - Function (failure) -> RCTResponseErrorBlock
+> - Number -> NSInteger
+> - Number -> CGFloat
+> - Number -> float
+
+For iOS, you can also write native module methods with any argument type that is supported by the `RCTConvert` class (see [RCTConvert](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTConvert.h) for details about what is supported). The RCTConvert helper functions all accept a JSON value as input and map it to a native Objective-C type or class.
+
+### Exporting Constants
+
+A native module can export constants by overriding the native method `constantsToExport()`. Below `constantsToExport()` is overriden, and returns a Dictionary that contains a default event name property you can access in JavaScript like so:
+
+```objectivec
+- (NSDictionary *)constantsToExport
+{
+ return @{ @"DEFAULT_EVENT_NAME": @"New Event" };
+}
+```
+
+The constant can then be accessed by invoking `getConstants()` on the native module in JS like so:
+
+```tsx
+const {DEFAULT_EVENT_NAME} = CalendarModule.getConstants();
+console.log(DEFAULT_EVENT_NAME);
+```
+
+Technically, it is possible to access constants exported in `constantsToExport()` directly off the `NativeModule` object. This will no longer be supported with TurboModules, so we encourage the community to switch to the above approach to avoid necessary migration down the line.
+
+> Note that the constants are exported only at initialization time, so if you change `constantsToExport()` values at runtime it won't affect the JavaScript environment.
+
+For iOS, if you override `constantsToExport()` then you should also implement `+ requiresMainQueueSetup` to let React Native know if your module needs to be initialized on the main thread, before any JavaScript code executes. Otherwise you will see a warning that in the future your module may be initialized on a background thread unless you explicitly opt out with `+ requiresMainQueueSetup:`. If your module does not require access to UIKit, then you should respond to `+ requiresMainQueueSetup` with NO.
+
+### Callbacks
+
+Native modules also support a unique kind of argument - a callback. Callbacks are used to pass data from Objective-C to JavaScript for asynchronous methods. They can also be used to asynchronously execute JS from the native side.
+
+For iOS, callbacks are implemented using the type `RCTResponseSenderBlock`. Below the callback parameter `myCallBack` is added to the `createCalendarEventMethod()`:
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)title
+ location:(NSString *)location
+ myCallback:(RCTResponseSenderBlock)callback)
+
+```
+
+You can then invoke the callback in your native function, providing whatever result you want to pass to JavaScript in an array. Note that `RCTResponseSenderBlock` accepts only one argument - an array of parameters to pass to the JavaScript callback. Below you will pass back the ID of an event created in an earlier call.
+
+> It is important to highlight that the callback is not invoked immediately after the native function completes—remember the communication is asynchronous.
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)title location:(NSString *)location callback: (RCTResponseSenderBlock)callback)
+{
+ NSInteger eventId = ...
+ callback(@[@(eventId)]);
+
+ RCTLogInfo(@"Pretending to create an event %@ at %@", title, location);
+}
+
+```
+
+This method could then be accessed in JavaScript using the following:
+
+```tsx
+const onSubmit = () => {
+ CalendarModule.createCalendarEvent(
+ 'Party',
+ '04-12-2020',
+ eventId => {
+ console.log(`Created a new event with id ${eventId}`);
+ },
+ );
+};
+```
+
+A native module is supposed to invoke its callback only once. It can, however, store the callback and invoke it later. This pattern is often used to wrap iOS APIs that require delegates— see [`RCTAlertManager`](https://github.com/facebook/react-native/blob/main/packages/react-native/React/CoreModules/RCTAlertManager.mm) for an example. If the callback is never invoked, some memory is leaked.
+
+There are two approaches to error handling with callbacks. The first is to follow Node’s convention and treat the first argument passed to the callback array as an error object.
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEventCallback:(NSString *)title location:(NSString *)location callback: (RCTResponseSenderBlock)callback)
+{
+ NSNumber *eventId = [NSNumber numberWithInt:123];
+ callback(@[[NSNull null], eventId]);
+}
+```
+
+In JavaScript, you can then check the first argument to see if an error was passed through:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEventCallback(
+ 'testName',
+ 'testLocation',
+ (error, eventId) => {
+ if (error) {
+ console.error(`Error found! ${error}`);
+ }
+ console.log(`event id ${eventId} returned`);
+ },
+ );
+};
+```
+
+Another option is to use two separate callbacks: onFailure and onSuccess.
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEventCallback:(NSString *)title
+ location:(NSString *)location
+ errorCallback: (RCTResponseSenderBlock)errorCallback
+ successCallback: (RCTResponseSenderBlock)successCallback)
+{
+ @try {
+ NSNumber *eventId = [NSNumber numberWithInt:123];
+ successCallback(@[eventId]);
+ }
+
+ @catch ( NSException *e ) {
+ errorCallback(@[e]);
+ }
+}
+```
+
+Then in JavaScript you can add a separate callback for error and success responses:
+
+```tsx
+const onPress = () => {
+ CalendarModule.createCalendarEventCallback(
+ 'testName',
+ 'testLocation',
+ error => {
+ console.error(`Error found! ${error}`);
+ },
+ eventId => {
+ console.log(`event id ${eventId} returned`);
+ },
+ );
+};
+```
+
+If you want to pass error-like objects to JavaScript, use `RCTMakeError` from [`RCTUtils.h.`](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTUtils.h) Right now this only passes an Error-shaped dictionary to JavaScript, but React Native aims to automatically generate real JavaScript Error objects in the future. You can also provide a `RCTResponseErrorBlock` argument, which is used for error callbacks and accepts an `NSError \* object`. Please note that this argument type will not be supported with TurboModules.
+
+### Promises
+
+Native modules can also fulfill a promise, which can simplify your JavaScript, especially when using ES2016's `async/await` syntax. When the last parameter of a native module method is a `RCTPromiseResolveBlock` and `RCTPromiseRejectBlock`, its corresponding JS method will return a JS Promise object.
+
+Refactoring the above code to use a promise instead of callbacks looks like this:
+
+```objectivec
+RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)title
+ location:(NSString *)location
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject)
+{
+ NSInteger eventId = createCalendarEvent();
+ if (eventId) {
+ resolve(@(eventId));
+ } else {
+ reject(@"event_failure", @"no event id returned", nil);
+ }
+}
+
+```
+
+The JavaScript counterpart of this method returns a Promise. This means you can use the `await` keyword within an async function to call it and wait for its result:
+
+```tsx
+const onSubmit = async () => {
+ try {
+ const eventId = await CalendarModule.createCalendarEvent(
+ 'Party',
+ 'my house',
+ );
+ console.log(`Created a new event with id ${eventId}`);
+ } catch (e) {
+ console.error(e);
+ }
+};
+```
+
+### Sending Events to JavaScript
+
+Native modules can signal events to JavaScript without being invoked directly. For example, you might want to signal to JavaScript a reminder that a calendar event from the native iOS calendar app will occur soon. The preferred way to do this is to subclass `RCTEventEmitter`, implement `supportedEvents` and call self `sendEventWithName`:
+
+Update your header class to import `RCTEventEmitter` and subclass `RCTEventEmitter`:
+
+```objectivec
+// CalendarModule.h
+
+#import
+#import
+
+@interface CalendarModule : RCTEventEmitter
+@end
+
+```
+
+JavaScript code can subscribe to these events by creating a new `NativeEventEmitter` instance around your module.
+
+You will receive a warning if you expend resources unnecessarily by emitting an event while there are no listeners. To avoid this, and to optimize your module's workload (e.g. by unsubscribing from upstream notifications or pausing background tasks), you can override `startObserving` and `stopObserving` in your `RCTEventEmitter` subclass.
+
+```objectivec
+@implementation CalendarManager
+{
+ bool hasListeners;
+}
+
+// Will be called when this module's first listener is added.
+-(void)startObserving {
+ hasListeners = YES;
+ // Set up any upstream listeners or background tasks as necessary
+}
+
+// Will be called when this module's last listener is removed, or on dealloc.
+-(void)stopObserving {
+ hasListeners = NO;
+ // Remove upstream listeners, stop unnecessary background tasks
+}
+
+- (void)calendarEventReminderReceived:(NSNotification *)notification
+{
+ NSString *eventName = notification.userInfo[@"name"];
+ if (hasListeners) {// Only send events if anyone is listening
+ [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];
+ }
+}
+
+```
+
+### Threading
+
+Unless the native module provides its own method queue, it shouldn't make any assumptions about what thread it's being called on. Currently, if a native module doesn't provide a method queue, React Native will create a separate GCD queue for it and invoke its methods there. Please note that this is an implementation detail and might change. If you want to explicitly provide a method queue for a native module, override the `(dispatch_queue_t) methodQueue` method in the native module. For example, if it needs to use a main-thread-only iOS API, it should specify this via:
+
+```objectivec
+- (dispatch_queue_t)methodQueue
+{
+ return dispatch_get_main_queue();
+}
+```
+
+Similarly, if an operation may take a long time to complete, the native module can specify its own queue to run operations on. Again, currently React Native will provide a separate method queue for your native module, but this is an implementation detail you should not rely on. If you don't provide your own method queue, in the future, your native module's long running operations may end up blocking async calls being executed on other unrelated native modules. The `RCTAsyncLocalStorage` module here, for example, creates its own queue so the React queue isn't blocked waiting on potentially slow disk access.
+
+```objectivec
+- (dispatch_queue_t)methodQueue
+{
+ return dispatch_queue_create("com.facebook.React.AsyncLocalStorageQueue", DISPATCH_QUEUE_SERIAL);
+}
+```
+
+The specified `methodQueue` will be shared by all of the methods in your module. If only one of your methods is long-running (or needs to be run on a different queue than the others for some reason), you can use `dispatch_async` inside the method to perform that particular method's code on another queue, without affecting the others:
+
+```objectivec
+RCT_EXPORT_METHOD(doSomethingExpensive:(NSString *)param callback:(RCTResponseSenderBlock)callback)
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ // Call long-running code on background thread
+ ...
+ // You can invoke callback from any thread/queue
+ callback(@[...]);
+ });
+}
+
+```
+
+> Sharing dispatch queues between modules
+>
+> The `methodQueue` method will be called once when the module is initialized, and then retained by React Native, so there is no need to keep a reference to the queue yourself, unless you wish to make use of it within your module. However, if you wish to share the same queue between multiple modules then you will need to ensure that you retain and return the same queue instance for each of them.
+
+### Dependency Injection
+
+React Native will create and initialize any registered native modules automatically. However, you may wish to create and initialize your own module instances to, for example, inject dependencies.
+
+You can do this by creating a class that implements the `RCTBridgeDelegate` Protocol, initializing an `RCTBridge` with the delegate as an argument and initialising a `RCTRootView` with the initialized bridge.
+
+```objectivec
+id moduleInitialiser = [[classThatImplementsRCTBridgeDelegate alloc] init];
+
+RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:moduleInitialiser launchOptions:nil];
+
+RCTRootView *rootView = [[RCTRootView alloc]
+ initWithBridge:bridge
+ moduleName:kModuleName
+ initialProperties:nil];
+```
+
+### Exporting Swift
+
+Swift doesn't have support for macros, so exposing native modules and their methods to JavaScript inside React Native requires a bit more setup. However, it works relatively the same. Let's say you have the same `CalendarModule` but as a Swift class:
+
+```swift
+// CalendarManager.swift
+
+@objc(CalendarManager)
+class CalendarManager: NSObject {
+
+ @objc(addEvent:location:date:)
+ func addEvent(_ name: String, location: String, date: NSNumber) -> Void {
+ // Date is ready to use!
+ }
+
+ @objc
+ func constantsToExport() -> [String: Any]! {
+ return ["someKey": "someValue"]
+ }
+
+}
+```
+
+> It is important to use the `@objc` modifiers to ensure the class and functions are exported properly to the Objective-C runtime.
+
+Then create a private implementation file that will register the required information with React Native:
+
+```objectivec
+// CalendarManagerBridge.m
+#import
+
+@interface RCT_EXTERN_MODULE(CalendarManager, NSObject)
+
+RCT_EXTERN_METHOD(addEvent:(NSString *)name location:(NSString *)location date:(nonnull NSNumber *)date)
+
+@end
+```
+
+For those of you new to Swift and Objective-C, whenever you [mix the two languages in an iOS project](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html), you will also need an additional bridging file, known as a bridging header, to expose the Objective-C files to Swift. Xcode will offer to create this header file for you if you add your Swift file to your app through the Xcode `File>New File` menu option. You will need to import `RCTBridgeModule.h` in this header file.
+
+```objectivec
+// CalendarManager-Bridging-Header.h
+#import
+```
+
+You can also use `RCT_EXTERN_REMAP_MODULE` and `_RCT_EXTERN_REMAP_METHOD` to alter the JavaScript name of the module or methods you are exporting. For more information see [`RCTBridgeModule`](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTBridgeModule.h).
+
+> Important when making third party modules: Static libraries with Swift are only supported in Xcode 9 and later. In order for the Xcode project to build when you use Swift in the iOS static library you include in the module, your main app project must contain Swift code and a bridging header itself. If your app project does not contain any Swift code, a workaround can be a single empty .swift file and an empty bridging header.
+
+### Reserved Method Names
+
+#### invalidate()
+
+Native modules can conform to the [RCTInvalidating](https://github.com/facebook/react-native/blob/main/packages/react-native/React/Base/RCTInvalidating.h) protocol on iOS by implementing the `invalidate()` method. This method [can be invoked](https://github.com/facebook/react-native/blob/0.62-stable/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm#L456) when the native bridge is invalidated (ie: on devmode reload). Please use this mechanism as necessary to do the required cleanup for your native module.
diff --git a/website/versioned_docs/version-0.73.0/native-modules-setup.md b/website/versioned_docs/version-0.73.0/native-modules-setup.md
new file mode 100644
index 00000000000..f68f078b961
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/native-modules-setup.md
@@ -0,0 +1,35 @@
+---
+id: native-modules-setup
+title: Native Modules NPM Package Setup
+---
+
+import NativeDeprecated from './the-new-architecture/\_markdown_native_deprecation.mdx'
+
+
+
+Native modules are usually distributed as npm packages, except that on top of the usual JavaScript they will include some native code per platform. To understand more about npm packages you may find [this guide](https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry) useful.
+
+To get set up with the basic project structure for a native module we will use the community tool called [create-react-native-library](https://github.com/callstack/react-native-builder-bob). You can go ahead further and dive deep into how that library works, but for our needs we will only execute the basic script:
+
+```shell
+npx create-react-native-library@latest react-native-awesome-module
+```
+
+Where `react-native-awesome-module` is the name you would like for the new module. After doing this you will navigate into `react-native-awesome-module` folder and bootstrap the example project by running:
+
+```shell
+yarn
+```
+
+When the bootstrap is done, you will be able to start the example app by executing one of the following commands:
+
+```shell
+# Android app
+yarn example android
+# iOS app
+yarn example ios
+```
+
+When all steps above are done, you will be able to continue with [Android Native Modules](native-modules-android) or [iOS Native Modules](native-modules-ios) guides to add in some code.
+
+> For a less opinionated setup, have a look at the third party tool [create-react-native-module](https://github.com/brodybits/create-react-native-module).
diff --git a/website/versioned_docs/version-0.73.0/navigation.md b/website/versioned_docs/version-0.73.0/navigation.md
new file mode 100644
index 00000000000..ceb52632825
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/navigation.md
@@ -0,0 +1,122 @@
+---
+id: navigation
+title: Navigating Between Screens
+---
+
+Mobile apps are rarely made up of a single screen. Managing the presentation of, and transition between, multiple screens is typically handled by what is known as a navigator.
+
+This guide covers the various navigation components available in React Native. If you are getting started with navigation, you will probably want to use [React Navigation](navigation.md#react-navigation). React Navigation provides a straightforward navigation solution, with the ability to present common stack navigation and tabbed navigation patterns on both Android and iOS.
+
+If you're integrating React Native into an app that already manages navigation natively, or looking for an alternative to React Navigation, the following library provides native navigation on both platforms: [react-native-navigation](https://github.com/wix/react-native-navigation).
+
+## React Navigation
+
+The community solution to navigation is a standalone library that allows developers to set up the screens of an app with a few lines of code.
+
+### Installation and setup
+
+First, you need to install them in your project:
+
+```shell
+npm install @react-navigation/native @react-navigation/native-stack
+```
+
+Next, install the required peer dependencies. You need to run different commands depending on whether your project is an Expo managed project or a bare React Native project.
+
+- If you have an Expo managed project, install the dependencies with `expo`:
+
+ ```shell
+ npx expo install react-native-screens react-native-safe-area-context
+ ```
+
+- If you have a bare React Native project, install the dependencies with `npm`:
+
+ ```shell
+ npm install react-native-screens react-native-safe-area-context
+ ```
+
+ For iOS with bare React Native project, make sure you have [CocoaPods](https://cocoapods.org/) installed. Then install the pods to complete the installation:
+
+ ```shell
+ cd ios
+ pod install
+ cd ..
+ ```
+
+:::note
+You might get warnings related to peer dependencies after installation. They are usually caused by incorrect version ranges specified in some packages. You can safely ignore most warnings as long as your app builds.
+:::
+
+Now, you need to wrap the whole app in `NavigationContainer`. Usually you'd do this in your entry file, such as `index.js` or `App.js`:
+
+```tsx
+import * as React from 'react';
+import {NavigationContainer} from '@react-navigation/native';
+
+const App = () => {
+ return (
+
+ {/* Rest of your app code */}
+
+ );
+};
+
+export default App;
+```
+
+Now you are ready to build and run your app on the device/simulator.
+
+### Usage
+
+Now you can create an app with a home screen and a profile screen:
+
+```tsx
+import * as React from 'react';
+import {NavigationContainer} from '@react-navigation/native';
+import {createNativeStackNavigator} from '@react-navigation/native-stack';
+
+const Stack = createNativeStackNavigator();
+
+const MyStack = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+```
+
+In this example, there are 2 screens (`Home` and `Profile`) defined using the `Stack.Screen` component. Similarly, you can define as many screens as you like.
+
+You can set options such as the screen title for each screen in the `options` prop of `Stack.Screen`.
+
+Each screen takes a `component` prop that is a React component. Those components receive a prop called `navigation` which has various methods to link to other screens. For example, you can use `navigation.navigate` to go to the `Profile` screen:
+
+```tsx
+const HomeScreen = ({navigation}) => {
+ return (
+
+ navigation.navigate('Profile', {name: 'Jane'})
+ }
+ />
+ );
+};
+const ProfileScreen = ({navigation, route}) => {
+ return This is {route.params.name}'s profile;
+};
+```
+
+This `native-stack` navigator uses the native APIs: `UINavigationController` on iOS and `Fragment` on Android so that navigation built with `createNativeStackNavigator` will behave the same and have the same performance characteristics as apps built natively on top of those APIs.
+
+React Navigation also has packages for different kind of navigators such as tabs and drawer. You can use them to implement various patterns in your app.
+
+For a complete intro to React Navigation, follow the [React Navigation Getting Started Guide](https://reactnavigation.org/docs/getting-started).
diff --git a/website/versioned_docs/version-0.73.0/network.md b/website/versioned_docs/version-0.73.0/network.md
new file mode 100644
index 00000000000..b7137fcaae7
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/network.md
@@ -0,0 +1,274 @@
+---
+id: network
+title: Networking
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Many mobile apps need to load resources from a remote URL. You may want to make a POST request to a REST API, or you may need to fetch a chunk of static content from another server.
+
+## Using Fetch
+
+React Native provides the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for your networking needs. Fetch will seem familiar if you have used `XMLHttpRequest` or other networking APIs before. You may refer to MDN's guide on [Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) for additional information.
+
+### Making requests
+
+In order to fetch content from an arbitrary URL, you can pass the URL to fetch:
+
+```tsx
+fetch('https://mywebsite.com/mydata.json');
+```
+
+Fetch also takes an optional second argument that allows you to customize the HTTP request. You may want to specify additional headers, or make a POST request:
+
+```tsx
+fetch('https://mywebsite.com/endpoint/', {
+ method: 'POST',
+ headers: {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ firstParam: 'yourValue',
+ secondParam: 'yourOtherValue',
+ }),
+});
+```
+
+Take a look at the [Fetch Request docs](https://developer.mozilla.org/en-US/docs/Web/API/Request) for a full list of properties.
+
+### Handling the response
+
+The above examples show how you can make a request. In many cases, you will want to do something with the response.
+
+Networking is an inherently asynchronous operation. Fetch method will return a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that makes it straightforward to write code that works in an asynchronous manner:
+
+```tsx
+const getMoviesFromApi = () => {
+ return fetch('https://reactnative.dev/movies.json')
+ .then(response => response.json())
+ .then(json => {
+ return json.movies;
+ })
+ .catch(error => {
+ console.error(error);
+ });
+};
+```
+
+You can also use the `async` / `await` syntax in a React Native app:
+
+```tsx
+const getMoviesFromApiAsync = async () => {
+ try {
+ const response = await fetch(
+ 'https://reactnative.dev/movies.json',
+ );
+ const json = await response.json();
+ return json.movies;
+ } catch (error) {
+ console.error(error);
+ }
+};
+```
+
+Don't forget to catch any errors that may be thrown by `fetch`, otherwise they will be dropped silently.
+
+
+
+
+```SnackPlayer name=Fetch%20Example&ext=js
+import React, {useEffect, useState} from 'react';
+import {ActivityIndicator, FlatList, Text, View} from 'react-native';
+
+const App = () => {
+ const [isLoading, setLoading] = useState(true);
+ const [data, setData] = useState([]);
+
+ const getMovies = async () => {
+ try {
+ const response = await fetch('https://reactnative.dev/movies.json');
+ const json = await response.json();
+ setData(json.movies);
+ } catch (error) {
+ console.error(error);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ useEffect(() => {
+ getMovies();
+ }, []);
+
+ return (
+
+ {isLoading ? (
+
+ ) : (
+ id}
+ renderItem={({item}) => (
+
+ {item.title}, {item.releaseYear}
+
+ )}
+ />
+ )}
+
+ );
+};
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Fetch%20Example&ext=tsx
+import React, {useEffect, useState} from 'react';
+import {ActivityIndicator, FlatList, Text, View} from 'react-native';
+
+type Movie = {
+ id: string;
+ title: string;
+ releaseYear: string;
+};
+
+const App = () => {
+ const [isLoading, setLoading] = useState(true);
+ const [data, setData] = useState([]);
+
+ const getMovies = async () => {
+ try {
+ const response = await fetch('https://reactnative.dev/movies.json');
+ const json = await response.json();
+ setData(json.movies);
+ } catch (error) {
+ console.error(error);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ useEffect(() => {
+ getMovies();
+ }, []);
+
+ return (
+
+ {isLoading ? (
+
+ ) : (
+ id}
+ renderItem={({item}) => (
+
+ {item.title}, {item.releaseYear}
+
+ )}
+ />
+ )}
+
+ );
+};
+
+export default App;
+```
+
+
+
+
+> By default, iOS 9.0 or later enforce App Transport Secruity (ATS). ATS requires any HTTP connection to use HTTPS. If you need to fetch from a cleartext URL (one that begins with `http`) you will first need to [add an ATS exception](integration-with-existing-apps.md#test-your-integration). If you know ahead of time what domains you will need access to, it is more secure to add exceptions only for those domains; if the domains are not known until runtime you can [disable ATS completely](publishing-to-app-store.md#1-enable-app-transport-security). Note however that from January 2017, [Apple's App Store review will require reasonable justification for disabling ATS](https://forums.developer.apple.com/thread/48979). See [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33) for more information.
+
+> On Android, as of API Level 28, clear text traffic is also blocked by default. This behaviour can be overridden by setting [`android:usesCleartextTraffic`](https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic) in the app manifest file.
+
+## Using Other Networking Libraries
+
+The [XMLHttpRequest API](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) is built into React Native. This means that you can use third party libraries such as [frisbee](https://github.com/niftylettuce/frisbee) or [axios](https://github.com/axios/axios) that depend on it, or you can use the XMLHttpRequest API directly if you prefer.
+
+```tsx
+const request = new XMLHttpRequest();
+request.onreadystatechange = e => {
+ if (request.readyState !== 4) {
+ return;
+ }
+
+ if (request.status === 200) {
+ console.log('success', request.responseText);
+ } else {
+ console.warn('error');
+ }
+};
+
+request.open('GET', 'https://mywebsite.com/endpoint/');
+request.send();
+```
+
+> The security model for XMLHttpRequest is different than on web as there is no concept of [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) in native apps.
+
+## WebSocket Support
+
+React Native also supports [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket), a protocol which provides full-duplex communication channels over a single TCP connection.
+
+```tsx
+const ws = new WebSocket('ws://host.com/path');
+
+ws.onopen = () => {
+ // connection opened
+ ws.send('something'); // send a message
+};
+
+ws.onmessage = e => {
+ // a message was received
+ console.log(e.data);
+};
+
+ws.onerror = e => {
+ // an error occurred
+ console.log(e.message);
+};
+
+ws.onclose = e => {
+ // connection closed
+ console.log(e.code, e.reason);
+};
+```
+
+## Known Issues with `fetch` and cookie based authentication
+
+The following options are currently not working with `fetch`
+
+- `redirect:manual`
+- `credentials:omit`
+
+* Having same name headers on Android will result in only the latest one being present. A temporary solution can be found here: https://github.com/facebook/react-native/issues/18837#issuecomment-398779994.
+* Cookie based authentication is currently unstable. You can view some of the issues raised here: https://github.com/facebook/react-native/issues/23185
+* As a minimum on iOS, when redirected through a `302`, if a `Set-Cookie` header is present, the cookie is not set properly. Since the redirect cannot be handled manually this might cause a scenario where infinite requests occur if the redirect is the result of an expired session.
+
+## Configuring NSURLSession on iOS
+
+For some applications it may be appropriate to provide a custom `NSURLSessionConfiguration` for the underlying `NSURLSession` that is used for network requests in a React Native application running on iOS. For instance, one may need to set a custom user agent string for all network requests coming from the app or supply `NSURLSession` with an ephemeral `NSURLSessionConfiguration`. The function `RCTSetCustomNSURLSessionConfigurationProvider` allows for such customization. Remember to add the following import to the file in which `RCTSetCustomNSURLSessionConfigurationProvider` will be called:
+
+```objectivec
+#import
+```
+
+`RCTSetCustomNSURLSessionConfigurationProvider` should be called early in the application life cycle such that it is readily available when needed by React, for instance:
+
+```objectivec
+-(void)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+
+ // set RCTSetCustomNSURLSessionConfigurationProvider
+ RCTSetCustomNSURLSessionConfigurationProvider(^NSURLSessionConfiguration *{
+ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
+ // configure the session
+ return configuration;
+ });
+
+ // set up React
+ _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
+}
+```
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-app-intro.md b/website/versioned_docs/version-0.73.0/new-architecture-app-intro.md
new file mode 100644
index 00000000000..e29ded77d34
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-app-intro.md
@@ -0,0 +1,125 @@
+---
+id: new-architecture-app-intro
+title: Prerequisites for Applications
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+
+
+
+There are a few prerequisites that should be addressed before the New Architecture is enabled in your application.
+
+## Update to the latest React Native version
+
+React Native released the support for the New Architecture with the release `0.68.0`.
+
+This guide is written with the expectation that you’re using the [**latest** React Native release](https://github.com/facebook/react-native/releases/latest).
+
+You can find instructions on how to upgrade in the page [upgrading to new versions](/docs/upgrading).
+
+Remember to re-install the dependencies after upgrading (run `npm install` or `yarn`).
+
+:::info
+
+Whenever you have to rename some files in the `ios` folder, please **use Xcode to rename them**. This ensure that the file references are updated in the Xcode project as well. You might need to clean the build folder (**Project** → **Clean Build Folder** or Cmd ⌘ + Shift ⇪ + K) before re-building the app. If the file is renamed outside of Xcode, you may need to click on the old `.m` file reference and Locate the new file.
+
+:::
+
+## Android - Enable the New Architecture
+
+If you successfully updated your project to the latest version of React Native, you **already meet** all the prerequisites to use the New Architecture on Android.
+
+You will only need to update your `android/gradle.properties` file as follows:
+
+```diff
+# Use this property to enable support to the new architecture.
+# This will allow you to use TurboModules and the Fabric render in
+# your application. You should enable this flag either if you want
+# to write custom TurboModules/Fabric components OR use libraries that
+# are providing them.
+-newArchEnabled=false
++newArchEnabled=true
+```
+
+## iOS - Enable the New Architecture
+
+If you successfully updated your project to the latest version of React Native, you **already meet** all the prerequisites to use the New Architecture on iOS.
+
+You will only need to reinstall your pods by running `pod install` with the right flag:
+
+```bash
+# Run pod install with the flag:
+RCT_NEW_ARCH_ENABLED=1 bundle exec pod install
+```
+
+## Running the App
+
+It’s now time to run your app to verify that everything works correctly:
+
+
+
+
+```bash
+# To run android
+yarn android
+
+# To run iOS
+yarn ios
+```
+
+
+
+
+```bash
+# To run android
+npm run android
+
+# To run iOS
+npm run ios
+```
+
+
+
+
+In your Metro terminal log, you will now see the following log to confirm that Fabric is running correctly:
+
+```
+BUNDLE ./App.tsx
+LOG Running "App" with {"fabric":true,"initialProps":{"concurrentRoot": "true"},"rootTag":1}
+```
+
+## Advanced - Pass your component in the interop layer
+
+If you followed the previous steps but your app uses some custom Native Components that have not been migrated to the New Architecture completely, you are going to see some reddish/pinkish boxes saying that the component is not compatible with Fabric. This is happening because custom Native Components written for the legacy architecture can't run as-is in the New Architecture.
+
+Starting from **React Native `0.72.0`**, we worked on a interoperability layer to let you use legacy components in the New Architecture without having to wait for them to be migrated.
+
+You can read more about the interoperability layer and how to use it [here](https://github.com/reactwg/react-native-new-architecture/discussions/135). Follow this guide to register your components and then rerun your app with the commands:
+
+
+
+
+```bash
+# To run android
+yarn android
+
+# To run iOS
+yarn ios
+```
+
+
+
+
+```bash
+# To run android
+npm run android
+
+# To run iOS
+npm run ios
+```
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-appendix.md b/website/versioned_docs/version-0.73.0/new-architecture-appendix.md
new file mode 100644
index 00000000000..76396050ae1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-appendix.md
@@ -0,0 +1,301 @@
+---
+id: new-architecture-appendix
+title: Appendix
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+import VerticalTable from '@site/core/VerticalTable';
+
+
+
+## I. Terminology
+
+The whole New Architecture related guides will stick to the following **terminology**:
+
+- **Legacy Native Components** - To refer to Components which are running on the old React Native architecture.
+- **Legacy Native Modules** - To refer to Modules which are running on the old React Native architecture.
+- **Fabric Native Components** - To refer to Components which have been adapted to work well with the New Architecture, namely the new renderer. For brevity you might find them referred as **Fabric Components**.
+- **Turbo Native Modules** - To refer to Modules which have been adapted to work well with the New Architecture, namely the new Native Module System. For brevity you might find them referred as **Turbo Modules**
+
+## II. Flow Type to Native Type Mapping
+
+You may use the following table as a reference for which types are supported and what they map to in each platform:
+
+### `string`
+
+?string],
+['Android (Java)', String],
+['iOS', NSString],
+]} />
+
+### `boolean`
+
+?boolean],
+['Android (Java)', Boolean],
+['iOS', NSNumber],
+]} />
+
+### Object literal
+
+This is recommended over using plain `Object`, for type safety.
+
+**Example:** `{| foo: string, ... |}`
+
+{`?{| foo: string, ...|}`}],
+['Android (Java)', '-'],
+['iOS', '-'],
+]} />
+
+### `Object`
+
+:::note
+Recommended to use [Object literal](#object-literal) instead.
+:::
+
+?Object],
+['Android (Java)', ReadableMap],
+['iOS', <>@{} (untyped dictionary)>],
+]} />
+
+### `Array<*>`
+
+{`?Array<*>`}],
+['Android (Java)', ReadableArray],
+['iOS', <>NSArray (or RCTConvertVecToArray when used inside objects)>],
+]} />
+
+### `Function`
+
+?Function],
+['Android (Java)', '-'],
+['iOS', '-'],
+]} />
+
+### `Promise<*>`
+
+{`?Promise<*>`}],
+['Android (Java)', com.facebook.react.bridge.Promise],
+['iOS', <>RCTPromiseResolve and RCTPromiseRejectBlock>],
+]} />
+
+### Type Unions
+
+Type unions are only supported as callbacks.
+
+**Example:** `'SUCCESS' | 'FAIL'`
+
+
+
+### Callbacks
+
+Callback functions are not type checked, and are generalized as `Object`s.
+
+**Example:** `() =>`
+
+com.facebook.react.bridge.Callback],
+['iOS', RCTResponseSenderBlock],
+]} />
+
+:::note
+You may also find it useful to refer to the JavaScript specifications for the core modules in React Native. These are located inside the `Libraries/` directory in the React Native repository.
+:::
+
+## III. TypeScript to Native Type Mapping
+
+You may use the following table as a reference for which types are supported and what they map to in each platform:
+
+### `string`
+
+{`string | null`}],
+['Android (Java)', String],
+['iOS', NSString],
+]} />
+
+### `boolean`
+
+{`boolean | null`}],
+['Android (Java)', Boolean],
+['iOS', NSNumber],
+]} />
+
+### `number`
+
+double],
+['iOS', NSNumber],
+]} />
+
+### Object literal
+
+This is recommended over using plain `Object`, for type safety.
+
+**Example:** `{| foo: string, ... |}`
+
+{`{| foo: string, ...|} | null`}],
+['Android (Java)', '-'],
+['iOS', '-'],
+]} />
+
+### `Object`
+
+:::note
+Recommended to use [Object literal](#object-literal-1) instead.
+:::
+
+{`Object | null`}],
+['Android (Java)', ReadableMap],
+['iOS', <>@{} (untyped dictionary)>],
+]} />
+
+### `Array<*>`
+
+{`Array<*> | null`}],
+['Android (Java)', ReadableArray],
+['iOS', <>NSArray (or RCTConvertVecToArray when used inside objects)>],
+]} />
+
+### `Function`
+
+?{`Function | null`}],
+['Android (Java)', '-'],
+['iOS', '-'],
+]} />
+
+### `Promise<*>`
+
+{`Promise<*> | null`}],
+['Android (Java)', com.facebook.react.bridge.Promise],
+['iOS', <>RCTPromiseResolve and RCTPromiseRejectBlock>],
+]} />
+
+### Type Unions
+
+Type unions are only supported as callbacks.
+
+**Example:** `'SUCCESS' | 'FAIL'`
+
+
+
+### Callbacks
+
+Callback functions are not type checked, and are generalized as `Object`s.
+
+**Example:** `() =>`
+
+com.facebook.react.bridge.Callback],
+['iOS', RCTResponseSenderBlock],
+]} />
+
+You may also find it useful to refer to the JavaScript specifications for the core modules in React Native. These are located inside the `Libraries/` directory in the React Native repository.
+
+## IV. Invoking the code-gen during development
+
+> This section contains information specific to v0.66 of React Native.
+
+The Codegen is typically invoked at build time, but you may find it useful to generate your native interface code on demand for troubleshooting.
+
+If you wish to invoke the codegen manually, you have two options:
+
+1. Invoking a Gradle task directly (Android).
+2. Invoking a script manually.
+
+### Android - Invoking a Gradle task directly
+
+You can trigger the Codegen by invoking the following task:
+
+```bash
+./gradlew generateCodegenArtifactsFromSchema --rerun-tasks
+```
+
+The extra `--rerun-tasks` flag is added to make sure Gradle is ignoring the `UP-TO-DATE` checks for this task. You should not need it during normal development.
+
+The `generateCodegenArtifactsFromSchema` task normally runs before the `preBuild` task, so you should not need to invoke it manually, but it will be triggered before your builds.
+
+### Invoking the script manually
+
+Alternatively, you can invoke the Codegen directly, bypassing the Gradle Plugin or CocoaPods infrastructure.
+This can be done with the following commands.
+
+The parameters to provide will look quite familiar to you now that you have already configured the Gradle plugin or CocoaPods library.
+
+#### Generating the schema file
+
+First, you’ll need to generate a schema file from your JavaScript sources. You only need to do this whenever your JavaScript specs change. The script to generate this schema is provided as part of the `react-native-codegen` package. If running this from within your React Native application, you can use the package from `node_modules` directly:
+
+```bash
+node node_modules/react-native-codegen/lib/cli/combine/combine-js-to-schema-cli.js \
+
+```
+
+> The source for the `react-native-codegen` is available in the React Native repository, under `packages/react-native-codegen`. Run `yarn install` and `yarn build` in that directory to build your own `react-native-codegen` package from source. In most cases, you will not want to do this as the guide assumes the use of the `react-native-codegen` package version that is associated with the relevant React Native nightly release.
+
+#### Generating the native code artifacts
+
+Once you have a schema file for your native modules or components, you can use a second script to generate the actual native code artifacts for your library. You can use the same schema file generated by the previous script.
+
+```bash
+node node_modules/react-native/scripts/generate-specs-cli.js \
+ --platform \
+ --schemaPath \
+ --outputDir \
+ [--libraryName library_name] \
+ [--javaPackageName java_package_name] \
+ [--libraryType all(default)|modules|components]
+```
+
+> **NOTE:** The output artifacts of the Codegen are inside the build folder and should not be committed.
+> They should be considered only for reference.
+
+##### Example
+
+The following is a basic example of invoking the Codegen script to generate native iOS interface code for a library that provides native modules. The JavaScript spec sources for this library are located in a `js/` subdirectory, and this library’s native code expects the native interfaces to be available in the `ios` subdirectory.
+
+```bash
+# Generate schema - only needs to be done whenever JS specs change
+node node_modules/react-native-codegen/lib/cli/combine/combine-js-to-schema-cli.js /tmp/schema.json ./js
+
+# Generate native code artifacts
+node node_modules/react-native/scripts/generate-specs-cli.js \
+ --platform ios \
+ --schemaPath /tmp/schema.json \
+ --outputDir ./ios \
+ --libraryName MyLibSpecs \
+ --libraryType modules
+```
+
+In the above example, the code-gen script will generate several files: `MyLibSpecs.h` and `MyLibSpecs-generated.mm`, as well as a handful of `.h` and `.cpp` files, all located in the `ios` directory.
+
+## V. Note on Existing Apps
+
+This guide provides instructions for migrating an application that is based on the default app template that is provided by React Native. If your app has deviated from the template, or you are working with an application that was never based off the template, then the following sections might help.
+
+### Finding your bridge delegate
+
+This guide assumes that the `AppDelegate` is configured as the bridge delegate. If you are not sure which is your bridge delegate, then place a breakpoint in `RCTBridge` and `RCTCxxBridge`, run your app, and inspect `self.delegate`.
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-intro.md b/website/versioned_docs/version-0.73.0/new-architecture-intro.md
new file mode 100644
index 00000000000..504df16335c
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-intro.md
@@ -0,0 +1,27 @@
+---
+id: new-architecture-intro
+title: Migrating to the New Architecture
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+
+
+
+# Getting Started with the New Architecture
+
+This migration guide is designed for React Native **library authors** and **application developers**. It outlines the steps you need to follow to roll out the new Architecture, composed of the **new NativeModule system (Turbo Module) and the new Renderer (Fabric)** to your **Android** and **iOS** libraries and apps.
+
+## Table of Contents
+
+The guide is divided into five sections:
+
+- **Supporting the New Architecture in your Library**
+ - [Prerequisites for Supporting the New Architecture in JavaScript](new-architecture-library-intro)
+ - Enabling the New Architecture in your Library
+ - [Android](new-architecture-library-android)
+ - [iOS](new-architecture-library-ios)
+- **Supporting the New Architecture in your App**
+ - [Prerequisites for Supporting the New Architecture in your App](new-architecture-app-intro)
+- [**React 18 & React Native**](react-18-and-react-native)
+- [**Troubleshooting**](new-architecture-troubleshooting)
+- [**Appendix**](new-architecture-appendix)
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-library-android.md b/website/versioned_docs/version-0.73.0/new-architecture-library-android.md
new file mode 100644
index 00000000000..c02ee40653d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-library-android.md
@@ -0,0 +1,118 @@
+---
+id: new-architecture-library-android
+title: Enabling in Android Library
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+Once you have defined the JavaScript specs for your native modules as part of the [prerequisites](new-architecture-library-intro), set up the configuration of the Codegen, and follow the Android/Gradle setup, you are now ready to migrate your library to the new architecture. Here are the steps you can follow to accomplish this.
+
+## 1. Extend or Implement the Code-generated Native Interfaces
+
+The JavaScript spec for your native module or component will be used to generate native interface code for each supported platform (i.e., Android and iOS). These native interface files will be generated **when a React Native application that depends on your library is built**.
+
+While this generated native interface code **will not ship as part of your library**, you do need to make sure your Java/Kotlin code conforms to the protocols provided by these native interface files.
+
+You can invoke the `generateCodegenArtifactsFromSchema` Gradle task to generate your library’s native interface code in order to use them **as a reference:**
+
+```bash
+./gradlew generateCodegenArtifactsFromSchema
+```
+
+The files that are output can be found inside `build/generated/source/codegen` and **should not be committed**, but you’ll need to refer to them to determine what changes you need to make to your native modules in order for them to provide an implementation for each generated interface.
+
+The output of the Codegen for a module called `NativeAwesomeManager` will look like this:
+
+```
+app/build/generated/source/codegen
+├── java
+│ └── com
+│ └── example
+│ └── samplelibrary
+│ └── NativeAwesomeManagerSpec.java
+├── jni
+│ ├── Android.mk
+│ ├── CMakeLists.txt
+│ ├── react
+│ │ └── renderer
+│ │ └── components
+│ │ └── samplelibrary
+│ │ ├── ComponentDescriptors.h
+│ │ ├── EventEmitters.cpp
+│ │ ├── EventEmitters.h
+│ │ ├── Props.cpp
+│ │ ├── Props.h
+│ │ ├── ShadowNodes.cpp
+│ │ └── ShadowNodes.h
+│ ├── samplelibrary-generated.cpp
+│ └── samplelibrary.h
+└── schema.json
+```
+
+### Extends the Abstract Class Provided by the Codegen
+
+Update your native module or component to ensure it **extends the abstract class** that has been code-generated from your JavaScript specs (i.e., the `NativeAwesomeManagerSpec.java` file from the previous example).
+
+Following the example set forth in the previous section, your library might import `NativeAwesomeManagerSpec`, implement the relevant native interface and the necessary methods for it:
+
+
+
+
+
+```java
+import androidx.annotation.NonNull;
+
+import com.example.samplelibrary.NativeAwesomeManagerSpec;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReactApplicationContext;
+
+public class NativeAwesomeManager extends NativeAwesomeManagerSpec {
+
+ public static final String NAME = "NativeAwesomeManager";
+
+ public NativeAwesomeManager(ReactApplicationContext reactContext) {
+ super(reactContext);
+ }
+
+ @Override
+ public void getString(String id, Promise promise) {
+ // Implement this method
+ }
+
+ @NonNull
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
+```
+
+
+
+
+
+```kotlin
+import com.example.samplelibrary.NativeAwesomeManagerSpec
+import com.facebook.react.bridge.Promise
+import com.facebook.react.bridge.ReactApplicationContext
+
+class NativeAwesomeManager(reactContext: ReactApplicationContext) :
+ NativeAwesomeManagerSpec(reactContext) {
+ override fun getString(id: String, promise: Promise) {
+ // Implement this method
+ }
+
+ override fun getName() = NAME
+
+ companion object {
+ val NAME = "NativeAwesomeManager"
+ }
+}
+```
+
+
+
+
+Please note that the **generated abstract class** that you’re now extending (`MyAwesomeSpec` in this example) is itself extending `ReactContextBaseJavaModule`. Therefore you should not use access to any of the method/fields you were previously using (e.g., the `ReactApplicationContext` and so on). Moreover, the generated class will now also implement the `TurboModule` interface for you.
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-library-intro.md b/website/versioned_docs/version-0.73.0/new-architecture-library-intro.md
new file mode 100644
index 00000000000..8acf14d311e
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-library-intro.md
@@ -0,0 +1,420 @@
+---
+id: new-architecture-library-intro
+title: Prerequisites for Libraries
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+
+
+
+The following steps will help ensure your modules and components are ready for the New Architecture.
+
+## Define Specs in JavaScript
+
+The JavaScript specs serve as the source of truth for the methods provided by each native module. They define all APIs provided by the native module, along with the types of those constants and functions.
+Using a **typed** spec file allows you to be intentional and declare all the input arguments and outputs of your native module’s methods.
+
+:::info
+**TypeScript** support is in beta right now.
+:::
+
+To adopt the New Architecture, you start by creating these specs for your native modules and native components. You can do this before migrating to the New Architecture: the specs will be used later on to generate native interface code for all the supported platforms as a way to enforce uniform APIs across platforms.
+
+### Turbo Native Modules
+
+JavaScript spec files **must** be named `Native.js`, and they export a `TurboModuleRegistry` `Spec` object. The name convention is important because the Codegen process looks for modules whose `js` (`jsx`, `ts`, or `tsx`) spec file starts with the keyword `Native`.
+
+The following is a basic JavaScript spec template, written using the [Flow](https://flow.org/) and [TypeScript](https://www.typescriptlang.org/) syntax.
+
+
+
+
+```js
+// @flow strict
+
+import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
+import {TurboModuleRegistry} from 'react-native';
+
+export interface Spec extends TurboModule {
+ +getConstants: () => {||};
+
+ // your module methods go here, for example:
+ getString(id: string): Promise;
+}
+
+export default (TurboModuleRegistry.get(
+ '',
+): ?Spec);
+```
+
+
+
+
+```tsx
+import {TurboModule, TurboModuleRegistry} from 'react-native';
+
+export interface Spec extends TurboModule {
+ readonly getConstants: () => {};
+
+ // your module methods go here, for example:
+ getString(id: string): Promise;
+}
+
+export default TurboModuleRegistry.get('');
+```
+
+
+
+
+### Fabric Native Components
+
+JavaScript spec files **must** be named `NativeComponent.js` (for TypeScript use extension `.ts` or `.tsx`) and they export a `HostComponent` object. The name convention is important: the Codegen process looks for components whose spec file (either JavaScript or TypeScript) ends with the suffix `NativeComponent`.
+
+The following snippet shows a basic JavaScript spec template, written in [Flow](https://flow.org/) as well as [TypeScript](https://www.typescriptlang.org/).
+
+
+
+
+```js
+// @flow strict-local
+
+import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes';
+import type {HostComponent} from 'react-native';
+import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
+
+type NativeProps = $ReadOnly<{|
+ ...ViewProps,
+ // add other props here
+|}>;
+
+export default (codegenNativeComponent(
+ '',
+): HostComponent);
+```
+
+
+
+
+```tsx
+import type {ViewProps} from 'ViewPropTypes';
+import type {HostComponent} from 'react-native';
+import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
+
+export interface NativeProps extends ViewProps {
+ // add other props here
+}
+
+export default codegenNativeComponent(
+ '',
+) as HostComponent;
+```
+
+
+
+
+### Supported Types
+
+When using Flow or TypeScript, you will be using [type annotations](https://flow.org/en/docs/types/) to define your spec. Keeping in mind that the goal of defining a JavaScript spec is to ensure the generated native interface code is type-safe, the set of supported types will be those that can be mapped one-to-one to a corresponding type on the native platform.
+
+
+
+In general, this means you can use primitive types (strings, numbers, booleans), function types, object types, and array types. Union types, on the other hand, are not supported. All types must be read-only. For Flow: either `+` or `$ReadOnly<>` or `{||}` objects. For TypeScript: `readonly` for properties, `Readonly<>` for objects, and `ReadonlyArray<>` for arrays.
+
+> See Appendix [II. Flow Type to Native Type Mapping](new-architecture-appendix#ii-flow-type-to-native-type-mapping).
+> See Appendix [III. TypeScript to Native Type Mapping](new-architecture-appendix#iii-typescript-to-native-type-mapping).
+
+### Codegen Helper Types
+
+You can use predefined types for your JavaScript spec, here is a list of them:
+
+- `Double`
+- `Float`
+- `Int32`
+- `UnsafeObject`
+- `WithDefault` - Sets default value for type
+- `BubblingEventHandler` - For events that are propagated (bubbled) up the component tree from child to parent up to the root (eg: `onStartShouldSetResponder`).
+- `DirectEventHandler` - For events that are called only on element recieving the event (eg: `onClick`) and don't bubble.
+
+Later on those types are compiled to coresponding equivalents on target platforms.
+
+### Be Consistent Across Platforms and Eliminate Type Ambiguity
+
+Before adopting the New Architecture in your native module, you should ensure your methods are consistent across platforms. You will realize this as you set out to write the JavaScript spec for your native module - remember that JavaScript spec defines what the methods will look like on all supported platforms.
+
+If your existing native module has methods with the same name on multiple platforms, but with different numbers or types of arguments across platforms, you will need to find a way to make these consistent. If you have methods that can take two or more different types for the same argument, then you need to find a way to resolve this type of ambiguity as type unions are intentionally not supported.
+
+## Configure Codegen
+
+[Codegen](the-new-architecture/pillars-codegen) is a tool that runs when you build an Android app or install the dependencies of an iOS app. It creates some scaffolding code that you won't have to create manually.
+
+Codegen can be configured in the `package.json` file of your Library. Add the following JSON object at the end of it.
+
+```diff
+ },
++ "codegenConfig": {
++ "name": "",
++ "type": "all",
++ "jsSrcsDir": ".",
++ "android": {
++ "javaPackageName": "com.facebook.fbreact.specs"
++ }
++ }
+}
+```
+
+- The `codegenConfig` is the key used by the Codegen to verify that there is some code to generate.
+- The `name` field is the name of the library.
+- The `type` field is used to identify the type of module we want to create. We suggest keeping `all` to support libraries that contain both Turbo Native Module and Fabric Native Components.
+- The `jsSrcsDir` is the directory where the codegen will start looking for JavaScript specs.
+- The `android.javaPackageName` is the name of the package where the generated code ends up.
+
+Android also requires to have the [React Gradle Plugin properly configured](new-architecture-app-intro#android-specifics) in your app.
+
+## Migrating from `UIManager` JavaScript APIs
+
+In the New Architecture, most `UIManager` methods will become available as instance methods on native component instances obtained via `ref`:
+
+```tsx
+function MyComponent(props: Props) {
+ const viewRef = useRef(null);
+
+ useEffect(() => {
+ viewRef.current.measure(((left, top, width, height, pageX, pageY) => {
+ // ...
+ });
+ }, []);
+
+ return ;
+}
+```
+
+This new API design provides several benefits:
+
+- Better developer ergonomics by removing the need for separately importing `UIManager` or calling `findNodeHandle`.
+- Better performance by avoiding the node handle lookup step.
+- Directionally aligned with [the analogous deprecation of `findDOMNode`](https://reactjs.org/docs/strict-mode.html#warning-about-deprecated-finddomnode-usage).
+
+We will eventually deprecate `UIManager`. However, we recognize that migrations demand a high cost for many application and library authors. In order to minimize this cost, we plan to continue supporting as many of the methods on `UIManager` as possible in the New Architecture.
+
+**Support for `UIManager` methods in the New Architecture is actively being developed.** While we make progress here, early adopters can still experiment with the New Architecture by following these steps to migrate off common `UIManager` APIs:
+
+1. Move the call to `requireNativeComponent` to a separate file
+2. Migrating off `dispatchViewManagerCommand`
+3. Creating NativeCommands with `codegenNativeCommands`
+
+### Move the call to `requireNativeComponent` to a separate file
+
+This will prepare for the JS to be ready for the new codegen system for the New Architecture. The new file should be named `NativeComponent.js.`
+
+#### Old way
+
+```js
+const RNTMyNativeView = requireNativeComponent('RNTMyNativeView');
+
+[...]
+
+return ;
+```
+
+#### New way
+
+```js title="RNTMyNativeNativeComponent.js"
+import RNTMyNativeViewNativeComponent from './RNTMyNativeViewNativeComponent';
+
+[...]
+
+return ;
+```
+
+```js title="RNTMyNativeViewNativeComponent.js"
+import {requireNativeComponent} from 'react-native';
+
+const RNTMyNativeViewNativeComponent = requireNativeComponent(
+ 'RNTMyNativeView',
+);
+
+export default RNTMyNativeViewNativeComponent;
+```
+
+#### Flow support
+
+If `requireNativeComponent` is not typed, you can temporarily use the `mixed` type to fix the Flow warning, for example:
+
+```js
+// @flow strict-local
+
+import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes';
+// ...
+const RCTWebViewNativeComponent: HostComponent =
+ requireNativeComponent('RNTMyNativeView');
+```
+
+#### Later on you can replace `requireNativeComponent`
+
+When you are ready to migrate to Fabric you can replace `requireNativeComponent` with `codegenNativeComponent`:
+
+```js title="RNTMyNativeViewNativeComponent.js"
+// @flow strict-local
+
+export default (codegenNativeComponent(
+ 'RNTMyNativeView',
+): HostComponent);
+```
+
+And update the main file:
+
+```js title="RNTMyNativeNativeComponent.js"
+// @flow strict-local
+
+export default require('./RNTMyNativeViewNativeComponent')
+ .default;
+```
+
+### Migrating off `dispatchViewManagerCommand`
+
+Similar to the one above, in an effort to avoid calling methods on the UIManager, all view manager methods are now called through an instance of `NativeCommands`. `codegenNativeCommands` is a new API to code-generate `NativeCommands` given an interface of your view manager’s commands.
+
+**Before**
+
+```tsx
+class MyComponent extends React.Component {
+ _moveToRegion: (region: Region, duration: number) => {
+ UIManager.dispatchViewManagerCommand(
+ ReactNative.findNodeHandle(this),
+ 'moveToRegion',
+ [region, duration]
+ );
+ }
+
+ render() {
+ return
+ }
+}
+```
+
+**Creating NativeCommands with `codegenNativeCommands`**
+
+```js title="MyCustomMapNativeComponent.js"
+// @flow strict-local
+
+import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
+import type {HostComponent} from 'react-native/Libraries/Renderer/shims/ReactNativeTypes';
+
+type MyCustomMapNativeComponentType = HostComponent;
+
+interface NativeCommands {
+ +moveToRegion: (
+ viewRef: React.ElementRef,
+ region: MapRegion,
+ duration: number,
+ ) => void;
+}
+
+export const Commands: NativeCommands =
+ codegenNativeCommands({
+ supportedCommands: ['moveToRegion'],
+ });
+```
+
+Note:
+
+- The first argument in the `moveToRegion` command is a HostComponent ref of the native component
+- The arguments to the `moveToRegion` command are enumerated in the signature
+- The command definition is co-located with the native component. This is an encouraged pattern
+- Ensure you have included your command name in the `supportedCommands` array
+
+#### Using Your Command
+
+```js
+// @flow strict-local
+
+import {Commands, ...} from './MyCustomMapNativeComponent';
+
+class MyComponent extends React.Component {
+ _ref: ?React.ElementRef;
+
+ _captureRef: (ref: React.ElementRef) => {
+ this._ref = ref;
+ }
+
+ _moveToRegion: (region: Region, duration: number) => {
+ if (this._ref != null) {
+ Commands.moveToRegion(this._ref, region, duration);
+ }
+ }
+
+ render() {
+ return
+ }
+}
+```
+
+#### Updating Native Implementation
+
+In the example, the code-generated `Commands` will dispatch `moveToRegion` call to the native component’s view manager. In addition to writing the JS interface, you’ll need to update your native implementation signatures to match the dispatched method call. See the mapping for [Android argument types](https://facebook.github.io/react-native/docs/native-modules-android#argument-types) and[iOS argument types](https://facebook.github.io/react-native/docs/native-modules-ios#argument-types) for reference.
+
+**iOS**
+
+```objc
+RCT_EXPORT_METHOD(moveToRegion:(nonnull NSNumber *)reactTag
+ region:(NSDictionary *)region
+ duration:(double)duration
+{
+ ...
+}
+```
+
+**Android**
+
+
+
+
+```kotlin
+ fun receiveCommand(
+ view: ReactMapDrawerView?, commandId: String?, args: ReadableArray?
+ ) {
+ when (commandId) {
+ "moveToRegion" -> {
+ if (args != null) {
+ val region: ReadableMap = args.getMap(0)
+ val durationMs: Int = args.getInt(1)
+ // ... act on the view...
+ }
+ }
+ }
+ }
+```
+
+
+
+
+```java
+// receiveCommand signature has changed to receive String commandId
+@Override
+ public void receiveCommand(
+ ReactMapDrawerView view, String commandId, @Nullable ReadableArray args) {
+ switch (commandId) {
+ case "moveToRegion":
+ if (args == null) {
+ break;
+ }
+
+ ReadableMap region = args.getMap(0);
+ int durationMs = args.getInt(1);
+ // ... act on the view...
+ break;
+ }
+ }
+```
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-library-ios.md b/website/versioned_docs/version-0.73.0/new-architecture-library-ios.md
new file mode 100644
index 00000000000..da9cfdf77af
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-library-ios.md
@@ -0,0 +1,73 @@
+---
+id: new-architecture-library-ios
+title: Enabling in iOS Library
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+
+
+
+You have defined the JavaScript specs for your native modules as part of the [prerequisites](new-architecture-library-intro), and you are now ready to migrate your library to the New Architecture. Here are the steps you can follow to accomplish this.
+
+## 1. Updating your Podspec for the New Architecture
+
+The New Architecture makes use of CocoaPods.
+
+### Add Folly and Other Dependencies
+
+The New Architecture requires some specific dependencies to work properly. You can set up your podspec to automatically install the required dependencies by modifying the `.podspec` file. In your `Pod::Spec.new` block, add the following line:
+
+```diff
+Pod::Spec.new do |s|
+ # ...
++ install_modules_dependencies(s)
+ # ...
+end
+```
+
+At this [link](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L192-L197), you can find the documentation of the `install_modules_dependencies` function.
+
+If you need to explicitly know which `folly_flags` React Native is using, you can query them using the [`folly_flag`](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L188) function.
+
+## 2. Extend or Implement the Code-generated Native Interfaces
+
+The JavaScript spec for your native module or component will be used to generate native interface code for each supported platform (i.e., Android and iOS). These native interface files will be generated when a React Native application that depends on your library is built.
+
+While this generated native interface code **will not ship as part of your library**, you do need to make sure your Objective-C or Java code conforms to the protocols provided by these native interface files. You can use the Codegen script to generate your library’s native interface code in order to use it **as a reference**.
+
+```sh
+cd
+node node_modules/react-native/scripts/generate-codegen-artifacts.js \
+ --path / \
+ --outputPath \
+```
+
+This command will generate the boilerplate code required by iOS in the output path provided as a parameter.
+
+The files that are output by the script **should not be committed**, but you’ll need to refer to them to determine what changes you need to make to your native modules in order for them to provide an implementation for each generated `@protocol` / native interface.
+
+### Conform to the protocols provided by the native interface code
+
+Update your native module or component to ensure it implements/extends the native interface that has been generated from your JavaScript specs.
+
+Following the example set forth in the previous section, your library might import `MyAwesomeSpecs.h`, extend the relevant native interface, and implement the necessary methods for this interface:
+
+```objc
+#import
+
+@interface MyAwesomeModule ()
+@end
+
+RCT_EXPORT_METHOD(getString:(NSString *)string
+ callback:(RCTResponseSenderBlock)callback)
+{
+ // Implement this method
+}
+
+- (std::shared_ptr)getTurboModule:(const ObjCTurboModule::InitParams &)params
+{
+ return std::make_shared(params);
+}
+```
+
+For an existing native module, you will likely already have one or more instances of [`RCT_EXPORT_METHOD`](native-modules-ios#export-a-native-method-to-javascript). To migrate to the New Architecture, you’ll need to make sure the method signature uses the structs provided by the Codegen output.
diff --git a/website/versioned_docs/version-0.73.0/new-architecture-troubleshooting.md b/website/versioned_docs/version-0.73.0/new-architecture-troubleshooting.md
new file mode 100644
index 00000000000..03837087018
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/new-architecture-troubleshooting.md
@@ -0,0 +1,40 @@
+---
+id: new-architecture-troubleshooting
+title: Troubleshooting
+---
+
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+
+
+
+This page contains resolutions to common problem you might face when migrating to the New Architecture.
+
+## CocoaPods and Node Reset
+
+The CocoaPods integration will see frequent updates as we rollout the New Architecture, and it is possible to end up with your workspace in a broken state after one of these changes. You may clean up any changes related to the codegen by performing some of these steps:
+
+1. Run `bundle exec pod deintegrate` in your ios directory and then rerun `RCT_NEW_ARCH_ENABLED=1 bundle exec pod install`.
+2. Delete `node_modules` and re-run `yarn install`.
+
+## Android build is failing with `OutOfMemoryException`
+
+If your Android Gradle builds are failing with: `OutOfMemoryException: Out of memory: Java heap space.` or similar errors related to low memory, you might need to increase the memory allocated to the JVM.
+
+You can do that by editing the `gradle.properties` file in your `android/gradle.properties` folder:
+
+```diff
+ # Specifies the JVM arguments used for the daemon process.
+ # The setting is particularly useful for tweaking memory settings.
+ # Default value: -Xmx1024m -XX:MaxPermSize=256m
+-# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
++org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+```
+
+Make sure to uncomment the line and set the preferred memory size with the `-Xmx` parameter. 2Gb should be the minimum required and 4Gb is recommended.
+
+## Android NDK and Mac with M1 Apple Silicon CPUs
+
+We're aware of a series of incompatibilities between the Android NDK and Macs on M1 CPUs ([here](https://github.com/android/ndk/issues/1299) and [here](https://github.com/android/ndk/issues/1410)).
+As the New Architectecture relies on the NDK, you might face problems during your build.
+
+React Native version 0.70 and 0.71 contains fixes for those build failures, and we invite you to update to those versions whenever possible.
diff --git a/website/versioned_docs/version-0.73.0/optimizing-flatlist-configuration.md b/website/versioned_docs/version-0.73.0/optimizing-flatlist-configuration.md
new file mode 100644
index 00000000000..3d7e60a4188
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/optimizing-flatlist-configuration.md
@@ -0,0 +1,155 @@
+---
+id: optimizing-flatlist-configuration
+title: Optimizing Flatlist Configuration
+---
+
+## Terms
+
+- **VirtualizedList:** The component behind `FlatList` (React Native's implementation of the [`Virtual List`](https://bvaughn.github.io/react-virtualized/#/components/List) concept.)
+
+- **Memory consumption:** How much information about your list is being stored in memory, which could lead to an app crash.
+
+- **Responsiveness:** Application ability to respond to interactions. Low responsiveness, for instance, is when you touch on a component and it waits a bit to respond, instead of responding immediately as expected.
+
+- **Blank areas:** When `VirtualizedList` can't render your items fast enough, you may enter a part of your list with non-rendered components that appear as blank space.
+
+- **Viewport:** The visible area of content that is rendered to pixels.
+
+- **Window:** The area in which items should be mounted, which is generally much larger than the viewport.
+
+## Props
+
+Here are a list of props that can help to improve `FlatList` performance:
+
+### removeClippedSubviews
+
+| Type | Default |
+| ------- | ------- |
+| Boolean | False |
+
+If `true`, views that are outside of the viewport are detached from the native view hierarchy.
+
+**Pros:** This reduces time spent on the main thread, and thus reduces the risk of dropped frames, by excluding views outside of the viewport from the native rendering and drawing traversals.
+
+**Cons:** Be aware that this implementation can have bugs, such as missing content (mainly observed on iOS), especially if you are doing complex things with transforms and/or absolute positioning. Also note this does not save significant memory because the views are not deallocated, only detached.
+
+### maxToRenderPerBatch
+
+| Type | Default |
+| ------ | ------- |
+| Number | 10 |
+
+It is a `VirtualizedList` prop that can be passed through `FlatList`. This controls the amount of items rendered per batch, which is the next chunk of items rendered on every scroll.
+
+**Pros:** Setting a bigger number means less visual blank areas when scrolling (increases the fill rate).
+
+**Cons:** More items per batch means longer periods of JavaScript execution potentially blocking other event processing, like presses, hurting responsiveness.
+
+### updateCellsBatchingPeriod
+
+| Type | Default |
+| ------ | ------- |
+| Number | 50 |
+
+While `maxToRenderPerBatch` tells the amount of items rendered per batch, setting `updateCellsBatchingPeriod` tells your `VirtualizedList` the delay in milliseconds between batch renders (how frequently your component will be rendering the windowed items).
+
+**Pros:** Combining this prop with `maxToRenderPerBatch` gives you the power to, for example, render more items in a less frequent batch, or less items in a more frequent batch.
+
+**Cons:** Less frequent batches may cause blank areas, More frequent batches may cause responsiveness issues.
+
+### initialNumToRender
+
+| Type | Default |
+| ------ | ------- |
+| Number | 10 |
+
+The initial amount of items to render.
+
+**Pros:** Define precise number of items that would cover the screen for every device. This can be a big performance boost for the initial render.
+
+**Cons:** Setting a low `initialNumToRender` may cause blank areas, especially if it's too small to cover the viewport on initial render.
+
+### windowSize
+
+| Type | Default |
+| ------ | ------- |
+| Number | 21 |
+
+The number passed here is a measurement unit where 1 is equivalent to your viewport height. The default value is 21 (10 viewports above, 10 below, and one in between).
+
+**Pros:** Bigger `windowSize` will result in less chance of seeing blank space while scrolling. On the other hand, smaller `windowSize` will result in fewer items mounted simultaneously, saving memory.
+
+**Cons:** For a bigger `windowSize`, you will have more memory consumption. For a lower `windowSize`, you will have a bigger chance of seeing blank areas.
+
+## List items
+
+Below are some tips about list item components. They are the core of your list, so they need to be fast.
+
+### Use basic components
+
+The more complex your components are, the slower they will render. Try to avoid a lot of logic and nesting in your list items. If you are reusing this list item component a lot in your app, create a component only for your big lists and make them with as little logic and nesting as possible.
+
+### Use light components
+
+The heavier your components are, the slower they render. Avoid heavy images (use a cropped version or thumbnail for list items, as small as possible). Talk to your design team, use as little effects and interactions and information as possible in your list. Show them in your item's detail.
+
+### Use `memo()`
+
+`React.memo()` creates a memoized component that will be re-rendered only when the props passed to the component change. We can use this function to optimize the components in the FlatList.
+
+```tsx
+import React, {memo} from 'react';
+import {View, Text} from 'react-native';
+
+const MyListItem = memo(
+ ({title}: {title: string}) => (
+
+ {title}
+
+ ),
+ (prevProps, nextProps) => {
+ return prevProps.title === nextProps.title;
+ },
+);
+
+export default MyListItem;
+```
+
+In this example, we have determined that MyListItem should be re-rendered only when the title changes. We passed the comparison function as the second argument to React.memo() so that the component is re-rendered only when the specified prop is changed. If the comparison function returns true, the component will not be re-rendered.
+
+### Use cached optimized images
+
+You can use the community packages (such as [react-native-fast-image](https://github.com/DylanVann/react-native-fast-image) from [@DylanVann](https://github.com/DylanVann)) for more performant images. Every image in your list is a `new Image()` instance. The faster it reaches the `loaded` hook, the faster your JavaScript thread will be free again.
+
+### Use getItemLayout
+
+If all your list item components have the same height (or width, for a horizontal list), providing the [getItemLayout](flatlist#getitemlayout) prop removes the need for your `FlatList` to manage async layout calculations. This is a very desirable optimization technique.
+
+If your components have dynamic size and you really need performance, consider asking your design team if they may think of a redesign in order to perform better.
+
+### Use keyExtractor or key
+
+You can set the [`keyExtractor`](flatlist#keyextractor) to your `FlatList` component. This prop is used for caching and as the React `key` to track item re-ordering.
+
+You can also use a `key` prop in your item component.
+
+### Avoid anonymous function on renderItem
+
+For functional components, move the `renderItem` function outside of the returned JSX. Also, ensure that it is wrapped in a `useCallback` hook to prevent it from being recreated each render.
+
+For class componenents, move the `renderItem` function outside of the render function, so it won't recreate itself each time the render function is called.
+
+```tsx
+const renderItem = useCallback(({item}) => (
+
+ {item.title}
+
+ ), []);
+
+return (
+ // ...
+
+ ;
+ // ...
+);
+```
diff --git a/website/versioned_docs/version-0.73.0/other-debugging-methods.md b/website/versioned_docs/version-0.73.0/other-debugging-methods.md
new file mode 100644
index 00000000000..1691b3a9678
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/other-debugging-methods.md
@@ -0,0 +1,95 @@
+---
+id: other-debugging-methods
+title: Other Debugging Methods
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+This page covers other JavaScript debugging methods besides what is described in [Opening the Debugger](./debugging#opening-the-debugger). If you are using a newly created React Native or Expo app, we recommend starting there.
+
+## Safari Developer Tools (direct JSC debugging)
+
+You can use Safari to debug the iOS version of your app when using [JavaScriptCore](https://trac.webkit.org/wiki/JavaScriptCore) (JSC) as your app's runtime.
+
+1. **Physical devices only**: Open the Settings app, and navigate to Safari > Advanced, and make sure "Web Inspector" is turned on.
+2. On your Mac, open Safari and enable the Develop menu. This can be found under Safari > Settings..., then the Advanced tab, then selecting "Show features for web developers".
+3. Find your device under the Develop menu, and select the "JSContext" item from the submenu. This will open Safari's Web Inspector, which includes Console and Sources panels similar to Chrome DevTools.
+
+
+
+:::tip
+While source maps may not be enabled by default, you can follow [this guide](https://blog.nparashuram.com/2019/10/debugging-react-native-ios-apps-with.html) or [video](https://www.youtube.com/watch?v=GrGqIIz51k4) to enable them and set break points at the right places in the source code.
+:::
+
+:::tip
+Every time the app is reloaded, a new JSContext is created. Choosing "Automatically Show Web Inspectors for JSContexts" saves you from having to select the latest JSContext manually.
+:::
+
+## Remote JavaScript Debugging (deprecated)
+
+:::warning
+Remote JavaScript Debugging is deprecated in React Native 0.73 and will be removed in a future release.
+:::
+
+Remote JavaScript Debugging connects an external web browser (Chrome) to your app and runs your JavaScript code inside a web page. This allows you to use Chrome's debugger as you would with any web app. Note that the browser environment can be very different, and not all React Native modules will work when debugging this way.
+
+### Setup
+
+Since React Native 0.73, Remote JavaScript Debugging must be **manually enabled** using the `NativeDevSettings` module.
+
+```js
+import NativeDevSettings from 'react-native/Libraries/NativeModules/specs/NativeDevSettings';
+
+function MyApp() {
+ // Assign this to a dev-only button or useEffect call
+ const connectToRemoteDebugger = () => {
+ NativeDevSettings.setIsDebuggingRemotely(true);
+ };
+}
+```
+
+When `NativeDevSettings.setIsDebuggingRemotely(true)` is invoked, this will open a new tab at [http://localhost:8081/debugger-ui](http://localhost:8081/debugger-ui).
+
+From this page, open Chrome DevTools via:
+
+- View > Developer > Developer Tools
+- ⌥ Option + Cmd ⌘ + I (macOS) / Ctrl + Shift + I (Windows and Linux).
+
+The Console and Sources panels will allow you to inspect your React Native code.
+
+
+
+:::info
+Under Remote JavaScript Debugging, the web version of React DevTools in Chrome will not work with React Native. See the [React DevTools](./react-devtools) guide to learn how to use the standalone version of React DevTools.
+:::
+
+:::note
+On Android, if the times between the debugger and device have drifted, things such as animations and event behavior might not work properly. This can be fixed by running `` adb shell "date `date +%m%d%H%M%Y.%S%3N`" ``. Root access is required if using a physical device.
+:::
+
+### Debugging on a physical device
+
+:::info
+If you're using Expo CLI, this is configured for you already.
+:::
+
+
+
+
+On iOS devices, open the file [`RCTWebSocketExecutor.mm`](https://github.com/facebook/react-native/blob/master/packages/react-native/React/CoreModules/RCTWebSocketExecutor.mm) and change "localhost" to the IP address of your computer.
+
+
+
+
+On Android 5.0+ devices connected via USB, you can use the [`adb` command line tool](http://developer.android.com/tools/help/adb.html) to set up port forwarding from the device to your computer:
+
+```sh
+adb reverse tcp:8081 tcp:8081
+```
+
+
+
+
+:::note
+If you run into any issues, it may be possible that one of your Chrome extensions is interacting in unexpected ways with the debugger. Try disabling all of your extensions and re-enabling them one-by-one until you find the problematic extension.
+:::
diff --git a/website/versioned_docs/version-0.73.0/out-of-tree-platforms.md b/website/versioned_docs/version-0.73.0/out-of-tree-platforms.md
new file mode 100644
index 00000000000..cf5aca2c0ae
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/out-of-tree-platforms.md
@@ -0,0 +1,46 @@
+---
+id: out-of-tree-platforms
+title: Out-of-Tree Platforms
+---
+
+React Native is not only for Android and iOS devices - our partners and the community maintain projects that bring React Native to other platforms, such as:
+
+**From Partners**
+
+- [React Native macOS](https://github.com/microsoft/react-native-macos) - React Native for macOS and Cocoa.
+- [React Native Windows](https://github.com/microsoft/react-native-windows) - React Native for Microsoft's Universal Windows Platform (UWP).
+
+**From Community**
+
+- [React Native tvOS](https://github.com/react-native-tvos/react-native-tvos) - React Native for Apple TV and Android TV devices.
+- [React Native Web](https://github.com/necolas/react-native-web) - React Native on the web using React DOM.
+- [React Native Skia](https://github.com/react-native-skia/react-native-skia) - React Native using [Skia](https://skia.org/) as a renderer. Currently supports Linux and macOS.
+
+## Creating your own React Native platform
+
+Right now the process of creating a React Native platform from scratch is not very well documented - one of the goals of the upcoming re-architecture ([Fabric](/blog/2018/06/14/state-of-react-native-2018)) is to make maintaining a platform easier.
+
+### Bundling
+
+As of React Native 0.57 you can now register your React Native platform with React Native's JavaScript bundler, [Metro](https://facebook.github.io/metro/). This means you can pass `--platform example` to `npx react-native bundle`, and it will look for JavaScript files with the `.example.js` suffix.
+
+To register your platform with RNPM, your module's name must match one of these patterns:
+
+- `react-native-example` - It will search all top-level modules that start with `react-native-`
+- `@org/react-native-example` - It will search for modules that start with `react-native-` under any scope
+- `@react-native-example/module` - It will search in all modules under scopes with names starting with `@react-native-`
+
+You must also have an entry in your `package.json` like this:
+
+```json
+{
+ "rnpm": {
+ "haste": {
+ "providesModuleNodeModules": ["react-native-example"],
+ "platforms": ["example"]
+ }
+ }
+}
+```
+
+`"providesModuleNodeModules"` is an array of modules that will get added to the Haste module search path, and `"platforms"` is an array of platform suffixes that will be added as valid platforms.
diff --git a/website/versioned_docs/version-0.73.0/panresponder.md b/website/versioned_docs/version-0.73.0/panresponder.md
new file mode 100644
index 00000000000..a3ec6502988
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/panresponder.md
@@ -0,0 +1,174 @@
+---
+id: panresponder
+title: PanResponder
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+`PanResponder` reconciles several touches into a single gesture. It makes single-touch gestures resilient to extra touches, and can be used to recognize basic multi-touch gestures.
+
+By default, `PanResponder` holds an `InteractionManager` handle to block long-running JS events from interrupting active gestures.
+
+It provides a predictable wrapper of the responder handlers provided by the [gesture responder system](gesture-responder-system.md). For each handler, it provides a new `gestureState` object alongside the native event object:
+
+```
+onPanResponderMove: (event, gestureState) => {}
+```
+
+A native event is a synthetic touch event with form of [PressEvent](pressevent).
+
+A `gestureState` object has the following:
+
+- `stateID` - ID of the gestureState- persisted as long as there's at least one touch on screen
+- `moveX` - the latest screen coordinates of the recently-moved touch
+- `moveY` - the latest screen coordinates of the recently-moved touch
+- `x0` - the screen coordinates of the responder grant
+- `y0` - the screen coordinates of the responder grant
+- `dx` - accumulated distance of the gesture since the touch started
+- `dy` - accumulated distance of the gesture since the touch started
+- `vx` - current velocity of the gesture
+- `vy` - current velocity of the gesture
+- `numberActiveTouches` - Number of touches currently on screen
+
+## Usage Pattern
+
+```tsx
+const ExampleComponent = () => {
+ const panResponder = React.useRef(
+ PanResponder.create({
+ // Ask to be the responder:
+ onStartShouldSetPanResponder: (evt, gestureState) => true,
+ onStartShouldSetPanResponderCapture: (evt, gestureState) =>
+ true,
+ onMoveShouldSetPanResponder: (evt, gestureState) => true,
+ onMoveShouldSetPanResponderCapture: (evt, gestureState) =>
+ true,
+
+ onPanResponderGrant: (evt, gestureState) => {
+ // The gesture has started. Show visual feedback so the user knows
+ // what is happening!
+ // gestureState.d{x,y} will be set to zero now
+ },
+ onPanResponderMove: (evt, gestureState) => {
+ // The most recent move distance is gestureState.move{X,Y}
+ // The accumulated gesture distance since becoming responder is
+ // gestureState.d{x,y}
+ },
+ onPanResponderTerminationRequest: (evt, gestureState) =>
+ true,
+ onPanResponderRelease: (evt, gestureState) => {
+ // The user has released all touches while this view is the
+ // responder. This typically means a gesture has succeeded
+ },
+ onPanResponderTerminate: (evt, gestureState) => {
+ // Another component has become the responder, so this gesture
+ // should be cancelled
+ },
+ onShouldBlockNativeResponder: (evt, gestureState) => {
+ // Returns whether this component should block native components from becoming the JS
+ // responder. Returns true by default. Is currently only supported on android.
+ return true;
+ },
+ }),
+ ).current;
+
+ return ;
+};
+```
+
+## Example
+
+`PanResponder` works with `Animated` API to help build complex gestures in the UI. The following example contains an animated `View` component which can be dragged freely across the screen
+
+```SnackPlayer name=PanResponder
+import React, {useRef} from 'react';
+import {Animated, View, StyleSheet, PanResponder, Text} from 'react-native';
+
+const App = () => {
+ const pan = useRef(new Animated.ValueXY()).current;
+
+ const panResponder = useRef(
+ PanResponder.create({
+ onMoveShouldSetPanResponder: () => true,
+ onPanResponderMove: Animated.event([null, {dx: pan.x, dy: pan.y}]),
+ onPanResponderRelease: () => {
+ pan.extractOffset();
+ },
+ }),
+ ).current;
+
+ return (
+
+ Drag this box!
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ titleText: {
+ fontSize: 14,
+ lineHeight: 24,
+ fontWeight: 'bold',
+ },
+ box: {
+ height: 150,
+ width: 150,
+ backgroundColor: 'blue',
+ borderRadius: 5,
+ },
+});
+
+export default App;
+```
+
+Try the [PanResponder example in RNTester](https://github.com/facebook/react-native/blob/main/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js).
+
+---
+
+# Reference
+
+## Methods
+
+### `create()`
+
+```tsx
+static create(config: PanResponderCallbacks): PanResponderInstance;
+```
+
+**Parameters:**
+
+| Name | Type | Description |
+| ----------------------------------------------------------- | ------ | ----------- |
+| config
Required
| object | Refer below |
+
+The `config` object provides enhanced versions of all of the responder callbacks that provide not only the [`PressEvent`](pressevent), but also the `PanResponder` gesture state, by replacing the word `Responder` with `PanResponder` in each of the typical `onResponder*` callbacks. For example, the `config` object would look like:
+
+- `onMoveShouldSetPanResponder: (e, gestureState) => {...}`
+- `onMoveShouldSetPanResponderCapture: (e, gestureState) => {...}`
+- `onStartShouldSetPanResponder: (e, gestureState) => {...}`
+- `onStartShouldSetPanResponderCapture: (e, gestureState) => {...}`
+- `onPanResponderReject: (e, gestureState) => {...}`
+- `onPanResponderGrant: (e, gestureState) => {...}`
+- `onPanResponderStart: (e, gestureState) => {...}`
+- `onPanResponderEnd: (e, gestureState) => {...}`
+- `onPanResponderRelease: (e, gestureState) => {...}`
+- `onPanResponderMove: (e, gestureState) => {...}`
+- `onPanResponderTerminate: (e, gestureState) => {...}`
+- `onPanResponderTerminationRequest: (e, gestureState) => {...}`
+- `onShouldBlockNativeResponder: (e, gestureState) => {...}`
+
+In general, for events that have capture equivalents, we update the gestureState once in the capture phase and can use it in the bubble phase as well.
+
+Be careful with `onStartShould*` callbacks. They only reflect updated `gestureState` for start/end events that bubble/capture to the Node. Once the node is the responder, you can rely on every start/end event being processed by the gesture and `gestureState` being updated accordingly. (numberActiveTouches) may not be totally accurate unless you are the responder.
diff --git a/website/versioned_docs/version-0.73.0/performance.md b/website/versioned_docs/version-0.73.0/performance.md
new file mode 100644
index 00000000000..b79f9b8e4ff
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/performance.md
@@ -0,0 +1,108 @@
+---
+id: performance
+title: Performance Overview
+---
+
+A compelling reason to use React Native instead of WebView-based tools is to achieve 60 frames per second and provide a native look and feel to your apps. Whenever feasible, we aim for React Native to handle optimizations automatically, allowing you to focus on your app without worrying about performance. However, there are certain areas where we haven't quite reached that level yet, and others where React Native (similar to writing native code directly) cannot determine the best optimization approach for you. In such cases, manual intervention becomes necessary. We strive to deliver buttery-smooth UI performance by default, but there may be instances where that isn't possible.
+
+This guide is intended to teach you some basics to help you to [troubleshoot performance issues](profiling.md), as well as discuss [common sources of problems and their suggested solutions](performance.md#common-sources-of-performance-problems).
+
+## What you need to know about frames
+
+Your grandparents' generation called movies ["moving pictures"](https://www.youtube.com/watch?v=F1i40rnpOsA) for a reason: realistic motion in video is an illusion created by quickly changing static images at a consistent speed. We refer to each of these images as frames. The number of frames that is displayed each second has a direct impact on how smooth and ultimately life-like a video (or user interface) seems to be. iOS devices display 60 frames per second, which gives you and the UI system about 16.67ms to do all of the work needed to generate the static image (frame) that the user will see on the screen for that interval. If you are unable to do the work necessary to generate that frame within the allotted 16.67ms, then you will "drop a frame" and the UI will appear unresponsive.
+
+Now to confuse the matter a little bit, open up the [Dev Menu](debugging.md#accessing-the-dev-menu) in your app and toggle `Show Perf Monitor`. You will notice that there are two different frame rates.
+
+
+
+### JS frame rate (JavaScript thread)
+
+For most React Native applications, your business logic will run on the JavaScript thread. This is where your React application lives, API calls are made, touch events are processed, etc... Updates to native-backed views are batched and sent over to the native side at the end of each iteration of the event loop, before the frame deadline (if all goes well). If the JavaScript thread is unresponsive for a frame, it will be considered a dropped frame. For example, if you were to call `this.setState` on the root component of a complex application and it resulted in re-rendering computationally expensive component subtrees, it's conceivable that this might take 200ms and result in 12 frames being dropped. Any animations controlled by JavaScript would appear to freeze during that time. If anything takes longer than 100ms, the user will feel it.
+
+This often happens during `Navigator` transitions: when you push a new route, the JavaScript thread needs to render all of the components necessary for the scene in order to send over the proper commands to the native side to create the backing views. It's common for the work being done here to take a few frames and cause [jank](https://jankfree.org/) because the transition is controlled by the JavaScript thread. Sometimes components will do additional work on `componentDidMount`, which might result in a second stutter in the transition.
+
+Another example is responding to touches: if you are doing work across multiple frames on the JavaScript thread, you might notice a delay in responding to `TouchableOpacity`, for example. This is because the JavaScript thread is busy and cannot process the raw touch events sent over from the main thread. As a result, `TouchableOpacity` cannot react to the touch events and command the native view to adjust its opacity.
+
+### UI frame rate (main thread)
+
+Many people have noticed that performance of `NavigatorIOS` is better out of the box than `Navigator`. The reason for this is that the animations for the transitions are done entirely on the main thread, and so they are not interrupted by frame drops on the JavaScript thread.
+
+Similarly, you can happily scroll up and down through a `ScrollView` when the JavaScript thread is locked up because the `ScrollView` lives on the main thread. The scroll events are dispatched to the JS thread, but their receipt is not necessary for the scroll to occur.
+
+## Common sources of performance problems
+
+### Running in development mode (`dev=true`)
+
+JavaScript thread performance suffers greatly when running in dev mode. This is unavoidable: a lot more work needs to be done at runtime to provide you with good warnings and error messages, such as validating propTypes and various other assertions. Always make sure to test performance in [release builds](running-on-device.md#building-your-app-for-production).
+
+### Using `console.log` statements
+
+When running a bundled app, these statements can cause a big bottleneck in the JavaScript thread. This includes calls from debugging libraries such as [redux-logger](https://github.com/evgenyrodionov/redux-logger), so make sure to remove them before bundling. You can also use this [babel plugin](https://babeljs.io/docs/plugins/transform-remove-console/) that removes all the `console.*` calls. You need to install it first with `npm i babel-plugin-transform-remove-console --save-dev`, and then edit the `.babelrc` file under your project directory like this:
+
+```json
+{
+ "env": {
+ "production": {
+ "plugins": ["transform-remove-console"]
+ }
+ }
+}
+```
+
+This will automatically remove all `console.*` calls in the release (production) versions of your project.
+
+It is recommended to use the plugin even if no `console.*` calls are made in your project. A third party library could also call them.
+
+### `ListView` initial rendering is too slow or scroll performance is bad for large lists
+
+Use the new [`FlatList`](flatlist.md) or [`SectionList`](sectionlist.md) component instead. Besides simplifying the API, the new list components also have significant performance enhancements, the main one being nearly constant memory usage for any number of rows.
+
+If your [`FlatList`](flatlist.md) is rendering slow, be sure that you've implemented [`getItemLayout`](flatlist.md#getitemlayout) to optimize rendering speed by skipping measurement of the rendered items.
+
+### JS FPS plunges when re-rendering a view that hardly changes
+
+If you are using a ListView, you must provide a `rowHasChanged` function that can reduce a lot of work by quickly determining whether or not a row needs to be re-rendered. If you are using immutable data structures, this would only need to be a reference equality check.
+
+Similarly, you can implement `shouldComponentUpdate` and indicate the exact conditions under which you would like the component to re-render. If you write pure components (where the return value of the render function is entirely dependent on props and state), you can leverage PureComponent to do this for you. Once again, immutable data structures are useful to keep this fast -- if you have to do a deep comparison of a large list of objects, it may be that re-rendering your entire component would be quicker, and it would certainly require less code.
+
+### Dropping JS thread FPS because of doing a lot of work on the JavaScript thread at the same time
+
+"Slow Navigator transitions" is the most common manifestation of this, but there are other times this can happen. Using InteractionManager can be a good approach, but if the user experience cost is too high to delay work during an animation, then you might want to consider LayoutAnimation.
+
+The Animated API currently calculates each keyframe on-demand on the JavaScript thread unless you [set `useNativeDriver: true`](/blog/2017/02/14/using-native-driver-for-animated#how-do-i-use-this-in-my-app), while LayoutAnimation leverages Core Animation and is unaffected by JS thread and main thread frame drops.
+
+One case where I have used this is for animating in a modal (sliding down from top and fading in a translucent overlay) while initializing and perhaps receiving responses for several network requests, rendering the contents of the modal, and updating the view where the modal was opened from. See the Animations guide for more information about how to use LayoutAnimation.
+
+Caveats:
+
+- LayoutAnimation only works for fire-and-forget animations ("static" animations) -- if it must be interruptible, you will need to use `Animated`.
+
+### Moving a view on the screen (scrolling, translating, rotating) drops UI thread FPS
+
+This is especially true when you have text with a transparent background positioned on top of an image, or any other situation where alpha compositing would be required to re-draw the view on each frame. You will find that enabling `shouldRasterizeIOS` or `renderToHardwareTextureAndroid` can help with this significantly.
+
+Be careful not to overuse this or your memory usage could go through the roof. Profile your performance and memory usage when using these props. If you don't plan to move a view anymore, turn this property off.
+
+### Animating the size of an image drops UI thread FPS
+
+On iOS, each time you adjust the width or height of an Image component it is re-cropped and scaled from the original image. This can be very expensive, especially for large images. Instead, use the `transform: [{scale}]` style property to animate the size. An example of when you might do this is when you tap an image and zoom it in to full screen.
+
+### My TouchableX view isn't very responsive
+
+Sometimes, if we do an action in the same frame that we are adjusting the opacity or highlight of a component that is responding to a touch, we won't see that effect until after the `onPress` function has returned. If `onPress` does a `setState` that results in a lot of work and a few frames dropped, this may occur. A solution to this is to wrap any action inside of your `onPress` handler in `requestAnimationFrame`:
+
+```tsx
+handleOnPress() {
+ requestAnimationFrame(() => {
+ this.doExpensiveAction();
+ });
+}
+```
+
+### Slow navigator transitions
+
+As mentioned above, `Navigator` animations are controlled by the JavaScript thread. Imagine the "push from right" scene transition: each frame, the new scene is moved from the right to left, starting offscreen (let's say at an x-offset of 320) and ultimately settling when the scene sits at an x-offset of 0. Each frame during this transition, the JavaScript thread needs to send a new x-offset to the main thread. If the JavaScript thread is locked up, it cannot do this and so no update occurs on that frame and the animation stutters.
+
+One solution to this is to allow for JavaScript-based animations to be offloaded to the main thread. If we were to do the same thing as in the above example with this approach, we might calculate a list of all x-offsets for the new scene when we are starting the transition and send them to the main thread to execute in an optimized way. Now that the JavaScript thread is freed of this responsibility, it's not a big deal if it drops a few frames while rendering the scene -- you probably won't even notice because you will be too distracted by the pretty transition.
+
+Solving this is one of the main goals behind the new [React Navigation](navigation.md) library. The views in React Navigation use native components and the [`Animated`](animated.md) library to deliver 60 FPS animations that are run on the native thread.
diff --git a/website/versioned_docs/version-0.73.0/permissionsandroid.md b/website/versioned_docs/version-0.73.0/permissionsandroid.md
new file mode 100644
index 00000000000..307f5d17411
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/permissionsandroid.md
@@ -0,0 +1,205 @@
+---
+id: permissionsandroid
+title: PermissionsAndroid
+---
+
+
+
Project with Native Code Required
+
+ The following section only applies to projects with native code exposed. If you are using the managed Expo workflow, see the guide on Permissions in the Expo documentation for the appropriate alternative.
+
+
+
+`PermissionsAndroid` provides access to Android M's new permissions model. The so-called "normal" permissions are granted by default when the application is installed as long as they appear in `AndroidManifest.xml`. However, "dangerous" permissions require a dialog prompt. You should use this module for those permissions.
+
+On devices before SDK version 23, the permissions are automatically granted if they appear in the manifest, so `check` should always result to `true` and `request` should always resolve to `PermissionsAndroid.RESULTS.GRANTED`.
+
+If a user has previously turned off a permission that you prompt for, the OS will advise your app to show a rationale for needing the permission. The optional `rationale` argument will show a dialog prompt only if necessary - otherwise the normal permission prompt will appear.
+
+### Example
+
+```SnackPlayer name=PermissionsAndroid%20Example&supportedPlatforms=android
+import React from 'react';
+import {
+ Button,
+ PermissionsAndroid,
+ StatusBar,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const requestCameraPermission = async () => {
+ try {
+ const granted = await PermissionsAndroid.request(
+ PermissionsAndroid.PERMISSIONS.CAMERA,
+ {
+ title: 'Cool Photo App Camera Permission',
+ message:
+ 'Cool Photo App needs access to your camera ' +
+ 'so you can take awesome pictures.',
+ buttonNeutral: 'Ask Me Later',
+ buttonNegative: 'Cancel',
+ buttonPositive: 'OK',
+ },
+ );
+ if (granted === PermissionsAndroid.RESULTS.GRANTED) {
+ console.log('You can use the camera');
+ } else {
+ console.log('Camera permission denied');
+ }
+ } catch (err) {
+ console.warn(err);
+ }
+};
+
+const App = () => (
+
+ Try permissions
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingTop: StatusBar.currentHeight,
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ item: {
+ margin: 24,
+ fontSize: 18,
+ fontWeight: 'bold',
+ textAlign: 'center',
+ },
+});
+
+export default App;
+```
+
+### Permissions that require prompting the user
+
+Available as constants under `PermissionsAndroid.PERMISSIONS`:
+
+- `READ_CALENDAR`: 'android.permission.READ_CALENDAR'
+- `WRITE_CALENDAR`: 'android.permission.WRITE_CALENDAR'
+- `CAMERA`: 'android.permission.CAMERA'
+- `READ_CONTACTS`: 'android.permission.READ_CONTACTS'
+- `WRITE_CONTACTS`: 'android.permission.WRITE_CONTACTS'
+- `GET_ACCOUNTS`: 'android.permission.GET_ACCOUNTS'
+- `ACCESS_FINE_LOCATION`: 'android.permission.ACCESS_FINE_LOCATION'
+- `ACCESS_COARSE_LOCATION`: 'android.permission.ACCESS_COARSE_LOCATION'
+- `ACCESS_BACKGROUND_LOCATION`: 'android.permission.ACCESS_BACKGROUND_LOCATION'
+- `RECORD_AUDIO`: 'android.permission.RECORD_AUDIO'
+- `READ_PHONE_STATE`: 'android.permission.READ_PHONE_STATE'
+- `CALL_PHONE`: 'android.permission.CALL_PHONE'
+- `READ_CALL_LOG`: 'android.permission.READ_CALL_LOG'
+- `WRITE_CALL_LOG`: 'android.permission.WRITE_CALL_LOG'
+- `ADD_VOICEMAIL`: 'com.android.voicemail.permission.ADD_VOICEMAIL'
+- `USE_SIP`: 'android.permission.USE_SIP'
+- `PROCESS_OUTGOING_CALLS`: 'android.permission.PROCESS_OUTGOING_CALLS'
+- `BODY_SENSORS`: 'android.permission.BODY_SENSORS'
+- `SEND_SMS`: 'android.permission.SEND_SMS'
+- `RECEIVE_SMS`: 'android.permission.RECEIVE_SMS'
+- `READ_SMS`: 'android.permission.READ_SMS'
+- `RECEIVE_WAP_PUSH`: 'android.permission.RECEIVE_WAP_PUSH'
+- `RECEIVE_MMS`: 'android.permission.RECEIVE_MMS'
+- `READ_EXTERNAL_STORAGE`: 'android.permission.READ_EXTERNAL_STORAGE'
+- `WRITE_EXTERNAL_STORAGE`: 'android.permission.WRITE_EXTERNAL_STORAGE'
+- `BLUETOOTH_CONNECT`: 'android.permission.BLUETOOTH_CONNECT'
+- `BLUETOOTH_SCAN`: 'android.permission.BLUETOOTH_SCAN'
+- `BLUETOOTH_ADVERTISE`: 'android.permission.BLUETOOTH_ADVERTISE'
+- `ACCESS_MEDIA_LOCATION`: 'android.permission.ACCESS_MEDIA_LOCATION'
+- `ACCEPT_HANDOVER`: 'android.permission.ACCEPT_HANDOVER'
+- `ACTIVITY_RECOGNITION`: 'android.permission.ACTIVITY_RECOGNITION'
+- `ANSWER_PHONE_CALLS`: 'android.permission.ANSWER_PHONE_CALLS'
+- `READ_PHONE_NUMBERS`: 'android.permission.READ_PHONE_NUMBERS'
+- `UWB_RANGING`: 'android.permission.UWB_RANGING'
+- `BODY_SENSORS_BACKGROUND`: 'android.permission.BODY_SENSORS_BACKGROUND'
+- `READ_MEDIA_IMAGES`: 'android.permission.READ_MEDIA_IMAGES'
+- `READ_MEDIA_VIDEO`: 'android.permission.READ_MEDIA_VIDEO'
+- `READ_MEDIA_AUDIO`: 'android.permission.READ_MEDIA_AUDIO'
+- `POST_NOTIFICATIONS`: 'android.permission.POST_NOTIFICATIONS'
+- `NEARBY_WIFI_DEVICES`: 'android.permission.NEARBY_WIFI_DEVICES'
+- `READ_VOICEMAIL`: 'com.android.voicemail.permission.READ_VOICEMAIL',
+- `WRITE_VOICEMAIL`: 'com.android.voicemail.permission.WRITE_VOICEMAIL',
+
+### Result strings for requesting permissions
+
+Available as constants under `PermissionsAndroid.RESULTS`:
+
+- `GRANTED`: 'granted'
+- `DENIED`: 'denied'
+- `NEVER_ASK_AGAIN`: 'never_ask_again'
+
+---
+
+# Reference
+
+## Methods
+
+### `check()`
+
+```tsx
+static check(permission: Permission): Promise;
+```
+
+Returns a promise resolving to a boolean value as to whether the specified permissions has been granted.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ---------- | ------ | -------- | ---------------------------- |
+| permission | string | Yes | The permission to check for. |
+
+---
+
+### `request()`
+
+```tsx
+static request(
+ permission: Permission,
+ rationale?: Rationale,
+): Promise;
+```
+
+Prompts the user to enable a permission and returns a promise resolving to a string value (see result strings above) indicating whether the user allowed or denied the request or does not want to be asked again.
+
+If `rationale` is provided, this function checks with the OS whether it is necessary to show a dialog explaining why the permission is needed (https://developer.android.com/training/permissions/requesting.html#explain) and then shows the system permission dialog.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ---------- | ------ | -------- | -------------------------- |
+| permission | string | Yes | The permission to request. |
+| rationale | object | No | See `rationale` below. |
+
+**Rationale:**
+
+| Name | Type | Required | Description |
+| -------------- | ------ | -------- | -------------------------------- |
+| title | string | Yes | The title of the dialog. |
+| message | string | Yes | The message of the dialog. |
+| buttonPositive | string | Yes | The text of the positive button. |
+| buttonNegative | string | No | The text of the negative button. |
+| buttonNeutral | string | No | The text of the neutral button. |
+
+---
+
+### `requestMultiple()`
+
+```tsx
+static requestMultiple(
+ permissions: Permission[],
+): Promise<{[key in Permission]: PermissionStatus}>;
+```
+
+Prompts the user to enable multiple permissions in the same dialog and returns an object with the permissions as keys and strings as values (see result strings above) indicating whether the user allowed or denied the request or does not want to be asked again.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----------- | ----- | -------- | -------------------------------- |
+| permissions | array | Yes | Array of permissions to request. |
diff --git a/website/versioned_docs/version-0.73.0/pixelratio.md b/website/versioned_docs/version-0.73.0/pixelratio.md
new file mode 100644
index 00000000000..6215d7bf501
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/pixelratio.md
@@ -0,0 +1,168 @@
+---
+id: pixelratio
+title: PixelRatio
+---
+
+`PixelRatio` gives you access to the device's pixel density and font scale.
+
+## Fetching a correctly sized image
+
+You should get a higher resolution image if you are on a high pixel density device. A good rule of thumb is to multiply the size of the image you display by the pixel ratio.
+
+```tsx
+const image = getImage({
+ width: PixelRatio.getPixelSizeForLayoutSize(200),
+ height: PixelRatio.getPixelSizeForLayoutSize(100),
+});
+;
+```
+
+## Pixel grid snapping
+
+In iOS, you can specify positions and dimensions for elements with arbitrary precision, for example 29.674825. But, ultimately the physical display only have a fixed number of pixels, for example 640×1136 for iPhone SE (1st generation) or 828×1792 for iPhone 11. iOS tries to be as faithful as possible to the user value by spreading one original pixel into multiple ones to trick the eye. The downside of this technique is that it makes the resulting element look blurry.
+
+In practice, we found out that developers do not want this feature and they have to work around it by doing manual rounding in order to avoid having blurry elements. In React Native, we are rounding all the pixels automatically.
+
+We have to be careful when to do this rounding. You never want to work with rounded and unrounded values at the same time as you're going to accumulate rounding errors. Having even one rounding error is deadly because a one pixel border may vanish or be twice as big.
+
+In React Native, everything in JavaScript and within the layout engine works with arbitrary precision numbers. It's only when we set the position and dimensions of the native element on the main thread that we round. Also, rounding is done relative to the root rather than the parent, again to avoid accumulating rounding errors.
+
+## Example
+
+```SnackPlayer name=PixelRatio%20Example
+import React from 'react';
+import {
+ Image,
+ PixelRatio,
+ ScrollView,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const size = 50;
+const cat = {
+ uri: 'https://reactnative.dev/docs/assets/p_cat1.png',
+ width: size,
+ height: size,
+};
+
+const App = () => (
+
+
+ Current Pixel Ratio is:
+ {PixelRatio.get()}
+
+
+ Current Font Scale is:
+ {PixelRatio.getFontScale()}
+
+
+ On this device images with a layout width of
+ {size} px
+
+
+
+ require images with a pixel width of
+
+ {PixelRatio.getPixelSizeForLayoutSize(size)} px
+
+
+
+
+);
+
+const styles = StyleSheet.create({
+ scrollContainer: {
+ flex: 1,
+ },
+ container: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ value: {
+ fontSize: 24,
+ marginBottom: 12,
+ marginTop: 4,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `get()`
+
+```tsx
+static get(): number;
+```
+
+Returns the device pixel density. Some examples:
+
+- `PixelRatio.get() === 1`
+ - [mdpi Android devices](https://material.io/tools/devices/)
+- `PixelRatio.get() === 1.5`
+ - [hdpi Android devices](https://material.io/tools/devices/)
+- `PixelRatio.get() === 2`
+ - iPhone SE, 6S, 7, 8
+ - iPhone XR
+ - iPhone 11
+ - [xhdpi Android devices](https://material.io/tools/devices/)
+- `PixelRatio.get() === 3`
+ - iPhone 6S Plus, 7 Plus, 8 Plus
+ - iPhone X, XS, XS Max
+ - iPhone 11 Pro, 11 Pro Max
+ - Pixel, Pixel 2
+ - [xxhdpi Android devices](https://material.io/tools/devices/)
+- `PixelRatio.get() === 3.5`
+ - Nexus 6
+ - Pixel XL, Pixel 2 XL
+ - [xxxhdpi Android devices](https://material.io/tools/devices/)
+
+---
+
+### `getFontScale()`
+
+```tsx
+static getFontScale(): number;
+```
+
+Returns the scaling factor for font sizes. This is the ratio that is used to calculate the absolute font size, so any elements that heavily depend on that should use this to do calculations.
+
+- on Android value reflects the user preference set in **Settings > Display > Font size**
+- on iOS value reflects the user preference set in **Settings > Display & Brightness > Text Size**, value can also be updated in **Settings > Accessibility > Display & Text Size > Larger Text**
+
+If a font scale is not set, this returns the device pixel ratio.
+
+---
+
+### `getPixelSizeForLayoutSize()`
+
+```tsx
+static getPixelSizeForLayoutSize(layoutSize: number): number;
+```
+
+Converts a layout size (dp) to pixel size (px).
+
+Guaranteed to return an integer number.
+
+---
+
+### `roundToNearestPixel()`
+
+```tsx
+static roundToNearestPixel(layoutSize: number): number;
+```
+
+Rounds a layout size (dp) to the nearest layout size that corresponds to an integer number of pixels. For example, on a device with a PixelRatio of 3, `PixelRatio.roundToNearestPixel(8.4) = 8.33`, which corresponds to exactly (8.33 \* 3) = 25 pixels.
diff --git a/website/versioned_docs/version-0.73.0/platform-specific-code.md b/website/versioned_docs/version-0.73.0/platform-specific-code.md
new file mode 100644
index 00000000000..758c6b86202
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/platform-specific-code.md
@@ -0,0 +1,138 @@
+---
+id: platform-specific-code
+title: Platform-Specific Code
+---
+
+When building a cross-platform app, you'll want to re-use as much code as possible. Scenarios may arise where it makes sense for the code to be different, for example you may want to implement separate visual components for Android and iOS.
+
+React Native provides two ways to organize your code and separate it by platform:
+
+- Using the [`Platform` module](platform-specific-code.md#platform-module).
+- Using [platform-specific file extensions](platform-specific-code.md#platform-specific-extensions).
+
+Certain components may have properties that work on one platform only. All of these props are annotated with `@platform` and have a small badge next to them on the website.
+
+## Platform module
+
+React Native provides a module that detects the platform in which the app is running. You can use the detection logic to implement platform-specific code. Use this option when only small parts of a component are platform-specific.
+
+```tsx
+import {Platform, StyleSheet} from 'react-native';
+
+const styles = StyleSheet.create({
+ height: Platform.OS === 'ios' ? 200 : 100,
+});
+```
+
+`Platform.OS` will be `ios` when running on iOS and `android` when running on Android.
+
+There is also a `Platform.select` method available, that given an object where keys can be one of `'ios' | 'android' | 'native' | 'default'`, returns the most fitting value for the platform you are currently running on. That is, if you're running on a phone, `ios` and `android` keys will take preference. If those are not specified, `native` key will be used and then the `default` key.
+
+```tsx
+import {Platform, StyleSheet} from 'react-native';
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ ...Platform.select({
+ ios: {
+ backgroundColor: 'red',
+ },
+ android: {
+ backgroundColor: 'green',
+ },
+ default: {
+ // other platforms, web for example
+ backgroundColor: 'blue',
+ },
+ }),
+ },
+});
+```
+
+This will result in a container having `flex: 1` on all platforms, a red background color on iOS, a green background color on Android, and a blue background color on other platforms.
+
+Since it accepts `any` value, you can also use it to return platform-specific components, like below:
+
+```tsx
+const Component = Platform.select({
+ ios: () => require('ComponentIOS'),
+ android: () => require('ComponentAndroid'),
+})();
+
+;
+```
+
+```tsx
+const Component = Platform.select({
+ native: () => require('ComponentForNative'),
+ default: () => require('ComponentForWeb'),
+})();
+
+;
+```
+
+### Detecting the Android version
+
+On Android, the `Platform` module can also be used to detect the version of the Android Platform in which the app is running:
+
+```tsx
+import {Platform} from 'react-native';
+
+if (Platform.Version === 25) {
+ console.log('Running on Nougat!');
+}
+```
+
+**Note**: `Version` is set to the Android API version not the Android OS version. To find a mapping please refer to [Android Version History](https://en.wikipedia.org/wiki/Android_version_history#Overview).
+
+### Detecting the iOS version
+
+On iOS, the `Version` is a result of `-[UIDevice systemVersion]`, which is a string with the current version of the operating system. An example of the system version is "10.3". For example, to detect the major version number on iOS:
+
+```tsx
+import {Platform} from 'react-native';
+
+const majorVersionIOS = parseInt(Platform.Version, 10);
+if (majorVersionIOS <= 9) {
+ console.log('Work around a change in behavior');
+}
+```
+
+## Platform-specific extensions
+
+When your platform-specific code is more complex, you should consider splitting the code out into separate files. React Native will detect when a file has a `.ios.` or `.android.` extension and load the relevant platform file when required from other components.
+
+For example, say you have the following files in your project:
+
+```shell
+BigButton.ios.js
+BigButton.android.js
+```
+
+You can then import the component as follows:
+
+```tsx
+import BigButton from './BigButton';
+```
+
+React Native will automatically pick up the right file based on the running platform.
+
+## Native-specific extensions (i.e. sharing code with NodeJS and Web)
+
+You can also use the `.native.js` extension when a module needs to be shared between NodeJS/Web and React Native but it has no Android/iOS differences. This is especially useful for projects that have common code shared among React Native and ReactJS.
+
+For example, say you have the following files in your project:
+
+```shell
+Container.js # picked up by webpack, Rollup or any other Web bundler
+Container.native.js # picked up by the React Native bundler for both Android and iOS (Metro)
+```
+
+You can still import it without the `.native` extension, as follows:
+
+```tsx
+import Container from './Container';
+```
+
+**Pro tip:** Configure your Web bundler to ignore `.native.js` extensions in order to avoid having unused code in your production bundle, thus reducing the final bundle size.
diff --git a/website/versioned_docs/version-0.73.0/platform.md b/website/versioned_docs/version-0.73.0/platform.md
new file mode 100644
index 00000000000..5525d43401d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/platform.md
@@ -0,0 +1,224 @@
+---
+id: platform
+title: Platform
+---
+
+## Example
+
+```SnackPlayer name=Platform%20API%20Example&supportedPlatforms=ios,android
+import React from 'react';
+import {Platform, StyleSheet, Text, ScrollView} from 'react-native';
+
+const App = () => {
+ return (
+
+ OS
+ {Platform.OS}
+ OS Version
+ {Platform.Version}
+ isTV
+ {Platform.isTV.toString()}
+ {Platform.OS === 'ios' && (
+ <>
+ isPad
+ {Platform.isPad.toString()}
+ >
+ )}
+ Constants
+
+ {JSON.stringify(Platform.constants, null, 2)}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ value: {
+ fontWeight: '600',
+ padding: 4,
+ marginBottom: 8,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Properties
+
+### `constants`
+
+```tsx
+static constants: PlatformConstants;
+```
+
+Returns an object which contains all available common and specific constants related to the platform.
+
+**Properties:**
+
+|
Name
| Type | Optional | Description |
+| --------------------------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| isTesting | boolean | No | |
+| reactNativeVersion | object | No | Information about React Native version. Keys are `major`, `minor`, `patch` with optional `prerelease` and values are `number`s. |
+| Version
Android
| number | No | OS version constant specific to Android. |
+| Release
Android
| string | No | |
+| Serial
Android
| string | No | Hardware serial number of an Android device. |
+| Fingerprint
Android
| string | No | A string that uniquely identifies the build. |
+| Model
Android
| string | No | The end-user-visible name for the Android device. |
+| Brand
Android
| string | No | The consumer-visible brand with which the product/hardware will be associated. |
+| Manufacturer
Android
| string | No | The manufacturer of the Android device. |
+| ServerHost
Android
| string | Yes | |
+| uiMode
Android
| string | No | Possible values are: `'car'`, `'desk'`, `'normal'`,`'tv'`, `'watch'` and `'unknown'`. Read more about [Android ModeType](https://developer.android.com/reference/android/app/UiModeManager.html). |
+| forceTouchAvailable
iOS
| boolean | No | Indicate the availability of 3D Touch on a device. |
+| interfaceIdiom
iOS
| string | No | The interface type for the device. Read more about [UIUserInterfaceIdiom](https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom). |
+| osVersion
iOS
| string | No | OS version constant specific to iOS. |
+| systemName
iOS
| string | No | OS name constant specific to iOS. |
+
+---
+
+### `isPad`
iOS
+
+```tsx
+static isPad: boolean;
+```
+
+Returns a boolean which defines if device is an iPad.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `isTV`
+
+```tsx
+static isTV: boolean;
+```
+
+Returns a boolean which defines if device is a TV.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `isTesting`
+
+```tsx
+static isTesting: boolean;
+```
+
+Returns a boolean which defines if application is running in Developer Mode with testing flag set.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `OS`
+
+```tsx
+static OS: 'android' | 'ios';
+```
+
+Returns string value representing the current OS.
+
+| Type |
+| -------------------------- |
+| enum(`'android'`, `'ios'`) |
+
+---
+
+### `Version`
+
+```tsx
+static Version: 'number' | 'string';
+```
+
+Returns the version of the OS.
+
+| Type |
+| ---------------------------------------------------------------------------------------------------- |
+| number
Android
string
iOS
|
+
+## Methods
+
+### `select()`
+
+```tsx
+static select(config: Record): T;
+```
+
+Returns the most fitting value for the platform you are currently running on.
+
+#### Parameters:
+
+| Name | Type | Required | Description |
+| ------ | ------ | -------- | ----------------------------- |
+| config | object | Yes | See config description below. |
+
+Select method returns the most fitting value for the platform you are currently running on. That is, if you're running on a phone, `android` and `ios` keys will take preference. If those are not specified, `native` key will be used and then the `default` key.
+
+The `config` parameter is an object with the following keys:
+
+- `android` (any)
+- `ios` (any)
+- `native` (any)
+- `default` (any)
+
+**Example usage:**
+
+```tsx
+import {Platform, StyleSheet} from 'react-native';
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ ...Platform.select({
+ android: {
+ backgroundColor: 'green',
+ },
+ ios: {
+ backgroundColor: 'red',
+ },
+ default: {
+ // other platforms, web for example
+ backgroundColor: 'blue',
+ },
+ }),
+ },
+});
+```
+
+This will result in a container having `flex: 1` on all platforms, a green background color on Android, a red background color on iOS, and a blue background color on other platforms.
+
+Since the value of the corresponding platform key can be of type `any`, [`select`](platform.md#select) method can also be used to return platform-specific components, like below:
+
+```tsx
+const Component = Platform.select({
+ ios: () => require('ComponentIOS'),
+ android: () => require('ComponentAndroid'),
+})();
+
+;
+```
+
+```tsx
+const Component = Platform.select({
+ native: () => require('ComponentForNative'),
+ default: () => require('ComponentForWeb'),
+})();
+
+;
+```
diff --git a/website/versioned_docs/version-0.73.0/platformcolor.md b/website/versioned_docs/version-0.73.0/platformcolor.md
new file mode 100644
index 00000000000..fe8a0386d1d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/platformcolor.md
@@ -0,0 +1,83 @@
+---
+id: platformcolor
+title: PlatformColor
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+```js
+PlatformColor(color1, [color2, ...colorN]);
+```
+
+You can use the `PlatformColor` function to access native colors on the target platform by supplying the native color’s corresponding string value. You pass a string to the `PlatformColor` function and, provided it exists on that platform, it will return the corresponding native color, which you can apply in any part of your application.
+
+If you pass more than one string value to the `PlatformColor` function, it will treat the first value as the default and the rest as fallback.
+
+```js
+PlatformColor('bogusName', 'linkColor');
+```
+
+Since native colors can be sensitive to themes and/or high contrast, this platform specific logic also translates inside your components.
+
+### Supported colors
+
+For a full list of the types of system colors supported, see:
+
+- Android:
+ - [R.attr](https://developer.android.com/reference/android/R.attr) - `?attr` prefix
+ - [R.color](https://developer.android.com/reference/android/R.color) - `@android:color` prefix
+- iOS (Objective-C and Swift notations):
+ - [UIColor Standard Colors](https://developer.apple.com/documentation/uikit/uicolor/standard_colors)
+ - [UIColor UI Element Colors](https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors)
+
+#### Developer notes
+
+
+
+
+
+> If you’re familiar with design systems, another way of thinking about this is that `PlatformColor` lets you tap into the local design system's color tokens so your app can blend right in!
+
+
+
+
+## Example
+
+```SnackPlayer name=PlatformColor%20Example&supportedPlatforms=android,ios
+import React from 'react';
+import {Platform, PlatformColor, StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+ I am a special label color!
+
+);
+
+const styles = StyleSheet.create({
+ label: {
+ padding: 16,
+ ...Platform.select({
+ ios: {
+ color: PlatformColor('label'),
+ backgroundColor: PlatformColor('systemTealColor'),
+ },
+ android: {
+ color: PlatformColor('?android:attr/textColor'),
+ backgroundColor: PlatformColor('@android:color/holo_blue_bright'),
+ },
+ default: {color: 'black'},
+ }),
+ },
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+
+export default App;
+```
+
+The string value provided to the `PlatformColor` function must match the string as it exists on the native platform where the app is running. In order to avoid runtime errors, the function should be wrapped in a platform check, either through a `Platform.OS === 'platform'` or a `Platform.select()`, as shown on the example above.
+
+> **Note:** You can find a complete example that demonstrates proper, intended use of `PlatformColor` in [PlatformColorExample.js](https://github.com/facebook/react-native/blob/main/packages/rn-tester/js/examples/PlatformColor/PlatformColorExample.js).
diff --git a/website/versioned_docs/version-0.73.0/pressable.md b/website/versioned_docs/version-0.73.0/pressable.md
new file mode 100644
index 00000000000..761cc7e2fa7
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/pressable.md
@@ -0,0 +1,253 @@
+---
+id: pressable
+title: Pressable
+---
+
+Pressable is a Core Component wrapper that can detect various stages of press interactions on any of its defined children.
+
+```tsx
+
+ I'm pressable!
+
+```
+
+## How it works
+
+On an element wrapped by `Pressable`:
+
+- [`onPressIn`](#onpressin) is called when a press is activated.
+- [`onPressOut`](#onpressout) is called when the press gesture is deactivated.
+
+After pressing [`onPressIn`](#onpressin), one of two things will happen:
+
+1. The person will remove their finger, triggering [`onPressOut`](#onpressout) followed by [`onPress`](#onpress).
+2. If the person leaves their finger longer than 500 milliseconds before removing it, [`onLongPress`](#onlongpress) is triggered. ([`onPressOut`](#onpressout) will still fire when they remove their finger.)
+
+
+
+Fingers are not the most precise instruments, and it is common for users to accidentally activate the wrong element or miss the activation area. To help, `Pressable` has an optional `HitRect` you can use to define how far a touch can register away from the wrapped element. Presses can start anywhere within a `HitRect`.
+
+`PressRect` allows presses to move beyond the element and its `HitRect` while maintaining activation and being eligible for a "press"—think of sliding your finger slowly away from a button you're pressing down on.
+
+> The touch area never extends past the parent view bounds and the Z-index of sibling views always takes precedence if a touch hits two overlapping views.
+
+
+
+
+ You can set HitRect with hitSlop and set PressRect with pressRetentionOffset.
+
+
+
+> `Pressable` uses React Native's `Pressability` API. For more information around the state machine flow of Pressability and how it works, check out the implementation for [Pressability](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Pressability/Pressability.js#L350).
+
+## Example
+
+```SnackPlayer name=Pressable
+import React, {useState} from 'react';
+import {Pressable, StyleSheet, Text, View} from 'react-native';
+
+const App = () => {
+ const [timesPressed, setTimesPressed] = useState(0);
+
+ let textLog = '';
+ if (timesPressed > 1) {
+ textLog = timesPressed + 'x onPress';
+ } else if (timesPressed > 0) {
+ textLog = 'onPress';
+ }
+
+ return (
+
+ {
+ setTimesPressed(current => current + 1);
+ }}
+ style={({pressed}) => [
+ {
+ backgroundColor: pressed ? 'rgb(210, 230, 255)' : 'white',
+ },
+ styles.wrapperCustom,
+ ]}>
+ {({pressed}) => (
+ {pressed ? 'Pressed!' : 'Press Me'}
+ )}
+
+
+ {textLog}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ text: {
+ fontSize: 16,
+ },
+ wrapperCustom: {
+ borderRadius: 8,
+ padding: 6,
+ },
+ logBox: {
+ padding: 20,
+ margin: 10,
+ borderWidth: StyleSheet.hairlineWidth,
+ borderColor: '#f0f0f0',
+ backgroundColor: '#f9f9f9',
+ },
+});
+
+export default App;
+```
+
+## Props
+
+### `android_disableSound`
Android
+
+If true, doesn't play Android system sound on press.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+### `android_ripple`
Android
+
+Enables the Android ripple effect and configures its properties.
+
+| Type |
+| -------------------------------------- |
+| [RippleConfig](pressable#rippleconfig) |
+
+### `children`
+
+Either children or a function that receives a boolean reflecting whether the component is currently pressed.
+
+| Type |
+| ------------------------ |
+| [React Node](react-node) |
+
+### `unstable_pressDelay`
+
+Duration (in milliseconds) to wait after press down before calling `onPressIn`.
+
+| Type |
+| ------ |
+| number |
+
+### `delayLongPress`
+
+Duration (in milliseconds) from `onPressIn` before `onLongPress` is called.
+
+| Type | Default |
+| ------ | ------- |
+| number | `500` |
+
+### `disabled`
+
+Whether the press behavior is disabled.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+### `hitSlop`
+
+Sets additional distance outside of element in which a press can be detected.
+
+| Type |
+| ---------------------- |
+| [Rect](rect) or number |
+
+### `onHoverIn`
+
+Called when the hover is activated to provide visual feedback.
+
+| Type |
+| --------------------------------------------------------------------------------------------------------- |
+| `md ({ nativeEvent: [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) }) => void` |
+
+### `onHoverOut`
+
+Called when the hover is deactivated to undo visual feedback.
+
+| Type |
+| --------------------------------------------------------------------------------------------------------- |
+| `md ({ nativeEvent: [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) }) => void` |
+
+### `onLongPress`
+
+Called if the time after `onPressIn` lasts longer than 500 milliseconds. This time period can be customized with [`delayLongPress`](#delaylongpress).
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+### `onPress`
+
+Called after `onPressOut`.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+### `onPressIn`
+
+Called immediately when a touch is engaged, before `onPressOut` and `onPress`.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+### `onPressOut`
+
+Called when a touch is released.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+### `pressRetentionOffset`
+
+Additional distance outside of this view in which a touch is considered a press before `onPressOut` is triggered.
+
+| Type | Default |
+| ---------------------- | -------------------------------------------- |
+| [Rect](rect) or number | `{bottom: 30, left: 20, right: 20, top: 20}` |
+
+### `style`
+
+Either view styles or a function that receives a boolean reflecting whether the component is currently pressed and returns view styles.
+
+| Type |
+| ------------------------------ |
+| [View Style](view-style-props) |
+
+### `testOnly_pressed`
+
+Used only for documentation or testing (e.g. snapshot testing).
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+## Type Definitions
+
+### RippleConfig
+
+Ripple effect configuration for the `android_ripple` property.
+
+| Type |
+| ------ |
+| object |
+
+**Properties:**
+
+| Name | Type | Required | Description |
+| ---------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| color | [color](colors) | No | Defines the color of the ripple effect. |
+| borderless | boolean | No | Defines if ripple effect should not include border. |
+| radius | number | No | Defines the radius of the ripple effect. |
+| foreground | boolean | No | Set to true to add the ripple effect to the foreground of the view, instead of the background. This is useful if one of your child views has a background of its own, or you're e.g. displaying images, and you don't want the ripple to be covered by them. |
diff --git a/website/versioned_docs/version-0.73.0/pressevent.md b/website/versioned_docs/version-0.73.0/pressevent.md
new file mode 100644
index 00000000000..b7ec5a5d4ef
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/pressevent.md
@@ -0,0 +1,118 @@
+---
+id: pressevent
+title: PressEvent Object Type
+---
+
+`PressEvent` object is returned in the callback as a result of user press interaction, for example `onPress` in [Button](button) component.
+
+## Example
+
+```js
+{
+ changedTouches: [PressEvent],
+ identifier: 1,
+ locationX: 8,
+ locationY: 4.5,
+ pageX: 24,
+ pageY: 49.5,
+ target: 1127,
+ timestamp: 85131876.58868201,
+ touches: []
+}
+```
+
+## Keys and values
+
+### `changedTouches`
+
+Array of all PressEvents that have changed since the last event.
+
+| Type | Optional |
+| -------------------- | -------- |
+| array of PressEvents | No |
+
+### `force`
iOS
+
+Amount of force used during the 3D Touch press. Returns the float value in range from `0.0` to `1.0`.
+
+| Type | Optional |
+| ------ | -------- |
+| number | Yes |
+
+### `identifier`
+
+Unique numeric identifier assigned to the event.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `locationX`
+
+Touch origin X coordinate inside touchable area (relative to the element).
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `locationY`
+
+Touch origin Y coordinate inside touchable area (relative to the element).
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `pageX`
+
+Touch origin X coordinate on the screen (relative to the root view).
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `pageY`
+
+Touch origin Y coordinate on the screen (relative to the root view).
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `target`
+
+The node id of the element receiving the PressEvent.
+
+| Type | Optional |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+### `timestamp`
+
+Timestamp value when a PressEvent occurred. Value is represented in milliseconds.
+
+| Type | Optional |
+| ------ | -------- |
+| number | No |
+
+### `touches`
+
+Array of all current PressEvents on the screen.
+
+| Type | Optional |
+| -------------------- | -------- |
+| array of PressEvents | No |
+
+## Used by
+
+- [`Button`](button)
+- [`PanResponder`](panresponder)
+- [`Pressable`](pressable)
+- [`ScrollView`](scrollview)
+- [`Text`](text)
+- [`TextInput`](textinput)
+- [`TouchableHighlight`](touchablenativefeedback)
+- [`TouchableOpacity`](touchablewithoutfeedback)
+- [`TouchableNativeFeedback`](touchablenativefeedback)
+- [`TouchableWithoutFeedback`](touchablewithoutfeedback)
+- [`View`](view)
diff --git a/website/versioned_docs/version-0.73.0/profile-hermes.md b/website/versioned_docs/version-0.73.0/profile-hermes.md
new file mode 100644
index 00000000000..0a0c78dfdeb
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/profile-hermes.md
@@ -0,0 +1,137 @@
+---
+id: profile-hermes
+title: Profiling with Hermes
+---
+
+You can visualize JavaScript's performance in a React Native app using [Hermes](https://github.com/facebook/hermes). Hermes is a small and lightweight JavaScript engine optimized for running React Native on Android (you can [read more about using it with React Native here](hermes). Hermes helps improve app performance and also exposes ways to analyze the performance of the JavaScript that it runs.
+
+In this section, you will learn how to profile your React Native app running on Hermes and how to visualize the profile using [the Performance tab on Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference)
+
+:::caution
+Be sure to [enable Hermes in your app](Hermes) before you get started!
+:::
+
+Follow the instructions below to get started profiling:
+
+1. [Record a Hermes sampling profile](profile-hermes.md#record-a-hermes-sampling-profile)
+2. [Execute command from CLI](profile-hermes.md#execute-command-from-cli)
+3. [Open the downloaded profile on Chrome DevTools](profile-hermes.md#open-the-downloaded-profile-on-chrome-devtools)
+
+## Record a Hermes sampling profile
+
+To record a sampling profiler from the Dev Menu:
+
+1. Navigate to your running Metro server terminal.
+2. Press `d` to open the **Dev Menu.**
+3. Select **Enable Sampling Profiler.**
+4. Execute your JavaScript by in your app (press buttons, etc.)
+5. Open the **Dev Menu** by pressing `d` again.
+6. Select **Disable Sampling Profiler** to stop recording and save the sampling profiler.
+
+A toast will show the location where the sampling profiler has been saved, usually in `/data/user/0/com.appName/cache/*.cpuprofile`
+
+
+
+## Execute command from CLI
+
+You can use the [React Native CLI](https://github.com/react-native-community/cli) to convert the Hermes tracing profile to Chrome tracing profile, and then pull it to your local machine using:
+
+```sh
+npx react-native profile-hermes [destinationDir]
+```
+
+### Enabling source map
+
+:::info
+You may read about source maps on the [Debugging Release Builds](debugging-release-builds.md) page.
+:::
+
+### Common errors
+
+#### `adb: no devices/emulators found` or `adb: device offline`
+
+- **Why this happens** The CLI cannot access the device or emulator (through adb) you are using to run the app.
+- **How to fix** Make sure your Android device/emulator is connected and running. The command only works when it can access adb.
+
+#### `There is no file in the cache/ directory`
+
+- **Why this happens** The CLI cannot find any **.cpuprofile** file in your app's **cache/** directory. You might have forgotten to record a profile from the device.
+- **How to fix** Follow the [instructions](profile-hermes.md#record-a-hermes-sampling-profile) to enable/disable profiler from device.
+
+#### `Error: your_profile_name.cpuprofile is an empty file`
+
+- **Why this happens** The profile is empty, it might be because Hermes is not running correctly.
+- **How to fix** Make sure your app is running on the latest version of Hermes.
+
+## Open the downloaded profile in Chrome DevTools
+
+To open the profile in Chrome DevTools:
+
+1. Open Chrome DevTools.
+2. Select the **Performance** tab.
+3. Right click and choose **Load profile...**
+
+
+
+## How does the Hermes Profile Transformer work?
+
+The Hermes Sample Profile is of the `JSON object format`, while the format that Google's DevTools supports is `JSON Array Format`. (More information about the formats can be found on the [Trace Event Format Document](https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview))
+
+```ts
+export interface HermesCPUProfile {
+ traceEvents: SharedEventProperties[];
+ samples: HermesSample[];
+ stackFrames: {[key in string]: HermesStackFrame};
+}
+```
+
+The Hermes profile has most of its information encoded into the `samples` and `stackFrames` properties. Each sample is a snapshot of the function call stack at that particular timestamp as each sample has a `sf` property which corresponds to a function call.
+
+```ts
+export interface HermesSample {
+ cpu: string;
+ name: string;
+ ts: string;
+ pid: number;
+ tid: string;
+ weight: string;
+ /**
+ * Will refer to an element in the stackFrames object of the Hermes Profile
+ */
+ sf: number;
+ stackFrameData?: HermesStackFrame;
+}
+```
+
+The information about a function call can be found in `stackFrames` which contains key-object pairs, where the key is the `sf` number and the corresponding object gives us all the relevant information about the function including the `sf` number of its parent function. This parent-child relationship can be traced upwards to find the information of all the functions running at a particular timestamp.
+
+```ts
+export interface HermesStackFrame {
+ line: string;
+ column: string;
+ funcLine: string;
+ funcColumn: string;
+ name: string;
+ category: string;
+ /**
+ * A parent function may or may not exist
+ */
+ parent?: number;
+}
+```
+
+At this point, you should define a few more terms, namely:
+
+1. Nodes: The objects corresponding to `sf` numbers in `stackFrames`
+2. Active Nodes: The nodes which are currently running at a particular timestamp. A node is classified as running if its `sf` number is in the function call stack. This call stack can be obtained from the `sf` number of the sample and tracing upwards till parent `sf`s are available
+
+The `samples` and the `stackFrames` in tandem can then be used to generate all the start and end events at the corresponding timestamps, wherein:
+
+1. Start Nodes/Events: Nodes absent in the previous sample's function call stack but present in the current sample's.
+2. End Nodes/Events: Nodes present in the previous sample's function call stack but absent in the current sample's.
+
+
+
+You can now construct a `flamechart` of function calls as you have all the function information including its start and end timestamps.
+
+The `hermes-profile-transformer` can convert any profile generated using Hermes into a format that can be directly displayed in Chrome DevTools. More information about this can be found on [ `@react-native-community/hermes-profile-transformer` ](https://github.com/react-native-community/hermes-profile-transformer)
diff --git a/website/versioned_docs/version-0.73.0/profiling.md b/website/versioned_docs/version-0.73.0/profiling.md
new file mode 100644
index 00000000000..c2e3a340d30
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/profiling.md
@@ -0,0 +1,146 @@
+---
+id: profiling
+title: Profiling
+---
+
+Use the built-in profiler to get detailed information about work done in the JavaScript thread and main thread side-by-side. Access it by selecting Perf Monitor from the Debug menu.
+
+For iOS, Instruments is an invaluable tool, and on Android you should learn to use [`systrace`](profiling.md#profiling-android-ui-performance-with-systrace).
+
+But first, [**make sure that Development Mode is OFF!**](performance.md#running-in-development-mode-devtrue) You should see `__DEV__ === false, development-level warning are OFF, performance optimizations are ON` in your application logs.
+
+Another way to profile JavaScript is to use the Chrome profiler while debugging. This won't give you accurate results as the code is running in Chrome but will give you a general idea of where bottlenecks might be. Run the profiler under Chrome's `Performance` tab. A flame graph will appear under `User Timing`. To view more details in tabular format, click at the `Bottom Up` tab below and then select `DedicatedWorker Thread` at the top left menu.
+
+## Profiling Android UI Performance with `systrace`
+
+Android supports 10k+ different phones and is generalized to support software rendering: the framework architecture and need to generalize across many hardware targets unfortunately means you get less for free relative to iOS. But sometimes, there are things you can improve -- and many times it's not native code's fault at all!
+
+The first step for debugging this jank is to answer the fundamental question of where your time is being spent during each 16ms frame. For that, we'll be using a standard Android profiling tool called `systrace`.
+
+`systrace` is a standard Android marker-based profiling tool (and is installed when you install the Android platform-tools package). Profiled code blocks are surrounded by start/end markers which are then visualized in a colorful chart format. Both the Android SDK and React Native framework provide standard markers that you can visualize.
+
+### 1. Collecting a trace
+
+First, connect a device that exhibits the stuttering you want to investigate to your computer via USB and get it to the point right before the navigation/animation you want to profile. Run `systrace` as follows:
+
+```shell
+$ /platform-tools/systrace/systrace.py --time=10 -o trace.html sched gfx view -a
+```
+
+A quick breakdown of this command:
+
+- `time` is the length of time the trace will be collected in seconds
+- `sched`, `gfx`, and `view` are the android SDK tags (collections of markers) we care about: `sched` gives you information about what's running on each core of your phone, `gfx` gives you graphics info such as frame boundaries, and `view` gives you information about measure, layout, and draw passes
+- `-a ` enables app-specific markers, specifically the ones built into the React Native framework. `your_package_name` can be found in the `AndroidManifest.xml` of your app and looks like `com.example.app`
+
+Once the trace starts collecting, perform the animation or interaction you care about. At the end of the trace, systrace will give you a link to the trace which you can open in your browser.
+
+### 2. Reading the trace
+
+After opening the trace in your browser (preferably Chrome), you should see something like this:
+
+
+
+:::note Hint
+Use the WASD keys to strafe and zoom.
+:::
+
+If your trace .html file isn't opening correctly, check your browser console for the following:
+
+
+
+Since `Object.observe` was deprecated in recent browsers, you may have to open the file from the Google Chrome Tracing tool. You can do so by:
+
+- Opening tab in chrome chrome://tracing
+- Selecting load
+- Selecting the html file generated from the previous command.
+
+:::info Enable VSync highlighting
+Check this checkbox at the top right of the screen to highlight the 16ms frame boundaries:
+
+
+
+You should see zebra stripes as in the screenshot above. If you don't, try profiling on a different device: Samsung has been known to have issues displaying vsyncs while the Nexus series is generally pretty reliable.
+:::
+
+### 3. Find your process
+
+Scroll until you see (part of) the name of your package. In this case, I was profiling `com.facebook.adsmanager`, which shows up as `book.adsmanager` because of silly thread name limits in the kernel.
+
+On the left side, you'll see a set of threads which correspond to the timeline rows on the right. There are a few threads we care about for our purposes: the UI thread (which has your package name or the name UI Thread), `mqt_js`, and `mqt_native_modules`. If you're running on Android 5+, we also care about the Render Thread.
+
+- **UI Thread.** This is where standard android measure/layout/draw happens. The thread name on the right will be your package name (in my case book.adsmanager) or UI Thread. The events that you see on this thread should look something like this and have to do with `Choreographer`, `traversals`, and `DispatchUI`:
+
+ 
+
+- **JS Thread.** This is where JavaScript is executed. The thread name will be either `mqt_js` or `<...>` depending on how cooperative the kernel on your device is being. To identify it if it doesn't have a name, look for things like `JSCall`, `Bridge.executeJSCall`, etc:
+
+ 
+
+- **Native Modules Thread.** This is where native module calls (e.g. the `UIManager`) are executed. The thread name will be either `mqt_native_modules` or `<...>`. To identify it in the latter case, look for things like `NativeCall`, `callJavaModuleMethod`, and `onBatchComplete`:
+
+ 
+
+- **Bonus: Render Thread.** If you're using Android L (5.0) and up, you will also have a render thread in your application. This thread generates the actual OpenGL commands used to draw your UI. The thread name will be either `RenderThread` or `<...>`. To identify it in the latter case, look for things like `DrawFrame` and `queueBuffer`:
+
+ 
+
+## Identifying a culprit
+
+A smooth animation should look something like the following:
+
+
+
+Each change in color is a frame -- remember that in order to display a frame, all our UI work needs to be done by the end of that 16ms period. Notice that no thread is working close to the frame boundary. An application rendering like this is rendering at 60 FPS.
+
+If you noticed chop, however, you might see something like this:
+
+
+
+Notice that the JS thread is executing almost all the time, and across frame boundaries! This app is not rendering at 60 FPS. In this case, **the problem lies in JS**.
+
+You might also see something like this:
+
+
+
+In this case, the UI and render threads are the ones that have work crossing frame boundaries. The UI that we're trying to render on each frame is requiring too much work to be done. In this case, **the problem lies in the native views being rendered**.
+
+At this point, you'll have some very helpful information to inform your next steps.
+
+## Resolving JavaScript issues
+
+If you identified a JS problem, look for clues in the specific JS that you're executing. In the scenario above, we see `RCTEventEmitter` being called multiple times per frame. Here's a zoom-in of the JS thread from the trace above:
+
+
+
+This doesn't seem right. Why is it being called so often? Are they actually different events? The answers to these questions will probably depend on your product code. And many times, you'll want to look into [shouldComponentUpdate](https://reactjs.org/docs/react-component.html#shouldcomponentupdate).
+
+## Resolving native UI Issues
+
+If you identified a native UI problem, there are usually two scenarios:
+
+1. the UI you're trying to draw each frame involves too much work on the GPU, or
+2. You're constructing new UI during the animation/interaction (e.g. loading in new content during a scroll).
+
+### Too much GPU work
+
+In the first scenario, you'll see a trace that has the UI thread and/or Render Thread looking like this:
+
+
+
+Notice the long amount of time spent in `DrawFrame` that crosses frame boundaries. This is time spent waiting for the GPU to drain its command buffer from the previous frame.
+
+To mitigate this, you should:
+
+- investigate using `renderToHardwareTextureAndroid` for complex, static content that is being animated/transformed (e.g. the `Navigator` slide/alpha animations)
+- make sure that you are **not** using `needsOffscreenAlphaCompositing`, which is disabled by default, as it greatly increases the per-frame load on the GPU in most cases.
+
+### Creating new views on the UI thread
+
+In the second scenario, you'll see something more like this:
+
+
+
+Notice that first the JS thread thinks for a bit, then you see some work done on the native modules thread, followed by an expensive traversal on the UI thread.
+
+There isn't a quick way to mitigate this unless you're able to postpone creating new UI until after the interaction, or you are able to simplify the UI you're creating. The react native team is working on an infrastructure level solution for this that will allow new UI to be created and configured off the main thread, allowing the interaction to continue smoothly.
diff --git a/website/versioned_docs/version-0.73.0/progressbarandroid.md b/website/versioned_docs/version-0.73.0/progressbarandroid.md
new file mode 100644
index 00000000000..ba5ee781a2a
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/progressbarandroid.md
@@ -0,0 +1,129 @@
+---
+id: progressbarandroid
+title: '🚧 ProgressBarAndroid'
+---
+
+> **Deprecated.** Use one of the [community packages](https://reactnative.directory/?search=progressbar) instead.
+
+Android-only React component used to indicate that the app is loading or there is some activity in the app.
+
+### Example
+
+```SnackPlayer name=ProgressBarAndroid&supportedPlatforms=android
+import React from 'react';
+import {View, StyleSheet, ProgressBarAndroid, Text} from 'react-native';
+
+const App = () => {
+ return (
+
+
+ Circle Progress Indicator
+
+
+
+ Horizontal Progress Indicator
+
+
+
+ Colored Progress Indicator
+
+
+
+ Fixed Progress Value
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ example: {
+ marginVertical: 24,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view.md#props).
+
+### `animating`
+
+Whether to show the ProgressBar (true, the default) or hide it (false).
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
+
+---
+
+### `color`
+
+Color of the progress bar.
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+---
+
+### `indeterminate`
+
+If the progress bar will show indeterminate progress. Note that this can only be false if styleAttr is Horizontal, and requires a `progress` value.
+
+| Type | Required |
+| ----------------- | -------- |
+| indeterminateType | No |
+
+---
+
+### `progress`
+
+The progress value (between 0 and 1).
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `styleAttr`
+
+Style of the ProgressBar. One of:
+
+- Horizontal
+- Normal (default)
+- Small
+- Large
+- Inverse
+- SmallInverse
+- LargeInverse
+
+| Type | Required |
+| ----------------------------------------------------------------------------------------- | -------- |
+| enum('Horizontal', 'Normal', 'Small', 'Large', 'Inverse', 'SmallInverse', 'LargeInverse') | No |
+
+---
+
+### `testID`
+
+Used to locate this view in end-to-end tests.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
diff --git a/website/versioned_docs/version-0.73.0/progressviewios.md b/website/versioned_docs/version-0.73.0/progressviewios.md
new file mode 100644
index 00000000000..fd7839adac3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/progressviewios.md
@@ -0,0 +1,124 @@
+---
+id: progressviewios
+title: '🚧 ProgressViewIOS'
+---
+
+> **Removed.** Use one of the [community packages](https://reactnative.directory/?search=progressview) instead.
+
+Uses `ProgressViewIOS` to render a UIProgressView on iOS.
+
+### Example
+
+```SnackPlayer name=ProgressViewIOS&supportedPlatforms=ios&disableLinting=true
+import React from 'react';
+import {View, StyleSheet, ProgressViewIOS, Text} from 'react-native';
+
+const App = () => {
+ return (
+
+
+ Progress Bar - 0%
+
+
+
+ Colored Progress Bar - 50%
+
+
+
+ Progress Bar - 100%
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ example: {
+ marginVertical: 20,
+ },
+ progress: {
+ width: 200,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view.md#props).
+
+### `progress`
+
+The progress value (between 0 and 1).
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `progressImage`
+
+A stretchable image to display as the progress bar.
+
+| Type | Required |
+| ---------------------- | -------- |
+| Image.propTypes.source | No |
+
+---
+
+### `progressTintColor`
+
+The tint color of the progress bar itself.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
+
+---
+
+### `progressViewStyle`
+
+The progress bar style.
+
+| Type | Required |
+| ---------------------- | -------- |
+| enum('default', 'bar') | No |
+
+---
+
+### `trackImage`
+
+A stretchable image to display behind the progress bar.
+
+| Type | Required |
+| ---------------------- | -------- |
+| Image.propTypes.source | No |
+
+---
+
+### `trackTintColor`
+
+The tint color of the progress bar track.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
diff --git a/website/versioned_docs/version-0.73.0/props.md b/website/versioned_docs/version-0.73.0/props.md
new file mode 100644
index 00000000000..490eb214632
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/props.md
@@ -0,0 +1,99 @@
+---
+id: props
+title: Props
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Most components can be customized when they are created, with different parameters. These created parameters are called `props`, short for properties.
+
+For example, one basic React Native component is the `Image`. When you create an image, you can use a prop named `source` to control what image it shows.
+
+```SnackPlayer name=Props
+import React from 'react';
+import {Image} from 'react-native';
+
+const Bananas = () => {
+ let pic = {
+ uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg',
+ };
+ return (
+
+ );
+};
+
+export default Bananas;
+```
+
+Notice the braces surrounding `{pic}` - these embed the variable `pic` into JSX. You can put any JavaScript expression inside braces in JSX.
+
+Your own components can also use `props`. This lets you make a single component that is used in many different places in your app, with slightly different properties in each place by referring to `props` in your `render` function. Here's an example:
+
+
+
+
+```SnackPlayer name=Props&ext=js
+import React from 'react';
+import {Text, View} from 'react-native';
+
+const Greeting = props => {
+ return (
+
+ Hello {props.name}!
+
+ );
+};
+
+const LotsOfGreetings = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default LotsOfGreetings;
+```
+
+
+
+
+```SnackPlayer name=Props&ext=tsx
+import React from 'react';
+import {Text, View} from 'react-native';
+
+type GreetingProps = {
+ name: string;
+};
+
+const Greeting = (props: GreetingProps) => {
+ return (
+
+ Hello {props.name}!
+
+ );
+};
+
+const LotsOfGreetings = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default LotsOfGreetings;
+```
+
+
+
+
+Using `name` as a prop lets us customize the `Greeting` component, so we can reuse that component for each of our greetings. This example also uses the `Greeting` component in JSX, similar to the [Core Components](intro-react-native-components). The power to do this is what makes React so cool - if you find yourself wishing that you had a different set of UI primitives to work with, you can invent new ones.
+
+The other new thing going on here is the [`View`](view.md) component. A [`View`](view.md) is useful as a container for other components, to help control style and layout.
+
+With `props` and the basic [`Text`](text.md), [`Image`](image.md), and [`View`](view.md) components, you can build a wide variety of static screens. To learn how to make your app change over time, you need to [learn about State](state.md).
diff --git a/website/versioned_docs/version-0.73.0/publishing-to-app-store.md b/website/versioned_docs/version-0.73.0/publishing-to-app-store.md
new file mode 100644
index 00000000000..5b1b65764e5
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/publishing-to-app-store.md
@@ -0,0 +1,88 @@
+---
+id: publishing-to-app-store
+title: Publishing to Apple App Store
+---
+
+The publishing process is the same as any other native iOS app, with some additional considerations to take into account.
+
+:::info
+If you are using Expo, read the Expo guide for [Deploying to App Stores](https://docs.expo.dev/distribution/app-stores/) to build and submit your app for the Apple App Store. This guide works with any React Native app to automate the deployment process.
+:::
+
+### 1. Enable App Transport Security
+
+App Transport Security is a security feature introduced in iOS 9 that rejects all HTTP requests that are not sent over HTTPS. This can result in HTTP traffic being blocked, including the developer React Native server. ATS is disabled for `localhost` by default in React Native projects in order to make development easier.
+
+You should re-enable ATS prior to building your app for production by opening your `ios/App/Info.plist` file and removing the `localhost` entry from the `NSExceptionDomains` dictionary and setting `NSAllowsArbitraryLoads` to `false` in the `NSAppTransportSecurity` dict. You can also re-enable ATS from within Xcode by opening your target properties under the Info pane and editing the App Transport Security Settings entry.
+
+
+
+If you are editing Info.plist via plaintext rather than the XCode UI, the below is how the `NSAppTransportSecurity` entry would look like without an any domain exceptions.
+
+```xml
+NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+ NSExceptionDomains
+
+
+```
+
+:::note
+If your application needs to access HTTP resources on production, learn how to configure ATS on your project.
+:::
+
+### 2. Configure release scheme
+
+Building an app for distribution in the App Store requires using the `Release` scheme in Xcode. Apps built for `Release` will automatically disable the in-app Dev Menu, which will prevent your users from inadvertently accessing the menu in production. It will also bundle the JavaScript locally, so you can put the app on a device and test whilst not connected to the computer.
+
+To configure your app to be built using the `Release` scheme, go to **Product** → **Scheme** → **Edit Scheme**. Select the **Run** tab in the sidebar, then set the Build Configuration dropdown to `Release`.
+
+
+
+#### Pro Tips
+
+As your App Bundle grows in size, you may start to see a blank screen flash between your splash screen and the display of your root application view. If this is the case, you can add the following code to `AppDelegate.m` in order to keep your splash screen displayed during the transition.
+
+```objectivec
+ // Place this code after "[self.window makeKeyAndVisible]" and before "return YES;"
+ UIStoryboard *sb = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
+ UIViewController *vc = [sb instantiateInitialViewController];
+ rootView.loadingView = vc.view;
+```
+
+The static bundle is built every time you target a physical device, even in Debug. If you want to save time, turn off bundle generation in Debug by adding the following to your shell script in the Xcode Build Phase `Bundle React Native code and images`:
+
+```shell
+ if [ "${CONFIGURATION}" == "Debug" ]; then
+ export SKIP_BUNDLING=true
+ fi
+```
+
+### 3. Build app for release
+
+You can now build your app for release by tapping Cmd ⌘ + B or selecting **Product** → **Build** from the menu bar. Once built for release, you'll be able to distribute the app to beta testers and submit the app to the App Store.
+
+:::info
+You can also use the `React Native CLI` to perform this operation using the option `--mode` with the value `Release` (e.g. from the root of your project: `npm run ios -- --mode="Release"` or `yarn ios --mode Release`).
+:::
+
+Once you are done with the testing and ready to publish to App Store, follow along with this guide.
+
+- Launch your terminal, and navigate into the iOS folder of your app and type `open .`.
+- Double click on YOUR_APP_NAME.xcworkspace. It should launch XCode.
+- Click on `Product` → `Archive`. Make sure to set the device to "Any iOS Device (arm64)".
+
+:::note
+Check your Bundle Identifier and make sure it is exactly same as the one you have created in the Identifiers in Apple Developer Dashboard.
+:::
+
+- After the archive is completed, in the archive window, click on `Distribute App`.
+- Click on `App Store Connect` now (if you want to publish in App Store).
+- Click `Upload` → Make sure all the check boxes are selected, hit `Next`.
+- Choose between `Automatically manage signing` and `Manually manage signing` based on your needs.
+- Click on `Upload`.
+- Now you can find it in the App Store Connect under TestFlight.
+
+Now fill up the necessary information and in the Build Section, select the build of the app and click on `Save` → `Submit For Review`.
diff --git a/website/versioned_docs/version-0.73.0/pushnotificationios.md b/website/versioned_docs/version-0.73.0/pushnotificationios.md
new file mode 100644
index 00000000000..665a50fbe54
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/pushnotificationios.md
@@ -0,0 +1,511 @@
+---
+id: pushnotificationios
+title: '🚧 PushNotificationIOS'
+---
+
+> **Deprecated.** Use one of the [community packages](https://reactnative.directory/?search=push+notification) instead.
+
+
+
Projects with Native Code Only
+
+ The following section only applies to projects with native code exposed. If you are using the managed Expo workflow, see the guide on Notifications in the Expo documentation for the appropriate alternative.
+
+
+
+Handle push notifications for your app, including permission handling and icon badge number.
+
+To get up and running, [configure your notifications with Apple](https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW6) and your server-side system.
+
+React Native version equal or higher than 0.60.0:
+
+- Autolinking in 0.60.0 handles the linking for you!
+
+React Native versions lower than 0.60.0:
+
+Add the PushNotificationIOS library to your Podfile: ./ios/Podfile
+
+- CocoaPods:
+
+ - Add the PushNotificationIOS library to your Podfile: ./ios/Podfile
+
+ ```ruby
+ target 'myAwesomeApp' do
+ # Pods for myAwesomeApp
+ pod 'React-RCTPushNotification', :path => '../node_modules/react-native/Libraries/PushNotificationIOS'
+ end
+ ```
+
+- [Manually link](linking-libraries-ios.md#manual-linking) the PushNotificationIOS library:
+ - Add the following to your Project: `node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj`
+ - Add the following to `Link Binary With Libraries`: `libRCTPushNotification.a`
+
+Finally, to enable support for `notification` and `register` events you need to augment your AppDelegate.
+
+At the top of your `AppDelegate.m`:
+
+`#import `
+
+And then in your AppDelegate implementation add the following:
+
+```objectivec
+ // Required to register for notifications
+ - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
+ {
+ [RCTPushNotificationManager didRegisterUserNotificationSettings:notificationSettings];
+ }
+ // Required for the register event.
+ - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
+ {
+ [RCTPushNotificationManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
+ }
+ // Required for the notification event. You must call the completion handler after handling the remote notification.
+ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
+ fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
+ {
+ [RCTPushNotificationManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
+ }
+ // Required for the registrationError event.
+ - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
+ {
+ [RCTPushNotificationManager didFailToRegisterForRemoteNotificationsWithError:error];
+ }
+ // Required for the localNotification event.
+ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
+ {
+ [RCTPushNotificationManager didReceiveLocalNotification:notification];
+ }
+```
+
+To show notifications while being in the foreground (available starting from iOS 10) add the following lines:
+
+At the top of your `AppDelegate.m`:
+
+`#import `
+
+And then in your AppDelegate implementation add the following:
+
+```objectivec
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ ...
+ // Define UNUserNotificationCenter
+ UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
+ center.delegate = self;
+
+ return YES;
+}
+
+//Called when a notification is delivered to a foreground app.
+-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
+{
+ completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
+}
+```
+
+Then enable Background Modes/Remote notifications to be able to use remote notifications properly. The easiest way to do this is via the project settings. Navigate to Targets -> Your App -> Capabilities -> Background Modes and check Remote notifications. This will automatically enable the required settings.
+
+---
+
+# Reference
+
+## Methods
+
+### `presentLocalNotification()`
+
+```tsx
+static presentLocalNotification(details: PresentLocalNotificationDetails);
+```
+
+Schedules the localNotification for immediate presentation.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------- | ------ | -------- | ----------- |
+| details | object | Yes | See below. |
+
+details is an object containing:
+
+- `alertBody` : The message displayed in the notification alert.
+- `alertAction` : The "action" displayed beneath an actionable notification. Defaults to "view". Note that Apple no longer shows this in iOS 10 +
+- `alertTitle` : The text displayed as the title of the notification alert.
+- `soundName` : The sound played when the notification is fired (optional).
+- `isSilent` : If true, the notification will appear without sound (optional).
+- `category` : The category of this notification, required for actionable notifications (optional).
+- `userInfo` : An object containing additional notification data (optional).
+- `applicationIconBadgeNumber` The number to display as the app's icon badge. The default value of this property is 0, which means that no badge is displayed (optional).
+
+---
+
+### `scheduleLocalNotification()`
+
+```tsx
+static scheduleLocalNotification(details: ScheduleLocalNotificationDetails);
+```
+
+Schedules the localNotification for future presentation.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------- | ------ | -------- | ----------- |
+| details | object | Yes | See below. |
+
+details is an object containing:
+
+- `fireDate` : The date and time when the system should deliver the notification.
+- `alertTitle` : The text displayed as the title of the notification alert.
+- `alertBody` : The message displayed in the notification alert.
+- `alertAction` : The "action" displayed beneath an actionable notification. Defaults to "view". Note that Apple no longer shows this in iOS 10 +
+- `soundName` : The sound played when the notification is fired (optional).
+- `isSilent` : If true, the notification will appear without sound (optional).
+- `category` : The category of this notification, required for actionable notifications (optional).
+- `userInfo` : An object containing additional notification data (optional).
+- `applicationIconBadgeNumber` The number to display as the app's icon badge. Setting the number to 0 removes the icon badge (optional).
+- `repeatInterval` : The interval to repeat as a string. Possible values: `minute`, `hour`, `day`, `week`, `month`, `year` (optional).
+
+---
+
+### `cancelAllLocalNotifications()`
+
+```tsx
+static cancelAllLocalNotifications();
+```
+
+Cancels all scheduled localNotifications
+
+---
+
+### `removeAllDeliveredNotifications()`
+
+```tsx
+static removeAllDeliveredNotifications();
+```
+
+Remove all delivered notifications from Notification Center
+
+---
+
+### `getDeliveredNotifications()`
+
+```tsx
+static getDeliveredNotifications(callback: (notifications: Object[]) => void);
+```
+
+Provides you with a list of the app’s notifications that are still displayed in Notification Center
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ----------------------------------------------------------- |
+| callback | function | Yes | Function which receive an array of delivered notifications. |
+
+A delivered notification is an object containing:
+
+- `identifier` : The identifier of this notification.
+- `title` : The title of this notification.
+- `body` : The body of this notification.
+- `category` : The category of this notification (optional).
+- `userInfo` : An object containing additional notification data (optional).
+- `thread-id` : The thread identifier of this notification, if has one.
+
+---
+
+### `removeDeliveredNotifications()`
+
+```tsx
+static removeDeliveredNotifications(identifiers: string[]);
+```
+
+Removes the specified notifications from Notification Center
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----------- | ----- | -------- | ---------------------------------- |
+| identifiers | array | Yes | Array of notification identifiers. |
+
+---
+
+### `setApplicationIconBadgeNumber()`
+
+```tsx
+static setApplicationIconBadgeNumber(number: number);
+```
+
+Sets the badge number for the app icon on the home screen
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------ | ------ | -------- | ------------------------------ |
+| number | number | Yes | Badge number for the app icon. |
+
+---
+
+### `getApplicationIconBadgeNumber()`
+
+```tsx
+static getApplicationIconBadgeNumber(callback: (badge: number) => void);
+```
+
+Gets the current badge number for the app icon on the home screen
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | -------------------------------------------------------- |
+| callback | function | Yes | A function that will be passed the current badge number. |
+
+---
+
+### `cancelLocalNotifications()`
+
+```tsx
+static cancelLocalNotifications(userInfo: Object);
+```
+
+Cancel local notifications.
+
+Optionally restricts the set of canceled notifications to those notifications whose `userInfo` fields match the corresponding fields in the `userInfo` argument.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | ------ | -------- | ----------- |
+| userInfo | object | No | |
+
+---
+
+### `getScheduledLocalNotifications()`
+
+```tsx
+static getScheduledLocalNotifications(
+ callback: (notifications: ScheduleLocalNotificationDetails[]) => void,
+);
+```
+
+Gets the local notifications that are currently scheduled.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ---------------------------------------------------------------------------------- |
+| callback | function | Yes | A function that will be passed an array of objects describing local notifications. |
+
+---
+
+### `addEventListener()`
+
+```tsx
+static addEventListener(
+ type: PushNotificationEventName,
+ handler:
+ | ((notification: PushNotification) => void)
+ | ((deviceToken: string) => void)
+ | ((error: {message: string; code: number; details: any}) => void),
+);
+```
+
+Attaches a listener to remote or local notification events while the app is running in the foreground or the background.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------- | -------- | -------- | ----------- |
+| type | string | Yes | Event type. |
+| handler | function | Yes | Listener. |
+
+Valid events are:
+
+- `notification` : Fired when a remote notification is received. The handler will be invoked with an instance of `PushNotificationIOS`.
+- `localNotification` : Fired when a local notification is received. The handler will be invoked with an instance of `PushNotificationIOS`.
+- `register`: Fired when the user registers for remote notifications. The handler will be invoked with a hex string representing the deviceToken.
+- `registrationError`: Fired when the user fails to register for remote notifications. Typically occurs when APNS is having issues, or the device is a simulator. The handler will be invoked with `{message: string, code: number, details: any}`.
+
+---
+
+### `removeEventListener()`
+
+```tsx
+static removeEventListener(
+ type: PushNotificationEventName,
+ handler:
+ | ((notification: PushNotification) => void)
+ | ((deviceToken: string) => void)
+ | ((error: {message: string; code: number; details: any}) => void),
+);
+```
+
+Removes the event listener. Do this in `componentWillUnmount` to prevent memory leaks
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ------- | -------- | -------- | ----------- |
+| type | string | Yes | Event type. |
+| handler | function | Yes | Listener. |
+
+---
+
+### `requestPermissions()`
+
+```tsx
+static requestPermissions(permissions?: PushNotificationPermissions[]);
+```
+
+Requests notification permissions from iOS, prompting the user's dialog box. By default, it will request all notification permissions, but a subset of these can be requested by passing a map of requested permissions. The following permissions are supported:
+
+- `alert`
+- `badge`
+- `sound`
+
+If a map is provided to the method, only the permissions with truthy values will be requested.
+
+This method returns a promise that will resolve when the user accepts, rejects, or if the permissions were previously rejected. The promise resolves to the current state of the permission.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| ----------- | ----- | -------- | ---------------------- |
+| permissions | array | No | alert, badge, or sound |
+
+---
+
+### `abandonPermissions()`
+
+```tsx
+static abandonPermissions();
+```
+
+Unregister for all remote notifications received via Apple Push Notification service.
+
+You should call this method in rare circumstances only, such as when a new version of the app removes support for all types of remote notifications. Users can temporarily prevent apps from receiving remote notifications through the Notifications section of the Settings app. Apps unregistered through this method can always re-register.
+
+---
+
+### `checkPermissions()`
+
+```tsx
+static checkPermissions(
+ callback: (permissions: PushNotificationPermissions) => void,
+);
+```
+
+See what push permissions are currently enabled.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+| -------- | -------- | -------- | ----------- |
+| callback | function | Yes | See below. |
+
+`callback` will be invoked with a `permissions` object:
+
+- `alert: boolean`
+- `badge: boolean`
+- `sound: boolean`
+
+---
+
+### `getInitialNotification()`
+
+```tsx
+static getInitialNotification(): Promise;
+```
+
+This method returns a promise. If the app was launched by a push notification, this promise resolves to an object of type `PushNotificationIOS`. Otherwise, it resolves to `null`.
+
+---
+
+### `finish()`
+
+```tsx
+finish(result: string);
+```
+
+This method is available for remote notifications that have been received via: `application:didReceiveRemoteNotification:fetchCompletionHandler:` https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application?language=objc
+
+Call this to execute when the remote notification handling is complete. When calling this block, pass in the fetch result value that best describes the results of your operation. You _must_ call this handler and should do so as soon as possible. For a list of possible values, see `PushNotificationIOS.FetchResult`.
+
+If you do not call this method your background remote notifications could be throttled, to read more about it see the above documentation link.
+
+---
+
+### `getMessage()`
+
+```tsx
+getMessage(): string | Object;
+```
+
+An alias for `getAlert` to get the notification's main message string
+
+---
+
+### `getSound()`
+
+```tsx
+getSound(): string;
+```
+
+Gets the sound string from the `aps` object
+
+---
+
+### `getCategory()`
+
+```tsx
+getCategory(): string;
+```
+
+Gets the category string from the `aps` object
+
+---
+
+### `getAlert()`
+
+```tsx
+getAlert(): string | Object;
+```
+
+Gets the notification's main message from the `aps` object
+
+---
+
+### `getContentAvailable()`
+
+```tsx
+getContentAvailable(): number;
+```
+
+Gets the content-available number from the `aps` object
+
+---
+
+### `getBadgeCount()`
+
+```tsx
+getBadgeCount(): number;
+```
+
+Gets the badge count number from the `aps` object
+
+---
+
+### `getData()`
+
+```tsx
+getData(): Object;
+```
+
+Gets the data object on the notification
+
+---
+
+### `getThreadID()`
+
+```tsx
+getThreadID();
+```
+
+Gets the thread ID on the notification
diff --git a/website/versioned_docs/version-0.73.0/ram-bundles-inline-requires.md b/website/versioned_docs/version-0.73.0/ram-bundles-inline-requires.md
new file mode 100644
index 00000000000..0a69c941ed5
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/ram-bundles-inline-requires.md
@@ -0,0 +1,184 @@
+---
+id: ram-bundles-inline-requires
+title: RAM Bundles and Inline Requires
+---
+
+If you have a large app you may want to consider the Random Access Modules (RAM) bundle format, and using inline requires. This is useful for apps that have a large number of screens which may not ever be opened during a typical usage of the app. Generally it is useful to apps that have large amounts of code that are not needed for a while after startup. For instance the app includes complicated profile screens or lesser used features, but most sessions only involve visiting the main screen of the app for updates. We can optimize the loading of the bundle by using the RAM format and requiring those features and screens inline (when they are actually used).
+
+## Loading JavaScript
+
+Before react-native can execute JS code, that code must be loaded into memory and parsed. With a standard bundle if you load a 50mb bundle, all 50mb must be loaded and parsed before any of it can be executed. The optimization behind RAM bundles is that you can load only the portion of the 50mb that you actually need at startup, and progressively load more of the bundle as those sections are needed.
+
+## Inline Requires
+
+Inline requires delay the requiring of a module or file until that file is actually needed. A basic example would look like this:
+
+```tsx title="VeryExpensive.tsx"
+import React, {Component} from 'react';
+import {Text} from 'react-native';
+// ... import some very expensive modules
+
+// You may want to log at the file level to verify when this is happening
+console.log('VeryExpensive component loaded');
+
+export default class VeryExpensive extends Component {
+ // lots and lots of code
+ render() {
+ return Very Expensive Component;
+ }
+}
+```
+
+```tsx title="Optimized.tsx"
+import React, {Component} from 'react';
+import {TouchableOpacity, View, Text} from 'react-native';
+
+let VeryExpensive = null;
+
+export default class Optimized extends Component {
+ state = {needsExpensive: false};
+
+ didPress = () => {
+ if (VeryExpensive == null) {
+ VeryExpensive = require('./VeryExpensive').default;
+ }
+
+ this.setState(() => ({
+ needsExpensive: true,
+ }));
+ };
+
+ render() {
+ return (
+
+
+ Load
+
+ {this.state.needsExpensive ? : null}
+
+ );
+ }
+}
+```
+
+Even without the RAM format, inline requires can lead to startup time improvements, because the code within VeryExpensive.js will only execute once it is required for the first time.
+
+## Enable the RAM format
+
+On iOS using the RAM format will create a single indexed file that react native will load one module at a time. On Android, by default it will create a set of files for each module. You can force Android to create a single file, like iOS, but using multiple files can be more performant and requires less memory.
+
+Enable the RAM format in Xcode by editing the build phase "Bundle React Native code and images". Before `../node_modules/react-native/scripts/react-native-xcode.sh` add `export BUNDLE_COMMAND="ram-bundle"`:
+
+```
+export BUNDLE_COMMAND="ram-bundle"
+export NODE_BINARY=node
+../node_modules/react-native/scripts/react-native-xcode.sh
+```
+
+On Android enable the RAM format by editing your `android/app/build.gradle` file. Before the line `apply from: "../../node_modules/react-native/react.gradle"` add or amend the `project.ext.react` block:
+
+```
+project.ext.react = [
+ bundleCommand: "ram-bundle",
+]
+```
+
+Use the following lines on Android if you want to use a single indexed file:
+
+```
+project.ext.react = [
+ bundleCommand: "ram-bundle",
+ extraPackagerArgs: ["--indexed-ram-bundle"]
+]
+```
+
+:::info
+If you are using [Hermes JS Engine](https://github.com/facebook/hermes), you **should not** have RAM bundles feature enabled. In Hermes, when loading the bytecode, `mmap` ensures that the entire file is not loaded. Using Hermes with RAM bundles might lead to issues, because those mechanisms are not compatible with each other.
+:::
+
+## Configure Preloading and Inline Requires
+
+Now that we have a RAM bundle, there is overhead for calling `require`. `require` now needs to send a message over the bridge when it encounters a module it has not loaded yet. This will impact startup the most, because that is where the largest number of require calls are likely to take place while the app loads the initial module. Luckily we can configure a portion of the modules to be preloaded. In order to do this, you will need to implement some form of inline require.
+
+## Investigating the Loaded Modules
+
+In your root file (index.(ios|android).js) you can add the following after the initial imports:
+
+```js
+const modules = require.getModules();
+const moduleIds = Object.keys(modules);
+const loadedModuleNames = moduleIds
+ .filter(moduleId => modules[moduleId].isInitialized)
+ .map(moduleId => modules[moduleId].verboseName);
+const waitingModuleNames = moduleIds
+ .filter(moduleId => !modules[moduleId].isInitialized)
+ .map(moduleId => modules[moduleId].verboseName);
+
+// make sure that the modules you expect to be waiting are actually waiting
+console.log(
+ 'loaded:',
+ loadedModuleNames.length,
+ 'waiting:',
+ waitingModuleNames.length,
+);
+
+// grab this text blob, and put it in a file named packager/modulePaths.js
+console.log(
+ `module.exports = ${JSON.stringify(
+ loadedModuleNames.sort(),
+ null,
+ 2,
+ )};`,
+);
+```
+
+When you run your app, you can look in the console and see how many modules have been loaded, and how many are waiting. You may want to read the moduleNames and see if there are any surprises. Note that inline requires are invoked the first time the imports are referenced. You may need to investigate and refactor to ensure only the modules you want are loaded on startup. Note that you can change the Systrace object on require to help debug problematic requires.
+
+```js
+require.Systrace.beginEvent = message => {
+ if (message.includes(problematicModule)) {
+ throw new Error();
+ }
+};
+```
+
+Every app is different, but it may make sense to only load the modules you need for the very first screen. When you are satisfied, put the output of the loadedModuleNames into a file named `packager/modulePaths.js`.
+
+## Updating the metro.config.js
+
+We now need to update `metro.config.js` in the root of the project to use our newly generated `modulePaths.js` file:
+
+
+```js
+const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+const fs = require('fs');
+const path = require('path');
+const modulePaths = require('./packager/modulePaths');
+
+const config = {
+ transformer: {
+ getTransformOptions: () => {
+ const moduleMap = {};
+ modulePaths.forEach(modulePath => {
+ if (fs.existsSync(modulePath)) {
+ moduleMap[path.resolve(modulePath)] = true;
+ }
+ });
+ return {
+ preloadedModules: moduleMap,
+ transform: {inlineRequires: {blockList: moduleMap}},
+ };
+ },
+ },
+};
+
+module.exports = mergeConfig(getDefaultConfig(__dirname), config);
+```
+
+See also [**Configuring Metro**](/docs/metro#configuring-metro).
+
+The `preloadedModules` entry in the config indicates which modules should be marked as preloaded when building a RAM bundle. When the bundle is loaded, those modules are immediately loaded, before any requires have even executed. The `blockList` entry indicates that those modules should not be required inline. Because they are preloaded, there is no performance benefit from using an inline require. In fact the generated JavaScript spends extra time resolving the inline require every time the imports are referenced.
+
+## Test and Measure Improvements
+
+You should now be ready to build your app using the RAM format and inline requires. Make sure you measure the before and after startup times.
diff --git a/website/versioned_docs/version-0.73.0/react-18-and-react-native.md b/website/versioned_docs/version-0.73.0/react-18-and-react-native.md
new file mode 100644
index 00000000000..874f3a036b3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/react-18-and-react-native.md
@@ -0,0 +1,122 @@
+---
+id: react-18-and-react-native
+title: React 18 & React Native
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+import NewArchitectureWarning from './\_markdown-new-architecture-warning.mdx';
+
+
+
+This page describes how to use React 18 with React Native using the React Native's New Architecture.
+
+> **tl;dr:** The first version of React Native compatible with React 18 is **0.69.0**. In order to use the new features in React 18 including automatic batching, `startTransition`, and `useDeferredValue`, you must migrate your React Native app to the New Architecture.
+
+## React 18 and the React Native New Architecture
+
+React 18 introduces [several new features](https://reactjs.org/blog/2022/03/29/react-v18.html) including:
+
+- Automatic batching
+- New Strict Mode behaviors
+- New hooks (`useId`, `useSyncExternalStore`)
+
+It also includes new concurrent features:
+
+- `startTransition`
+- `useTransition`
+- `useDeferredValue`
+- Full Suspense support
+
+The concurrent features in React 18 are built on top of the new concurrent rendering engine. Concurrent rendering is a new behind-the-scenes mechanism that enables React to prepare multiple versions of your UI at the same time.
+
+Previous versions of React Native built on the old architecture **cannot** support concurrent rendering or concurrent features. This is because the old architecture relied on mutating the native trees, which doesn’t allow for React to prepare multiple versions of the tree at the same time.
+
+Fortunately, the New Architecture was written bottom-up with concurrent rendering in mind, and is fully compatible with React 18. This means, in order to upgrade to React 18 in your React Native app, your application needs to be migrated to the React Native's New Architecture including Fabric Native Components and Turbo Native Modules.
+
+## React 18 enabled by default
+
+Starting in React Native 0.69, React 18 is **enabled by default** when you enable the New Architecture.
+
+This means you’re able to use the new features in React 18 as soon as you migrate. Since the new concurrent features are opt-in by using features like `startTransition` or `Suspense`, we expect React 18 to work out-of-the-box with minimal changes for users who migrate to the New Architecture or create a new app with the New Architecture enabled.
+
+However, if you do hit any issues, we provide an option to opt-out of the new root in React 18. Opt-ing out means your app will run in React 17 mode, and none of the features of React 18 will be accessible.
+
+### Opt-ing out of React 18 on Android
+
+On Android, you will be able to override the `isConcurrentRootEnabled` in your ActivityDelegate (in the `MainActivity` file), and enable/disable Concurrent React.
+
+
+
+
+
+```diff
+public class MainActivity extends ReactActivity {
+
+ public static class MainActivityDelegate extends ReactActivityDelegate {
+ public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
+ super(activity, mainComponentName);
+ }
+
+ @Override
+ protected ReactRootView createRootView() {
+ ReactRootView reactRootView = new ReactRootView(getContext());
+ // If you opted-in for the New Architecture, we enable the Fabric Renderer.
+ reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
+ return reactRootView;
+ }
+
++ @Override
++ protected boolean isConcurrentRootEnabled() {
++ // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
++ // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
++ return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
++ }
+ }
+}
+```
+
+
+
+
+
+```diff
+class MainActivity : ReactActivity() {
+
+ open class MainActivityDelegate(activity: ReactActivity?, mainComponentName: String?) : ReactActivityDelegate(activity, mainComponentName) {
+ override fun createRootView(): ReactRootView = ReactRootView(context).apply {
+ // If you opted-in for the New Architecture, we enable the Fabric Renderer.
+ setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED)
+ }
+
++ // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
++ // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
++ override fun isConcurrentRootEnabled() = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
+ }
+}
+```
+
+
+
+
+### Opt-ing out of React 18 on iOS
+
+On iOS, you'll have access to the `concurrentRootEnabled` method on your `AppDelegate.mm` file. You should change the returned value to `false` (or `NO`) to disable the feature.
+
+```objc
+/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
+///
+/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
+/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
+/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`.
+- (BOOL)concurrentRootEnabled
+{
+ // Switch this bool to turn on and off the concurrent root
+ return true;
+}
+```
+
+### Users on React Native 0.69 not yet migrated to the New Architecture
+
+Note: Users on React Native 0.69, but still on the Old Architecture will still use React 17 mode even if React 18 is installed in the `package.json` file.
+
+Overriding the `isConcurrentRootEnabled` method will have no effect on your app.
diff --git a/website/versioned_docs/version-0.73.0/react-devtools.md b/website/versioned_docs/version-0.73.0/react-devtools.md
new file mode 100644
index 00000000000..ced5c6589a2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/react-devtools.md
@@ -0,0 +1,87 @@
+---
+id: react-devtools
+title: React DevTools
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+[React DevTools](https://github.com/facebook/react/tree/main/packages/react-devtools) can be used to debug the React component hierarchy within your app.
+
+The standalone version of React DevTools allows connecting to React Native apps. To use it, install or run the `react-devtools` package. It should connect to your simulator within a few seconds.
+
+```sh
+npx react-devtools
+```
+
+
+
+
+💡 Installing React DevTools globally
+
+We recommend running `react-devtools` via `npx`, but you can also install a given version globally.
+
+
+
+
+```sh
+npm install -g react-devtools
+```
+
+
+
+
+```shell
+yarn global add react-devtools
+```
+
+
+
+
+Then, run the global `react-devtools` command:
+
+```sh
+react-devtools
+```
+
+
+
+
+💡 Adding React DevTools as a project dependency
+
+If you prefer to avoid global installations, you can add `react-devtools` as a project dependency. Add the `react-devtools` package to your project using `npm install --save-dev react-devtools`, then add `"react-devtools": "react-devtools"` to the `scripts` section in your `package.json`, and then run `npm run react-devtools` from your project folder to open the DevTools.
+
+
+
+:::tip
+Learn more about using DevTools in the [React Developer Tools guide on react.dev](https://react.dev/learn/react-developer-tools).
+:::
+
+## Integration with the Element Inspector
+
+React Native provides an Element Inspector, available under the Dev Menu as "Show Element Inspector". The inspector lets you tap on any UI element and see information about it.
+
+
+
+When React DevTools is connected, the Element Inspector will enter a **collapsed mode**, and instead use DevTools as the primary UI. In this mode, clicking on something in the simulator will navigate to the relevant component in DevTools.
+
+You can select "Hide Element Inspector" in the same menu to exit this mode.
+
+
+
+## Debugging application state
+
+[Reactotron](https://github.com/infinitered/reactotron) is an open-source desktop app that allows you to inspect Redux or MobX-State-Tree application state as well as view custom logs, run custom commands such as resetting state, store and restore state snapshots, and other helpful debugging features for React Native apps.
+
+You can view installation instructions [in the README](https://github.com/infinitered/reactotron). If you're using Expo, here is an article detailing [how to install on Expo](https://shift.infinite.red/start-using-reactotron-in-your-expo-project-today-in-3-easy-steps-a03d11032a7a).
+
+## Troubleshooting
+
+:::tip
+Once you have React DevTools running, follow the instructions. If you had your application running prior to opening React DevTools, you may need to [open the Dev Menu](./debugging#accessing-the-dev-menu) to connect it.
+
+
+:::
+
+:::info
+If connecting to an Android emulator proves troublesome, try running `adb reverse tcp:8097 tcp:8097` in a new terminal.
+:::
diff --git a/website/versioned_docs/version-0.73.0/react-native-gradle-plugin.md b/website/versioned_docs/version-0.73.0/react-native-gradle-plugin.md
new file mode 100644
index 00000000000..89fdad8eb04
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/react-native-gradle-plugin.md
@@ -0,0 +1,187 @@
+---
+id: react-native-gradle-plugin
+title: React Native Gradle Plugin
+---
+
+This guide describes how to configure the **React Native Gradle Plugin** (often referred as RNGP), when building your React Native application for Android.
+
+## Using the plugin
+
+The React Native Gradle Plugin is distributed as a separate NPM package which is installed automatically with `react-native`.
+
+The plugin is **already configured** for new projects created using `npx react-native init`. You don't need to do any extra steps to install it if you created your app with this command.
+
+If you're integrating React Native into an existing project, please refer to [the corresponding page](/docs/next/integration-with-existing-apps#configuring-gradle): it contains specific instructions on how to install the plugin.
+
+## Configuring the plugin
+
+By default, the plugin will work **out of the box** with sensible defaults. You should refer to this guide and customize the behavior only if you need it.
+
+To configure the plugin you can modify the `react` block, inside your `android/app/build.gradle`:
+
+```groovy
+apply plugin: "com.facebook.react"
+
+/**
+ * This is the configuration block to customize your React Native Android app.
+ * By default you don't need to apply any configuration, just uncomment the lines you need.
+ */
+react {
+ // Custom configuration goes here.
+}
+```
+
+Each configuration key is described below:
+
+### `root`
+
+This is the root folder of your React Native project, i.e. where the `package.json` file lives. Default is `..`. You can customize it as follows:
+
+```groovy
+root = file("../")
+```
+
+### `reactNativeDir`
+
+This is the folder where the `react-native` package lives. Default is `../node_modules/react-native`.
+If you're in a monorepo or using a different package manager, you can use adjust `reactNativeDir` to your setup.
+
+You can customize it as follows:
+
+```groovy
+reactNativeDir = file("../node_modules/react-native")
+```
+
+### `codegenDir`
+
+This is the folder where the `react-native-codegen` package lives. Default is `../node_modules/react-native-codegen`.
+If you're in a monorepo or using a different package manager, you can adjust `codegenDir` to your setup.
+
+You can customize it as follows:
+
+```groovy
+codegenDir = file("../node_modules/@react-native/codegen")
+```
+
+### `cliFile`
+
+This is the entrypoint file for the React Native CLI. Default is `../node_modules/react-native/cli.js`.
+The entrypoint file is needed as the plugin needs to invoke the CLI for bundling and creating your app.
+
+If you're in a monorepo or using a different package manager, you can adjust `cliFile` to your setup.
+You can customize it as follows:
+
+```groovy
+cliFile = file("../node_modules/react-native/cli.js")
+```
+
+### `debuggableVariants`
+
+This is the list of variants that are debuggable (see [using variants](#using-variants) for more context on variants).
+
+By default the plugin is considering as `debuggableVariants` only `debug`, while `release` is not. If you have other
+variants (like `staging`, `lite`, etc.) you'll need to adjust this accordingly.
+
+Variants that are listed as `debuggableVariants` will not come with a shipped bundle, so you'll need Metro to run them.
+
+You can customize it as follows:
+
+```groovy
+debuggableVariants = ["liteDebug", "prodDebug"]
+```
+
+### `nodeExecutableAndArgs`
+
+This is the list of node command and arguments that should be invoked for all the scripts. By default is `[node]` but can be customized to add extra flags as follows:
+
+```groovy
+nodeExecutableAndArgs = ["node"]
+```
+
+### `bundleCommand`
+
+This is the name of the `bundle` command to be invoked when creating the bundle for your app. That's useful if you're using [RAM Bundles](/docs/ram-bundles-inline-requires). By default is `bundle` but can be customized to add extra flags as follows:
+
+```groovy
+bundleCommand = "ram-bundle"
+```
+
+### `bundleConfig`
+
+This is the path to a configuration file that will be passed to `bundle --config ` if provided. Default is empty (no config file will be probided). More information on bundling config files can be found [on the CLI documentation](https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle). Can be customized as follow:
+
+```groovy
+bundleConfig = file(../rn-cli.config.js)
+```
+
+### `bundleAssetName`
+
+This is the name of the bundle file that should be generated. Default is `index.android.bundle`. Can be customized as follow:
+
+```groovy
+bundleAssetName = "MyApplication.android.bundle"
+```
+
+### `entryFile`
+
+The entry file used for bundle generation. The default is to search for `index.android.js` or `index.js`. Can be customized as follow:
+
+```groovy
+entryFile = file("../js/MyApplication.android.js")
+```
+
+### `extraPackagerArgs`
+
+A list of extra flags that will be passed to the `bundle` command. The list of available flags is in [the CLI documentation](https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle). Default is empty. Can be customized as follows:
+
+```groovy
+extraPackagerArgs = []
+```
+
+### `hermesCommand`
+
+The path to the `hermesc` command (the Hermes Compiler). React Native comes with a version of the Hermes compiler bundled with it, so you generally won't be needing to customize this. The plugin will use the correct compiler for your system by default.
+
+### `hermesFlags`
+
+The list of flags to pass to `hermesc`. By default is `["-O", "-output-source-map"]`. You can customize it as follows
+
+```groovy
+hermesFlags = ["-O", "-output-source-map"]
+```
+
+## Using Flavors & Build Variants
+
+When building Android apps, you might want to use [custom flavors](https://developer.android.com/studio/build/build-variants#product-flavors) to have different versions of your app starting from the same project.
+
+Please refer to the [official Android guide](https://developer.android.com/studio/build/build-variants) to configure custom build types (like `staging`) or custom flavors (like `full`, `lite`, etc.).
+By default new apps are create with two build types (`debug` and `release`) and no custom flavors.
+
+The combination of all the build types and all the flavors generates a set of **build variants**. For instance for `debug`/`staging`/`release` build types and `full`/`lite` you will have 6 build variants: `fullDebug`, `fullStaging`, `fullRelease` and so on.
+
+If you're using custom variants beyond `debug` and `release`, you need to instruct the React Native Gradle Plugin specifying which of your variants are **debuggable** using the [`debuggableVariants`](#debuggablevariants) configuration as follows:
+
+```diff
+apply plugin: "com.facebook.react"
+
+react {
++ debuggableVariants = ["fullStaging", "fullDebug"]
+}
+```
+
+This is necessary because the plugin will skip the JS bundling for all the `debuggableVariants`: you'll need Metro to run them. For example, if you list `fullStaging` in the `debuggableVariants`, you won't be able to publish it to a store as it will be missing the bundle.
+
+## What is the plugin doing under the hood?
+
+The React Native Gradle Plugin is responsible for configuring your Application build to ship React Native applications to production.
+The plugin is also used inside 3rd party libraries, to run the [Codegen](/docs/the-new-architecture/pillars-codegen) used for the New Architecture.
+
+Here is a summary of the plugin responsibilities:
+
+- Add a `createBundleJsAndAssets` task for every non debuggable variant, that is responsible of invoking the `bundle`, `hermesc` and `compose-source-map` commands.
+- Setting up the proper version of the `com.facebook.react:react-android` and `com.facebook.react:hermes-android` dependency, reading the React Native version from the `package.json` of `react-native`.
+- Setting up the proper Maven repositories (Maven Central, Google Maven Repo, JSC local Maven repo, etc.) needed to consume all the necessary Maven Dependencies.
+- Setting up the NDK to let you build apps that are using the New Architecture.
+- Setting up the `buildConfigFields` so that you can know at runtime if Hermes or the New Architecture are enabled.
+- Setting up the Metro DevServer Port as an Android resource so the app knows on which port to connect.
+- Invoking the [React Native Codegen](/docs/the-new-architecture/pillars-codegen) if a library or app is using the Codegen for the New Architecture.
diff --git a/website/versioned_docs/version-0.73.0/react-node.md b/website/versioned_docs/version-0.73.0/react-node.md
new file mode 100644
index 00000000000..d703d1c1429
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/react-node.md
@@ -0,0 +1,13 @@
+---
+id: react-node
+title: React Node Object Type
+---
+
+A React Node is one of the following types:
+
+- Boolean (which is ignored)
+- `null` or `undefined` (which is ignored)
+- Number
+- String
+- A React element (result of JSX)
+- An array of any of the above, possibly a nested one
diff --git a/website/versioned_docs/version-0.73.0/rect.md b/website/versioned_docs/version-0.73.0/rect.md
new file mode 100644
index 00000000000..6a5d5db6444
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/rect.md
@@ -0,0 +1,50 @@
+---
+id: rect
+title: Rect Object Type
+---
+
+`Rect` accepts numeric pixel values to describe how far to extend a rectangular area. These values are added to the original area's size to expand it.
+
+## Example
+
+```js
+{
+ bottom: 20,
+ left: null,
+ right: undefined,
+ top: 50
+}
+```
+
+## Keys and values
+
+### `bottom`
+
+| Type | Required |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+### `left`
+
+| Type | Required |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+### `right`
+
+| Type | Required |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+### `top`
+
+| Type | Required |
+| --------------------------- | -------- |
+| number, `null`, `undefined` | No |
+
+## Used by
+
+- [`Image`](image)
+- [`Pressable`](pressable)
+- [`Text`](text)
+- [`TouchableWithoutFeedback`](touchablewithoutfeedback)
diff --git a/website/versioned_docs/version-0.73.0/refreshcontrol.md b/website/versioned_docs/version-0.73.0/refreshcontrol.md
new file mode 100644
index 00000000000..c2c74ea2231
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/refreshcontrol.md
@@ -0,0 +1,168 @@
+---
+id: refreshcontrol
+title: RefreshControl
+---
+
+This component is used inside a ScrollView or ListView to add pull to refresh functionality. When the ScrollView is at `scrollY: 0`, swiping down triggers an `onRefresh` event.
+
+## Example
+
+```SnackPlayer name=RefreshControl&supportedPlatforms=ios,android
+import React from 'react';
+import {
+ RefreshControl,
+ SafeAreaView,
+ ScrollView,
+ StyleSheet,
+ Text,
+} from 'react-native';
+
+const App = () => {
+ const [refreshing, setRefreshing] = React.useState(false);
+
+ const onRefresh = React.useCallback(() => {
+ setRefreshing(true);
+ setTimeout(() => {
+ setRefreshing(false);
+ }, 2000);
+ }, []);
+
+ return (
+
+
+ }>
+ Pull down to see RefreshControl indicator
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ scrollView: {
+ flex: 1,
+ backgroundColor: 'pink',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+
+export default App;
+```
+
+> Note: `refreshing` is a controlled prop, this is why it needs to be set to `true` in the `onRefresh` function otherwise the refresh indicator will stop immediately.
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+###
Required
**`refreshing`**
+
+Whether the view should be indicating an active refresh.
+
+| Type |
+| ------- |
+| boolean |
+
+---
+
+### `colors`
Android
+
+The colors (at least one) that will be used to draw the refresh indicator.
+
+| Type |
+| ---------------------------- |
+| array of [colors](colors.md) |
+
+---
+
+### `enabled`
Android
+
+Whether the pull to refresh functionality is enabled.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `true` |
+
+---
+
+### `onRefresh`
+
+Called when the view starts refreshing.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `progressBackgroundColor`
Android
+
+The background color of the refresh indicator.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `progressViewOffset`
+
+Progress view top offset.
+
+| Type | Default |
+| ------ | ------- |
+| number | `0` |
+
+---
+
+### `size`
Android
+
+Size of the refresh indicator.
+
+| Type | Default |
+| ---------------------------- | ----------- |
+| enum(`'default'`, `'large'`) | `'default'` |
+
+---
+
+### `tintColor`
iOS
+
+The color of the refresh indicator.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `title`
iOS
+
+The title displayed under the refresh indicator.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `titleColor`
iOS
+
+The color of the refresh indicator title.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
diff --git a/website/versioned_docs/version-0.73.0/roottag.md b/website/versioned_docs/version-0.73.0/roottag.md
new file mode 100644
index 00000000000..c486b6f93c1
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/roottag.md
@@ -0,0 +1,74 @@
+---
+id: roottag
+title: RootTag
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+`RootTag` is an opaque identifier assigned to the native root view of your React Native surface — i.e. the `ReactRootView` or `RCTRootView` instance for Android or iOS respectively. In short, it is a surface identifier.
+
+## When to use a RootTag?
+
+For most React Native developers, you likely won’t need to deal with `RootTag`s.
+
+`RootTag`s are useful for when an app renders **multiple React Native root views** and you need to handle native API calls differently depending on the surface. An example of this is when an app is using native navigation and each screen is a separate React Native root view.
+
+In native navigation, every React Native root view is rendered in a platform’s navigation view (e.g., `Activity` for Android, `UINavigationViewController` for iOS). By this, you are able to leverage the navigation paradigms of the platform such as native look and feel and navigation transitions. The functionality to interact with the native navigation APIs can be exposed to React Native via a [native module](https://reactnative.dev/docs/next/native-modules-intro).
+
+For example, to update the title bar of a screen, you would call the navigation module’s API `setTitle("Updated Title")`, but it would need to know which screen in the stack to update. A `RootTag` is necessary here to identify the root view and its hosting container.
+
+Another use case for `RootTag` is when your app needs to attribute a certain JavaScript call to native based on its originating root view. A `RootTag` is necessary to differentiate the source of the call from different surfaces.
+
+## How to access the RootTag... if you need it
+
+In versions 0.65 and below, RootTag is accessed via a [legacy context](https://github.com/facebook/react-native/blob/v0.64.1/Libraries/ReactNative/AppContainer.js#L56). To prepare React Native for Concurrent features coming in React 18 and beyond, we are migrating to the latest [Context API](https://reactjs.org/docs/context.html#api) via `RootTagContext` in 0.66. Version 0.65 supports both the legacy context and the recommended `RootTagContext` to allow developers time to migrate their call-sites. See the breaking changes summary.
+
+How to access `RootTag` via the `RootTagContext`.
+
+```js
+import {RootTagContext} from 'react-native';
+import NativeAnalytics from 'native-analytics';
+import NativeNavigation from 'native-navigation';
+
+function ScreenA() {
+ const rootTag = useContext(RootTagContext);
+
+ const updateTitle = title => {
+ NativeNavigation.setTitle(rootTag, title);
+ };
+
+ const handleOneEvent = () => {
+ NativeAnalytics.logEvent(rootTag, 'one_event');
+ };
+
+ // ...
+}
+
+class ScreenB extends React.Component {
+ static contextType: typeof RootTagContext = RootTagContext;
+
+ updateTitle(title) {
+ NativeNavigation.setTitle(this.context, title);
+ }
+
+ handleOneEvent() {
+ NativeAnalytics.logEvent(this.context, 'one_event');
+ }
+
+ // ...
+}
+```
+
+Learn more about the Context API for [classes](https://reactjs.org/docs/context.html#classcontexttype) and [hooks](https://reactjs.org/docs/hooks-reference.html#usecontext) from the React docs.
+
+### Breaking Change in 0.65
+
+`RootTagContext` was formerly named `unstable_RootTagContext` and changed to `RootTagContext` in 0.65. Please update any usages of `unstable_RootTagContext` in your codebase.
+
+### Breaking Change in 0.66
+
+The legacy context access to `RootTag` will be removed and replaced by `RootTagContext`. Beginning in 0.65, we encourage developers to proactively migrate `RootTag` accesses to `RootTagContext`.
+
+## Future Plans
+
+With the new React Native architecture progressing, there will be future iterations to `RootTag`, with the intention to keep the `RootTag` type opaque and prevent thrash in React Native codebases. Please do not rely on the fact that RootTag currently aliases to a number! If your app relies on RootTags, keep an eye on our version change logs, which you can find [here](https://github.com/facebook/react-native/blob/main/CHANGELOG.md).
diff --git a/website/versioned_docs/version-0.73.0/running-on-device.md b/website/versioned_docs/version-0.73.0/running-on-device.md
new file mode 100644
index 00000000000..01175add366
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/running-on-device.md
@@ -0,0 +1,437 @@
+---
+id: running-on-device
+title: Running On Device
+hide_table_of_contents: true
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+It's always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production.
+
+:::info
+If you used `create-expo-app` to set up your project, you can run your app on a device in Expo Go by scanning the QR code that is displayed when you run `npm start`. Refer to the Expo guide for [running your project on your device](https://docs.expo.dev/get-started/expo-go/) for more information.
+:::
+
+
+
+
+## Running your app on Android devices
+
+#### Development OS
+
+
+
+
+[//]: # 'macOS, Android'
+
+### 1. Enable Debugging over USB
+
+Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development.
+
+To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to **Settings** → **About phone** → **Software information** and then tapping the `Build number` row at the bottom seven times. You can then go back to **Settings** → **Developer options** to enable "USB debugging".
+
+### 2. Plug in your device via USB
+
+Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine.
+
+Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running `adb devices`.
+
+```shell
+$ adb devices
+List of devices attached
+emulator-5554 offline # Google emulator
+14ed2fcc device # Physical device
+```
+
+Seeing `device` in the right column means the device is connected. You must have **only one device connected** at a time.
+
+:::note
+If you see `unauthorized` in the list you will need to run `adb reverse tcp:8081 tcp:8081` and press allow USB debugging on the device.
+:::
+
+### 3. Run your app
+
+From the root of your project; type the following in your command prompt to install and launch your app on the device:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+> If you get a "bridge configuration isn't available" error, see [Using adb reverse](running-on-device.md#method-1-using-adb-reverse-recommended).
+
+> Hint: You can also use the `React Native CLI` to generate and run a `release` build (e.g. from the root of your project: `yarn android --mode release`).
+
+
Connecting to the development server
+
+You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network.
+
+### Method 1: Using adb reverse (recommended)
+
+You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine.
+
+Run the following in a command prompt:
+
+```shell
+$ adb -s reverse tcp:8081 tcp:8081
+```
+
+To find the device name, run the following adb command:
+
+```shell
+$ adb devices
+```
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+### Method 2: Connect via Wi-Fi
+
+You can also connect to the development server over Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding.
+
+You can find the IP address in **System Settings (or System Preferences)** → **Network**.
+
+1. Make sure your laptop and your phone are on the **same** Wi-Fi network.
+2. Open your React Native app on your device.
+3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that.
+4. Open the in-app [Dev Menu](debugging.md#accessing-the-dev-menu).
+5. Go to **Dev Settings** → **Debug server host & port for device**.
+6. Type in your machine's IP address and the port of the local dev server (e.g. `10.0.1.1:8081`).
+7. Go back to the **Dev Menu** and select **Reload JS**.
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+## Building your app for production
+
+You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for [generating a signed APK](signed-apk-android.md) to learn more.
+
+
+
+
+[//]: # 'Windows, Android'
+
+### 1. Enable Debugging over USB
+
+Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development.
+
+To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to **Settings** → **About phone** → **Software information** and then tapping the `Build number` row at the bottom seven times. You can then go back to **Settings** → **Developer options** to enable "USB debugging".
+
+### 2. Plug in your device via USB
+
+Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine.
+
+Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running `adb devices`.
+
+```shell
+$ adb devices
+List of devices attached
+emulator-5554 offline # Google emulator
+14ed2fcc device # Physical device
+```
+
+Seeing `device` in the right column means the device is connected. You must have **only one device connected** at a time.
+
+### 3. Run your app
+
+From the root of your project, run the following in your command prompt to install and launch your app on the device:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+> Hint: You can also use the `React Native CLI` to generate and run a `release` build (e.g. from the root of your project: `yarn android --mode release`).
+
+
Connecting to the development server
+
+You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network.
+
+### Method 1: Using adb reverse (recommended)
+
+You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine.
+
+Run the following in a command prompt:
+
+```shell
+$ adb -s reverse tcp:8081 tcp:8081
+```
+
+To find the device name, run the following adb command:
+
+```shell
+$ adb devices
+```
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+### Method 2: Connect via Wi-Fi
+
+You can also connect to the development server over Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding.
+
+Open the command prompt and type `ipconfig` to find your machine's IP address ([more info](https://windows.microsoft.com/en-us/windows/using-command-line-tools-networking-information)).
+
+1. Make sure your laptop and your phone are on the **same** Wi-Fi network.
+2. Open your React Native app on your device.
+3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that.
+4. Open the in-app [Dev Menu](debugging.md#accessing-the-dev-menu).
+5. Go to **Dev Settings** → **Debug server host & port for device**.
+6. Type in your machine's IP address and the port of the local dev server (e.g. `10.0.1.1:8081`).
+7. Go back to the **Dev Menu** and select **Reload JS**.
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+## Building your app for production
+
+You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for [generating a signed APK](signed-apk-android.md) to learn more.
+
+
+
+
+[//]: # 'Linux, Android'
+
+### 1. Enable Debugging over USB
+
+Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development.
+
+To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to **Settings** → **About phone** → **Software information** and then tapping the `Build number` row at the bottom seven times. You can then go back to **Settings** → **Developer options** to enable "USB debugging".
+
+### 2. Plug in your device via USB
+
+Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine.
+
+Next, check the manufacturer code by using `lsusb` (on mac, you must first [install lsusb](https://github.com/jlhonora/lsusb)). `lsusb` should output something like this:
+
+```bash
+$ lsusb
+Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
+Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+Bus 001 Device 003: ID 22b8:2e76 Motorola PCS
+Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
+Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
+Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+```
+
+These lines represent the USB devices currently connected to your machine.
+
+You want the line that represents your phone. If you're in doubt, try unplugging your phone and running the command again:
+
+```bash
+$ lsusb
+Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
+Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
+Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
+Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+```
+
+You'll see that after removing the phone, the line which has the phone model ("Motorola PCS" in this case) disappeared from the list. This is the line that we care about.
+
+`Bus 001 Device 003: ID 22b8:2e76 Motorola PCS`
+
+From the above line, you want to grab the first four digits from the device ID:
+
+`22b8:2e76`
+
+In this case, it's `22b8`. That's the identifier for Motorola.
+
+You'll need to input this into your udev rules in order to get up and running:
+
+```shell
+echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android-usb.rules
+```
+
+Make sure that you replace `22b8` with the identifier you get in the above command.
+
+Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running `adb devices`.
+
+```shell
+$ adb devices
+List of devices attached
+emulator-5554 offline # Google emulator
+14ed2fcc device # Physical device
+```
+
+Seeing `device` in the right column means the device is connected. You must have **only one device connected** at a time.
+
+### 3. Run your app
+
+From the root of your project, type the following in your command prompt to install and launch your app on the device:
+
+
+
+
+```shell
+npm run android
+```
+
+
+
+
+```shell
+yarn android
+```
+
+
+
+
+> If you get a "bridge configuration isn't available" error, see [Using adb reverse](running-on-device.md#method-1-using-adb-reverse-recommended).
+
+> Hint: You can also use the `React Native CLI` to generate and run a `release` build (e.g. from the root of your project: `yarn android --mode release`).
+
+
Connecting to the development server
+
+You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network.
+
+### Method 1: Using adb reverse (recommended)
+
+You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine.
+
+Run the following in a command prompt:
+
+```shell
+$ adb -s reverse tcp:8081 tcp:8081
+```
+
+To find the device name, run the following adb command:
+
+```shell
+$ adb devices
+```
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+### Method 2: Connect via Wi-Fi
+
+You can also connect to the development server over Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding.
+
+Open a terminal and type `/sbin/ifconfig` to find your machine's IP address.
+
+1. Make sure your laptop and your phone are on the **same** Wi-Fi network.
+2. Open your React Native app on your device.
+3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that.
+4. Open the in-app [Dev Menu](debugging.md#accessing-the-dev-menu).
+5. Go to **Dev Settings** → **Debug server host & port for device**.
+6. Type in your machine's IP address and the port of the local dev server (e.g. `10.0.1.1:8081`).
+7. Go back to the **Dev Menu** and select **Reload JS**.
+
+You can now enable Live reloading from the [Dev Menu](debugging.md#accessing-the-dev-menu). Your app will reload whenever your JavaScript code has changed.
+
+## Building your app for production
+
+You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for [generating a signed APK](signed-apk-android.md) to learn more.
+
+
+
+
+
+
+
+## Running your app on iOS devices
+
+#### Development OS
+
+
+
+
+[//]: # 'macOS, iOS'
+
+### 1. Plug in your device via USB
+
+Connect your iOS device to your Mac using a USB to Lightning cable. Navigate to the `ios` folder in your project, then open the `.xcodeproj` file, or if you are using CocoaPods open `.xcworkspace`, within it using Xcode.
+
+If this is your first time running an app on your iOS device, you may need to register your device for development. Open the **Product** menu from Xcode's menubar, then go to **Destination**. Look for and select your device from the list. Xcode will then register your device for development.
+
+### 2. Configure code signing
+
+Register for an [Apple developer account](https://developer.apple.com/) if you don't have one yet.
+
+Select your project in the Xcode Project Navigator, then select your main target (it should share the same name as your project). Look for the "General" tab. Go to "Signing" and make sure your Apple developer account or team is selected under the Team dropdown. Do the same for the tests target (it ends with Tests, and is below your main target).
+
+**Repeat** this step for the **Tests** target in your project.
+
+
+
+### 3. Build and Run your app
+
+If everything is set up correctly, your device will be listed as the build target in the Xcode toolbar, and it will also appear in the Devices pane (Shift ⇧ + Cmd ⌘ + 2). You can now press the **Build and run** button (Cmd ⌘ + R) or select **Run** from the **Product** menu. Your app will launch on your device shortly.
+
+
+
+> If you run into any issues, please take a look at Apple's [Launching Your App on a Device](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/LaunchingYourApponDevices/LaunchingYourApponDevices.html#//apple_ref/doc/uid/TP40012582-CH27-SW4) docs.
+
+
Connecting to the development server
+
+You can also iterate quickly on a device using the development server. You only have to be on the same Wi-Fi network as your computer. Shake your device to open the [Dev Menu](debugging.md#accessing-the-dev-menu), then enable Live Reload. Your app will reload whenever your JavaScript code has changed.
+
+
+
+### Troubleshooting
+
+> If you have any issues, ensure that your Mac and device are on the same network and can reach each other. Many open wireless networks with captive portals are configured to prevent devices from reaching other devices on the network. You may use your device's Personal Hotspot feature in this case. You may also share your internet (Wi-Fi/Ethernet) connection from your Mac to your device via USB and connect to the bundler through this tunnel for very high transfer speeds.
+
+When trying to connect to the development server you might get a [red screen with an error](debugging.md#in-app-errors-and-warnings) saying:
+
+> Connection to `http://localhost:8081/debugger-proxy?role=client` timed out. Are you running node proxy? If you are running on the device, check if you have the right IP address in `RCTWebSocketExecutor.m`.
+
+To solve this issue check the following points.
+
+#### 1. Wi-Fi network.
+
+Make sure your laptop and your phone are on the **same** Wi-Fi network.
+
+#### 2. IP address
+
+Make sure that the build script detected the IP address of your machine correctly (e.g. `10.0.1.123`).
+
+
+
+Open the **Report navigator** tab, select the last **Build** and search for `IP=` followed by an IP address. The IP address which gets embedded in the app should match your machines IP address.
+
+## Building your app for production
+
+You have built a great app using React Native, and you are now itching to release it in the App Store. The process is the same as any other native iOS app, with some additional considerations to take into account. Follow the guide for [publishing to the Apple App Store](publishing-to-app-store.md) to learn more.
+
+
+
+
+[//]: # 'Windows, iOS'
+
+> A Mac is required in order to build your app for iOS devices. Alternatively, you can refer to our [environment setup guide](environment-setup) to learn how to build your app using Expo CLI, which will allow you to run your app using the Expo client app.
+
+
+
+
+[//]: # 'Linux, iOS'
+
+> A Mac is required in order to build your app for iOS devices. Alternatively, you can refer to our [environment setup guide](environment-setup) to learn how to build your app using Expo CLI, which will allow you to run your app using the Expo client app.
+
+
+
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/running-on-simulator-ios.md b/website/versioned_docs/version-0.73.0/running-on-simulator-ios.md
new file mode 100644
index 00000000000..cf371cf29f2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/running-on-simulator-ios.md
@@ -0,0 +1,94 @@
+---
+id: running-on-simulator-ios
+title: Running On Simulator
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Starting the simulator
+
+Once you have your React Native project initialized, you can run the following command inside the newly created project directory.
+
+
+
+
+```shell
+npm run ios
+```
+
+
+
+
+```shell
+yarn ios
+```
+
+
+
+
+If everything is set up correctly, you should see your new app running in the iOS Simulator shortly.
+
+## Specifying a device
+
+You can specify the device the simulator should run with the `--simulator` flag, followed by the device name as a string. The default is `"iPhone 14"`. If you wish to run your app on an iPhone SE (3rd generation), run the following command:
+
+
+
+
+```shell
+npm run ios -- --simulator="iPhone SE (3rd generation)"
+```
+
+
+
+
+```shell
+yarn ios --simulator "iPhone SE (3rd generation)"
+```
+
+
+
+
+The device names correspond to the list of devices available in Xcode. You can check your available devices by running `xcrun simctl list devices` from the console.
+
+### Specifying a version of device
+
+If you have multiple iOS versions installed, you also need to specify it's appropiate version. E.g. To run your app on an iPhone 14 Pro (16.0) run the following command:
+
+
+
+
+```shell
+npm run ios -- --simulator="iPhone 14 Pro (16.0)"
+```
+
+
+
+
+```shell
+yarn ios --simulator "iPhone 14 Pro (16.0)"
+```
+
+
+
+
+## Specifying an UDID
+
+You can specify the device UDID returned from `xcrun simctl list devices` command. E.g. To run your app with UDID `AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA` run the following command:
+
+
+
+
+```shell
+npm run ios -- --udid="AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
+```
+
+
+
+
+```shell
+yarn ios --udid "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
+```
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/safeareaview.md b/website/versioned_docs/version-0.73.0/safeareaview.md
new file mode 100644
index 00000000000..16c3acdd33b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/safeareaview.md
@@ -0,0 +1,49 @@
+---
+id: safeareaview
+title: SafeAreaView
+---
+
+The purpose of `SafeAreaView` is to render content within the safe area boundaries of a device. It is currently only applicable to iOS devices with iOS version 11 or later.
+
+`SafeAreaView` renders nested content and automatically applies padding to reflect the portion of the view that is not covered by navigation bars, tab bars, toolbars, and other ancestor views. Moreover, and most importantly, Safe Area's paddings reflect the physical limitation of the screen, such as rounded corners or camera notches (i.e. the sensor housing area on iPhone 13).
+
+## Example
+
+To use, wrap your top level view with a `SafeAreaView` with a `flex: 1` style applied to it. You may also want to use a background color that matches your application's design.
+
+```SnackPlayer name=SafeAreaView&supportedPlatforms=ios
+import React from 'react';
+import {StyleSheet, Text, SafeAreaView} from 'react-native';
+
+const App = () => {
+ return (
+
+ Page content
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ text: {
+ fontSize: 25,
+ fontWeight: '500',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+> As padding is used to implement the behavior of the component, padding rules in styles applied to a `SafeAreaView` will be ignored and can cause different results depending on the platform. See [#22211](https://github.com/facebook/react-native/issues/22211) for details.
diff --git a/website/versioned_docs/version-0.73.0/scrollview.md b/website/versioned_docs/version-0.73.0/scrollview.md
new file mode 100644
index 00000000000..6845b6893d4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/scrollview.md
@@ -0,0 +1,776 @@
+---
+id: scrollview
+title: ScrollView
+---
+
+Component that wraps platform ScrollView while providing integration with touch locking "responder" system.
+
+Keep in mind that ScrollViews must have a bounded height in order to work, since they contain unbounded-height children into a bounded container (via a scroll interaction). In order to bound the height of a ScrollView, either set the height of the view directly (discouraged) or make sure all parent views have bounded height. Forgetting to transfer `{flex: 1}` down the view stack can lead to errors here, which the element inspector makes quick to debug.
+
+Doesn't yet support other contained responders from blocking this scroll view from becoming the responder.
+
+`` vs [``](flatlist.md) - which one to use?
+
+`ScrollView` renders all its react child components at once, but this has a performance downside.
+
+Imagine you have a very long list of items you want to display, maybe several screens worth of content. Creating JS components and native views for everything all at once, much of which may not even be shown, will contribute to slow rendering and increased memory usage.
+
+This is where `FlatList` comes into play. `FlatList` renders items lazily, when they are about to appear, and removes items that scroll way off screen to save memory and processing time.
+
+`FlatList` is also handy if you want to render separators between your items, multiple columns, infinite scroll loading, or any number of other features it supports out of the box.
+
+## Example
+
+```SnackPlayer name=ScrollView
+import React from 'react';
+import {
+ StyleSheet,
+ Text,
+ SafeAreaView,
+ ScrollView,
+ StatusBar,
+} from 'react-native';
+
+const App = () => {
+ return (
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
+ minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in
+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+ culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: StatusBar.currentHeight,
+ },
+ scrollView: {
+ backgroundColor: 'pink',
+ marginHorizontal: 20,
+ },
+ text: {
+ fontSize: 42,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view#props).
+
+---
+
+### `StickyHeaderComponent`
+
+A React Component that will be used to render sticky headers, should be used together with `stickyHeaderIndices`. You may need to set this component if your sticky header uses custom transforms, for example, when you want your list to have an animated and hidable header. If a component has not been provided, the default [`ScrollViewStickyHeader`](https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js) component will be used.
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `alwaysBounceHorizontal`
iOS
+
+When true, the scroll view bounces horizontally when it reaches the end even if the content is smaller than the scroll view itself.
+
+| Type | Default |
+| ---- | ----------------------------------------------------- |
+| bool | `true` when `horizontal={true}``false` otherwise |
+
+---
+
+### `alwaysBounceVertical`
iOS
+
+When true, the scroll view bounces vertically when it reaches the end even if the content is smaller than the scroll view itself.
+
+| Type | Default |
+| ---- | --------------------------------------------------- |
+| bool | `false` when `vertical={true}``true` otherwise |
+
+---
+
+### `automaticallyAdjustContentInsets`
iOS
+
+Controls whether iOS should automatically adjust the content inset for scroll views that are placed behind a navigation bar or tab bar/toolbar.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `automaticallyAdjustKeyboardInsets`
iOS
+
+Controls whether the ScrollView should automatically adjust its `contentInset` and `scrollViewInsets` when the Keyboard changes its size.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `automaticallyAdjustsScrollIndicatorInsets`
iOS
+
+Controls whether iOS should automatically adjust the scroll indicator insets. See Apple's [documentation on the property](https://developer.apple.com/documentation/uikit/uiscrollview/3198043-automaticallyadjustsscrollindica).
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `bounces`
iOS
+
+When true, the scroll view bounces when it reaches the end of the content if the content is larger than the scroll view along the axis of the scroll direction. When `false`, it disables all bouncing even if the `alwaysBounce*` props are `true`.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `bouncesZoom`
iOS
+
+When `true`, gestures can drive zoom past min/max and the zoom will animate to the min/max value at gesture end, otherwise the zoom will not exceed the limits.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `canCancelContentTouches`
iOS
+
+When `false`, once tracking starts, won't try to drag if the touch moves.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `centerContent`
iOS
+
+When `true`, the scroll view automatically centers the content when the content is smaller than the scroll view bounds; when the content is larger than the scroll view, this property has no effect.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `contentContainerStyle`
+
+These styles will be applied to the scroll view content container which wraps all of the child views. Example:
+
+```
+return (
+
+
+);
+...
+const styles = StyleSheet.create({
+ contentContainer: {
+ paddingVertical: 20
+ }
+});
+```
+
+| Type |
+| ------------------------------ |
+| [View Style](view-style-props) |
+
+---
+
+### `contentInset`
iOS
+
+The amount by which the scroll view content is inset from the edges of the scroll view.
+
+| Type | Default |
+| -------------------------------------------------------------------- | ---------------------------------------- |
+| object: `{top: number, left: number, bottom: number, right: number}` | `{top: 0, left: 0, bottom: 0, right: 0}` |
+
+---
+
+### `contentInsetAdjustmentBehavior`
iOS
+
+This property specifies how the safe area insets are used to modify the content area of the scroll view. Available on iOS 11 and later.
+
+| Type | Default |
+| -------------------------------------------------------------- | --------- |
+| enum(`'automatic'`, `'scrollableAxes'`, `'never'`, `'always'`) | `'never'` |
+
+---
+
+### `contentOffset`
+
+Used to manually set the starting scroll offset.
+
+| Type | Default |
+| ----- | -------------- |
+| Point | `{x: 0, y: 0}` |
+
+---
+
+### `decelerationRate`
+
+A floating-point number that determines how quickly the scroll view decelerates after the user lifts their finger. You may also use string shortcuts `"normal"` and `"fast"` which match the underlying iOS settings for `UIScrollViewDecelerationRateNormal` and `UIScrollViewDecelerationRateFast` respectively.
+
+- `'normal'` 0.998 on iOS, 0.985 on Android.
+- `'fast'`, 0.99 on iOS, 0.9 on Android.
+
+| Type | Default |
+| ---------------------------------- | ---------- |
+| enum(`'fast'`, `'normal'`), number | `'normal'` |
+
+---
+
+### `directionalLockEnabled`
iOS
+
+When true, the ScrollView will try to lock to only vertical or horizontal scrolling while dragging.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `disableIntervalMomentum`
+
+When true, the scroll view stops on the next index (in relation to scroll position at release) regardless of how fast the gesture is. This can be used for pagination when the page is less than the width of the horizontal ScrollView or the height of the vertical ScrollView.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `disableScrollViewPanResponder`
+
+When true, the default JS pan responder on the ScrollView is disabled, and full control over touches inside the ScrollView is left to its child components. This is particularly useful if `snapToInterval` is enabled, since it does not follow typical touch patterns. Do not use this on regular ScrollView use cases without `snapToInterval` as it may cause unexpected touches to occur while scrolling.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `endFillColor`
Android
+
+Sometimes a scrollview takes up more space than its content fills. When this is the case, this prop will fill the rest of the scrollview with a color to avoid setting a background and creating unnecessary overdraw. This is an advanced optimization that is not needed in the general case.
+
+| Type |
+| --------------- |
+| [color](colors) |
+
+---
+
+### `fadingEdgeLength`
Android
+
+Fades out the edges of the the scroll content.
+
+If the value is greater than `0`, the fading edges will be set accordingly to the current scroll direction and position, indicating if there is more content to show.
+
+| Type | Default |
+| ------ | ------- |
+| number | `0` |
+
+---
+
+### `horizontal`
+
+When `true`, the scroll view's children are arranged horizontally in a row instead of vertically in a column.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `indicatorStyle`
iOS
+
+The style of the scroll indicators.
+
+- `'default'` same as `black`.
+- `'black'`, scroll indicator is `black`. This style is good against a light background.
+- `'white'`, scroll indicator is `white`. This style is good against a dark background.
+
+| Type | Default |
+| --------------------------------------- | ----------- |
+| enum(`'default'`, `'black'`, `'white'`) | `'default'` |
+
+---
+
+### `invertStickyHeaders`
+
+If sticky headers should stick at the bottom instead of the top of the ScrollView. This is usually used with inverted ScrollViews.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `keyboardDismissMode`
+
+Determines whether the keyboard gets dismissed in response to a drag.
+
+- `'none'`, drags do not dismiss the keyboard.
+- `'on-drag'`, the keyboard is dismissed when a drag begins.
+
+**iOS Only**
+
+- `'interactive'`, the keyboard is dismissed interactively with the drag and moves in synchrony with the touch, dragging upwards cancels the dismissal. On Android this is not supported and it will have the same behavior as `'none'`.
+
+| Type | Default |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| enum(`'none'`, `'on-drag'`)
Android
enum(`'none'`, `'on-drag'`, `'interactive'`)
iOS
| `'none'` |
+
+---
+
+### `keyboardShouldPersistTaps`
+
+Determines when the keyboard should stay visible after a tap.
+
+- `'never'` tapping outside of the focused text input when the keyboard is up dismisses the keyboard. When this happens, children won't receive the tap.
+- `'always'`, the keyboard will not dismiss automatically, and the scroll view will not catch taps, but children of the scroll view can catch taps.
+- `'handled'`, the keyboard will not dismiss automatically when the tap was handled by children of the scroll view (or captured by an ancestor).
+- `false`, **_deprecated_**, use `'never'` instead
+- `true`, **_deprecated_**, use `'always'` instead
+
+| Type | Default |
+| --------------------------------------------------------- | --------- |
+| enum(`'always'`, `'never'`, `'handled'`, `false`, `true`) | `'never'` |
+
+---
+
+### `maintainVisibleContentPosition`
+
+When set, the scroll view will adjust the scroll position so that the first child that is currently visible and at or beyond `minIndexForVisible` will not change position. This is useful for lists that are loading content in both directions, e.g. a chat thread, where new messages coming in might otherwise cause the scroll position to jump. A value of 0 is common, but other values such as 1 can be used to skip loading spinners or other content that should not maintain position.
+
+The optional `autoscrollToTopThreshold` can be used to make the content automatically scroll to the top after making the adjustment if the user was within the threshold of the top before the adjustment was made. This is also useful for chat-like applications where you want to see new messages scroll into place, but not if the user has scrolled up a ways and it would be disruptive to scroll a bunch.
+
+Caveat 1: Reordering elements in the scrollview with this enabled will probably cause jumpiness and jank. It can be fixed, but there are currently no plans to do so. For now, don't re-order the content of any ScrollViews or Lists that use this feature.
+
+Caveat 2: This uses `contentOffset` and `frame.origin` in native code to compute visibility. Occlusion, transforms, and other complexity won't be taken into account as to whether content is "visible" or not.
+
+| Type |
+| ------------------------------------------------------------------------ |
+| object: `{minIndexForVisible: number, autoscrollToTopThreshold: number}` |
+
+---
+
+### `maximumZoomScale`
iOS
+
+The maximum allowed zoom scale.
+
+| Type | Default |
+| ------ | ------- |
+| number | `1.0` |
+
+---
+
+### `minimumZoomScale`
+
+Enables nested scrolling for Android API level 21+.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `onContentSizeChange`
+
+Called when scrollable content view of the ScrollView changes.
+
+The handler function will recieve two parameters: the content width and content height `(contentWidth, contentHeight)`.
+
+It's implemented using onLayout handler attached to the content container which this ScrollView renders.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onMomentumScrollBegin`
+
+Called when the momentum scroll starts (scroll which occurs as the ScrollView starts gliding).
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onMomentumScrollEnd`
+
+Called when the momentum scroll ends (scroll which occurs as the ScrollView glides to a stop).
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onScroll`
+
+Fires at most once per frame during scrolling. The frequency of the events can be controlled using the `scrollEventThrottle` prop. The event has the following shape (all values are numbers):
+
+```js
+{
+ nativeEvent: {
+ contentInset: {bottom, left, right, top},
+ contentOffset: {x, y},
+ contentSize: {height, width},
+ layoutMeasurement: {height, width},
+ zoomScale
+ }
+}
+```
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onScrollBeginDrag`
+
+Called when the user begins to drag the scroll view.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onScrollEndDrag`
+
+Called when the user stops dragging the scroll view and it either stops or begins to glide.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onScrollToTop`
iOS
+
+Fires when the scroll view scrolls to top after the status bar has been tapped.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `overScrollMode`
Android
+
+Used to override default value of overScroll mode.
+
+Possible values:
+
+- `'auto'` - Allow a user to over-scroll this view only if the content is large enough to meaningfully scroll.
+- `'always'` - Always allow a user to over-scroll this view.
+- `'never'` - Never allow a user to over-scroll this view.
+
+| Type | Default |
+| ------------------------------------- | -------- |
+| enum(`'auto'`, `'always'`, `'never'`) | `'auto'` |
+
+---
+
+### `pagingEnabled`
+
+When true, the scroll view stops on multiples of the scroll view's size when scrolling. This can be used for horizontal pagination.
+
+> Note: Vertical pagination is not supported on Android.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `persistentScrollbar`
Android
+
+Causes the scrollbars not to turn transparent when they are not in use.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `pinchGestureEnabled`
iOS
+
+When true, ScrollView allows use of pinch gestures to zoom in and out.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `refreshControl`
+
+A RefreshControl component, used to provide pull-to-refresh functionality for the ScrollView. Only works for vertical ScrollViews (`horizontal` prop must be `false`).
+
+See [RefreshControl](refreshcontrol).
+
+| Type |
+| ------- |
+| element |
+
+---
+
+### `removeClippedSubviews`
+
+Experimental: When `true`, offscreen child views (whose `overflow` value is `hidden`) are removed from their native backing superview when offscreen. This can improve scrolling performance on long lists.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `scrollEnabled`
+
+When false, the view cannot be scrolled via touch interaction.
+
+Note that the view can always be scrolled by calling `scrollTo`.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `scrollEventThrottle`
iOS
+
+This controls how often the scroll event will be fired while scrolling (as a time interval in ms). A lower number yields better accuracy for code that is tracking the scroll position, but can lead to scroll performance problems due to the volume of information being sent over the bridge. You will not notice a difference between values set between 1-16 as the JS run loop is synced to the screen refresh rate. If you do not need precise scroll position tracking, set this value higher to limit the information being sent across the bridge. The default value is `0`, which results in the scroll event being sent only once each time the view is scrolled.
+
+| Type | Default |
+| ------ | ------- |
+| number | `0` |
+
+---
+
+### `scrollIndicatorInsets`
iOS
+
+The amount by which the scroll view indicators are inset from the edges of the scroll view. This should normally be set to the same value as the `contentInset`.
+
+| Type | Default |
+| -------------------------------------------------------------------- | ---------------------------------------- |
+| object: `{top: number, left: number, bottom: number, right: number}` | `{top: 0, left: 0, bottom: 0, right: 0}` |
+
+---
+
+### `scrollPerfTag`
Android
+
+Tag used to log scroll performance on this scroll view. Will force momentum events to be turned on (see sendMomentumEvents). This doesn't do anything out of the box and you need to implement a custom native FpsListener for it to be useful.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `scrollToOverflowEnabled`
iOS
+
+When `true`, the scroll view can be programmatically scrolled beyond its content size.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `scrollsToTop`
iOS
+
+When `true`, the scroll view scrolls to top when the status bar is tapped.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `showsHorizontalScrollIndicator`
+
+When `true`, shows a horizontal scroll indicator.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `showsVerticalScrollIndicator`
+
+When `true`, shows a vertical scroll indicator.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `snapToAlignment`
iOS
+
+When `snapToInterval` is set, `snapToAlignment` will define the relationship of the snapping to the scroll view.
+
+Possible values:
+
+- `'start'` will align the snap at the left (horizontal) or top (vertical).
+- `'center'` will align the snap in the center.
+- `'end'` will align the snap at the right (horizontal) or bottom (vertical).
+
+| Type | Default |
+| ------------------------------------ | --------- |
+| enum(`'start'`, `'center'`, `'end'`) | `'start'` |
+
+---
+
+### `snapToEnd`
+
+Use in conjunction with `snapToOffsets`. By default, the end of the list counts as a snap offset. Set `snapToEnd` to false to disable this behavior and allow the list to scroll freely between its end and the last `snapToOffsets` offset.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `snapToInterval`
+
+When set, causes the scroll view to stop at multiples of the value of `snapToInterval`. This can be used for paginating through children that have lengths smaller than the scroll view. Typically used in combination with `snapToAlignment` and `decelerationRate="fast"`. Overrides less configurable `pagingEnabled` prop.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `snapToOffsets`
+
+When set, causes the scroll view to stop at the defined offsets. This can be used for paginating through variously sized children that have lengths smaller than the scroll view. Typically used in combination with `decelerationRate="fast"`. Overrides less configurable `pagingEnabled` and `snapToInterval` props.
+
+| Type |
+| --------------- |
+| array of number |
+
+---
+
+### `snapToStart`
+
+Use in conjunction with `snapToOffsets`. By default, the beginning of the list counts as a snap offset. Set `snapToStart` to `false` to disable this behavior and allow the list to scroll freely between its start and the first `snapToOffsets` offset.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `stickyHeaderHiddenOnScroll`
+
+When set to `true`, sticky header will be hidden when scrolling down the list, and it will dock at the top of the list when scrolling up.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `stickyHeaderIndices`
+
+An array of child indices determining which children get docked to the top of the screen when scrolling. For example, passing `stickyHeaderIndices={[0]}` will cause the first child to be fixed to the top of the scroll view. You can also use like [x,y,z] to make multiple items sticky when they are at the top. This property is not supported in conjunction with `horizontal={true}`.
+
+| Type |
+| --------------- |
+| array of number |
+
+---
+
+### `zoomScale`
iOS
+
+The current scale of the scroll view content.
+
+| Type | Default |
+| ------ | ------- |
+| number | `1.0` |
+
+---
+
+## Methods
+
+### `flashScrollIndicators()`
+
+```tsx
+flashScrollIndicators();
+```
+
+Displays the scroll indicators momentarily.
+
+---
+
+### `scrollTo()`
+
+```tsx
+scrollTo(
+ options?: {x?: number, y?: number, animated?: boolean} | number,
+ deprecatedX?: number,
+ deprecatedAnimated?: boolean,
+);
+```
+
+Scrolls to a given x, y offset, either immediately, with a smooth animation.
+
+**Example:**
+
+`scrollTo({x: 0, y: 0, animated: true})`
+
+> Note: The weird function signature is due to the fact that, for historical reasons, the function also accepts separate arguments as an alternative to the options object. This is deprecated due to ambiguity (y before x), and SHOULD NOT BE USED.
+
+---
+
+### `scrollToEnd()`
+
+```tsx
+scrollToEnd(options?: {animated?: boolean});
+```
+
+If this is a vertical ScrollView scrolls to the bottom. If this is a horizontal ScrollView scrolls to the right.
+
+Use `scrollToEnd({animated: true})` for smooth animated scrolling, `scrollToEnd({animated: false})` for immediate scrolling. If no options are passed, `animated` defaults to `true`.
diff --git a/website/versioned_docs/version-0.73.0/sectionlist.md b/website/versioned_docs/version-0.73.0/sectionlist.md
new file mode 100644
index 00000000000..a14b94e96f2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/sectionlist.md
@@ -0,0 +1,368 @@
+---
+id: sectionlist
+title: SectionList
+---
+
+A performant interface for rendering sectioned lists, supporting the most handy features:
+
+- Fully cross-platform.
+- Configurable viewability callbacks.
+- List header support.
+- List footer support.
+- Item separator support.
+- Section header support.
+- Section separator support.
+- Heterogeneous data and item rendering support.
+- Pull to Refresh.
+- Scroll loading.
+
+If you don't need section support and want a simpler interface, use [``](flatlist.md).
+
+## Example
+
+```SnackPlayer name=SectionList%20Example
+import React from 'react';
+import {
+ StyleSheet,
+ Text,
+ View,
+ SafeAreaView,
+ SectionList,
+ StatusBar,
+} from 'react-native';
+
+const DATA = [
+ {
+ title: 'Main dishes',
+ data: ['Pizza', 'Burger', 'Risotto'],
+ },
+ {
+ title: 'Sides',
+ data: ['French Fries', 'Onion Rings', 'Fried Shrimps'],
+ },
+ {
+ title: 'Drinks',
+ data: ['Water', 'Coke', 'Beer'],
+ },
+ {
+ title: 'Desserts',
+ data: ['Cheese Cake', 'Ice Cream'],
+ },
+];
+
+const App = () => (
+
+ item + index}
+ renderItem={({item}) => (
+
+ {item}
+
+ )}
+ renderSectionHeader={({section: {title}}) => (
+ {title}
+ )}
+ />
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: StatusBar.currentHeight,
+ marginHorizontal: 16,
+ },
+ item: {
+ backgroundColor: '#f9c2ff',
+ padding: 20,
+ marginVertical: 8,
+ },
+ header: {
+ fontSize: 32,
+ backgroundColor: '#fff',
+ },
+ title: {
+ fontSize: 24,
+ },
+});
+
+export default App;
+```
+
+This is a convenience wrapper around [``](virtualizedlist.md), and thus inherits its props (as well as those of [``](scrollview.md)) that aren't explicitly listed here, along with the following caveats:
+
+- Internal state is not preserved when content scrolls out of the render window. Make sure all your data is captured in the item data or external stores like Flux, Redux, or Relay.
+- This is a `PureComponent` which means that it will not re-render if `props` remain shallow-equal. Make sure that everything your `renderItem` function depends on is passed as a prop (e.g. `extraData`) that is not `===` after updates, otherwise your UI may not update on changes. This includes the `data` prop and parent component state.
+- In order to constrain memory and enable smooth scrolling, content is rendered asynchronously offscreen. This means it's possible to scroll faster than the fill rate and momentarily see blank content. This is a tradeoff that can be adjusted to suit the needs of each application, and we are working on improving it behind the scenes.
+- By default, the list looks for a `key` prop on each item and uses that for the React key. Alternatively, you can provide a custom `keyExtractor` prop.
+
+---
+
+# Reference
+
+## Props
+
+### [VirtualizedList Props](virtualizedlist.md#props)
+
+Inherits [VirtualizedList Props](virtualizedlist.md#props).
+
+---
+
+###
Required
**`renderItem`**
+
+Default renderer for every item in every section. Can be over-ridden on a per-section basis. Should return a React element.
+
+| Type |
+| -------- |
+| function |
+
+The render function will be passed an object with the following keys:
+
+- 'item' (object) - the item object as specified in this section's `data` key
+- 'index' (number) - Item's index within the section.
+- 'section' (object) - The full section object as specified in `sections`.
+- 'separators' (object) - An object with the following keys:
+ - 'highlight' (function) - `() => void`
+ - 'unhighlight' (function) - `() => void`
+ - 'updateProps' (function) - `(select, newProps) => void`
+ - 'select' (enum) - possible values are 'leading', 'trailing'
+ - 'newProps' (object)
+
+---
+
+###
Required
**`sections`**
+
+The actual data to render, akin to the `data` prop in [`FlatList`](flatlist.md).
+
+| Type |
+| ------------------------------------------- |
+| array of [Section](sectionlist.md#section)s |
+
+---
+
+### `extraData`
+
+A marker property for telling the list to re-render (since it implements `PureComponent`). If any of your `renderItem`, Header, Footer, etc. functions depend on anything outside of the `data` prop, stick it here and treat it immutably.
+
+| Type |
+| ---- |
+| any |
+
+---
+
+### `initialNumToRender`
+
+How many items to render in the initial batch. This should be enough to fill the screen but not much more. Note these items will never be unmounted as part of the windowed rendering in order to improve perceived performance of scroll-to-top actions.
+
+| Type | Default |
+| ------ | ------- |
+| number | `10` |
+
+---
+
+### `inverted`
+
+Reverses the direction of scroll. Uses scale transforms of -1.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `ItemSeparatorComponent`
+
+Rendered in between each item, but not at the top or bottom. By default, `highlighted`, `section`, and `[leading/trailing][Item/Section]` props are provided. `renderItem` provides `separators.highlight`/`unhighlight` which will update the `highlighted` prop, but you can also add custom props with `separators.updateProps`. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ---------------------------- |
+| component, function, element |
+
+---
+
+### `keyExtractor`
+
+Used to extract a unique key for a given item at the specified index. Key is used for caching and as the React key to track item re-ordering. The default extractor checks `item.key`, then falls back to using the index, like React does. Note that this sets keys for each item, but each overall section still needs its own key.
+
+| Type |
+| --------------------------------------- |
+| (item: object, index: number) => string |
+
+---
+
+### `ListEmptyComponent`
+
+Rendered when the list is empty. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `ListFooterComponent`
+
+Rendered at the very end of the list. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `ListHeaderComponent`
+
+Rendered at the very beginning of the list. Can be a React Component (e.g. `SomeComponent`), or a React element (e.g. ``).
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `onRefresh`
+
+If provided, a standard RefreshControl will be added for "Pull to Refresh" functionality. Make sure to also set the `refreshing` prop correctly. To offset the RefreshControl from the top (e.g. by 100 pts), use `progressViewOffset={100}`.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onViewableItemsChanged`
+
+Called when the viewability of rows changes, as defined by the `viewabilityConfig` prop.
+
+| Type |
+| ----------------------------------------------------------------------------------------------------- |
+| `md (callback: {changed: [ViewToken](viewtoken)[], viewableItems: [ViewToken](viewtoken)[]}) => void` |
+
+---
+
+### `refreshing`
+
+Set this true while waiting for new data from a refresh.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `removeClippedSubviews`
+
+> Note: may have bugs (missing content) in some circumstances - use at your own risk.
+
+This may improve scroll performance for large lists.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `renderSectionFooter`
+
+Rendered at the bottom of each section.
+
+| Type |
+| ------------------------------------------------------------------------- |
+| `md (info: {section: [Section](sectionlist#section)}) => element | null` |
+
+---
+
+### `renderSectionHeader`
+
+Rendered at the top of each section. These stick to the top of the `ScrollView` by default on iOS. See `stickySectionHeadersEnabled`.
+
+| Type |
+| ------------------------------------------------------------------------- |
+| `md (info: {section: [Section](sectionlist#section)}) => element | null` |
+
+---
+
+### `SectionSeparatorComponent`
+
+Rendered at the top and bottom of each section (note this is different from `ItemSeparatorComponent` which is only rendered between items). These are intended to separate sections from the headers above and below and typically have the same highlight response as `ItemSeparatorComponent`. Also receives `highlighted`, `[leading/trailing][Item/Section]`, and any custom props from `separators.updateProps`.
+
+| Type |
+| ------------------ |
+| component, element |
+
+---
+
+### `stickySectionHeadersEnabled`
+
+Makes section headers stick to the top of the screen until the next one pushes it off. Only enabled by default on iOS because that is the platform standard there.
+
+| Type | Default |
+| ------- | ------------------------------------------------------------------------------------------------ |
+| boolean | `false`
Android
`true`
iOS
|
+
+## Methods
+
+### `flashScrollIndicators()`
iOS
+
+```tsx
+flashScrollIndicators();
+```
+
+Displays the scroll indicators momentarily.
+
+---
+
+### `recordInteraction()`
+
+```tsx
+recordInteraction();
+```
+
+Tells the list an interaction has occurred, which should trigger viewability calculations, e.g. if `waitForInteractions` is true and the user has not scrolled. This is typically called by taps on items or by navigation actions.
+
+---
+
+### `scrollToLocation()`
+
+```tsx
+scrollToLocation(params: SectionListScrollParams);
+```
+
+Scrolls to the item at the specified `sectionIndex` and `itemIndex` (within the section) positioned in the viewable area such that `viewPosition` 0 places it at the top (and may be covered by a sticky header), 1 at the bottom, and 0.5 centered in the middle.
+
+> Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` or `onScrollToIndexFailed` prop.
+
+**Parameters:**
+
+| Name | Type |
+| ------------------------------------------------------- | ------ |
+| params
Required
| object |
+
+Valid `params` keys are:
+
+- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`.
+- 'itemIndex' (number) - Index within section for the item to scroll to. Required.
+- 'sectionIndex' (number) - Index for section that contains the item to scroll to. Required.
+- 'viewOffset' (number) - A fixed number of pixels to offset the final target position, e.g. to compensate for sticky headers.
+- 'viewPosition' (number) - A value of `0` places the item specified by index at the top, `1` at the bottom, and `0.5` centered in the middle.
+
+## Type Definitions
+
+### Section
+
+An object that identifies the data to be rendered for a given section.
+
+| Type |
+| ---- |
+| any |
+
+**Properties:**
+
+| Name | Type | Description |
+| ----------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| data
Required
| array | The data for rendering items in this section. Array of objects, much like [`FlatList`'s data prop](flatlist#required-data). |
+| key | string | Optional key to keep track of section re-ordering. If you don't plan on re-ordering sections, the array index will be used by default. |
+| renderItem | function | Optionally define an arbitrary item renderer for this section, overriding the default [`renderItem`](sectionlist#renderitem) for the list. |
+| ItemSeparatorComponent | component, element | Optionally define an arbitrary item separator for this section, overriding the default [`ItemSeparatorComponent`](sectionlist#itemseparatorcomponent) for the list. |
+| keyExtractor | function | Optionally define an arbitrary key extractor for this section, overriding the default [`keyExtractor`](sectionlist#keyextractor). |
diff --git a/website/versioned_docs/version-0.73.0/security.md b/website/versioned_docs/version-0.73.0/security.md
new file mode 100644
index 00000000000..632fe2e591f
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/security.md
@@ -0,0 +1,129 @@
+---
+id: security
+title: Security
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Security is often overlooked when building apps. It is true that it is impossible to build software that is completely impenetrable—we’ve yet to invent a completely impenetrable lock (bank vaults do, after all, still get broken into). However, the probability of falling victim to a malicious attack or being exposed for a security vulnerability is inversely proportional to the effort you’re willing to put in to protecting your application against any such eventuality. Although an ordinary padlock is pickable, it is still much harder to get past than a cabinet hook!
+
+
+
+In this guide, you will learn about best practices for storing sensitive information, authentication, network security, and tools that will help you secure your app. This is not a preflight checklist—it is a catalogue of options, each of which will help further protect your app and users.
+
+## Storing Sensitive Info
+
+Never store sensitive API keys in your app code. Anything included in your code could be accessed in plain text by anyone inspecting the app bundle. Tools like [react-native-dotenv](https://github.com/goatandsheep/react-native-dotenv) and [react-native-config](https://github.com/luggit/react-native-config/) are great for adding environment-specific variables like API endpoints, but they should not be confused with server-side environment variables, which can often contain secrets and API keys.
+
+If you must have an API key or a secret to access some resource from your app, the most secure way to handle this would be to build an orchestration layer between your app and the resource. This could be a serverless function (e.g. using AWS Lambda or Google Cloud Functions) which can forward the request with the required API key or secret. Secrets in server side code cannot be accessed by the API consumers the same way secrets in your app code can.
+
+**For persisted user data, choose the right type of storage based on its sensitivity.** As your app is used, you’ll often find the need to save data on the device, whether to support your app being used offline, cut down on network requests or save your user’s access token between sessions so they wouldn’t have to re-authenticate each time they use the app.
+
+> **Persisted vs unpersisted** — persisted data is written to the device’s disk, which lets the data be read by your app across application launches without having to do another network request to fetch it or asking the user to re-enter it. But this also can make that data more vulnerable to being accessed by attackers. Unpersisted data is never written to disk—so there's no data to access!
+
+### Async Storage
+
+[Async Storage](https://github.com/react-native-async-storage/async-storage) is a community-maintained module for React Native that provides an asynchronous, unencrypted, key-value store. Async Storage is not shared between apps: every app has its own sandbox environment and has no access to data from other apps.
+
+| **Do** use async storage when... | **Don't** use async storage for... |
+| --------------------------------------------- | ---------------------------------- |
+| Persisting non-sensitive data across app runs | Token storage |
+| Persisting Redux state | Secrets |
+| Persisting GraphQL state | |
+| Storing global app-wide variables | |
+
+#### Developer Notes
+
+
+
+
+
+> Async Storage is the React Native equivalent of Local Storage from the web
+
+
+
+
+### Secure Storage
+
+React Native does not come bundled with any way of storing sensitive data. However, there are pre-existing solutions for Android and iOS platforms.
+
+#### iOS - Keychain Services
+
+[Keychain Services](https://developer.apple.com/documentation/security/keychain_services) allows you to securely store small chunks of sensitive info for the user. This is an ideal place to store certificates, tokens, passwords, and any other sensitive information that doesn’t belong in Async Storage.
+
+#### Android - Secure Shared Preferences
+
+[Shared Preferences](https://developer.android.com/reference/android/content/SharedPreferences) is the Android equivalent for a persistent key-value data store. **Data in Shared Preferences is not encrypted by default**, but [Encrypted Shared Preferences](https://developer.android.com/topic/security/data) wraps the Shared Preferences class for Android, and automatically encrypts keys and values.
+
+#### Android - Keystore
+
+The [Android Keystore](https://developer.android.com/training/articles/keystore) system lets you store cryptographic keys in a container to make it more difficult to extract from the device.
+
+In order to use iOS Keychain services or Android Secure Shared Preferences, you can either write a bridge yourself or use a library which wraps them for you and provides a unified API at your own risk. Some libraries to consider:
+
+- [expo-secure-store](https://docs.expo.dev/versions/latest/sdk/securestore/)
+- [react-native-encrypted-storage](https://github.com/emeraldsanto/react-native-encrypted-storage) - uses Keychain on iOS and EncryptedSharedPreferences on Android.
+- [react-native-keychain](https://github.com/oblador/react-native-keychain)
+- [react-native-sensitive-info](https://github.com/mCodex/react-native-sensitive-info) - secure for iOS, but uses Android Shared Preferences for Android (which is not secure by default). There is however a [branch](https://github.com/mCodex/react-native-sensitive-info/tree/keystore) that uses Android Keystore.
+ - [redux-persist-sensitive-storage](https://github.com/CodingZeal/redux-persist-sensitive-storage) - wraps react-native-sensitive-info for Redux.
+
+> **Be mindful of unintentionally storing or exposing sensitive info.** This could happen accidentally, for example saving sensitive form data in redux state and persisting the whole state tree in Async Storage. Or sending user tokens and personal info to an application monitoring service such as Sentry or Crashlytics.
+
+## Authentication and Deep Linking
+
+
+
+Mobile apps have a unique vulnerability that is non-existent in the web: **deep linking**. Deep linking is a way of sending data directly to a native application from an outside source. A deep link looks like `app://` where `app` is your app scheme and anything following the // could be used internally to handle the request.
+
+For example, if you were building an ecommerce app, you could use `app://products/1` to deep link to your app and open the product detail page for a product with id 1. You can think of these kind of like URLs on the web, but with one crucial distinction:
+
+Deep links are not secure and you should never send any sensitive information in them.
+
+The reason deep links are not secure is because there is no centralized method of registering URL schemes. As an application developer, you can use almost any url scheme you choose by [configuring it in Xcode](https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app) for iOS or [adding an intent on Android](https://developer.android.com/training/app-links/deep-linking).
+
+There is nothing stopping a malicious application from hijacking your deep link by also registering to the same scheme and then obtaining access to the data your link contains. Sending something like `app://products/1` is not harmful, but sending tokens is a security concern.
+
+When the operating system has two or more applications to choose from when opening a link, Android will show the user a [Disambiguation dialog](https://developer.android.com/training/basics/intents/sending#disambiguation-dialog) and ask them to choose which application to use to open the link. On iOS however, the operating system will make the choice for you, so the user will be blissfully unaware. Apple has made steps to address this issue in later iOS versions (iOS 11) where they instituted a first-come-first-served principle, although this vulnerability could still be exploited in different ways which you can read more about [here](https://thehackernews.com/2019/07/ios-custom-url-scheme.html). Using [universal links](https://developer.apple.com/ios/universal-links/) will allow linking to content within your app securely in iOS.
+
+### OAuth2 and Redirects
+
+The OAuth2 authentication protocol is incredibly popular nowadays, prided as the most complete and secure protocol around. The OpenID Connect protocol is also based on this. In OAuth2, the user is asked to authenticate via a third party. On successful completion, this third party redirects back to the requesting application with a verification code which can be exchanged for a JWT — a [JSON Web Token](https://jwt.io/introduction/). JWT is an open standard for securely transmitting information between parties on the web.
+
+On the web, this redirect step is secure, because URLs on the web are guaranteed to be unique. This is not true for apps because, as mentioned earlier, there is no centralized method of registering URL schemes! In order to address this security concern, an additional check must be added in the form of PKCE.
+
+[PKCE](https://oauth.net/2/pkce/), pronounced “Pixy” stands for Proof of Key Code Exchange, and is an extension to the OAuth 2 spec. This involves adding an additional layer of security which verifies that the authentication and token exchange requests come from the same client. PKCE uses the [SHA 256](https://www.movable-type.co.uk/scripts/sha256.html) Cryptographic Hash Algorithm. SHA 256 creates a unique “signature” for a text or file of any size, but it is:
+
+- Always the same length regardless of the input file
+- Guaranteed to always produce the same result for the same input
+- One way (that is, you can’t reverse engineer it to reveal the original input)
+
+Now you have two values:
+
+- **code_verifier** - a large random string generated by the client
+- **code_challenge** - the SHA 256 of the code_verifier
+
+During the initial `/authorize` request, the client also sends the `code_challenge` for the `code_verifier` it keeps in memory. After the authorize request has returned correctly, the client also sends the `code_verifier` that was used to generate the `code_challenge`. The IDP will then calculate the `code_challenge`, see if it matches what was set on the very first `/authorize` request, and only send the access token if the values match.
+
+This guarantees that only the application that triggered the initial authorization flow would be able to successfully exchange the verification code for a JWT. So even if a malicious application gets access to the verification code, it will be useless on its own. To see this in action, check out [this example](https://aaronparecki.com/oauth-2-simplified/#mobile-apps).
+
+A library to consider for native OAuth is [react-native-app-auth](https://github.com/FormidableLabs/react-native-app-auth). React-native-app-auth is an SDK for communicating with OAuth2 providers. It wraps the native [AppAuth-iOS](https://github.com/openid/AppAuth-iOS) and [AppAuth-Android](https://github.com/openid/AppAuth-Android) libraries and can support PKCE.
+
+> React-native-app-auth can support PKCE only if your Identity Provider supports it.
+
+
+
+## Network Security
+
+Your APIs should always use [SSL encryption](https://www.ssl.com/faqs/faq-what-is-ssl/). SSL encryption protects against the requested data being read in plain text between when it leaves the server and before it reaches the client. You’ll know the endpoint is secure, because it starts with `https://` instead of `http://`.
+
+### SSL Pinning
+
+Using https endpoints could still leave your data vulnerable to interception. With https, the client will only trust the server if it can provide a valid certificate that is signed by a trusted Certificate Authority that is pre-installed on the client. An attacker could take advantage of this by installing a malicious root CA certificate to the user’s device, so the client would trust all certificates that are signed by the attacker. Thus, relying on certificates alone could still leave you vulnerable to a [man-in-the-middle attack](https://en.wikipedia.org/wiki/Man-in-the-middle_attack).
+
+**SSL pinning** is a technique that can be used on the client side to avoid this attack. It works by embedding (or pinning) a list of trusted certificates to the client during development, so that only the requests signed with one of the trusted certificates will be accepted, and any self-signed certificates will not be.
+
+> When using SSL pinning, you should be mindful of certificate expiry. Certificates expire every 1-2 years and when one does, it’ll need to be updated in the app as well as on the server. As soon as the certificate on the server has been updated, any apps with the old certificate embedded in them will cease to work.
+
+## Summary
+
+There is no bulletproof way to handle security, but with conscious effort and diligence, it is possible to significantly reduce the likelihood of a security breach in your application. Invest in security proportional to the sensitivity of the data stored in your application, the number of users, and the damage a hacker could do when gaining access to their account. And remember: it’s significantly harder to access information that was never requested in the first place.
diff --git a/website/versioned_docs/version-0.73.0/segmentedcontrolios.md b/website/versioned_docs/version-0.73.0/segmentedcontrolios.md
new file mode 100644
index 00000000000..eb7ec3a49d3
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/segmentedcontrolios.md
@@ -0,0 +1,126 @@
+---
+id: segmentedcontrolios
+title: '🚧 SegmentedControlIOS'
+---
+
+> **Removed from React Native.** Use one of the [community packages](https://reactnative.directory/?search=segmentedcontrol) instead.
+
+Uses `SegmentedControlIOS` to render a UISegmentedControl iOS.
+
+#### Programmatically changing selected index
+
+The selected index can be changed on the fly by assigning the selectedIndex prop to a state variable, then changing that variable. Note that the state variable would need to be updated as the user selects a value and changes the index, as shown in the example below.
+
+## Example
+
+```SnackPlayer name=SegmentedControlIOS%20Example&supportedPlatforms=ios&ext=js
+import React, {useState} from 'react';
+import {SegmentedControlIOS, StyleSheet, Text, View} from 'react-native';
+
+const App = () => {
+ const [index, setIndex] = useState(0);
+ return (
+
+ {
+ setIndex(event.nativeEvent.selectedSegmentIndex);
+ }}
+ />
+ Selected index: {index}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 24,
+ justifyContent: 'center',
+ },
+ text: {
+ marginTop: 24,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view.md#props).
+
+### `enabled`
+
+If false the user won't be able to interact with the control. Default value is true.
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
+
+---
+
+### `momentary`
+
+If true, then selecting a segment won't persist visually. The `onValueChange` callback will still work as expected.
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
+
+---
+
+### `onChange`
+
+Callback that is called when the user taps a segment; passes the event as an argument
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onValueChange`
+
+Callback that is called when the user taps a segment; passes the segment's value as an argument
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `selectedIndex`
+
+The index in `props.values` of the segment to be (pre)selected.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `tintColor`
+
+> **Note:** `tintColor` is not supported on the iOS 13+.
+
+Accent color of the control.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
+
+---
+
+### `values`
+
+The labels for the control's segment buttons, in order.
+
+| Type | Required |
+| --------------- | -------- |
+| array of string | No |
diff --git a/website/versioned_docs/version-0.73.0/settings.md b/website/versioned_docs/version-0.73.0/settings.md
new file mode 100644
index 00000000000..76aabe647b7
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/settings.md
@@ -0,0 +1,98 @@
+---
+id: settings
+title: Settings
+---
+
+`Settings` serves as a wrapper for [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults), a persistent key-value store available only on iOS.
+
+## Example
+
+```SnackPlayer name=Settings%20Example&supportedPlatforms=ios
+import React, {useState} from 'react';
+import {Button, Settings, StyleSheet, Text, View} from 'react-native';
+
+const App = () => {
+ const [data, setData] = useState(() => Settings.get('data'));
+
+ return (
+
+ Stored value:
+ {data}
+ {
+ Settings.set({data: 'React'});
+ setData(Settings.get('data'));
+ }}
+ title="Store 'React'"
+ />
+ {
+ Settings.set({data: 'Native'});
+ setData(Settings.get('data'));
+ }}
+ title="Store 'Native'"
+ />
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ value: {
+ fontSize: 24,
+ marginVertical: 12,
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `clearWatch()`
+
+```tsx
+static clearWatch(watchId: number);
+```
+
+`watchId` is the number returned by `watchKeys()` when the subscription was originally configured.
+
+---
+
+### `get()`
+
+```tsx
+static get(key: string): any;
+```
+
+Get the current value for a given `key` in `NSUserDefaults`.
+
+---
+
+### `set()`
+
+```tsx
+static set(settings: Record);
+```
+
+Set one or more values in `NSUserDefaults`.
+
+---
+
+### `watchKeys()`
+
+```tsx
+static watchKeys(keys: string | array, callback: () => void): number;
+```
+
+Subscribe to be notified when the value for any of the keys specified by the `keys` parameter has been changed in `NSUserDefaults`. Returns a `watchId` number that may be used with `clearWatch()` to unsubscribe.
+
+> **Note:** `watchKeys()` by design ignores internal `set()` calls and fires callback only on changes preformed outside of React Native code.
diff --git a/website/versioned_docs/version-0.73.0/shadow-props.md b/website/versioned_docs/version-0.73.0/shadow-props.md
new file mode 100644
index 00000000000..a328842b736
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/shadow-props.md
@@ -0,0 +1,253 @@
+---
+id: shadow-props
+title: Shadow Props
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+
+```SnackPlayer name=Shadow%20Props&supportedPlatforms=ios&ext=js&dependencies=@react-native-community/slider
+import React, {useState} from 'react';
+import {Text, View, StyleSheet} from 'react-native';
+import Slider from '@react-native-community/slider';
+const ShadowPropSlider = ({label, value, ...props}) => {
+ return (
+ <>
+
+ {label} ({value.toFixed(2)})
+
+
+ >
+ );
+};
+
+const App = () => {
+ const [shadowOffsetWidth, setShadowOffsetWidth] = useState(0);
+ const [shadowOffsetHeight, setShadowOffsetHeight] = useState(0);
+ const [shadowRadius, setShadowRadius] = useState(0);
+ const [shadowOpacity, setShadowOpacity] = useState(0.1);
+
+ return (
+
+
+
+
+
+
+ setShadowOpacity(val)}
+ />
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'space-around',
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ square: {
+ alignSelf: 'center',
+ backgroundColor: 'white',
+ borderRadius: 4,
+ height: 150,
+ shadowColor: 'black',
+ width: 150,
+ },
+ controls: {
+ paddingHorizontal: 12,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=Shadow%20Props&supportedPlatforms=ios&ext=tsx&dependencies=@react-native-community/slider
+import React, {useState} from 'react';
+import {Text, View, StyleSheet} from 'react-native';
+import Slider from '@react-native-community/slider';
+import type {SliderProps} from '@react-native-community/slider';
+
+type ShadowPropSliderProps = SliderProps & {
+ label: string;
+};
+
+const ShadowPropSlider = ({label, value, ...props}: ShadowPropSliderProps) => {
+ return (
+ <>
+
+ {label} ({value?.toFixed(2)})
+
+
+ >
+ );
+};
+
+const App = () => {
+ const [shadowOffsetWidth, setShadowOffsetWidth] = useState(0);
+ const [shadowOffsetHeight, setShadowOffsetHeight] = useState(0);
+ const [shadowRadius, setShadowRadius] = useState(0);
+ const [shadowOpacity, setShadowOpacity] = useState(0.1);
+
+ return (
+
+
+
+
+
+
+ setShadowOpacity(val)}
+ />
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'space-around',
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ square: {
+ alignSelf: 'center',
+ backgroundColor: 'white',
+ borderRadius: 4,
+ height: 150,
+ shadowColor: 'black',
+ width: 150,
+ },
+ controls: {
+ paddingHorizontal: 12,
+ },
+});
+
+export default App;
+```
+
+
+
+
+# Reference
+
+## Props
+
+### `shadowColor`
+
+Sets the drop shadow color.
+
+This property will only work on Android API 28 and above. For similar functionality on lower Android APIs, use the [`elevation` property](view-style-props#elevation-android).
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `shadowOffset`
iOS
+
+Sets the drop shadow offset.
+
+| Type |
+| ---------------------------------------- |
+| object: `{width: number,height: number}` |
+
+---
+
+### `shadowOpacity`
iOS
+
+Sets the drop shadow opacity (multiplied by the color's alpha component).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `shadowRadius`
iOS
+
+Sets the drop shadow blur radius.
+
+| Type |
+| ------ |
+| number |
diff --git a/website/versioned_docs/version-0.73.0/share.md b/website/versioned_docs/version-0.73.0/share.md
new file mode 100644
index 00000000000..ab0e847c003
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/share.md
@@ -0,0 +1,130 @@
+---
+id: share
+title: Share
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+## Example
+
+
+
+
+```SnackPlayer name=Example&supportedPlatforms=ios,android&ext=js
+import React from 'react';
+import {Alert, Share, View, Button} from 'react-native';
+
+const ShareExample = () => {
+ const onShare = async () => {
+ try {
+ const result = await Share.share({
+ message:
+ 'React Native | A framework for building native apps using React',
+ });
+ if (result.action === Share.sharedAction) {
+ if (result.activityType) {
+ // shared with activity type of result.activityType
+ } else {
+ // shared
+ }
+ } else if (result.action === Share.dismissedAction) {
+ // dismissed
+ }
+ } catch (error) {
+ Alert.alert(error.message);
+ }
+ };
+ return (
+
+
+
+ );
+};
+
+export default ShareExample;
+```
+
+
+
+
+```SnackPlayer name=Example&supportedPlatforms=ios,android&ext=tsx
+import React from 'react';
+import {Alert, Share, View, Button} from 'react-native';
+
+const ShareExample = () => {
+ const onShare = async () => {
+ try {
+ const result = await Share.share({
+ message:
+ 'React Native | A framework for building native apps using React',
+ });
+ if (result.action === Share.sharedAction) {
+ if (result.activityType) {
+ // shared with activity type of result.activityType
+ } else {
+ // shared
+ }
+ } else if (result.action === Share.dismissedAction) {
+ // dismissed
+ }
+ } catch (error: any) {
+ Alert.alert(error.message);
+ }
+ };
+ return (
+
+
+
+ );
+};
+
+export default ShareExample;
+```
+
+
+
+
+# Reference
+
+## Methods
+
+### `share()`
+
+```tsx
+static share(content: ShareContent, options?: ShareOptions);
+```
+
+Open a dialog to share text content.
+
+In iOS, returns a Promise which will be invoked with an object containing `action` and `activityType`. If the user dismissed the dialog, the Promise will still be resolved with action being `Share.dismissedAction` and all the other keys being undefined. Note that some share options will not appear or work on the iOS simulator.
+
+In Android, returns a Promise which will always be resolved with action being `Share.sharedAction`.
+
+**Properties:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| content
Required
| object | `message` - a message to share `url` - a URL to share
iOS
`title` - title of the message
Android
At least one of `url` and `message` is required. |
+| options | object | `dialogTitle`
Android
`excludedActivityTypes`
iOS
`subject` - a subject to share via email
iOS
`tintColor`
iOS
`anchor` - the node to which the action sheet should be anchored (used for iPad)
+
+```tsx
+static dismissedAction: 'dismissedAction';
+```
+
+The dialog has been dismissed.
diff --git a/website/versioned_docs/version-0.73.0/signed-apk-android.md b/website/versioned_docs/version-0.73.0/signed-apk-android.md
new file mode 100644
index 00000000000..d51ecd67bbe
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/signed-apk-android.md
@@ -0,0 +1,196 @@
+---
+id: signed-apk-android
+title: Publishing to Google Play Store
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Android requires that all apps be digitally signed with a certificate before they can be installed. In order to distribute your Android application via [Google Play store](https://play.google.com/store) it needs to be signed with a release key that then needs to be used for all future updates. Since 2017 it is possible for Google Play to manage signing releases automatically thanks to [App Signing by Google Play](https://developer.android.com/studio/publish/app-signing#app-signing-google-play) functionality. However, before your application binary is uploaded to Google Play it needs to be signed with an upload key. The [Signing Your Applications](https://developer.android.com/tools/publishing/app-signing.html) page on Android Developers documentation describes the topic in detail. This guide covers the process in brief, as well as lists the steps required to package the JavaScript bundle.
+
+:::info
+If you are using Expo, read the Expo guide for [Deploying to App Stores](https://docs.expo.dev/distribution/app-stores/) to build and submit your app for the Google Play Store. This guide works with any React Native app to automate the deployment process.
+:::
+
+## Generating an upload key
+
+You can generate a private signing key using `keytool`.
+
+### Windows
+
+On Windows `keytool` must be run from `C:\Program Files\Java\jdkx.x.x_x\bin`, as administrator.
+
+```shell
+keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
+```
+
+This command prompts you for passwords for the keystore and key and for the Distinguished Name fields for your key. It then generates the keystore as a file called `my-upload-key.keystore`.
+
+The keystore contains a single key, valid for 10000 days. The alias is a name that you will use later when signing your app, so remember to take note of the alias.
+
+### macOS
+
+On macOS, if you're not sure where your JDK bin folder is, then perform the following command to find it:
+
+```shell
+/usr/libexec/java_home
+```
+
+It will output the directory of the JDK, which will look something like this:
+
+```shell
+/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home
+```
+
+Navigate to that directory by using the command `cd /your/jdk/path` and use the keytool command with sudo permission as shown below.
+
+```shell
+sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
+```
+
+:::caution
+Remember to keep the keystore file private. In case you've lost upload key or it's been compromised you should [follow these instructions](https://support.google.com/googleplay/android-developer/answer/7384423#reset).
+:::
+
+## Setting up Gradle variables
+
+1. Place the `my-upload-key.keystore` file under the `android/app` directory in your project folder.
+2. Edit the file `~/.gradle/gradle.properties` or `android/gradle.properties`, and add the following (replace `*****` with the correct keystore password, alias and key password),
+
+```
+MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
+MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
+MYAPP_UPLOAD_STORE_PASSWORD=*****
+MYAPP_UPLOAD_KEY_PASSWORD=*****
+```
+
+These are going to be global Gradle variables, which we can later use in our Gradle config to sign our app.
+
+:::note Note about using git
+Saving the above Gradle variables in `~/.gradle/gradle.properties` instead of `android/gradle.properties` prevents them from being checked in to git. You may have to create the `~/.gradle/gradle.properties` file in your user's home directory before you can add the variables.
+:::
+
+:::note Note about security
+If you are not keen on storing your passwords in plaintext, and you are running macOS, you can also [store your credentials in the Keychain Access app](https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/). Then you can skip the two last rows in `~/.gradle/gradle.properties`.
+:::
+
+## Adding signing config to your app's Gradle config
+
+The last configuration step that needs to be done is to setup release builds to be signed using upload key. Edit the file `android/app/build.gradle` in your project folder, and add the signing config,
+
+```groovy
+...
+android {
+ ...
+ defaultConfig { ... }
+ signingConfigs {
+ release {
+ if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
+ storeFile file(MYAPP_UPLOAD_STORE_FILE)
+ storePassword MYAPP_UPLOAD_STORE_PASSWORD
+ keyAlias MYAPP_UPLOAD_KEY_ALIAS
+ keyPassword MYAPP_UPLOAD_KEY_PASSWORD
+ }
+ }
+ }
+ buildTypes {
+ release {
+ ...
+ signingConfig signingConfigs.release
+ }
+ }
+}
+...
+```
+
+## Generating the release AAB
+
+Run the following command in a terminal:
+
+```shell
+npx react-native build-android --mode=release
+```
+
+This command uses Gradle's `bundleRelease` under the hood that bundles all the JavaScript needed to run your app into the AAB ([Android App Bundle](https://developer.android.com/guide/app-bundle)). If you need to change the way the JavaScript bundle and/or drawable resources are bundled (e.g. if you changed the default file/folder names or the general structure of the project), have a look at `android/app/build.gradle` to see how you can update it to reflect these changes.
+
+:::note
+Make sure `gradle.properties` does not include `org.gradle.configureondemand=true` as that will make the release build skip bundling JS and assets into the app binary.
+:::
+
+The generated AAB can be found under `android/app/build/outputs/bundle/release/app-release.aab`, and is ready to be uploaded to Google Play.
+
+In order for Google Play to accept AAB format the App Signing by Google Play needs to be configured for your application on the Google Play Console. If you are updating an existing app that doesn't use App Signing by Google Play, please check our [migration section](#migrating-old-android-react-native-apps-to-use-app-signing-by-google-play) to learn how to perform that configuration change.
+
+## Testing the release build of your app
+
+Before uploading the release build to the Play Store, make sure you test it thoroughly. First uninstall any previous version of the app you already have installed. Install it on the device using the following command in the project root:
+
+
+
+
+```shell
+npm run android -- --mode="release"
+```
+
+
+
+
+```shell
+yarn android --mode release
+```
+
+
+
+
+Note that `--mode release` is only available if you've set up signing as described above.
+
+You can terminate any running bundler instances, since all your framework and JavaScript code is bundled in the APK's assets.
+
+## Publishing to other stores
+
+By default, the generated APK has the native code for both `x86`, `x86_64`, `ARMv7a` and `ARM64-v8a` CPU architectures. This makes it easier to share APKs that run on almost all Android devices. However, this has the downside that there will be some unused native code on any device, leading to unnecessarily bigger APKs.
+
+You can create an APK for each CPU by adding the following line in your `android/app/build.gradle` file:
+
+```diff
+android {
+
+ splits {
+ abi {
+ reset()
+ enable true
+ universalApk false
+ include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
+ }
+ }
+
+}
+```
+
+Upload these files to markets which support device targeting, such as [Amazon AppStore](https://developer.amazon.com/docs/app-submission/device-filtering-and-compatibility.html) or [F-Droid](https://f-droid.org/en/), and the users will automatically get the appropriate APK. If you want to upload to other markets, such as [APKFiles](https://www.apkfiles.com/), which do not support multiple APKs for a single app, change the `universalApk false` line to `true` to create the default universal APK with binaries for both CPUs.
+
+Please note that you will also have to configure distinct version codes, as [suggested in this page](https://developer.android.com/studio/build/configure-apk-splits#configure-APK-versions) from the official Android documentation.
+
+## Enabling Proguard to reduce the size of the APK (optional)
+
+Proguard is a tool that can slightly reduce the size of the APK. It does this by stripping parts of the React Native Java bytecode (and its dependencies) that your app is not using.
+
+:::caution Important
+Make sure to thoroughly test your app if you've enabled Proguard. Proguard often requires configuration specific to each native library you're using. See `app/proguard-rules.pro`.
+:::
+
+To enable Proguard, edit `android/app/build.gradle`:
+
+```groovy
+/**
+ * Run Proguard to shrink the Java bytecode in release builds.
+ */
+def enableProguardInReleaseBuilds = true
+```
+
+## Migrating old Android React Native apps to use App Signing by Google Play
+
+If you are migrating from previous version of React Native chances are your app does not use App Signing by Google Play feature. We recommend you enable that in order to take advantage from things like automatic app splitting. In order to migrate from the old way of signing you need to start by [generating new upload key](#generating-an-upload-key) and then replacing release signing config in `android/app/build.gradle` to use the upload key instead of the release one (see section about [adding signing config to gradle](#adding-signing-config-to-your-apps-gradle-config)). Once that's done you should follow the [instructions from Google Play Help website](https://support.google.com/googleplay/android-developer/answer/7384423) in order to send your original release key to Google Play.
+
+## Default Permissions
+
+By default, `INTERNET` permission is added to your Android app as pretty much all apps use it. `SYSTEM_ALERT_WINDOW` permission is added to your Android APK in debug mode but it will be removed in production.
diff --git a/website/versioned_docs/version-0.73.0/slider.md b/website/versioned_docs/version-0.73.0/slider.md
new file mode 100644
index 00000000000..7aa6809d321
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/slider.md
@@ -0,0 +1,176 @@
+---
+id: slider
+title: '🚧 Slider'
+---
+
+> **Deprecated.** Use one of the [community packages](https://reactnative.directory/?search=slider) instead.
+
+A component used to select a single value from a range of values.
+
+---
+
+# Reference
+
+## Props
+
+Inherits [View Props](view.md#props).
+
+### `style`
+
+Used to style and layout the `Slider`. See `StyleSheet.js` and `ViewStylePropTypes.js` for more info.
+
+| Type | Required |
+| ---------- | -------- |
+| View.style | No |
+
+---
+
+### `disabled`
+
+If true the user won't be able to move the slider. Default value is false.
+
+| Type | Required |
+| ---- | -------- |
+| bool | No |
+
+---
+
+### `maximumValue`
+
+Initial maximum value of the slider. Default value is 1.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `minimumTrackTintColor`
+
+The color used for the track to the left of the button. Overrides the default blue gradient image on iOS.
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+---
+
+### `minimumValue`
+
+Initial minimum value of the slider. Default value is 0.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `onSlidingComplete`
+
+Callback that is called when the user releases the slider, regardless if the value has changed. The current value is passed as an argument to the callback handler.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `onValueChange`
+
+Callback continuously called while the user is dragging the slider.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `step`
+
+Step value of the slider. The value should be between 0 and (maximumValue - minimumValue). Default value is 0.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `maximumTrackTintColor`
+
+The color used for the track to the right of the button. Overrides the default gray gradient image on iOS.
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+---
+
+### `testID`
+
+Used to locate this view in UI automation tests.
+
+| Type | Required |
+| ------ | -------- |
+| string | No |
+
+---
+
+### `value`
+
+Initial value of the slider. The value should be between minimumValue and maximumValue, which default to 0 and 1 respectively. Default value is 0.
+
+_This is not a controlled component_, you don't need to update the value during dragging.
+
+| Type | Required |
+| ------ | -------- |
+| number | No |
+
+---
+
+### `thumbTintColor`
+
+The color used to tint the default thumb images on iOS, or the color of the foreground switch grip on Android.
+
+| Type | Required |
+| ------------------ | -------- |
+| [color](colors.md) | No |
+
+---
+
+### `maximumTrackImage`
+
+Assigns a maximum track image. Only static images are supported. The leftmost pixel of the image will be stretched to fill the track.
+
+| Type | Required | Platform |
+| ---------------------- | -------- | -------- |
+| Image.propTypes.source | No | iOS |
+
+---
+
+### `minimumTrackImage`
+
+Assigns a minimum track image. Only static images are supported. The rightmost pixel of the image will be stretched to fill the track.
+
+| Type | Required | Platform |
+| ---------------------- | -------- | -------- |
+| Image.propTypes.source | No | iOS |
+
+---
+
+### `thumbImage`
+
+Sets an image for the thumb. Only static images are supported.
+
+| Type | Required | Platform |
+| ---------------------- | -------- | -------- |
+| Image.propTypes.source | No | iOS |
+
+---
+
+### `trackImage`
+
+Assigns a single image for the track. Only static images are supported. The center pixel of the image will be stretched to fill the track.
+
+| Type | Required | Platform |
+| ---------------------- | -------- | -------- |
+| Image.propTypes.source | No | iOS |
diff --git a/website/versioned_docs/version-0.73.0/speeding-ci-builds.md b/website/versioned_docs/version-0.73.0/speeding-ci-builds.md
new file mode 100644
index 00000000000..9adf6bc90d2
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/speeding-ci-builds.md
@@ -0,0 +1,54 @@
+---
+id: speeding-ci-builds
+title: Speeding Up CI Builds
+---
+
+You or your company may have set up a Continuous Integration (CI) environment to test your React Native application.
+
+A fast CI service is important for 2 reasons:
+
+- The more time CI machines are running, the more they cost.
+- The longer the CI jobs take to run, the longer the development loop.
+
+It is therefore important to try and minimize the time the CI environment spends building React Native.
+
+## Disable Flipper for iOS
+
+[Flipper](https://github.com/facebook/flipper) is a debugging tool shipped by default with React Native, to help developers debug and profile their React Native applications. However, Flipper is not required in CI: it is very unlikely that you or one of your collegue would have to debug the app built in the CI environment.
+
+For iOS apps, Flipper is built every time the React Native framework is built and it may require some time to build, and this is time you can save.
+
+Starting from React Native 0.71, we introduced a new flag in the template's Podfile: the [`NO_FLIPPER` flag](https://github.com/facebook/react-native/blob/main/packages/react-native/template/ios/Podfile#L20).
+
+By default, the `NO_FLIPPER` flag is not set, therefore Flipper will be included by default in your app.
+
+You can specify `NO_FLIPPER=1` when installing your iOS pods, to instruct React Native not to install Flipper. Typically, the command would look like this:
+
+```shell
+# from the root folder of the react native project
+NO_FLIPPER=1 bundle exec pod install --project-directory=ios
+```
+
+Add this command in your CI environment to skip the installation of Flipper dependencies and thus saving time and money.
+
+### Handle Transitive Dependencies
+
+Your app may be using some libraries which depends on the Flipper pods. If that's your case, disabling flipper with the `NO_FLIPPER` flag may not be enough: your app may fail to build in this case.
+
+The proper way to handle this case is to add a custom configuration for react native, instructing the app to properly install the transitive dependency. To achieve that:
+
+1. If you don't have it already, create a new file called `react-native.config.js`.
+2. Exclude explicitly the transitive dependency from the `dependency` when the flag is turned on.
+
+For example, the `react-native-flipper` library is an additional library that depends on Flipper. If your app uses that, you need to exclude it from the dependencies. Your `react-native.config.js` would look like this:
+
+```js title="react-native.config.js"
+module.exports = {
+ // other fields
+ dependency: {
+ ...(process.env.NO_FLIPPER
+ ? {'react-native-flipper': {platforms: {ios: null}}}
+ : {}),
+ },
+};
+```
diff --git a/website/versioned_docs/version-0.73.0/state.md b/website/versioned_docs/version-0.73.0/state.md
new file mode 100644
index 00000000000..50f4f530739
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/state.md
@@ -0,0 +1,103 @@
+---
+id: state
+title: State
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+There are two types of data that control a component: `props` and `state`. `props` are set by the parent and they are fixed throughout the lifetime of a component. For data that is going to change, we have to use `state`.
+
+In general, you should initialize `state` in the constructor, and then call `setState` when you want to change it.
+
+For example, let's say we want to make text that blinks all the time. The text itself gets set once when the blinking component gets created, so the text itself is a `prop`. The "whether the text is currently on or off" changes over time, so that should be kept in `state`.
+
+
+
+
+```SnackPlayer name=State&ext=js
+import React, {useState, useEffect} from 'react';
+import {Text, View} from 'react-native';
+
+const Blink = props => {
+ const [isShowingText, setIsShowingText] = useState(true);
+
+ useEffect(() => {
+ const toggle = setInterval(() => {
+ setIsShowingText(!isShowingText);
+ }, 1000);
+
+ return () => clearInterval(toggle);
+ });
+
+ if (!isShowingText) {
+ return null;
+ }
+
+ return {props.text};
+};
+
+const BlinkApp = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default BlinkApp;
+```
+
+
+
+
+```SnackPlayer name=State&ext=tsx
+import React, {useState, useEffect} from 'react';
+import {Text, View} from 'react-native';
+
+type BlinkProps = {
+ text: string;
+};
+
+const Blink = (props: BlinkProps) => {
+ const [isShowingText, setIsShowingText] = useState(true);
+
+ useEffect(() => {
+ const toggle = setInterval(() => {
+ setIsShowingText(!isShowingText);
+ }, 1000);
+
+ return () => clearInterval(toggle);
+ });
+
+ if (!isShowingText) {
+ return null;
+ }
+
+ return {props.text};
+};
+
+const BlinkApp = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default BlinkApp;
+```
+
+
+
+
+In a real application, you probably won't be setting state with a timer. You might set state when you have new data from the server, or from user input. You can also use a state container like [Redux](https://redux.js.org/) or [MobX](https://mobx.js.org/) to control your data flow. In that case you would use Redux or MobX to modify your state rather than calling `setState` directly.
+
+When setState is called, BlinkApp will re-render its Component. By calling setState within the Timer, the component will re-render every time the Timer ticks.
+
+State works the same way as it does in React, so for more details on handling state, you can look at the [React.Component API](https://reactjs.org/docs/react-component.html#setstate). At this point, you may have noticed that most of our examples use the default text color. To customize the text color, you will have to [learn about Style](style.md).
diff --git a/website/versioned_docs/version-0.73.0/statusbar.md b/website/versioned_docs/version-0.73.0/statusbar.md
new file mode 100644
index 00000000000..710ba03bdbe
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/statusbar.md
@@ -0,0 +1,477 @@
+---
+id: statusbar
+title: StatusBar
+---
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+Component to control the app's status bar. The status bar is the zone, typically at the top of the screen, that displays the current time, Wi-Fi and cellular network information, battery level and/or other status icons.
+
+### Usage with Navigator
+
+It is possible to have multiple `StatusBar` components mounted at the same time. The props will be merged in the order the `StatusBar` components were mounted.
+
+
+
+
+```SnackPlayer name=StatusBar%20Component%20Example&supportedPlatforms=android,ios&ext=js
+import React, {useState} from 'react';
+import {
+ Button,
+ Platform,
+ SafeAreaView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+
+const STYLES = ['default', 'dark-content', 'light-content'];
+const TRANSITIONS = ['fade', 'slide', 'none'];
+
+const App = () => {
+ const [hidden, setHidden] = useState(false);
+ const [statusBarStyle, setStatusBarStyle] = useState(STYLES[0]);
+ const [statusBarTransition, setStatusBarTransition] = useState(
+ TRANSITIONS[0],
+ );
+
+ const changeStatusBarVisibility = () => setHidden(!hidden);
+
+ const changeStatusBarStyle = () => {
+ const styleId = STYLES.indexOf(statusBarStyle) + 1;
+ if (styleId === STYLES.length) {
+ setStatusBarStyle(STYLES[0]);
+ } else {
+ setStatusBarStyle(STYLES[styleId]);
+ }
+ };
+
+ const changeStatusBarTransition = () => {
+ const transition = TRANSITIONS.indexOf(statusBarTransition) + 1;
+ if (transition === TRANSITIONS.length) {
+ setStatusBarTransition(TRANSITIONS[0]);
+ } else {
+ setStatusBarTransition(TRANSITIONS[transition]);
+ }
+ };
+
+ return (
+
+
+
+ StatusBar Visibility:{'\n'}
+ {hidden ? 'Hidden' : 'Visible'}
+
+
+ StatusBar Style:{'\n'}
+ {statusBarStyle}
+
+ {Platform.OS === 'ios' ? (
+
+ StatusBar Transition:{'\n'}
+ {statusBarTransition}
+
+ ) : null}
+
+
+
+ {Platform.OS === 'ios' ? (
+
+ ) : null}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ECF0F1',
+ },
+ buttonsContainer: {
+ padding: 10,
+ },
+ textStyle: {
+ textAlign: 'center',
+ marginBottom: 8,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=StatusBar%20Component%20Example&supportedPlatforms=android,ios&ext=tsx
+import React, {useState} from 'react';
+import {
+ Button,
+ Platform,
+ SafeAreaView,
+ StatusBar,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+import type {StatusBarStyle} from 'react-native';
+
+const STYLES = ['default', 'dark-content', 'light-content'] as const;
+const TRANSITIONS = ['fade', 'slide', 'none'] as const;
+
+const App = () => {
+ const [hidden, setHidden] = useState(false);
+ const [statusBarStyle, setStatusBarStyle] = useState(
+ STYLES[0],
+ );
+ const [statusBarTransition, setStatusBarTransition] = useState<
+ 'fade' | 'slide' | 'none'
+ >(TRANSITIONS[0]);
+
+ const changeStatusBarVisibility = () => setHidden(!hidden);
+
+ const changeStatusBarStyle = () => {
+ const styleId = STYLES.indexOf(statusBarStyle) + 1;
+ if (styleId === STYLES.length) {
+ setStatusBarStyle(STYLES[0]);
+ } else {
+ setStatusBarStyle(STYLES[styleId]);
+ }
+ };
+
+ const changeStatusBarTransition = () => {
+ const transition = TRANSITIONS.indexOf(statusBarTransition) + 1;
+ if (transition === TRANSITIONS.length) {
+ setStatusBarTransition(TRANSITIONS[0]);
+ } else {
+ setStatusBarTransition(TRANSITIONS[transition]);
+ }
+ };
+
+ return (
+
+
+
+ StatusBar Visibility:{'\n'}
+ {hidden ? 'Hidden' : 'Visible'}
+
+
+ StatusBar Style:{'\n'}
+ {statusBarStyle}
+
+ {Platform.OS === 'ios' ? (
+
+ StatusBar Transition:{'\n'}
+ {statusBarTransition}
+
+ ) : null}
+
+
+
+ {Platform.OS === 'ios' ? (
+
+ ) : null}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ECF0F1',
+ },
+ buttonsContainer: {
+ padding: 10,
+ },
+ textStyle: {
+ textAlign: 'center',
+ marginBottom: 8,
+ },
+});
+
+export default App;
+```
+
+
+
+
+### Imperative API
+
+For cases where using a component is not ideal, there is also an imperative API exposed as static functions on the component. It is however not recommended to use the static API and the component for the same prop because any value set by the static API will get overridden by the one set by the component in the next render.
+
+---
+
+# Reference
+
+## Constants
+
+### `currentHeight`
Android
+
+The height of the status bar, which includes the notch height, if present.
+
+---
+
+## Props
+
+### `animated`
+
+If the transition between status bar property changes should be animated. Supported for `backgroundColor`, `barStyle` and `hidden` properties.
+
+| Type | Required | Default |
+| ------- | -------- | ------- |
+| boolean | No | `false` |
+
+---
+
+### `backgroundColor`
Android
+
+The background color of the status bar.
+
+| Type | Required | Default |
+| --------------- | -------- | ---------------------------------------------------------------------- |
+| [color](colors) | No | default system StatusBar background color, or `'black'` if not defined |
+
+---
+
+### `barStyle`
+
+Sets the color of the status bar text.
+
+On Android, this will only have an impact on API versions 23 and above.
+
+| Type | Required | Default |
+| ------------------------------------------ | -------- | ----------- |
+| [StatusBarStyle](statusbar#statusbarstyle) | No | `'default'` |
+
+---
+
+### `hidden`
+
+If the status bar is hidden.
+
+| Type | Required | Default |
+| ------- | -------- | ------- |
+| boolean | No | `false` |
+
+---
+
+### `networkActivityIndicatorVisible`
iOS
+
+If the network activity indicator should be visible.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `showHideTransition`
iOS
+
+The transition effect when showing and hiding the status bar using the `hidden` prop.
+
+| Type | Default |
+| -------------------------------------------------- | -------- |
+| [StatusBarAnimation](statusbar#statusbaranimation) | `'fade'` |
+
+---
+
+### `translucent`
Android
+
+If the status bar is translucent. When translucent is set to `true`, the app will draw under the status bar. This is useful when using a semi transparent status bar color.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+## Methods
+
+### `popStackEntry()`
+
+```tsx
+static popStackEntry(entry: StatusBarProps);
+```
+
+Get and remove the last StatusBar entry from the stack.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ---- | ------------------------------------- |
+| entry
Required
| any | Entry returned from `pushStackEntry`. |
+
+---
+
+### `pushStackEntry()`
+
+```tsx
+static pushStackEntry(props: StatusBarProps): StatusBarProps;
+```
+
+Push a StatusBar entry onto the stack. The return value should be passed to `popStackEntry` when complete.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ---- | ---------------------------------------------------------------- |
+| props
Required
| any | Object containing the StatusBar props to use in the stack entry. |
+
+---
+
+### `replaceStackEntry()`
+
+```tsx
+static replaceStackEntry(
+ entry: StatusBarProps,
+ props: StatusBarProps
+): StatusBarProps;
+```
+
+Replace an existing StatusBar stack entry with new props.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ---- | ---------------------------------------------------------------------------- |
+| entry
Required
| any | Entry returned from `pushStackEntry` to replace. |
+| props
Required
| any | Object containing the StatusBar props to use in the replacement stack entry. |
+
+---
+
+### `setBackgroundColor()`
Android
+
+```tsx
+static setBackgroundColor(color: ColorValue, animated?: boolean);
+```
+
+Set the background color for the status bar.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ------- | ------------------------- |
+| color
Required
| string | Background color. |
+| animated | boolean | Animate the style change. |
+
+---
+
+### `setBarStyle()`
+
+```tsx
+static setBarStyle(style: StatusBarStyle, animated?: boolean);
+```
+
+Set the status bar style.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ------------------------------------------ | ------------------------- |
+| style
Required
| [StatusBarStyle](statusbar#statusbarstyle) | Status bar style to set. |
+| animated | boolean | Animate the style change. |
+
+---
+
+### `setHidden()`
+
+```tsx
+static setHidden(hidden: boolean, animation?: StatusBarAnimation);
+```
+
+Show or hide the status bar.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------- |
+| hidden
Required
| boolean | Hide the status bar. |
+| animation
iOS
| [StatusBarAnimation](statusbar#statusbaranimation) | Animation when changing the status bar hidden property. |
+
+---
+
+### `setNetworkActivityIndicatorVisible()`
iOS
+
+```tsx
+static setNetworkActivityIndicatorVisible(visible: boolean);
+```
+
+Control the visibility of the network activity indicator.
+
+**Parameters:**
+
+| Name | Type | Description |
+| -------------------------------------------------------- | ------- | ------------------- |
+| visible
Required
| boolean | Show the indicator. |
+
+---
+
+### `setTranslucent()`
Android
+
+```tsx
+static setTranslucent(translucent: boolean);
+```
+
+Control the translucency of the status bar.
+
+**Parameters:**
+
+| Name | Type | Description |
+| ------------------------------------------------------------ | ------- | ------------------- |
+| translucent
Required
| boolean | Set as translucent. |
+
+## Type Definitions
+
+### StatusBarAnimation
+
+Status bar animation type for transitions on the iOS.
+
+| Type |
+| ---- |
+| enum |
+
+**Constants:**
+
+| Value | Type | Description |
+| --------- | ------ | --------------- |
+| `'fade'` | string | Fade animation |
+| `'slide'` | string | Slide animation |
+| `'none'` | string | No animation |
+
+---
+
+### StatusBarStyle
+
+Status bar style type.
+
+| Type |
+| ---- |
+| enum |
+
+**Constants:**
+
+| Value | Type | Description |
+| ----------------- | ------ | -------------------------------------------------------------------- |
+| `'default'` | string | Default status bar style (dark for iOS, light for Android) |
+| `'light-content'` | string | Dark background, white texts and icons |
+| `'dark-content'` | string | Light background, dark texts and icons (requires API>=23 on Android) |
diff --git a/website/versioned_docs/version-0.73.0/statusbarios.md b/website/versioned_docs/version-0.73.0/statusbarios.md
new file mode 100644
index 00000000000..5139d8715a4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/statusbarios.md
@@ -0,0 +1,8 @@
+---
+id: statusbarios
+title: '🚧 StatusBarIOS'
+---
+
+> **Deleted.** Use [`StatusBar`](statusbar.md) for mutating the status bar.
+
+---
diff --git a/website/versioned_docs/version-0.73.0/style.md b/website/versioned_docs/version-0.73.0/style.md
new file mode 100644
index 00000000000..d847c0597cb
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/style.md
@@ -0,0 +1,52 @@
+---
+id: style
+title: Style
+---
+
+With React Native, you style your application using JavaScript. All of the core components accept a prop named `style`. The style names and [values](colors.md) usually match how CSS works on the web, except names are written using camel casing, e.g. `backgroundColor` rather than `background-color`.
+
+The `style` prop can be a plain old JavaScript object. That's what we usually use for example code. You can also pass an array of styles - the last style in the array has precedence, so you can use this to inherit styles.
+
+As a component grows in complexity, it is often cleaner to use `StyleSheet.create` to define several styles in one place. Here's an example:
+
+```SnackPlayer name=Style
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const LotsOfStyles = () => {
+ return (
+
+ just red
+ just bigBlue
+ bigBlue, then red
+ red, then bigBlue
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ marginTop: 50,
+ },
+ bigBlue: {
+ color: 'blue',
+ fontWeight: 'bold',
+ fontSize: 30,
+ },
+ red: {
+ color: 'red',
+ },
+});
+
+export default LotsOfStyles;
+```
+
+One common pattern is to make your component accept a `style` prop which in turn is used to style subcomponents. You can use this to make styles "cascade" the way they do in CSS.
+
+There are a lot more ways to customize the text style. Check out the [Text component reference](text.md) for a complete list.
+
+Now you can make your text beautiful. The next step in becoming a style expert is to [learn how to control component size](height-and-width.md).
+
+## Known issues
+
+- [react-native#29308](https://github.com/facebook/react-native/issues/29308#issuecomment-792864162): In some cases React Native does not match how CSS works on the web, for example the touch area never extends past the parent view bounds and on Android negative margin is not supported.
diff --git a/website/versioned_docs/version-0.73.0/stylesheet.md b/website/versioned_docs/version-0.73.0/stylesheet.md
new file mode 100644
index 00000000000..a4872a50f45
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/stylesheet.md
@@ -0,0 +1,338 @@
+---
+id: stylesheet
+title: StyleSheet
+---
+
+A StyleSheet is an abstraction similar to CSS StyleSheets
+
+```SnackPlayer name=StyleSheet
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+ React Native
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 24,
+ backgroundColor: '#eaeaea',
+ },
+ title: {
+ marginTop: 16,
+ paddingVertical: 8,
+ borderWidth: 4,
+ borderColor: '#20232a',
+ borderRadius: 6,
+ backgroundColor: '#61dafb',
+ color: '#20232a',
+ textAlign: 'center',
+ fontSize: 30,
+ fontWeight: 'bold',
+ },
+});
+
+export default App;
+```
+
+Code quality tips:
+
+- By moving styles away from the render function, you're making the code easier to understand.
+- Naming the styles is a good way to add meaning to the low level components in the render function.
+
+---
+
+# Reference
+
+## Methods
+
+### `compose()`
+
+```tsx
+static compose(style1: Object, style2: Object): Object | Object[];
+```
+
+Combines two styles such that `style2` will override any styles in `style1`. If either style is falsy, the other one is returned without allocating an array, saving allocations and maintaining reference equality for PureComponent checks.
+
+```SnackPlayer name=Compose
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+ React Native
+
+);
+
+const page = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 24,
+ backgroundColor: '#fff',
+ },
+ text: {
+ fontSize: 30,
+ color: '#000',
+ },
+});
+
+const lists = StyleSheet.create({
+ listContainer: {
+ flex: 1,
+ backgroundColor: '#61dafb',
+ },
+ listItem: {
+ fontStyle: 'italic',
+ fontWeight: 'bold',
+ },
+});
+
+const container = StyleSheet.compose(page.container, lists.listContainer);
+const text = StyleSheet.compose(page.text, lists.listItem);
+
+export default App;
+```
+
+---
+
+### `create()`
+
+```tsx
+static create(styles: Object): Object;
+```
+
+Creates a StyleSheet style reference from the given object.
+
+---
+
+### `flatten()`
+
+```tsx
+static flatten(style: Object[]): Object;
+```
+
+Flattens an array of style objects, into one aggregated style object. Alternatively, this method can be used to lookup IDs, returned by `StyleSheet.register`.
+
+> **NOTE:** Exercise caution as abusing this can tax you in terms of optimizations. IDs enable optimizations through the bridge and memory in general. Referring to style objects directly will deprive you of these optimizations.
+
+```SnackPlayer name=Flatten
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+ React Native
+ Flatten Style
+ {JSON.stringify(flattenStyle, null, 2)}
+
+);
+
+const page = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 24,
+ alignItems: 'center',
+ },
+ text: {
+ color: '#000',
+ fontSize: 14,
+ fontWeight: 'bold',
+ },
+ code: {
+ marginTop: 12,
+ padding: 12,
+ borderRadius: 8,
+ color: '#666',
+ backgroundColor: '#eaeaea',
+ },
+});
+
+const typography = StyleSheet.create({
+ header: {
+ color: '#61dafb',
+ fontSize: 30,
+ marginBottom: 36,
+ },
+});
+
+const flattenStyle = StyleSheet.flatten([page.text, typography.header]);
+
+export default App;
+```
+
+This method internally uses `StyleSheetRegistry.getStyleByID(style)` to resolve style objects represented by IDs. Thus, an array of style objects (instances of `StyleSheet.create()`), are individually resolved to, their respective objects, merged as one and then returned. This also explains the alternative use.
+
+---
+
+### `setStyleAttributePreprocessor()`
+
+> **WARNING: EXPERIMENTAL.** Breaking changes will probably happen a lot and will not be reliably announced. The whole thing might be deleted, who knows? Use at your own risk.
+
+```tsx
+static setStyleAttributePreprocessor(
+ property: string,
+ process: (propValue: any) => any,
+);
+```
+
+Sets a function to use to pre-process a style property value. This is used internally to process color and transform values. You should not use this unless you really know what you are doing and have exhausted other options.
+
+## Properties
+
+---
+
+### `absoluteFill`
+
+A very common pattern is to create overlays with position absolute and zero positioning (`position: 'absolute', left: 0, right: 0, top: 0, bottom: 0`), so `absoluteFill` can be used for convenience and to reduce duplication of these repeated styles. If you want, absoluteFill can be used to create a customized entry in a StyleSheet, e.g.:
+
+```SnackPlayer name=absoluteFill
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ box1: {
+ position: 'absolute',
+ top: 40,
+ left: 40,
+ width: 100,
+ height: 100,
+ backgroundColor: 'red',
+ },
+ box2: {
+ width: 100,
+ height: 100,
+ backgroundColor: 'blue',
+ },
+ box3: {
+ position: 'absolute',
+ top: 120,
+ left: 120,
+ width: 100,
+ height: 100,
+ backgroundColor: 'green',
+ },
+ text: {
+ color: '#FFF',
+ fontSize: 80,
+ },
+});
+
+export default App;
+```
+
+---
+
+### `absoluteFillObject`
+
+Sometimes you may want `absoluteFill` but with a couple tweaks - `absoluteFillObject` can be used to create a customized entry in a `StyleSheet`, e.g.:
+
+```SnackPlayer name=absoluteFillObject
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ box1: {
+ position: 'absolute',
+ top: 40,
+ left: 40,
+ width: 100,
+ height: 100,
+ backgroundColor: 'red',
+ },
+ box2: {
+ ...StyleSheet.absoluteFillObject,
+ top: 120,
+ left: 50,
+ width: 100,
+ height: 100,
+ backgroundColor: 'blue',
+ },
+ box3: {
+ ...StyleSheet.absoluteFillObject,
+ top: 120,
+ left: 120,
+ width: 100,
+ height: 100,
+ backgroundColor: 'green',
+ },
+ text: {
+ color: '#FFF',
+ fontSize: 80,
+ },
+});
+
+export default App;
+```
+
+---
+
+### `hairlineWidth`
+
+This is defined as the width of a thin line on the platform. It can be used as the thickness of a border or division between two elements. Example:
+
+```SnackPlayer name=hairlineWidth
+import React from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+
+const App = () => (
+
+ React
+ Native
+
+);
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 24,
+ },
+ row: {
+ padding: 4,
+ borderBottomColor: 'red',
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ },
+});
+
+export default App;
+```
+
+This constant will always be a round number of pixels (so a line defined by it can look crisp) and will try to match the standard width of a thin line on the underlying platform. However, you should not rely on it being a constant size, because on different platforms and screen densities its value may be calculated differently.
+
+A line with hairline width may not be visible if your simulator is downscaled.
diff --git a/website/versioned_docs/version-0.73.0/switch.md b/website/versioned_docs/version-0.73.0/switch.md
new file mode 100644
index 00000000000..f6cff1444ad
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/switch.md
@@ -0,0 +1,124 @@
+---
+id: switch
+title: Switch
+---
+
+Renders a boolean input.
+
+This is a controlled component that requires an `onValueChange` callback that updates the `value` prop in order for the component to reflect user actions. If the `value` prop is not updated, the component will continue to render the supplied `value` prop instead of the expected result of any user actions.
+
+## Example
+
+```SnackPlayer name=Switch&supportedPlatforms=android,ios
+import React, {useState} from 'react';
+import {View, Switch, StyleSheet} from 'react-native';
+
+const App = () => {
+ const [isEnabled, setIsEnabled] = useState(false);
+ const toggleSwitch = () => setIsEnabled(previousState => !previousState);
+
+ return (
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+### `disabled`
+
+If true the user won't be able to toggle the switch.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `ios_backgroundColor`
iOS
+
+On iOS, custom color for the background. This background color can be seen either when the switch value is `false` or when the switch is disabled (and the switch is translucent).
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `onChange`
+
+Invoked when the user tries to change the value of the switch. Receives the change event as an argument. If you want to only receive the new value, use `onValueChange` instead.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onValueChange`
+
+Invoked when the user tries to change the value of the switch. Receives the new value as an argument. If you want to instead receive an event, use `onChange`.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `thumbColor`
+
+Color of the foreground switch grip. If this is set on iOS, the switch grip will lose its drop shadow.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `trackColor`
+
+Custom colors for the switch track.
+
+_iOS_: When the switch value is `false`, the track shrinks into the border. If you want to change the color of the background exposed by the shrunken track, use [`ios_backgroundColor`](switch.md#ios_backgroundColor).
+
+| Type |
+| ------------------------------------------------------------ |
+| `md object: {false: [color](colors), true: [color](colors)}` |
+
+---
+
+### `value`
+
+The value of the switch. If true the switch will be turned on. Default value is false.
+
+| Type |
+| ---- |
+| bool |
diff --git a/website/versioned_docs/version-0.73.0/systrace.md b/website/versioned_docs/version-0.73.0/systrace.md
new file mode 100644
index 00000000000..22c2709b696
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/systrace.md
@@ -0,0 +1,146 @@
+---
+id: systrace
+title: Systrace
+---
+
+`Systrace` is a standard Android marker-based profiling tool (and is installed when you install the Android platform-tools package). Profiled code blocks are surrounded by start/end markers which are then visualized in a colorful chart format. Both the Android SDK and React Native framework provide standard markers that you can visualize.
+
+## Example
+
+`Systrace` allows you to mark JavaScript (JS) events with a tag and an integer value. Capture the non-Timed JS events in EasyProfiler.
+
+```SnackPlayer name=Systrace%20Example
+import React from 'react';
+import {
+ Button,
+ Text,
+ View,
+ SafeAreaView,
+ StyleSheet,
+ Systrace,
+} from 'react-native';
+
+const App = () => {
+ const enableProfiling = () => {
+ Systrace.setEnabled(true); // Call setEnabled to turn on the profiling.
+ Systrace.beginEvent('event_label');
+ Systrace.counterEvent('event_label', 10);
+ };
+
+ const stopProfiling = () => {
+ Systrace.endEvent();
+ };
+
+ return (
+
+
+ React Native Systrace API
+
+
+ enableProfiling()}
+ />
+ stopProfiling()}
+ color="#FF0000"
+ />
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingTop: 44,
+ padding: 8,
+ },
+ header: {
+ fontSize: 18,
+ fontWeight: 'bold',
+ textAlign: 'center',
+ },
+ paragraph: {
+ margin: 24,
+ fontSize: 25,
+ textAlign: 'center',
+ },
+ buttonRow: {
+ flexBasis: 150,
+ marginVertical: 16,
+ justifyContent: 'space-evenly',
+ },
+});
+
+export default App;
+```
+
+---
+
+# Reference
+
+## Methods
+
+### `isEnabled()`
+
+```tsx
+static isEnabled(): boolean;
+```
+
+---
+
+### `beginEvent()`
+
+```tsx
+static beginEvent(eventName: string | (() => string), args?: EventArgs);
+```
+
+beginEvent/endEvent for starting and then ending a profile within the same call stack frame.
+
+---
+
+### `endEvent()`
+
+```tsx
+static endEvent(args?: EventArgs);
+```
+
+---
+
+### `beginAsyncEvent()`
+
+```tsx
+static beginAsyncEvent(
+ eventName: string | (() => string),
+ args?: EventArgs,
+): number;
+```
+
+beginAsyncEvent/endAsyncEvent for starting and then ending a profile where the end can either occur on another thread or out of the current stack frame, eg await the returned cookie variable should be used as input into the endAsyncEvent call to end the profile.
+
+---
+
+### `endAsyncEvent()`
+
+```tsx
+static endAsyncEvent(
+ eventName: EventName,
+ cookie: number,
+ args?: EventArgs,
+);
+```
+
+---
+
+### `counterEvent()`
+
+```tsx
+static counterEvent(eventName: string | (() => string), value: number);
+```
+
+Register the value to the profileName on the systrace timeline.
diff --git a/website/versioned_docs/version-0.73.0/testing-overview.md b/website/versioned_docs/version-0.73.0/testing-overview.md
new file mode 100644
index 00000000000..5714c365ff6
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/testing-overview.md
@@ -0,0 +1,273 @@
+---
+id: testing-overview
+title: Testing
+author: Vojtech Novak
+authorURL: 'https://twitter.com/vonovak'
+description: This guide introduces React Native developers to the key concepts behind testing, how to write good tests, and what kinds of tests you can incorporate into your workflow.
+---
+
+As your codebase expands, small errors and edge cases you don’t expect can cascade into larger failures. Bugs lead to bad user experience and ultimately, business losses. One way to prevent fragile programming is to test your code before releasing it into the wild.
+
+In this guide, we will cover different, automated ways to ensure your app works as expected, ranging from static analysis to end-to-end tests.
+
+
+
+## Why Test
+
+We're humans, and humans make mistakes. Testing is important because it helps you uncover these mistakes and verifies that your code is working. Perhaps even more importantly, testing ensures that your code continues to work in the future as you add new features, refactor the existing ones, or upgrade major dependencies of your project.
+
+There is more value in testing than you might realize. One of the best ways to fix a bug in your code is to write a failing test that exposes it. Then when you fix the bug and re-run the test, if it passes it means the bug is fixed, never reintroduced into the code base.
+
+Tests can also serve as documentation for new people joining your team. For people who have never seen a codebase before, reading tests can help them understand how the existing code works.
+
+Last but not least, more automated testing means less time spent with manual QA, freeing up valuable time.
+
+## Static Analysis
+
+The first step to improve your code quality is to start using static analysis tools. Static analysis checks your code for errors as you write it, but without running any of that code.
+
+- **Linters** analyze code to catch common errors such as unused code and to help avoid pitfalls, to flag style guide no-nos like using tabs instead of spaces (or vice versa, depending on your configuration).
+- **Type checking** ensures that the construct you’re passing to a function matches what the function was designed to accept, preventing passing a string to a counting function that expects a number, for instance.
+
+React Native comes with two such tools configured out of the box: [ESLint](https://eslint.org/) for linting and [TypeScript](typescript) for type checking.
+
+## Writing Testable Code
+
+To start with tests, you first need to write code that is testable. Consider an aircraft manufacturing process - before any model first takes off to show that all of its complex systems work well together, individual parts are tested to guarantee they are safe and function correctly. For example, wings are tested by bending them under extreme load; engine parts are tested for their durability; the windshield is tested against simulated bird impact.
+
+Software is similar. Instead of writing your entire program in one huge file with many lines of code, you write your code in multiple small modules that you can test more thoroughly than if you tested the assembled whole. In this way, writing testable code is intertwined with writing clean, modular code.
+
+To make your app more testable, start by separating the view part of your app—your React components—from your business logic and app state (regardless of whether you use Redux, MobX or other solutions). This way, you can keep your business logic testing—which shouldn’t rely on your React components—independent of the components themselves, whose job is primarily rendering your app’s UI!
+
+Theoretically, you could go so far as to move all logic and data fetching out of your components. This way your components would be solely dedicated to rendering. Your state would be entirely independent of your components. Your app’s logic would work without any React components at all!
+
+> We encourage you to further explore the topic of testable code in other learning resources.
+
+## Writing Tests
+
+After writing testable code, it’s time to write some actual tests! The default template of React Native ships with [Jest](https://jestjs.io) testing framework. It includes a preset that's tailored to this environment so you can get productive without tweaking the configuration and mocks straight away—[more on mocks](#mocking) shortly. You can use Jest to write all types of tests featured in this guide.
+
+> If you do test-driven development, you actually write tests first! That way, testability of your code is given.
+
+### Structuring Tests
+
+Your tests should be short and ideally test only one thing. Let's start with an example unit test written with Jest:
+
+```js
+it('given a date in the past, colorForDueDate() returns red', () => {
+ expect(colorForDueDate('2000-10-20')).toBe('red');
+});
+```
+
+The test is described by the string passed to the [`it`](https://jestjs.io/docs/en/api#testname-fn-timeout) function. Take good care writing the description so that it’s clear what is being tested. Do your best to cover the following:
+
+1. **Given** - some precondition
+2. **When** - some action executed by the function that you’re testing
+3. **Then** - the expected outcome
+
+This is also known as AAA (Arrange, Act, Assert).
+
+Jest offers [`describe`](https://jestjs.io/docs/en/api#describename-fn) function to help structure your tests. Use `describe` to group together all tests that belong to one functionality. Describes can be nested, if you need that. Other functions you'll commonly use are [`beforeEach`](https://jestjs.io/docs/en/api#beforeeachfn-timeout) or [`beforeAll`](https://jestjs.io/docs/en/api#beforeallfn-timeout) that you can use for setting up the objects you're testing. Read more in the [Jest api reference](https://jestjs.io/docs/en/api).
+
+If your test has many steps or many expectations, you probably want to split it into multiple smaller ones. Also, ensure that your tests are completely independent of one another. Each test in your suite must be executable on its own without first running some other test. Conversely, if you run all your tests together, the first test must not influence the output of the second one.
+
+Lastly, as developers we like when our code works great and doesn't crash. With tests, this is often the opposite. Think of a failed test as of a _good thing!_ When a test fails, it often means something is not right. This gives you an opportunity to fix the problem before it impacts the users.
+
+## Unit Tests
+
+Unit tests cover the smallest parts of code, like individual functions or classes.
+
+When the object being tested has any dependencies, you’ll often need to mock them out, as described in the next paragraph.
+
+The great thing about unit tests is that they are quick to write and run. Therefore, as you work, you get fast feedback about whether your tests are passing. Jest even has an option to continuously run tests that are related to code you’re editing: [Watch mode](https://jestjs.io/docs/en/cli#watch).
+
+
+
+### Mocking
+
+Sometimes, when your tested objects have external dependencies, you’ll want to “mock them out.” “Mocking” is when you replace some dependency of your code with your own implementation.
+
+> Generally, using real objects in your tests is better than using mocks but there are situations where this is not possible. For example: when your JS unit test relies on a native module written in Java or Objective-C.
+
+Imagine you’re writing an app that shows the current weather in your city and you’re using some external service or other dependency that provides you with the weather information. If the service tells you that it’s raining, you want to show an image with a rainy cloud. You don’t want to call that service in your tests, because:
+
+- It could make the tests slow and unstable (because of the network requests involved)
+- The service may return different data every time you run the test
+- Third party services can go offline when you really need to run tests!
+
+Therefore, you can provide a mock implementation of the service, effectively replacing thousands of lines of code and some internet-connected thermometers!
+
+> Jest comes with [support for mocking](https://jestjs.io/docs/en/mock-functions#mocking-modules) from function level all the way to module level mocking.
+
+## Integration Tests
+
+When writing larger software systems, individual pieces of it need to interact with each other. In unit testing, if your unit depends on another one, you’ll sometimes end up mocking the dependency, replacing it with a fake one.
+
+In integration testing, real individual units are combined (same as in your app) and tested together to ensure that their cooperation works as expected. This is not to say that mocking does not happen here: you’ll still need mocks (for example, to mock communication with a weather service), but you'll need them much less than in unit testing.
+
+> Please note that the terminology around what integration testing means is not always consistent. Also, the line between what is a unit test and what is an integration test may not always be clear. For this guide, your test falls into "integration testing" if it:
+>
+> - Combines several modules of your app as described above
+> - Uses an external system
+> - Makes a network call to other application (such as the weather service API)
+> - Does any kind of file or database I/O
+
+
+
+## Component Tests
+
+React components are responsible for rendering your app, and users will directly interact with their output. Even if your app's business logic has high testing coverage and is correct, without component tests you may still deliver a broken UI to your users. Component tests could fall into both unit and integration testing, but because they are such a core part of React Native, we'll cover them separately.
+
+For testing React components, there are two things you may want to test:
+
+- Interaction: to ensure the component behaves correctly when interacted with by a user (eg. when user presses a button)
+- Rendering: to ensure the component render output used by React is correct (eg. the button's appearance and placement in the UI)
+
+For example, if you have a button that has an `onPress` listener, you want to test that the button both appears correctly and that tapping the button is correctly handled by the component.
+
+There are several libraries that can help you testing these:
+
+- React’s [Test Renderer](https://reactjs.org/docs/test-renderer.html), developed alongside its core, provides a React renderer that can be used to render React components to pure JavaScript objects, without depending on the DOM or a native mobile environment.
+- [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) builds on top of React’s test renderer and adds `fireEvent` and `query` APIs described in the next paragraph.
+
+> Component tests are only JavaScript tests running in Node.js environment. They do _not_ take into account any iOS, Android, or other platform code which is backing the React Native components. It follows that they cannot give you a 100% confidence that everything works for the user. If there is a bug in the iOS or Android code, they will not find it.
+
+
+
+### Testing User Interactions
+
+Aside from rendering some UI, your components handle events like `onChangeText` for `TextInput` or `onPress` for `Button`. They may also contain other functions and event callbacks. Consider the following example:
+
+```tsx
+function GroceryShoppingList() {
+ const [groceryItem, setGroceryItem] = useState('');
+ const [items, setItems] = useState([]);
+
+ const addNewItemToShoppingList = useCallback(() => {
+ setItems([groceryItem, ...items]);
+ setGroceryItem('');
+ }, [groceryItem, items]);
+
+ return (
+ <>
+ setGroceryItem(text)}
+ />
+
+ {items.map(item => (
+ {item}
+ ))}
+ >
+ );
+}
+```
+
+When testing user interactions, test the component from the user perspective—what's on the page? What changes when interacted with?
+
+As a rule of thumb, prefer using things users can see or hear:
+
+- make assertions using rendered text or [accessibility helpers](https://reactnative.dev/docs/accessibility#accessibility-properties)
+
+Conversely, you should avoid:
+
+- making assertions on component props or state
+- testID queries
+
+Avoid testing implementation details like props or state—while such tests work, they are not oriented toward how users will interact with the component and tend to break by refactoring (for example when you'd like to rename some things or rewrite class component using hooks).
+
+> React class components are especially prone to testing their implementation details such as internal state, props or event handlers. To avoid testing implementation details, prefer using function components with Hooks, which make relying on component internals _harder_.
+
+Component testing libraries such as [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) facilitate writing user-centric tests by careful choice of provided APIs. The following example uses `fireEvent` methods `changeText` and `press` that simulate a user interacting with the component and a query function `getAllByText` that finds matching `Text` nodes in the rendered output.
+
+```tsx
+test('given empty GroceryShoppingList, user can add an item to it', () => {
+ const {getByPlaceholderText, getByText, getAllByText} = render(
+ ,
+ );
+
+ fireEvent.changeText(
+ getByPlaceholderText('Enter grocery item'),
+ 'banana',
+ );
+ fireEvent.press(getByText('Add the item to list'));
+
+ const bananaElements = getAllByText('banana');
+ expect(bananaElements).toHaveLength(1); // expect 'banana' to be on the list
+});
+```
+
+This example is not testing how some state changes when you call a function. It tests what happens when a user changes text in the `TextInput` and presses the `Button`!
+
+### Testing Rendered Output
+
+[Snapshot testing](https://jestjs.io/docs/en/snapshot-testing) is an advanced kind of testing enabled by Jest. It is a very powerful and low-level tool, so extra attention is advised when using it.
+
+A "component snapshot" is a JSX-like string created by a custom React serializer built into Jest. This serializer lets Jest translate React component trees to string that's human-readable. Put another way: a component snapshot is a textual representation of your component’s render output _generated_ during a test run. It may look like this:
+
+```tsx
+
+ Welcome to React Native!
+
+```
+
+With snapshot testing, you typically first implement your component and then run the snapshot test. The snapshot test then creates a snapshot and saves it to a file in your repo as a reference snapshot. **The file is then committed and checked during code review**. Any future changes to the component render output will change its snapshot, which will cause the test to fail. You then need to update the stored reference snapshot for the test to pass. That change again needs to be committed and reviewed.
+
+Snapshots have several weak points:
+
+- For you as a developer or reviewer, it can be hard to tell whether a change in snapshot is intended or whether it's evidence of a bug. Especially large snapshots can quickly become hard to understand and their added value becomes low.
+- When snapshot is created, at that point it is considered to be correct-even in the case when the rendered output is actually wrong.
+- When a snapshot fails, it's tempting to update it using the `--updateSnapshot` jest option without taking proper care to investigate whether the change is expected. Certain developer discipline is thus needed.
+
+Snapshots themselves do not ensure that your component render logic is correct, they are merely good at guarding against unexpected changes and for checking that the components in the React tree under test receive the expected props (styles and etc.).
+
+We recommend that you only use small snapshots (see [`no-large-snapshots` rule](https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/no-large-snapshots.md)). If you want to test a _change_ between two React component states, use [`snapshot-diff`](https://github.com/jest-community/snapshot-diff). When in doubt, prefer explicit expectations as described in the previous paragraph.
+
+
+
+## End-to-End Tests
+
+In end-to-end (E2E) tests, you verify your app is working as expected on a device (or a simulator / emulator) from the user perspective.
+
+This is done by building your app in the release configuration and running the tests against it. In E2E tests, you no longer think about React components, React Native APIs, Redux stores or any business logic. That is not the purpose of E2E tests and those are not even accessible to you during E2E testing.
+
+Instead, E2E testing libraries allow you to find and control elements in the screen of your app: for example, you can _actually_ tap buttons or insert text into `TextInputs` the same way a real user would. Then you can make assertions about whether or not a certain element exists in the app’s screen, whether or not it’s visible, what text it contains, and so on.
+
+E2E tests give you the highest possible confidence that part of your app is working. The tradeoffs include:
+
+- writing them is more time consuming compared to the other types of tests
+- they are slower to run
+- they are more prone to flakiness (a "flaky" test is a test which randomly passes and fails without any change to code)
+
+Try to cover the vital parts of your app with E2E tests: authentication flow, core functionalities, payments, etc. Use faster JS tests for the non-vital parts of your app. The more tests you add, the higher your confidence, but also, the more time you'll spend maintaining and running them. Consider the tradeoffs and decide what's best for you.
+
+There are several E2E testing tools available: in the React Native community, [Detox](https://github.com/wix/detox/) is a popular framework because it’s tailored for React Native apps. Another popular library in the space of iOS and Android apps is [Appium](https://appium.io/) or [Maestro](https://maestro.mobile.dev/).
+
+
+
+## Summary
+
+We hope you enjoyed reading and learned something from this guide. There are many ways you can test your apps. It may be hard to decide what to use at first. However, we believe it all will make sense once you start adding tests to your awesome React Native app. So what are you waiting for? Get your coverage up!
+
+### Links
+
+- [React testing overview](https://reactjs.org/docs/testing.html)
+- [React Native Testing Library](https://callstack.github.io/react-native-testing-library/)
+- [Jest docs](https://jestjs.io/docs/en/tutorial-react-native)
+- [Detox](https://github.com/wix/detox/)
+- [Appium](https://appium.io/)
+- [Maestro](https://maestro.mobile.dev/)
+
+---
+
+_This guide originally authored and contributed in full by [Vojtech Novak](https://twitter.com/vonovak)._
diff --git a/website/versioned_docs/version-0.73.0/text-style-props.md b/website/versioned_docs/version-0.73.0/text-style-props.md
new file mode 100644
index 00000000000..973e9309bda
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/text-style-props.md
@@ -0,0 +1,941 @@
+---
+id: text-style-props
+title: Text Style Props
+---
+
+### Example
+
+import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
+
+
+
+
+```SnackPlayer name=TextStyleProps&supportedPlatforms=ios,android&ext=js&dependencies=@react-native-community/slider
+import React, {useState} from 'react';
+import {
+ FlatList,
+ Platform,
+ ScrollView,
+ StatusBar,
+ StyleSheet,
+ Switch,
+ Text,
+ TouchableWithoutFeedback,
+ View,
+} from 'react-native';
+import Slider from '@react-native-community/slider';
+
+const fontStyles = ['normal', 'italic'];
+const fontVariants = [
+ undefined,
+ 'small-caps',
+ 'oldstyle-nums',
+ 'lining-nums',
+ 'tabular-nums',
+ 'proportional-nums',
+];
+const fontWeights = [
+ 'normal',
+ 'bold',
+ '100',
+ '200',
+ '300',
+ '400',
+ '500',
+ '600',
+ '700',
+ '800',
+ '900',
+];
+const textAlignments = ['auto', 'left', 'right', 'center', 'justify'];
+const textDecorationLines = [
+ 'none',
+ 'underline',
+ 'line-through',
+ 'underline line-through',
+];
+const textDecorationStyles = ['solid', 'double', 'dotted', 'dashed'];
+const textTransformations = ['none', 'uppercase', 'lowercase', 'capitalize'];
+const textAlignmentsVertical = ['auto', 'top', 'bottom', 'center'];
+const writingDirections = ['auto', 'ltr', 'rtl'];
+
+const App = () => {
+ const [fontSize, setFontSize] = useState(10);
+ const [fontStyleIdx, setFontStyleIdx] = useState(0);
+ const [fontWeightIdx, setFontWeightIdx] = useState(0);
+ const [lineHeight, setLineHeight] = useState(10);
+ const [textAlignIdx, setTextAlignIdx] = useState(0);
+ const [textDecorationLineIdx, setTextDecorationLineIdx] = useState(0);
+ const [includeFontPadding, setIncludeFontPadding] = useState(false);
+ const [textVerticalAlignIdx, setTextVerticalAlignIdx] = useState(0);
+ const [fontVariantIdx, setFontVariantIdx] = useState(0);
+ const [letterSpacing, setLetterSpacing] = useState(0);
+ const [textDecorationStyleIdx, setTextDecorationStyleIdx] = useState(0);
+ const [textTransformIdx, setTextTransformIdx] = useState(0);
+ const [writingDirectionIdx, setWritingDirectionIdx] = useState(0);
+ const [textShadowRadius, setTextShadowRadius] = useState(0);
+ const [textShadowOffset, setTextShadowOffset] = useState({
+ height: 0,
+ width: 0,
+ });
+
+ const [, ...validFontVariants] = fontVariants;
+
+ return (
+
+
+ Lorem Ipsum is simply dummy text of the printing and typesetting
+ industry. 112 Likes
+
+
+
+ Common platform properties
+
+ setTextShadowOffset(prev => ({...prev, height: val}))
+ }
+ />
+
+ setTextShadowOffset(prev => ({...prev, width: val}))
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {Platform.OS === 'android' && (
+
+
+ Android only properties
+
+
+
+
+ )}
+ {Platform.OS === 'ios' && (
+
+
+ iOS only properties
+
+
+
+
+ )}
+
+
+ );
+};
+
+const CustomSwitch = ({label, handleValueChange, value}) => {
+ return (
+ <>
+ {label}
+
+
+
+ >
+ );
+};
+
+const CustomSlider = ({
+ label,
+ handleValueChange,
+ step = 1,
+ minimumValue = 0,
+ maximumValue = 10,
+ value,
+}) => {
+ return (
+ <>
+ {label && (
+ {`${label} (${value.toFixed(2)})`}
+ )}
+
+
+
+ >
+ );
+};
+
+const CustomPicker = ({label, data, currentIndex, onSelected}) => {
+ return (
+ <>
+ {label}
+
+ String(item)}
+ renderItem={({item, index}) => {
+ const selected = index === currentIndex;
+ return (
+ onSelected(index)}>
+
+
+ {item + ''}
+
+
+
+ );
+ }}
+ />
+
+ >
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: StatusBar.currentHeight,
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ paragraph: {
+ color: 'black',
+ textDecorationColor: 'yellow',
+ textShadowColor: 'red',
+ textShadowRadius: 1,
+ margin: 24,
+ },
+ wrapperHorizontal: {
+ height: 54,
+ justifyContent: 'center',
+ color: 'black',
+ marginBottom: 12,
+ },
+ itemStyleHorizontal: {
+ marginRight: 10,
+ height: 50,
+ padding: 8,
+ borderWidth: 1,
+ borderColor: 'grey',
+ borderRadius: 25,
+ textAlign: 'center',
+ justifyContent: 'center',
+ },
+ itemSelectedStyleHorizontal: {
+ borderWidth: 2,
+ borderColor: '#DAA520',
+ },
+ platformContainer: {
+ marginTop: 8,
+ borderTopWidth: 1,
+ },
+ platformContainerTitle: {
+ marginTop: 8,
+ },
+ title: {
+ fontWeight: 'bold',
+ marginVertical: 4,
+ },
+});
+
+export default App;
+```
+
+
+
+
+```SnackPlayer name=TextStyleProps&supportedPlatforms=ios,android&ext=tsx&dependencies=@react-native-community/slider
+import React, {useState} from 'react';
+import {
+ FlatList,
+ Platform,
+ ScrollView,
+ StatusBar,
+ StyleSheet,
+ Switch,
+ Text,
+ TouchableWithoutFeedback,
+ View,
+} from 'react-native';
+import Slider from '@react-native-community/slider';
+
+const fontStyles = ['normal', 'italic'] as const;
+const fontVariants = [
+ undefined,
+ 'small-caps',
+ 'oldstyle-nums',
+ 'lining-nums',
+ 'tabular-nums',
+ 'proportional-nums',
+] as const;
+const fontWeights = [
+ 'normal',
+ 'bold',
+ '100',
+ '200',
+ '300',
+ '400',
+ '500',
+ '600',
+ '700',
+ '800',
+ '900',
+] as const;
+const textAlignments = ['auto', 'left', 'right', 'center', 'justify'] as const;
+const textDecorationLines = [
+ 'none',
+ 'underline',
+ 'line-through',
+ 'underline line-through',
+] as const;
+const textDecorationStyles = ['solid', 'double', 'dotted', 'dashed'] as const;
+const textTransformations = [
+ 'none',
+ 'uppercase',
+ 'lowercase',
+ 'capitalize',
+] as const;
+const textAlignmentsVertical = ['auto', 'top', 'bottom', 'center'] as const;
+const writingDirections = ['auto', 'ltr', 'rtl'] as const;
+
+const App = () => {
+ const [fontSize, setFontSize] = useState(10);
+ const [fontStyleIdx, setFontStyleIdx] = useState(0);
+ const [fontWeightIdx, setFontWeightIdx] = useState(0);
+ const [lineHeight, setLineHeight] = useState(10);
+ const [textAlignIdx, setTextAlignIdx] = useState(0);
+ const [textDecorationLineIdx, setTextDecorationLineIdx] = useState(0);
+ const [includeFontPadding, setIncludeFontPadding] = useState(false);
+ const [textVerticalAlignIdx, setTextVerticalAlignIdx] = useState(0);
+ const [fontVariantIdx, setFontVariantIdx] = useState(0);
+ const [letterSpacing, setLetterSpacing] = useState(0);
+ const [textDecorationStyleIdx, setTextDecorationStyleIdx] = useState(0);
+ const [textTransformIdx, setTextTransformIdx] = useState(0);
+ const [writingDirectionIdx, setWritingDirectionIdx] = useState(0);
+ const [textShadowRadius, setTextShadowRadius] = useState(0);
+ const [textShadowOffset, setTextShadowOffset] = useState({
+ height: 0,
+ width: 0,
+ });
+
+ const [, ...validFontVariants] = fontVariants;
+
+ return (
+
+
+ Lorem Ipsum is simply dummy text of the printing and typesetting
+ industry. 112 Likes
+
+
+
+ Common platform properties
+
+ setTextShadowOffset(prev => ({...prev, height: val}))
+ }
+ />
+
+ setTextShadowOffset(prev => ({...prev, width: val}))
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {Platform.OS === 'android' && (
+
+
+ Android only properties
+
+
+
+
+ )}
+ {Platform.OS === 'ios' && (
+
+
+ iOS only properties
+
+
+
+
+ )}
+
+
+ );
+};
+
+type CustomSwitchProps = {
+ label: string;
+ handleValueChange: (value: boolean) => void;
+ value: boolean;
+};
+
+const CustomSwitch = ({label, handleValueChange, value}: CustomSwitchProps) => {
+ return (
+ <>
+ {label}
+
+
+
+ >
+ );
+};
+
+type CustomSliderProps = {
+ label: string;
+ handleValueChange: (value: number) => void;
+ step?: number;
+ minimumValue?: number;
+ maximumValue?: number;
+ value: number;
+};
+
+const CustomSlider = ({
+ label,
+ handleValueChange,
+ step = 1,
+ minimumValue = 0,
+ maximumValue = 10,
+ value,
+}: CustomSliderProps) => {
+ return (
+ <>
+ {label && (
+ {`${label} (${value.toFixed(2)})`}
+ )}
+
+
+
+ >
+ );
+};
+
+type CustomPickerProps = {
+ label: string;
+ data: ReadonlyArray;
+ currentIndex: number;
+ onSelected: (index: number) => void;
+};
+
+const CustomPicker = ({
+ label,
+ data,
+ currentIndex,
+ onSelected,
+}: CustomPickerProps) => {
+ return (
+ <>
+ {label}
+
+ String(item)}
+ renderItem={({item, index}) => {
+ const selected = index === currentIndex;
+ return (
+ onSelected(index)}>
+
+
+ {item + ''}
+
+
+
+ );
+ }}
+ />
+
+ >
+ );
+};
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: StatusBar.currentHeight,
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ paragraph: {
+ color: 'black',
+ textDecorationColor: 'yellow',
+ textShadowColor: 'red',
+ textShadowRadius: 1,
+ margin: 24,
+ },
+ wrapperHorizontal: {
+ height: 54,
+ justifyContent: 'center',
+ color: 'black',
+ marginBottom: 12,
+ },
+ itemStyleHorizontal: {
+ marginRight: 10,
+ height: 50,
+ padding: 8,
+ borderWidth: 1,
+ borderColor: 'grey',
+ borderRadius: 25,
+ textAlign: 'center',
+ justifyContent: 'center',
+ },
+ itemSelectedStyleHorizontal: {
+ borderWidth: 2,
+ borderColor: '#DAA520',
+ },
+ platformContainer: {
+ marginTop: 8,
+ borderTopWidth: 1,
+ },
+ platformContainerTitle: {
+ marginTop: 8,
+ },
+ title: {
+ fontWeight: 'bold',
+ marginVertical: 4,
+ },
+});
+
+export default App;
+```
+
+
+
+
+# Reference
+
+## Props
+
+### `color`
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `fontFamily`
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `fontSize`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `fontStyle`
+
+| Type |
+| ---------------------------- |
+| enum(`'normal'`, `'italic'`) |
+
+---
+
+### `fontWeight`
+
+Specifies font weight. The values `'normal'` and `'bold'` are supported for most fonts. Not all fonts have a variant for each of the numeric values, in that case the closest one is chosen.
+
+| Type | Default |
+| --------------------------------------------------------------------------------------------------------------------- | ---------- |
+| enum(`'normal'`, `'bold'`, `'100'`, `'200'`, `'300'`, `'400'`, `'500'`, `'600'`, `'700'`, `'800'`, `'900'`) or number | `'normal'` |
+
+---
+
+### `includeFontPadding`
Android
+
+Set to `false` to remove extra font padding intended to make space for certain ascenders / descenders. With some fonts, this padding can make text look slightly misaligned when centered vertically. For best results also set `textAlignVertical` to `center`.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `true` |
+
+---
+
+### `fontVariant`
+
+Allows you to set all the font variants for a font. Can be set by using an array of enums or a space-separated string e.g. `'small-caps common-ligatures'`.
+
+| Type | Default |
+| -------------------------------------------------------------------------------------------------------------------- | ------- |
+| array of enum(`'small-caps'`, `'oldstyle-nums'`, `'lining-nums'`, `'tabular-nums'`, `'proportional-nums'`) or string | `[]` |
+
+---
+
+### `letterSpacing`
+
+Increase or decrease the spacing between characters. By default there is no extra letter spacing.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `lineHeight`
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `textAlign`
+
+Specifies text alignment. On Android, the value 'justify' is only supported on Oreo (8.0) or above (API level >= 26). The value will fallback to `left` on lower Android versions.
+
+| Type | Default |
+| ------------------------------------------------------------ | -------- |
+| enum(`'auto'`, `'left'`, `'right'`, `'center'`, `'justify'`) | `'auto'` |
+
+---
+
+### `textAlignVertical`
+
+| Type | Default |
+| -------------------------------- | -------- |
+| enum(`'auto'`, `'ltr'`, `'rtl'`) | `'auto'` |
+
+---
+
+### `userSelect`
+
+It allows the user to select text and to use the native copy and paste functionality. Has precedence over the `selectable` prop.
+
+| Type | Default |
+| -------------------------------------------------------- | ------- |
+| enum(`'auto'`, `'text'`, `'none'`, `'contain'`, `'all'`) | `none` |
diff --git a/website/versioned_docs/version-0.73.0/text.md b/website/versioned_docs/version-0.73.0/text.md
new file mode 100644
index 00000000000..f576e3ac04b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/text.md
@@ -0,0 +1,758 @@
+---
+id: text
+title: Text
+---
+
+A React component for displaying text.
+
+`Text` supports nesting, styling, and touch handling.
+
+In the following example, the nested title and body text will inherit the `fontFamily` from `styles.baseText`, but the title provides its own additional styles. The title and body will stack on top of each other on account of the literal newlines:
+
+```SnackPlayer name=Text%20Functional%20Component%20Example
+import React, {useState} from 'react';
+import {Text, StyleSheet} from 'react-native';
+
+const TextInANest = () => {
+ const [titleText, setTitleText] = useState("Bird's Nest");
+ const bodyText = 'This is not really a bird nest.';
+
+ const onPressTitle = () => {
+ setTitleText("Bird's Nest [pressed]");
+ };
+
+ return (
+
+
+ {titleText}
+ {'\n'}
+ {'\n'}
+
+ {bodyText}
+
+ );
+};
+
+const styles = StyleSheet.create({
+ baseText: {
+ fontFamily: 'Cochin',
+ },
+ titleText: {
+ fontSize: 20,
+ fontWeight: 'bold',
+ },
+});
+
+export default TextInANest;
+```
+
+## Nested text
+
+Both Android and iOS allow you to display formatted text by annotating ranges of a string with specific formatting like bold or colored text (`NSAttributedString` on iOS, `SpannableString` on Android). In practice, this is very tedious. For React Native, we decided to use web paradigm for this where you can nest text to achieve the same effect.
+
+```SnackPlayer name=Nested%20Text%20Example
+import React from 'react';
+import {Text, StyleSheet} from 'react-native';
+
+const BoldAndBeautiful = () => {
+ return (
+
+ I am bold
+ and red
+
+ );
+};
+
+const styles = StyleSheet.create({
+ baseText: {
+ fontWeight: 'bold',
+ },
+ innerText: {
+ color: 'red',
+ },
+});
+
+export default BoldAndBeautiful;
+```
+
+Behind the scenes, React Native converts this to a flat `NSAttributedString` or `SpannableString` that contains the following information:
+
+```
+"I am bold and red"
+0-9: bold
+9-17: bold, red
+```
+
+## Containers
+
+The `` element is unique relative to layout: everything inside is no longer using the Flexbox layout but using text layout. This means that elements inside of a `` are no longer rectangles, but wrap when they see the end of the line.
+
+```tsx
+
+ First part and
+ second part
+
+// Text container: the text will be inline if the space allowed it
+// |First part and second part|
+
+// otherwise, the text will flow as if it was one
+// |First part |
+// |and second |
+// |part |
+
+
+ First part and
+ second part
+
+// View container: each text is its own block
+// |First part and|
+// |second part |
+
+// otherwise, the text will flow in its own block
+// |First part |
+// |and |
+// |second part|
+```
+
+## Limited Style Inheritance
+
+On the web, the usual way to set a font family and size for the entire document is to take advantage of inherited CSS properties like so:
+
+```css
+html {
+ font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
+ font-size: 11px;
+ color: #141823;
+}
+```
+
+All elements in the document will inherit this font unless they or one of their parents specifies a new rule.
+
+In React Native, we are more strict about it: **you must wrap all the text nodes inside of a `` component**. You cannot have a text node directly under a ``.
+
+```tsx
+// BAD: will raise exception, can't have a text node as child of a
+
+ Some text
+
+
+// GOOD
+
+
+ Some text
+
+
+```
+
+You also lose the ability to set up a default font for an entire subtree. Meanwhile, `fontFamily` only accepts a single font name, which is different from `font-family` in CSS. The recommended way to use consistent fonts and sizes across your application is to create a component `MyAppText` that includes them and use this component across your app. You can also use this component to make more specific components like `MyAppHeaderText` for other kinds of text.
+
+```tsx
+
+
+ Text styled with the default font for the entire application
+
+ Text styled as a header
+
+```
+
+Assuming that `MyAppText` is a component that only renders out its children into a `Text` component with styling, then `MyAppHeaderText` can be defined as follows:
+
+```tsx
+class MyAppHeaderText extends Component {
+ render() {
+ return (
+
+ {this.props.children}
+
+ );
+ }
+}
+```
+
+Composing `MyAppText` in this way ensures that we get the styles from a top-level component, but leaves us the ability to add / override them in specific use cases.
+
+React Native still has the concept of style inheritance, but limited to text subtrees. In this case, the second part will be both bold and red.
+
+```tsx
+
+ I am bold
+ and red
+
+```
+
+We believe that this more constrained way to style text will yield better apps:
+
+- (Developer) React components are designed with strong isolation in mind: You should be able to drop a component anywhere in your application, trusting that as long as the props are the same, it will look and behave the same way. Text properties that could inherit from outside of the props would break this isolation.
+
+- (Implementor) The implementation of React Native is also simplified. We do not need to have a `fontFamily` field on every single element, and we do not need to potentially traverse the tree up to the root every time we display a text node. The style inheritance is only encoded inside of the native Text component and doesn't leak to other components or the system itself.
+
+---
+
+# Reference
+
+## Props
+
+### `accessibilityHint`
+
+An accessibility hint helps users understand what will happen when they perform an action on the accessibility element when that result is not clear from the accessibility label.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityLanguage`
iOS
+
+A value indicating which language should be used by the screen reader when the user interacts with the element. It should follow the [BCP 47 specification](https://www.rfc-editor.org/info/bcp47).
+
+See the [iOS `accessibilityLanguage` doc](https://developer.apple.com/documentation/objectivec/nsobject/1615192-accessibilitylanguage) for more information.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityLabel`
+
+Overrides the text that's read by the screen reader when the user interacts with the element. By default, the label is constructed by traversing all the children and accumulating all the `Text` nodes separated by space.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `accessibilityRole`
+
+Tells the screen reader to treat the currently focused on element as having a specific role.
+
+On iOS, these roles map to corresponding Accessibility Traits. Image button has the same functionality as if the trait was set to both 'image' and 'button'. See the [Accessibility guide](accessibility.md#accessibilitytraits-ios) for more information.
+
+On Android, these roles have similar functionality on TalkBack as adding Accessibility Traits does on Voiceover in iOS
+
+| Type |
+| ---------------------------------------------------- |
+| [AccessibilityRole](accessibility#accessibilityrole) |
+
+---
+
+### `accessibilityState`
+
+Tells the screen reader to treat the currently focused on element as being in a specific state.
+
+You can provide one state, no state, or multiple states. The states must be passed in through an object. Ex: `{selected: true, disabled: true}`.
+
+| Type |
+| ------------------------------------------------------ |
+| [AccessibilityState](accessibility#accessibilitystate) |
+
+---
+
+### `accessibilityActions`
+
+Accessibility actions allow an assistive technology to programmatically invoke the actions of a component. The `accessibilityActions` property should contain a list of action objects. Each action object should contain the field name and label.
+
+See the [Accessibility guide](accessibility.md#accessibility-actions) for more information.
+
+| Type | Required |
+| ----- | -------- |
+| array | No |
+
+---
+
+### `onAccessibilityAction`
+
+Invoked when the user performs the accessibility actions. The only argument to this function is an event containing the name of the action to perform.
+
+See the [Accessibility guide](accessibility.md#accessibility-actions) for more information.
+
+| Type | Required |
+| -------- | -------- |
+| function | No |
+
+---
+
+### `accessible`
+
+When set to `true`, indicates that the view is an accessibility element.
+
+See the [Accessibility guide](accessibility#accessible-ios-android) for more information.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `true` |
+
+---
+
+### `adjustsFontSizeToFit`
+
+Specifies whether fonts should be scaled down automatically to fit given style constraints.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `allowFontScaling`
+
+Specifies whether fonts should scale to respect Text Size accessibility settings.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `true` |
+
+---
+
+### `android_hyphenationFrequency`
Android
+
+Sets the frequency of automatic hyphenation to use when determining word breaks on Android API Level 23+.
+
+| Type | Default |
+| ----------------------------------- | -------- |
+| enum(`'none'`, `'normal'`,`'full'`) | `'none'` |
+
+---
+
+### `aria-busy`
+
+Indicates an element is being modified and that assistive technologies may want to wait until the changes are complete before informing the user about the update.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+---
+
+### `aria-checked`
+
+Indicates the state of a checkable element. This field can either take a boolean or the "mixed" string to represent mixed checkboxes.
+
+| Type | Default |
+| ---------------- | ------- |
+| boolean, 'mixed' | false |
+
+---
+
+### `aria-disabled`
+
+Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+---
+
+### `aria-expanded`
+
+Indicates whether an expandable element is currently expanded or collapsed.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | false |
+
+---
+
+### `aria-label`
+
+Defines a string value that labels an interactive element.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `aria-selected`
+
+Indicates whether a selectable element is currently selected or not.
+
+| Type |
+| ------- |
+| boolean |
+
+### `dataDetectorType`
Android
+
+Determines the types of data converted to clickable URLs in the text element. By default, no data types are detected.
+
+You can provide only one type.
+
+| Type | Default |
+| ------------------------------------------------------------- | -------- |
+| enum(`'phoneNumber'`, `'link'`, `'email'`, `'none'`, `'all'`) | `'none'` |
+
+---
+
+### `disabled`
Android
+
+Specifies the disabled state of the text view for testing purposes.
+
+| Type | Default |
+| ---- | ------- |
+| bool | `false` |
+
+---
+
+### `dynamicTypeRamp`
iOS
+
+The [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically) ramp to apply to this element on iOS.
+
+| Type | Default |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| enum(`'caption2'`, `'caption1'`, `'footnote'`, `'subheadline'`, `'callout'`, `'body'`, `'headline'`, `'title3'`, `'title2'`, `'title1'`, `'largeTitle'`) | `'body'` |
+
+---
+
+### `ellipsizeMode`
+
+When `numberOfLines` is set, this prop defines how the text will be truncated. `numberOfLines` must be set in conjunction with this prop.
+
+This can be one of the following values:
+
+- `head` - The line is displayed so that the end fits in the container and the missing text at the beginning of the line is indicated by an ellipsis glyph. e.g., "...wxyz"
+- `middle` - The line is displayed so that the beginning and end fit in the container and the missing text in the middle is indicated by an ellipsis glyph. "ab...yz"
+- `tail` - The line is displayed so that the beginning fits in the container and the missing text at the end of the line is indicated by an ellipsis glyph. e.g., "abcd..."
+- `clip` - Lines are not drawn past the edge of the text container.
+
+> On Android, when `numberOfLines` is set to a value higher than `1`, only `tail` value will work correctly.
+
+| Type | Default |
+| ---------------------------------------------- | ------- |
+| enum(`'head'`, `'middle'`, `'tail'`, `'clip'`) | `tail` |
+
+---
+
+### `id`
+
+Used to locate this view from native code. Has precedence over `nativeID` prop.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `maxFontSizeMultiplier`
+
+Specifies the largest possible scale a font can reach when `allowFontScaling` is enabled. Possible values:
+
+- `null/undefined`: inherit from the parent node or the global default (0)
+- `0`: no max, ignore parent/global default
+- `>= 1`: sets the `maxFontSizeMultiplier` of this node to this value
+
+| Type | Default |
+| ------ | ----------- |
+| number | `undefined` |
+
+---
+
+### `minimumFontScale`
iOS
+
+Specifies the smallest possible scale a font can reach when `adjustsFontSizeToFit` is enabled. (values 0.01-1.0).
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `nativeID`
+
+Used to locate this view from native code.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `numberOfLines`
+
+Used to truncate the text with an ellipsis after computing the text layout, including line wrapping, such that the total number of lines does not exceed this number. Setting this property to `0` will result in unsetting this value, which means that no lines restriction will be applied.
+
+This prop is commonly used with `ellipsizeMode`.
+
+| Type | Default |
+| ------ | ------- |
+| number | `0` |
+
+---
+
+### `onLayout`
+
+Invoked on mount and on layout changes.
+
+| Type |
+| -------------------------------------------------------- |
+| `md ({nativeEvent: [LayoutEvent](layoutevent)}) => void` |
+
+---
+
+### `onLongPress`
+
+This function is called on long press.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onMoveShouldSetResponder`
+
+Does this view want to "claim" touch responsiveness? This is called for every touch move on the `View` when it is not the responder.
+
+| Type |
+| --------------------------------------------------------- |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => boolean` |
+
+---
+
+### `onPress`
+
+Function called on user press, triggered after `onPressOut`.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onPressIn`
+
+Called immediately when a touch is engaged, before `onPressOut` and `onPress`.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onPressOut`
+
+Called when a touch is released.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onResponderGrant`
+
+The View is now responding to touch events. This is the time to highlight and show the user what is happening.
+
+On Android, return true from this callback to prevent any other native components from becoming responder until this responder terminates.
+
+| Type |
+| ----------------------------------------------------------------- |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void | boolean` |
+
+---
+
+### `onResponderMove`
+
+The user is moving their finger.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onResponderRelease`
+
+Fired at the end of the touch.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onResponderTerminate`
+
+The responder has been taken from the `View`. Might be taken by other views after a call to `onResponderTerminationRequest`, or might be taken by the OS without asking (e.g., happens with control center/ notification center on iOS)
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onResponderTerminationRequest`
+
+Some other `View` wants to become a responder and is asking this `View` to release its responder. Returning `true` allows its release.
+
+| Type |
+| --------------------------------------------------------- |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => boolean` |
+
+---
+
+### `onStartShouldSetResponderCapture`
+
+If a parent `View` wants to prevent a child `View` from becoming a responder on a touch start, it should have this handler which returns `true`.
+
+| Type |
+| --------------------------------------------------------- |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => boolean` |
+
+---
+
+### `onTextLayout`
+
+Invoked on Text layout change.
+
+| Type |
+| ---------------------------------------------------- |
+| ([`TextLayoutEvent`](text#textlayoutevent)) => mixed |
+
+---
+
+### `pressRetentionOffset`
+
+When the scroll view is disabled, this defines how far your touch may move off of the button, before deactivating the button. Once deactivated, try moving it back and you'll see that the button is once again reactivated! Move it back and forth several times while the scroll view is disabled. Ensure you pass in a constant to reduce memory allocations.
+
+| Type |
+| -------------------- |
+| [Rect](rect), number |
+
+---
+
+### `role`
+
+`role` communicates the purpose of a component to the user of an assistive technology. Has precedence over the [`accessibilityRole`](text#accessibilityrole) prop.
+
+| Type |
+| -------------------------- |
+| [Role](accessibility#role) |
+
+---
+
+### `selectable`
+
+Lets the user select text, to use the native copy and paste functionality.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `selectionColor`
Android
+
+The highlight color of the text.
+
+| Type |
+| --------------- |
+| [color](colors) |
+
+---
+
+### `style`
+
+| Type |
+| -------------------------------------------------------------------- |
+| [Text Style](text-style-props), [View Style Props](view-style-props) |
+
+---
+
+### `suppressHighlighting`
iOS
+
+When `true`, no visual change is made when text is pressed down. By default, a gray oval highlights the text on press down.
+
+| Type | Default |
+| ------- | ------- |
+| boolean | `false` |
+
+---
+
+### `testID`
+
+Used to locate this view in end-to-end tests.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `textBreakStrategy`
Android
+
+Set text break strategy on Android API Level 23+, possible values are `simple`, `highQuality`, `balanced`.
+
+| Type | Default |
+| ----------------------------------------------- | ------------- |
+| enum(`'simple'`, `'highQuality'`, `'balanced'`) | `highQuality` |
+
+---
+
+### `lineBreakStrategyIOS`
iOS
+
+Set line break strategy on iOS 14+. Possible values are `none`, `standard`, `hangul-word` and `push-out`.
+
+| Type | Default |
+| ----------------------------------------------------------- | -------- |
+| enum(`'none'`, `'standard'`, `'hangul-word'`, `'push-out'`) | `'none'` |
+
+## Type Definitions
+
+### TextLayout
+
+`TextLayout` object is a part of [`TextLayoutEvent`](text#textlayoutevent) callback and contains the measurement data for `Text` line.
+
+#### Example
+
+```js
+{
+ capHeight: 10.496,
+ ascender: 14.624,
+ descender: 4,
+ width: 28.224,
+ height: 18.624,
+ xHeight: 6.048,
+ x: 0,
+ y: 0
+}
+```
+
+#### Properties
+
+| Name | Type | Optional | Description |
+| --------- | ------ | -------- | ------------------------------------------------------------------- |
+| ascender | number | No | The line ascender height after the text layout changes. |
+| capHeight | number | No | Height of capital letter above the baseline. |
+| descender | number | No | The line descender height after the text layout changes. |
+| height | number | No | Height of the line after the text layout changes. |
+| width | number | No | Width of the line after the text layout changes. |
+| x | number | No | Line X coordinate inside the Text component. |
+| xHeight | number | No | Distance between the baseline and median of the line (corpus size). |
+| y | number | No | Line Y coordinate inside the Text component. |
+
+### TextLayoutEvent
+
+`TextLayoutEvent` object is returned in the callback as a result of a component layout change. It contains a key called `lines` with a value which is an array containing [`TextLayout`](text#textlayout) object corresponded to every rendered text line.
+
+#### Example
+
+```js
+{
+ lines: [
+ TextLayout,
+ TextLayout,
+ // ...
+ ];
+ target: 1127;
+}
+```
+
+#### Properties
+
+| Name | Type | Optional | Description |
+| ------ | --------------------------------------- | -------- | ----------------------------------------------------- |
+| lines | array of [TextLayout](text#textlayout)s | No | Provides the TextLayout data for every rendered line. |
+| target | number | No | The node id of the element. |
diff --git a/website/versioned_docs/version-0.73.0/textinput.md b/website/versioned_docs/version-0.73.0/textinput.md
new file mode 100644
index 00000000000..cd9881c9a7d
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/textinput.md
@@ -0,0 +1,1039 @@
+---
+id: textinput
+title: TextInput
+---
+
+A foundational component for inputting text into the app via a keyboard. Props provide configurability for several features, such as auto-correction, auto-capitalization, placeholder text, and different keyboard types, such as a numeric keypad.
+
+The most basic use case is to plop down a `TextInput` and subscribe to the `onChangeText` events to read the user input. There are also other events, such as `onSubmitEditing` and `onFocus` that can be subscribed to. A minimal example:
+
+```SnackPlayer name=TextInput
+import React from 'react';
+import {SafeAreaView, StyleSheet, TextInput} from 'react-native';
+
+const TextInputExample = () => {
+ const [text, onChangeText] = React.useState('Useless Text');
+ const [number, onChangeNumber] = React.useState('');
+
+ return (
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ input: {
+ height: 40,
+ margin: 12,
+ borderWidth: 1,
+ padding: 10,
+ },
+});
+
+export default TextInputExample;
+```
+
+Two methods exposed via the native element are .focus() and .blur() that will focus or blur the TextInput programmatically.
+
+Note that some props are only available with `multiline={true/false}`. Additionally, border styles that apply to only one side of the element (e.g., `borderBottomColor`, `borderLeftWidth`, etc.) will not be applied if `multiline=true`. To achieve the same effect, you can wrap your `TextInput` in a `View`:
+
+```SnackPlayer name=TextInput
+import React from 'react';
+import {View, TextInput} from 'react-native';
+
+const MultilineTextInputExample = () => {
+ const [value, onChangeText] = React.useState('Useless Multiline Placeholder');
+
+ // If you type something in the text box that is a color, the background will change to that
+ // color.
+ return (
+
+ onChangeText(text)}
+ value={value}
+ style={{padding: 10}}
+ />
+
+ );
+};
+
+export default MultilineTextInputExample;
+```
+
+`TextInput` has by default a border at the bottom of its view. This border has its padding set by the background image provided by the system, and it cannot be changed. Solutions to avoid this are to either not set height explicitly, in which case the system will take care of displaying the border in the correct position, or to not display the border by setting `underlineColorAndroid` to transparent.
+
+Note that on Android performing text selection in an input can change the app's activity `windowSoftInputMode` param to `adjustResize`. This may cause issues with components that have position: 'absolute' while the keyboard is active. To avoid this behavior either specify `windowSoftInputMode` in AndroidManifest.xml ( https://developer.android.com/guide/topics/manifest/activity-element.html ) or control this param programmatically with native code.
+
+---
+
+# Reference
+
+## Props
+
+### [View Props](view.md#props)
+
+Inherits [View Props](view.md#props).
+
+---
+
+### `allowFontScaling`
+
+Specifies whether fonts should scale to respect Text Size accessibility settings. The default is `true`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `autoCapitalize`
+
+Tells `TextInput` to automatically capitalize certain characters. This property is not supported by some keyboard types such as `name-phone-pad`.
+
+- `characters`: all characters.
+- `words`: first letter of each word.
+- `sentences`: first letter of each sentence (_default_).
+- `none`: don't auto capitalize anything.
+
+| Type |
+| ------------------------------------------------ |
+| enum('none', 'sentences', 'words', 'characters') |
+
+---
+
+### `autoComplete`
+
+Specifies autocomplete hints for the system, so it can provide autofill. On Android, the system will always attempt to offer autofill by using heuristics to identify the type of content. To disable autocomplete, set `autoComplete` to `off`.
+
+The following values work across platforms:
+
+- `additional-name`
+- `address-line1`
+- `address-line2`
+- `birthdate-day` (iOS 17+)
+- `birthdate-full` (iOS 17+)
+- `birthdate-month` (iOS 17+)
+- `birthdate-year` (iOS 17+)
+- `cc-csc` (iOS 17+)
+- `cc-exp` (iOS 17+)
+- `cc-exp-day` (iOS 17+)
+- `cc-exp-month` (iOS 17+)
+- `cc-exp-year` (iOS 17+)
+- `cc-number`
+- `country`
+- `current-password`
+- `email`
+- `family-name`
+- `given-name`
+- `honorific-prefix`
+- `honorific-suffix`
+- `name`
+- `new-password`
+- `off`
+- `one-time-code`
+- `postal-code`
+- `street-address`
+- `tel`
+- `username`
+
+
+
+The following values work on Android only:
+
+- `gender`
+- `name-family`
+- `name-given`
+- `name-middle`
+- `name-middle-initial`
+- `name-prefix`
+- `name-suffix`
+- `password`
+- `password-new`
+- `postal-address`
+- `postal-address-country`
+- `postal-address-extended`
+- `postal-address-extended-postal-code`
+- `postal-address-locality`
+- `postal-address-region`
+- `sms-otp`
+- `tel-country-code`
+- `tel-device`
+- `tel-national`
+- `username-new`
+
+| Type······················································································································································································································································································································································································································································································································································································································································································································································································································································································································································ |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| enum('additional-name', 'address-line1', 'address-line2', 'birthdate-day', 'birthdate-full', 'birthdate-month', 'birthdate-year', 'cc-csc', 'cc-exp', 'cc-exp-day', 'cc-exp-month', 'cc-exp-year', 'cc-number', 'country', 'current-password', 'email', 'family-name', 'given-name', 'honorific-prefix', 'honorific-suffix', 'name', 'new-password', 'off', 'one-time-code', 'postal-code', 'street-address', 'tel', 'username', 'cc-family-name', 'cc-given-name', 'cc-middle-name', 'cc-name', 'cc-type', 'nickname', 'organization', 'organization-title', 'url', 'gender', 'name-family', 'name-given', 'name-middle', 'name-middle-initial', 'name-prefix', 'name-suffix', 'password', 'password-new', 'postal-address', 'postal-address-country', 'postal-address-extended', 'postal-address-extended-postal-code', 'postal-address-locality', 'postal-address-region', 'sms-otp', 'tel-country-code', 'tel-device', 'tel-national', 'username-new') |
+
+---
+
+### `autoCorrect`
+
+If `false`, disables auto-correct. The default value is `true`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `autoFocus`
+
+If `true`, focuses the input on `componentDidMount` or `useEffect`. The default value is `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `blurOnSubmit`
+
+If `true`, the text field will blur when submitted. The default value is true for single-line fields and false for multiline fields. Note that for multiline fields, setting `blurOnSubmit` to `true` means that pressing return will blur the field and trigger the `onSubmitEditing` event instead of inserting a newline into the field.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `caretHidden`
+
+If `true`, caret is hidden. The default value is `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `clearButtonMode`
iOS
+
+When the clear button should appear on the right side of the text view. This property is supported only for single-line TextInput component. The default value is `never`.
+
+| Type |
+| ---------------------------------------------------------- |
+| enum('never', 'while-editing', 'unless-editing', 'always') |
+
+---
+
+### `clearTextOnFocus`
iOS
+
+If `true`, clears the text field automatically when editing begins.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `contextMenuHidden`
+
+If `true`, context menu is hidden. The default value is `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `dataDetectorTypes`
iOS
+
+Determines the types of data converted to clickable URLs in the text input. Only valid if `multiline={true}` and `editable={false}`. By default no data types are detected.
+
+You can provide one type or an array of many types.
+
+Possible values for `dataDetectorTypes` are:
+
+- `'phoneNumber'`
+- `'link'`
+- `'address'`
+- `'calendarEvent'`
+- `'none'`
+- `'all'`
+
+| Type |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| enum('phoneNumber', 'link', 'address', 'calendarEvent', 'none', 'all'), ,array of enum('phoneNumber', 'link', 'address', 'calendarEvent', 'none', 'all') |
+
+---
+
+### `defaultValue`
+
+Provides an initial value that will change when the user starts typing. Useful for use-cases where you do not want to deal with listening to events and updating the value prop to keep the controlled state in sync.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `cursorColor`
Android
+
+When provided it will set the color of the cursor (or "caret") in the component. Unlike the behavior of `selectionColor` the cursor color will be set independently from the color of the text selection box.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `disableFullscreenUI`
Android
+
+When `false`, if there is a small amount of space available around a text input (e.g. landscape orientation on a phone), the OS may choose to have the user edit the text inside of a full screen text input mode. When `true`, this feature is disabled and users will always edit the text directly inside of the text input. Defaults to `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `editable`
+
+If `false`, text is not editable. The default value is `true`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `enablesReturnKeyAutomatically`
iOS
+
+If `true`, the keyboard disables the return key when there is no text and automatically enables it when there is text. The default value is `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `enterKeyHint`
+
+Determines what text should be shown to the return key. Has precedence over the `returnKeyType` prop.
+
+The following values work across platforms:
+
+- `enter`
+- `done`
+- `next`
+- `search`
+- `send`
+
+_Android Only_
+
+The following values work on Android only:
+
+- `previous`
+
+| Type |
+| ----------------------------------------------------------- |
+| enum('enter', 'done', 'next', 'previous', 'search', 'send') |
+
+---
+
+### `importantForAutofill`
Android
+
+Tells the operating system whether the individual fields in your app should be included in a view structure for autofill purposes on Android API Level 26+. Possible values are `auto`, `no`, `noExcludeDescendants`, `yes`, and `yesExcludeDescendants`. The default value is `auto`.
+
+- `auto`: Let the Android System use its heuristics to determine if the view is important for autofill.
+- `no`: This view isn't important for autofill.
+- `noExcludeDescendants`: This view and its children aren't important for autofill.
+- `yes`: This view is important for autofill.
+- `yesExcludeDescendants`: This view is important for autofill, but its children aren't important for autofill.
+
+| Type |
+| -------------------------------------------------------------------------- |
+| enum('auto', 'no', 'noExcludeDescendants', 'yes', 'yesExcludeDescendants') |
+
+---
+
+### `inlineImageLeft`
Android
+
+If defined, the provided image resource will be rendered on the left. The image resource must be inside `/android/app/src/main/res/drawable` and referenced like
+
+```
+
+```
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `inlineImagePadding`
Android
+
+Padding between the inline image, if any, and the text input itself.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `inputAccessoryViewID`
iOS
+
+An optional identifier which links a custom [InputAccessoryView](inputaccessoryview.md) to this text input. The InputAccessoryView is rendered above the keyboard when this text input is focused.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `inputMode`
+
+Works like the `inputmode` attribute in HTML, it determines which keyboard to open, e.g. `numeric` and has precedence over `keyboardType`.
+
+Support the following values:
+
+- `none`
+- `text`
+- `decimal`
+- `numeric`
+- `tel`
+- `search`
+- `email`
+- `url`
+
+| Type |
+| --------------------------------------------------------------------------- |
+| enum('decimal', 'email', 'none', 'numeric', 'search', 'tel', 'text', 'url') |
+
+---
+
+### `keyboardAppearance`
iOS
+
+Determines the color of the keyboard.
+
+| Type |
+| -------------------------------- |
+| enum('default', 'light', 'dark') |
+
+---
+
+### `keyboardType`
+
+Determines which keyboard to open, e.g.`numeric`.
+
+See screenshots of all the types [here](https://lefkowitz.me/2018/04/30/visual-guide-to-react-native-textinput-keyboardtype-options/).
+
+The following values work across platforms:
+
+- `default`
+- `number-pad`
+- `decimal-pad`
+- `numeric`
+- `email-address`
+- `phone-pad`
+- `url`
+
+_iOS Only_
+
+The following values work on iOS only:
+
+- `ascii-capable`
+- `numbers-and-punctuation`
+- `name-phone-pad`
+- `twitter`
+- `web-search`
+
+_Android Only_
+
+The following values work on Android only:
+
+- `visible-password`
+
+| Type |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| enum('default', 'email-address', 'numeric', 'phone-pad', 'ascii-capable', 'numbers-and-punctuation', 'url', 'number-pad', 'name-phone-pad', 'decimal-pad', 'twitter', 'web-search', 'visible-password') |
+
+---
+
+### `maxFontSizeMultiplier`
+
+Specifies largest possible scale a font can reach when `allowFontScaling` is enabled. Possible values:
+
+- `null/undefined` (default): inherit from the parent node or the global default (0)
+- `0`: no max, ignore parent/global default
+- `>= 1`: sets the `maxFontSizeMultiplier` of this node to this value
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `maxLength`
+
+Limits the maximum number of characters that can be entered. Use this instead of implementing the logic in JS to avoid flicker.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `multiline`
+
+If `true`, the text input can be multiple lines. The default value is `false`.
+
+:::note
+It is important to note that this aligns the text to the top on iOS, and centers it on Android. Use with `textAlignVertical` set to `top` for the same behavior in both platforms.
+:::
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `numberOfLines`
Android
+
+Sets the number of lines for a `TextInput`. Use it with multiline set to `true` to be able to fill the lines.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `onBlur`
+
+Callback that is called when the text input is blurred.
+
+> Note: If you are attempting to access the `text` value from `nativeEvent` keep in mind that the resulting value you get can be `undefined` which can cause unintended errors. If you are trying to find the last value of TextInput, you can use the [`onEndEditing`](textinput#onendediting) event, which is fired upon completion of editing.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onChange`
+
+Callback that is called when the text input's text changes.
+
+| Type |
+| ----------------------------------------------------- |
+| (`{nativeEvent: {eventCount, target, text}}`) => void |
+
+---
+
+### `onChangeText`
+
+Callback that is called when the text input's text changes. Changed text is passed as a single string argument to the callback handler.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onContentSizeChange`
+
+Callback that is called when the text input's content size changes.
+
+Only called for multiline text inputs.
+
+| Type |
+| ---------------------------------------------------------- |
+| (`{nativeEvent: {contentSize: {width, height} }}`) => void |
+
+---
+
+### `onEndEditing`
+
+Callback that is called when text input ends.
+
+| Type |
+| -------- |
+| function |
+
+---
+
+### `onPressIn`
+
+Callback that is called when a touch is engaged.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onPressOut`
+
+Callback that is called when a touch is released.
+
+| Type |
+| ------------------------------------------------------ |
+| `md ({nativeEvent: [PressEvent](pressevent)}) => void` |
+
+---
+
+### `onFocus`
+
+Callback that is called when the text input is focused.
+
+| Type |
+| -------------------------------------------------------- |
+| `md ({nativeEvent: [LayoutEvent](layoutevent)}) => void` |
+
+---
+
+### `onKeyPress`
+
+Callback that is called when a key is pressed. This will be called with object where `keyValue` is `'Enter'` or `'Backspace'` for respective keys and the typed-in character otherwise including `' '` for space. Fires before `onChange` callbacks. Note: on Android only the inputs from soft keyboard are handled, not the hardware keyboard inputs.
+
+| Type |
+| ------------------------------------------- |
+| (`{nativeEvent: {key: keyValue} }`) => void |
+
+---
+
+### `onLayout`
+
+Invoked on mount and on layout changes.
+
+| Type |
+| -------------------------------------------------------- |
+| `md ({nativeEvent: [LayoutEvent](layoutevent)}) => void` |
+
+---
+
+### `onScroll`
+
+Invoked on content scroll. May also contain other properties from `ScrollEvent` but on Android `contentSize` is not provided for performance reasons.
+
+| Type |
+| --------------------------------------------------- |
+| (`{nativeEvent: {contentOffset: {x, y} }}`) => void |
+
+---
+
+### `onSelectionChange`
+
+Callback that is called when the text input selection is changed.
+
+| Type |
+| ----------------------------------------------------- |
+| (`{nativeEvent: {selection: {start, end} }}`) => void |
+
+---
+
+### `onSubmitEditing`
+
+Callback that is called when the text input's submit button is pressed.
+
+| Type |
+| ----------------------------------------------------- |
+| (`{nativeEvent: {text, eventCount, target}}`) => void |
+
+Note that on iOS this method isn't called when using `keyboardType="phone-pad"`.
+
+---
+
+### `placeholder`
+
+The string that will be rendered before text input has been entered.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `placeholderTextColor`
+
+The text color of the placeholder string.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `readOnly`
+
+If `true`, text is not editable. The default value is `false`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `returnKeyLabel`
Android
+
+Sets the return key to the label. Use it instead of `returnKeyType`.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `returnKeyType`
+
+Determines how the return key should look. On Android you can also use `returnKeyLabel`.
+
+_Cross platform_
+
+The following values work across platforms:
+
+- `done`
+- `go`
+- `next`
+- `search`
+- `send`
+
+_Android Only_
+
+The following values work on Android only:
+
+- `none`
+- `previous`
+
+_iOS Only_
+
+The following values work on iOS only:
+
+- `default`
+- `emergency-call`
+- `google`
+- `join`
+- `route`
+- `yahoo`
+
+| Type |
+| --------------------------------------------------------------------------------------------------------------------------------- |
+| enum('done', 'go', 'next', 'search', 'send', 'none', 'previous', 'default', 'emergency-call', 'google', 'join', 'route', 'yahoo') |
+
+### `rejectResponderTermination`
iOS
+
+If `true`, allows TextInput to pass touch events to the parent component. This allows components such as SwipeableListView to be swipeable from the TextInput on iOS, as is the case on Android by default. If `false`, TextInput always asks to handle the input (except when disabled). The default value is `true`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `rows`
Android
+
+Sets the number of lines for a `TextInput`. Use it with multiline set to `true` to be able to fill the lines.
+
+| Type |
+| ------ |
+| number |
+
+---
+
+### `scrollEnabled`
iOS
+
+If `false`, scrolling of the text view will be disabled. The default value is `true`. Only works with `multiline={true}`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `secureTextEntry`
+
+If `true`, the text input obscures the text entered so that sensitive text like passwords stay secure. The default value is `false`. Does not work with `multiline={true}`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `selection`
+
+The start and end of the text input's selection. Set start and end to the same value to position the cursor.
+
+| Type |
+| ------------------------------------- |
+| object: `{start: number,end: number}` |
+
+---
+
+### `selectionColor`
+
+The highlight and cursor color of the text input.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `selectTextOnFocus`
+
+If `true`, all text will automatically be selected on focus.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `showSoftInputOnFocus`
+
+When `false`, it will prevent the soft keyboard from showing when the field is focused. The default value is `true`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `spellCheck`
iOS
+
+If `false`, disables spell-check style (i.e. red underlines). The default value is inherited from `autoCorrect`.
+
+| Type |
+| ---- |
+| bool |
+
+---
+
+### `textAlign`
+
+Align the input text to the left, center, or right sides of the input field.
+
+Possible values for `textAlign` are:
+
+- `left`
+- `center`
+- `right`
+
+| Type |
+| ------------------------------- |
+| enum('left', 'center', 'right') |
+
+---
+
+### `textContentType`
iOS
+
+Give the keyboard and the system information about the expected semantic meaning for the content that users enter.
+
+:::note
+[`autoComplete`](#autocomplete), provides the same functionality and is available for all platforms. You can use [`Platform.select`](/docs/next/platform#select) for differing platform behaviors.
+
+Avoid using both `textContentType` and `autoComplete`. For backwards compatibility, `textContentType` takes precedence when both properties are set.
+:::
+
+You can set `textContentType` to `username` or `password` to enable autofill of login details from the device keychain.
+
+`newPassword` can be used to indicate a new password input the user may want to save in the keychain, and `oneTimeCode` can be used to indicate that a field can be autofilled by a code arriving in an SMS.
+
+To disable autofill, set `textContentType` to `none`.
+
+Possible values for `textContentType` are:
+
+- `none`
+- `addressCity`
+- `addressCityAndState`
+- `addressState`
+- `birthdate` (iOS 17+)
+- `birthdateDay` (iOS 17+)
+- `birthdateMonth` (iOS 17+)
+- `birthdateYear` (iOS 17+)
+- `countryName`
+- `creditCardExpiration` (iOS 17+)
+- `creditCardExpirationMonth` (iOS 17+)
+- `creditCardExpirationYear` (iOS 17+)
+- `creditCardFamilyName` (iOS 17+)
+- `creditCardGivenName` (iOS 17+)
+- `creditCardMiddleName` (iOS 17+)
+- `creditCardName` (iOS 17+)
+- `creditCardNumber`
+- `creditCardSecurityCode` (iOS 17+)
+- `creditCardType` (iOS 17+)
+- `emailAddress`
+- `familyName`
+- `fullStreetAddress`
+- `givenName`
+- `jobTitle`
+- `location`
+- `middleName`
+- `name`
+- `namePrefix`
+- `nameSuffix`
+- `newPassword`
+- `nickname`
+- `oneTimeCode`
+- `organizationName`
+- `password`
+- `postalCode`
+- `streetAddressLine1`
+- `streetAddressLine2`
+- `sublocality`
+- `telephoneNumber`
+- `URL`
+- `username`
+
+| Type |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| enum('none', 'addressCity', 'addressCityAndState', 'addressState', 'birthdate', 'birthdateDay', 'birthdateMonth', 'birthdateYear', 'countryName', 'creditCardExpiration', 'creditCardExpirationMonth', 'creditCardExpirationYear', 'creditCardFamilyName', 'creditCardGivenName', 'creditCardMiddleName', 'creditCardName', 'creditCardNumber', 'creditCardSecurityCode', 'creditCardType', 'emailAddress', 'familyName', 'fullStreetAddress', 'givenName', 'jobTitle', 'location', 'middleName', 'name', 'namePrefix', 'nameSuffix', 'newPassword', 'nickname', 'oneTimeCode', 'organizationName', 'password', 'postalCode', 'streetAddressLine1', 'streetAddressLine2', 'sublocality', 'telephoneNumber', 'URL', 'username') |
+
+---
+
+### `passwordRules`
iOS
+
+When using `textContentType` as `newPassword` on iOS we can let the OS know the minimum requirements of the password so that it can generate one that will satisfy them. In order to create a valid string for `PasswordRules` take a look to the [Apple Docs](https://developer.apple.com/password-rules/).
+
+> If passwords generation dialog doesn't appear please make sure that:
+>
+> - AutoFill is enabled: **Settings** → **Passwords & Accounts** → toggle "On" the **AutoFill Passwords**,
+> - iCloud Keychain is used: **Settings** → **Apple ID** → **iCloud** → **Keychain** → toggle "On" the **iCloud Keychain**.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `style`
+
+Note that not all Text styles are supported, an incomplete list of what is not supported includes:
+
+- `borderLeftWidth`
+- `borderTopWidth`
+- `borderRightWidth`
+- `borderBottomWidth`
+- `borderTopLeftRadius`
+- `borderTopRightRadius`
+- `borderBottomRightRadius`
+- `borderBottomLeftRadius`
+
+see [Issue#7070](https://github.com/facebook/react-native/issues/7070) for more detail.
+
+[Styles](style.md)
+
+| Type |
+| --------------------- |
+| [Text](text.md#style) |
+
+---
+
+### `textBreakStrategy`
Android
+
+Set text break strategy on Android API Level 23+, possible values are `simple`, `highQuality`, `balanced` The default value is `highQuality`.
+
+| Type |
+| ----------------------------------------- |
+| enum('simple', 'highQuality', 'balanced') |
+
+---
+
+### `underlineColorAndroid`
Android
+
+The color of the `TextInput` underline.
+
+| Type |
+| ------------------ |
+| [color](colors.md) |
+
+---
+
+### `value`
+
+The value to show for the text input. `TextInput` is a controlled component, which means the native value will be forced to match this value prop if provided. For most uses, this works great, but in some cases this may cause flickering - one common cause is preventing edits by keeping value the same. In addition to setting the same value, either set `editable={false}`, or set/update `maxLength` to prevent unwanted edits without flicker.
+
+| Type |
+| ------ |
+| string |
+
+---
+
+### `lineBreakStrategyIOS`
iOS
+
+Set line break strategy on iOS 14+. Possible values are `none`, `standard`, `hangul-word` and `push-out`.
+
+| Type | Default |
+| ----------------------------------------------------------- | -------- |
+| enum(`'none'`, `'standard'`, `'hangul-word'`, `'push-out'`) | `'none'` |
+
+## Methods
+
+### `.focus()`
+
+```tsx
+focus();
+```
+
+Makes the native input request focus.
+
+### `.blur()`
+
+```tsx
+blur();
+```
+
+Makes the native input lose focus.
+
+### `clear()`
+
+```tsx
+clear();
+```
+
+Removes all text from the `TextInput`.
+
+---
+
+### `isFocused()`
+
+```tsx
+isFocused(): boolean;
+```
+
+Returns `true` if the input is currently focused; `false` otherwise.
+
+# Known issues
+
+- [react-native#19096](https://github.com/facebook/react-native/issues/19096): Doesn't support Android's `onKeyPreIme`.
+- [react-native#19366](https://github.com/facebook/react-native/issues/19366): Calling .focus() after closing Android's keyboard via back button doesn't bring keyboard up again.
+- [react-native#26799](https://github.com/facebook/react-native/issues/26799): Doesn't support Android's `secureTextEntry` when `keyboardType="email-address"` or `keyboardType="phone-pad"`.
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_beta_ts_support.mdx b/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_beta_ts_support.mdx
new file mode 100644
index 00000000000..8ebff56f256
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_beta_ts_support.mdx
@@ -0,0 +1,3 @@
+:::caution
+The TypeScript support for the New Architecture is still in beta.
+:::
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_native_deprecation.mdx b/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_native_deprecation.mdx
new file mode 100644
index 00000000000..390bfcdc3de
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/_markdown_native_deprecation.mdx
@@ -0,0 +1,4 @@
+:::info
+Native Module and Native Components are our stable technologies used by the legacy architecture.
+They will be deprecated in the future when the New Architecture will be stable. The New Architecture uses [Turbo Native Module](./the-new-architecture/pillars-turbomodules) and [Fabric Native Components](./the-new-architecture/pillars-fabric-components) to achieve similar results.
+:::
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-fabric-components.md b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-fabric-components.md
new file mode 100644
index 00000000000..962c269db73
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-fabric-components.md
@@ -0,0 +1,522 @@
+---
+id: backward-compatibility-fabric-components
+title: Fabric Components as Legacy Native Components
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+import BetaTS from './\_markdown_beta_ts_support.mdx';
+import NewArchitectureWarning from '../\_markdown-new-architecture-warning.mdx';
+
+
+
+:::info
+Creating a backward compatible Fabric Native Component requires the knowledge of how to create a Legacy Native Component. To recall these concepts, have a look at this [guide](pillars-fabric-components).
+
+Fabric Native Components only work when the New Architecture is properly set up. If you already have a library that you want to migrate to the New Architecture, have a look at the [migration guide](../new-architecture-intro) as well.
+:::
+
+Creating a backward compatible Fabric Native Component lets your users continue to leverage your library independently from the architecture they use. The creation of such a component requires a few steps:
+
+1. Configure the library so that dependencies are prepared to set up properly for both the Old and the New Architecture.
+1. Update the codebase so that the New Architecture types are not compiled when not available.
+1. Uniform the JavaScript API so that your user code won't need changes.
+
+:::info
+
+For the sake of this guide we're going to use the following **terminology**:
+
+- **Legacy Native Components** - To refer to Components which are running on the old React Native architecture.
+- **Fabric Native Components** - To refer to Components which have been adapted to work well with the New Native Renderer, Fabric. For brevity you might find them referred as **Fabric Components**.
+
+:::
+
+
+
+While the last step is the same for all the platforms, the first two steps are different for iOS and Android.
+
+## Configure the Fabric Native Component Dependencies
+
+### iOS {#dependencies-ios}
+
+The Apple platform installs Fabric Native Components using [CocoaPods](https://cocoapods.org) as a dependency manager.
+
+If you are already using the [`install_module_dependencies`](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L198) function, then **there is nothing to do**. The function already takes care of installing the proper dependencies when the New Architecture is enabled and avoiding them when it is not enabled.
+
+Otherwise, your Fabric Native Component's `podspec` should look like this:
+
+```ruby
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+
+folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
+
+Pod::Spec.new do |s|
+ # Default fields for a valid podspec
+ s.name = ""
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.description = package["description"]
+ s.homepage = package["homepage"]
+ s.license = package["license"]
+ s.platforms = { :ios => "11.0" }
+ s.author = package["author"]
+ s.source = { :git => package["repository"], :tag => "#{s.version}" }
+
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
+ # React Native Core dependency
+ s.dependency "React-Core"
+
+ # The following lines are required by the New Architecture.
+ s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
+ s.pod_target_xcconfig = {
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
+ "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
+ }
+
+ s.dependency "React-RCTFabric"
+ s.dependency "React-Codegen"
+ s.dependency "RCT-Folly"
+ s.dependency "RCTRequired"
+ s.dependency "RCTTypeSafety"
+ s.dependency "ReactCommon/turbomodule/core"
+end
+```
+
+You should install the extra dependencies when the New Architecture is enabled, and avoid installing them when it's not.
+To achieve this, you can use the [`install_modules_dependencies`](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L198). Update the `.podspec` file as it follows:
+
+```diff
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+
+- folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
+
+Pod::Spec.new do |s|
+ # Default fields for a valid podspec
+ s.name = ""
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.description = package["description"]
+ s.homepage = package["homepage"]
+ s.license = package["license"]
+ s.platforms = { :ios => "11.0" }
+ s.author = package["author"]
+ s.source = { :git => package["repository"], :tag => "#{s.version}" }
+
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
+ # React Native Core dependency
++ install_modules_dependencies(s)
+- s.dependency "React-Core"
+- # The following lines are required by the New Architecture.
+- s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
+- s.pod_target_xcconfig = {
+- "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
+- "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
+- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
+- }
+-
+- s.dependency "React-RCTFabric"
+- s.dependency "React-Codegen"
+- s.dependency "RCT-Folly"
+- s.dependency "RCTRequired"
+- s.dependency "RCTTypeSafety"
+- s.dependency "ReactCommon/turbomodule/core"
+end
+```
+
+### Android
+
+To create a Native Component that can work with both architectures, you need to configure Gradle to choose which files need to be compiled depending on the chosen architecture. This can be achieved by using **different source sets** in the Gradle configuration.
+
+:::note
+Please note that this is currently the suggested approach. While it might lead to some code duplication, it will ensure maximum compatibility with both architectures. You will see how to reduce the duplication in the next section.
+:::
+
+To configure the Fabric Native Component so that it picks the proper sourceset, you have to update the `build.gradle` file in the following way:
+
+```diff title="build.gradle"
++// Add this function in case you don't have it already
++ def isNewArchitectureEnabled() {
++ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
++}
+// ... other parts of the build file
+defaultConfig {
+ minSdkVersion safeExtGet('minSdkVersion', 21)
+ targetSdkVersion safeExtGet('targetSdkVersion', 31)
++ buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
++ }
++
++ sourceSets {
++ main {
++ if (isNewArchitectureEnabled()) {
++ java.srcDirs += ['src/newarch']
++ } else {
++ java.srcDirs += ['src/oldarch']
++ }
++ }
+ }
+}
+```
+
+These changes do three main things:
+
+1. The first lines define a function that returns whether the New Architecture is enabled or not.
+2. The `buildConfigField` line defines a build configuration boolean field called `IS_NEW_ARCHITECTURE_ENABLED`, and initialize it using the function declared in the first step. This allows you to check at runtime if a user has specified the `newArchEnabled` property or not.
+3. The last lines leverage the function declared in step one to decide which source sets we need to build, depending on the chosen architecture.
+
+## Update the codebase
+
+### iOS
+
+The second step is to instruct Xcode to avoid compiling all the lines using the New Architecture types and files when we are building an app with the Old Architecture.
+
+A Fabric Native Component requires a header file and an implementation file to add the actual `View` to the module.
+
+For example, the `RNMyComponentView.h` header file could look like this:
+
+```objectivec title='RNMyComponentView.h'
+#import
+#import
+
+#ifndef NativeComponentExampleComponentView_h
+#define NativeComponentExampleComponentView_h
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RNMyComponentView : RCTViewComponentView
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif /* NativeComponentExampleComponentView_h */
+```
+
+The implementation `RNMyComponentView.mm` file, instead, could look like this:
+
+```objectivec title='RNMyComponentView.mm'
+#import "RNMyComponentView.h"
+
+//
+
+#import "RCTFabricComponentsPlugins.h"
+
+using namespace facebook::react;
+
+@interface RNMyComponentView ()
+
+@end
+
+@implementation RNMyComponentView {
+ UIView * _view;
+}
+
++ (ComponentDescriptorProvider)componentDescriptorProvider
+{
+ // ... return the descriptor ...
+}
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ // ... initialize the object ...
+}
+
+- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
+{
+ // ... set up the props ...
+
+ [super updateProps:props oldProps:oldProps];
+}
+
+Class MyComponentViewCls(void)
+{
+ return RNMyComponentView.class;
+}
+
+@end
+```
+
+To make sure that Xcode skips these files, we can wrap **both** of them in some `#ifdef RCT_NEW_ARCH_ENABLED` compilation pragma. For example, the header file could change as follows:
+
+```diff
++ #ifdef RCT_NEW_ARCH_ENABLED
+#import
+#import
+
+// ... rest of the header file ...
+
+#endif /* NativeComponentExampleComponentView_h */
++ #endif
+```
+
+The same two lines should be added in the implementation file, as first and last lines.
+
+The above snippet uses the same `RCT_NEW_ARCH_ENABLED` flag used in the previous [section](#dependencies-ios). When this flag is not set, Xcode skips the lines within the `#ifdef` during compilation and it does not include them into the compiled binary. The compiled binary will have a the `RNMyComponentView.o` object but it will be an empty object.
+
+After wrapping the above components with a `#ifdef` pragma, you need to implement the component for the legacy architecture, following [the legacy Native Component documentation](https://reactnative.dev/docs/native-components-ios). This is needed because the New Renderer works in a different way from the legacy one, and it is not able to follow the new code's paths of the New Renderer.
+
+### Android
+
+As we can't use conditional compilation blocks on Android, we will define two different source sets. This will allow to create a backward compatible TurboModule with the proper source that is loaded and compiled depending on the used architecture.
+
+Therefore, you have to:
+
+1. Create a Legacy Native Component in the `src/oldarch` path. See [this guide](../native-components-android) to learn how to create a Legacy Native Component.
+2. Create a Fabric Native Component in the `src/newarch` path. See [this guide](pillars-fabric-components) to learn how to create a Fabric Native Component.
+
+and then instruct Gradle to decide which implementation to pick.
+
+Some files can be shared between a Legacy and a Fabric Component: these should be created or moved into a folder that is loaded by both the architectures. These files are:
+
+- the `.java` that instantiate and configure the Android View for both the components.
+- the `ManagerImpl.java` file where which contains the logic of the ViewManager that can be shared between the Legacy and the Fabric Component.
+- the `Package.java` file used to load the component.
+
+The final folder structure looks like this:
+
+```sh
+my-component
+├── android
+│ ├── build.gradle
+│ └── src
+│ ├── main
+│ │ ├── AndroidManifest.xml
+│ │ └── java
+│ │ └── com
+│ │ └── mycomponent
+│ │ ├── MyComponentView.java
+│ │ ├── MyComponentViewManagerImpl.java
+│ │ └── MyComponentViewPackage.java
+│ ├── newarch
+│ │ └── java
+│ │ └── com
+│ │ └── MyComponentViewManager.java
+│ └── oldarch
+│ └── java
+│ └── com
+│ └── MyComponentViewManager.java
+├── ios
+├── js
+└── package.json
+```
+
+The code that should go in the `MyComponentViewManagerImpl.java` and that can be shared between the Native Component and the Fabric Native Component is, for example:
+
+
+
+
+```java title="example of MyComponentViewManager.java"
+package com.mycomponent;
+
+import androidx.annotation.Nullable;
+import com.facebook.react.uimanager.ThemedReactContext;
+
+public class MyComponentViewManagerImpl {
+
+ public static final String NAME = "MyComponent";
+
+ public static MyComponentView createViewInstance(ThemedReactContext context) {
+ return new MyComponentView(context);
+ }
+
+ public static void setFoo(MyComponentView view, String param) {
+ // implement the logic of the foo function using the view and the param passed.
+ }
+}
+```
+
+
+
+
+```kotlin title="example of MyComponentViewManager.kt"
+package com.mycomponent
+
+import com.facebook.react.uimanager.ThemedReactContext
+
+object MyComponentViewManagerImpl {
+ const val NAME = "MyComponent"
+ fun createViewInstance(context: ThemedReactContext?) = MyComponentView(context)
+
+ fun setFoo(view: MyComponentView, param: String) {
+ // implement the logic of the foo function using the view and the param passed.
+ }
+}
+```
+
+
+
+
+Then, the Native Component and the Fabric Native Component can be updated using the function declared in the shared manager.
+
+For example, for a Native Component:
+
+
+
+
+```java title="Native Component using the ViewManagerImpl"
+public class MyComponentViewManager extends SimpleViewManager {
+
+ ReactApplicationContext mCallerContext;
+
+ public MyComponentViewManager(ReactApplicationContext reactContext) {
+ mCallerContext = reactContext;
+ }
+
+ @Override
+ public String getName() {
+ // static NAME property from the shared implementation
+ return MyComponentViewManagerImpl.NAME;
+ }
+
+ @Override
+ public MyComponentView createViewInstance(ThemedReactContext context) {
+ // static createViewInstance function from the shared implementation
+ return MyComponentViewManagerImpl.createViewInstance(context);
+ }
+
+ @ReactProp(name = "foo")
+ public void setFoo(MyComponentView view, String param) {
+ // static custom function from the shared implementation
+ MyComponentViewManagerImpl.setFoo(view, param);
+ }
+
+}
+```
+
+
+
+
+```kotlin title="Native Component using the ViewManagerImpl"
+class MyComponentViewManager(var context: ReactApplicationContext) : SimpleViewManager() {
+ // Use the static NAME property from the shared implementation
+ override fun getName() = MyComponentViewManagerImpl.NAME
+
+ public override fun createViewInstance(context: ThemedReactContext): MyComponentView =
+ // static createViewInstance function from the shared implementation
+ MyComponentViewManagerImpl.createViewInstance(context)
+
+ @ReactProp(name = "foo")
+ fun setFoo(view: MyComponentView, param: String) {
+ // static custom function from the shared implementation
+ MyComponentViewManagerImpl.setFoo(view, param)
+ }
+}
+```
+
+
+
+
+And, for a Fabric Native Component:
+
+
+
+
+```java title="Fabric Component using the ViewManagerImpl"
+// Use the static NAME property from the shared implementation
+@ReactModule(name = MyComponentViewManagerImpl.NAME)
+public class MyComponentViewManager extends SimpleViewManager
+ implements MyComponentViewManagerInterface {
+
+ private final ViewManagerDelegate mDelegate;
+
+ public MyComponentViewManager(ReactApplicationContext context) {
+ mDelegate = new MyComponentViewManagerDelegate<>(this);
+ }
+
+ @Nullable
+ @Override
+ protected ViewManagerDelegate getDelegate() {
+ return mDelegate;
+ }
+
+ @NonNull
+ @Override
+ public String getName() {
+ // static NAME property from the shared implementation
+ return MyComponentViewManagerImpl.NAME;
+ }
+
+ @NonNull
+ @Override
+ protected MyComponentView createViewInstance(@NonNull ThemedReactContext context) {
+ // static createViewInstance function from the shared implementation
+ return MyComponentViewManagerImpl.createViewInstance(context);
+ }
+
+ @Override
+ @ReactProp(name = "foo")
+ public void setFoo(MyComponentView view, @Nullable String param) {
+ // static custom function from the shared implementation
+ MyComponentViewManagerImpl.setFoo(view, param);
+ }
+}
+```
+
+
+
+
+```kotlin title="Fabric Component using the ViewManagerImpl"
+// Use the static NAME property from the shared implementation
+@ReactModule(name = MyComponentViewManagerImpl.NAME)
+class MyComponentViewManager(context: ReactApplicationContext) : SimpleViewManager(), MyComponentViewManagerInterface {
+ private val delegate: ViewManagerDelegate = MyComponentViewManagerDelegate(this)
+
+ override fun getDelegate(): ViewManagerDelegate = delegate
+
+ // Use the static NAME property from the shared implementation
+ override fun getName(): String = MyComponentViewManagerImpl.NAME
+
+ override fun createViewInstance(context: ThemedReactContext): MyComponentView =
+ // static createViewInstance function from the shared implementation
+ MyComponentViewManagerImpl.createViewInstance(context)
+
+ @ReactProp(name = "foo")
+ override fun setFoo(view: MyComponentView, text: String) {
+ // static custom function from the shared implementation
+ MyComponentViewManagerImpl.setFoo(view, param);
+ }
+}
+```
+
+
+
+
+For a step-by-step example on how to achieve this, have a look at [this repo](https://github.com/react-native-community/RNNewArchitectureLibraries/tree/feat/back-fabric-comp).
+
+## Unify the JavaScript specs
+
+
+
+The last step makes sure that the JavaScript behaves transparently to chosen architecture.
+
+For a Fabric Native Component, the source of truth is the `NativeComponent.js` (or `.ts`) spec file. The app accesses the spec file like this:
+
+```ts
+import MyComponent from 'your-component/src/index';
+```
+
+Since `codegenNativeComponent` is calling the `requireNativeComponent` under the hood, we need to re-export our component, to avoid registering it multiple times.
+
+
+
+
+```ts
+// @flow
+export default require('./MyComponentNativeComponent').default;
+```
+
+
+
+
+```ts
+export default require('./MyComponentNativeComponent').default;
+```
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-turbomodules.md b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-turbomodules.md
new file mode 100644
index 00000000000..6e8edbce4dd
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility-turbomodules.md
@@ -0,0 +1,463 @@
+---
+id: backward-compatibility-turbomodules
+title: Turbo Modules as Legacy Native Modules
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+import BetaTS from './\_markdown_beta_ts_support.mdx';
+import NewArchitectureWarning from '../\_markdown-new-architecture-warning.mdx';
+
+
+
+:::info
+Creating a backward compatible Turbo Native Module requires the knowledge of how to create a Legacy Native Module. To recall these concepts, have a look at this [guide](pillars-turbomodules).
+
+TurboModules only works when the New Architecture is properly set up. If you already have a library that you want to migrate to the New Architecture, have a look at the [migration guide](../new-architecture-intro) as well.
+:::
+
+Creating a backward compatible TurboModule lets your users continue to leverage your library, independently from the architecture they use. The creation of such a module requires a few steps:
+
+1. Configure the library so that dependencies are prepared set up properly for both the Old and the New Architecture.
+1. Update the codebase so that the New Architecture types are not compiled when not available.
+1. Uniform the JavaScript API so that your user code won't need changes.
+
+:::info
+
+For the sake of this guide we're going to use the following **terminology**:
+
+- **Legacy Native Modules** - To refer to Modules which are running on the old React Native architecture.
+- **Turbo Native Modules** - To refer to Modules which have been adapted to work well with the New Native Module System. For brevity you might find them referred as **Turbo Modules**.
+
+:::
+
+
+
+While the last step is the same for all the platforms, the first two steps are different for iOS and Android.
+
+## Configure the Turbo Native Module Dependencies
+
+### iOS {#dependencies-ios}
+
+The Apple platform installs Turbo Native Modules using [CocoaPods](https://cocoapods.org) as a dependency manager.
+
+If you are already using the [`install_module_dependencies`](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L198) function, then **there is nothing to do**. The function already takes care of installing the proper dependencies when the New Architecture is enabled and avoids them when it is not enabled.
+
+Otherwise, your Turbo Native Module's `podspec` should look like this:
+
+```ruby
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+
+folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
+
+Pod::Spec.new do |s|
+ # Default fields for a valid podspec
+ s.name = ""
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.description = package["description"]
+ s.homepage = package["homepage"]
+ s.license = package["license"]
+ s.platforms = { :ios => "11.0" }
+ s.author = package["author"]
+ s.source = { :git => package["repository"], :tag => "#{s.version}" }
+
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
+ # React Native Core dependency
+ s.dependency "React-Core"
+
+ # The following lines are required by the New Architecture.
+ s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
+ s.pod_target_xcconfig = {
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
+ }
+
+ s.dependency "React-Codegen"
+ s.dependency "RCT-Folly"
+ s.dependency "RCTRequired"
+ s.dependency "RCTTypeSafety"
+ s.dependency "ReactCommon/turbomodule/core"
+
+end
+```
+
+You should install the extra dependencies when the New Architecture is enabled, and avoid installing them when it's not.
+To achieve this, you can use the [`install_modules_dependencies`](https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L198). Update the `.podspec` file as it follows:
+
+```diff
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+
+-folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
+
+Pod::Spec.new do |s|
+ # Default fields for a valid podspec
+ s.name = ""
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.description = package["description"]
+ s.homepage = package["homepage"]
+ s.license = package["license"]
+ s.platforms = { :ios => "11.0" }
+ s.author = package["author"]
+ s.source = { :git => package["repository"], :tag => "#{s.version}" }
+
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
+ # React Native Core dependency
++ install_modules_dependencies(s)
+- s.dependency "React-Core"
+-
+- # The following lines are required by the New Architecture.
+- s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
+- s.pod_target_xcconfig = {
+- "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
+- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
+- }
+-
+- s.dependency "React-Codegen"
+- s.dependency "RCT-Folly"
+- s.dependency "RCTRequired"
+- s.dependency "RCTTypeSafety"
+- s.dependency "ReactCommon/turbomodule/core"
+end
+```
+
+### Android
+
+To create a module that can work with both architectures, you need to configure Gradle to choose which files need to be compiled depending on the chosen architecture. This can be achieved by using **different source sets** in the Gradle configuration.
+
+:::note
+Please note that this is currently the suggested approach. While it might lead to some code duplication, it will ensure the maximum compatibility with both architectures. You will see how to reduce the duplication in the next section.
+:::
+
+To configure the Turbo Native Module so that it picks the proper sourceset, you have to update the `build.gradle` file in the following way:
+
+```diff title="build.gradle"
++// Add this function in case you don't have it already
++ def isNewArchitectureEnabled() {
++ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
++}
+
+
+// ... other parts of the build file
+
+defaultConfig {
+ minSdkVersion safeExtGet('minSdkVersion', 21)
+ targetSdkVersion safeExtGet('targetSdkVersion', 31)
++ buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
++ }
++
++ sourceSets {
++ main {
++ if (isNewArchitectureEnabled()) {
++ java.srcDirs += ['src/newarch']
++ } else {
++ java.srcDirs += ['src/oldarch']
++ }
++ }
+ }
+}
+```
+
+This changes do three main things:
+
+1. The first lines define a function that returns whether the New Architecture is enabled or not.
+2. The `buildConfigField` line defines a build configuration boolean field called `IS_NEW_ARCHITECTURE_ENABLED`, and initialize it using the function declared in the first step. This allows you to check at runtime if a user has specified the `newArchEnabled` property or not.
+3. The last lines leverage the function declared in step one to decide which source sets we need to build, depending on the chosen architecture.
+
+## Update the codebase
+
+### iOS
+
+The second step is to instruct Xcode to avoid compiling all the lines using the New Architecture types and files when we are building an app with the Old Architecture.
+
+There are two files to change. The module implementation file, which is usually a `.mm` file, and the module header, which is usually a `.h` file.
+
+That implementation file is structured as follows:
+
+- Some `#import` statements, among which there is a `.h` file.
+- The module implementation, using the various `RCT_EXPORT_xxx` and `RCT_REMAP_xxx` macros.
+- The `getTurboModule:` function, which uses the `` type, generated by The New Architecture.
+
+The **goal** is to make sure that the `Turbo Native Module` still builds with the Old Architecture. To achieve that, we can wrap the `#import ".h"` and the `getTurboModule:` function into an `#ifdef RCT_NEW_ARCH_ENABLED` compilation directive, as shown in the following example:
+
+```diff
+#import ".h"
++ #ifdef RCT_NEW_ARCH_ENABLED
+#import ".h"
++ #endif
+
+// ... rest of your module
+
++ #ifdef RCT_NEW_ARCH_ENABLED
+ - (std::shared_ptr)getTurboModule:
+ (const facebook::react::ObjCTurboModule::InitParams &)params
+ {
+ return std::make_shared>(params);
+ }
++ #endif
+
+@end
+```
+
+A similar thing needs to be done for the header file. Add the following lines at the bottom of your module header. You need to first import the header and then, if the New Architecture is enabled, make it conform to the Spec protocol.
+
+```diff
+#import
++ #ifdef RCT_NEW_ARCH_ENABLED
++ #import
++ #endif
+
+@interface YourModule: NSObject
+
+@end
+
++ #ifdef RCT_NEW_ARCH_ENABLED
++ @interface YourModule ()
+
++ @end
++ #endif
+
+```
+
+This snippets uses the same `RCT_NEW_ARCH_ENABLED` flag used in the previous [section](#dependencies-ios). When this flag is not set, Xcode skips the lines within the `#ifdef` during compilation and it does not include them into the compiled binary.
+
+### Android
+
+As we can't use conditional compilation blocks on Android, we will define two different source sets. This will allow to create a backward compatible Turbo Native Module with the proper source that is loaded and compiled depending on the used architecture.
+
+Therefore, you have to:
+
+1. Create a Legacy Native Module in the `src/oldarch` path. See [this guide](../native-modules-intro) to learn how to create a Legacy Native Module.
+2. Create a Turbo Native Module in the `src/newarch` path. See [this guide](./pillars-turbomodules) to learn how to create a Turbo Native Module
+
+and then instruct Gradle to decide which implementation to pick.
+
+Some files can be shared between a Legacy Native Module and a Turbo Native Module: these should be created or moved into a folder that is loaded by both the architectures. These files are:
+
+- the `Package.java` file used to load the module.
+- a `Impl.java` file where we can put the code that both the Legacy Native Module and the Turbo Native Module has to execute.
+
+The final folder structure looks like this:
+
+```sh
+my-module
+├── android
+│ ├── build.gradle
+│ └── src
+│ ├── main
+│ │ ├── AndroidManifest.xml
+│ │ └── java
+│ │ └── com
+│ │ └── mymodule
+│ │ ├── MyModuleImpl.java
+│ │ └── MyModulePackage.java
+│ ├── newarch
+│ │ └── java
+│ │ └── com
+│ │ └── MyModule.java
+│ └── oldarch
+│ └── java
+│ └── com
+│ └── MyModule.java
+├── ios
+├── js
+└── package.json
+```
+
+The code that should go in the `MyModuleImpl.java`, and that can be shared by the Legacy Native Module and the Turbo Native Module is, for example:
+
+
+
+
+```java title="example of MyModuleImpl.java"
+package com.mymodule;
+
+import androidx.annotation.NonNull;
+import com.facebook.react.bridge.Promise;
+import java.util.Map;
+import java.util.HashMap;
+
+public class MyModuleImpl {
+
+ public static final String NAME = "MyModule";
+
+ public void foo(double a, double b, Promise promise) {
+ // implement the logic for foo and then invoke promise.resolve or
+ // promise.reject.
+ }
+}
+```
+
+
+
+
+```kotlin title="example of MyModuleImpl.kt"
+package com.mymodule;
+
+import com.facebook.react.bridge.Promise
+
+class MyModuleImpl {
+ fun foo(a: Double, b: Double, promise: Promise) {
+ // implement the logic for foo and then invoke
+ // promise.resolve or promise.reject.
+ }
+
+ companion object {
+ const val NAME = "MyModule"
+ }
+}
+```
+
+
+
+
+Then, the Legacy Native Module and the Turbo Native Module can be updated with the following steps:
+
+1. Create a private instance of the `MyModuleImpl` class.
+2. Initialize the instance in the module constructor.
+3. Use the private instance in the modules methods.
+
+For example, for a Legacy Native Module:
+
+
+
+
+```java title="Native Module using the Impl module"
+public class MyModule extends ReactContextBaseJavaModule {
+
+ // declare an instance of the implementation
+ private MyModuleImpl implementation;
+
+ MyModule(ReactApplicationContext context) {
+ super(context);
+ // initialize the implementation of the module
+ implementation = MyModuleImpl();
+ }
+
+ @Override
+ public String getName() {
+ // NAME is a static variable, so we can access it using the class name.
+ return MyModuleImpl.NAME;
+ }
+
+ @ReactMethod
+ public void foo(int a, int b, Promise promise) {
+ // Use the implementation instance to execute the function.
+ implementation.foo(a, b, promise);
+ }
+}
+```
+
+
+
+
+```kotlin title="Native Module using the Impl module"
+class MyModule(context: ReactApplicationContext) : ReactContextBaseJavaModule(context) {
+ // declare an instance of the implementation and use it in all the methods
+ private var implementation: MyModuleImpl = MyModuleImpl()
+
+ override fun getName(): String = MyModuleImpl.NAME
+
+ @ReactMethod
+ fun foo(a: Double, b: Double, promise: Promise) {
+ // Use the implementation instance to execute the function.
+ implementation.foo(a, b, promise)
+ }
+}
+```
+
+
+
+
+And, for a Turbo Native Module:
+
+
+
+
+```java title="TurboModule using the Impl module"
+public class MyModule extends MyModuleSpec {
+ // declare an instance of the implementation
+ private MyModuleImpl implementation;
+
+ MyModule(ReactApplicationContext context) {
+ super(context);
+ // initialize the implementation of the module
+ implementation = MyModuleImpl();
+ }
+
+ @Override
+ @NonNull
+ public String getName() {
+ // NAME is a static variable, so we can access it using the class name.
+ return MyModuleImpl.NAME;
+ }
+
+ @Override
+ public void foo(double a, double b, Promise promise) {
+ // Use the implementation instance to execute the function.
+ implementation.foo(a, b, promise);
+ }
+}
+```
+
+
+
+
+```kotlin title="TurboModule using the Impl module"
+class MyModule(reactContext: ReactApplicationContext) : MyModuleSpec(reactContext) {
+ // declare an instance of the implementation and use it in all the methods
+ private var implementation: MyModuleImpl = MyModuleImpl()
+
+ override fun getName(): String = MyModuleImpl.NAME
+
+ override fun foo(a: Double, b: Double, promise: Promise) {
+ // Use the implementation instance to execute the function.
+ implementation.foo(a, b, promise)
+ }
+}
+```
+
+
+
+
+For a step-by-step example on how to achieve this, have a look at [this repo](https://github.com/react-native-community/RNNewArchitectureLibraries/tree/feat/back-turbomodule).
+
+## Unify the JavaScript specs
+
+
+
+The last step makes sure that the JavaScript behaves transparently to chosen architecture.
+
+For a Turbo Native Module, the source of truth is the `Native.js` (or `.ts`) spec file. The app accesses the spec file like this:
+
+```ts
+import MyModule from 'your-module/src/index';
+```
+
+Since `TurboModuleRegistry.get` taps into the old Native Modules API under the hood, we need to re-export our module, to avoid registering it multiple times.
+
+
+
+
+```ts
+// @flow
+export default require('./Native').default;
+```
+
+
+
+
+```ts
+export default require('./Native').default;
+```
+
+
+
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility.md b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility.md
new file mode 100644
index 00000000000..879e6100da4
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/backward-compatibility.md
@@ -0,0 +1,25 @@
+---
+id: backward-compatibility
+title: What Backward Compatibility Is
+---
+
+import NewArchitectureWarning from '../\_markdown-new-architecture-warning.mdx';
+
+
+
+Creating a backward compatible module is important to provide a library that works in both the **Old Architecture** and the **New Architecture**. Not all the users of your library will immediately jump on the New Architecture ship: it is a good thing that they will be able to use your library even if they are still using the old architecture.
+
+The trick to create a good backward compatible module is to minimize the changes required to adopt the new version. In that way, users of the module can smoothly move to the new version and migrate to the New Architecture when they are ready, ideally by issuing one different command.
+
+To achieve this result, we have to perform few changes in our **Turbo Native Module** and **Fabric Native Component** configurations. The steps we have to follow are:
+
+1. **Update the installation configuration** to avoid using code that is not needed by the Old Architecture.
+1. **Update the code** to support both architectures. Both Android and iOS build pipelines gives you mechanism to provide a library that will compile with the correct React Native Architecture.
+1. **Configure the specs to load the proper implementation**, so that the JavaScript layer leverages the New Architecture when it is available.
+
+:::info
+The next sections requires that you are familiar with the [Pillars](pillars) of the **New Architecture**.
+:::
+
+- To create a backward compatible **Turbo Native Module**, follow [this guide](backward-compatibility-turbomodules).
+- To create a backward compatible **Fabric Native Component**, follow [this guide](backward-compatibility-fabric-components).
diff --git a/website/versioned_docs/version-0.73.0/the-new-architecture/cxx-custom-types.md b/website/versioned_docs/version-0.73.0/the-new-architecture/cxx-custom-types.md
new file mode 100644
index 00000000000..0bea368315b
--- /dev/null
+++ b/website/versioned_docs/version-0.73.0/the-new-architecture/cxx-custom-types.md
@@ -0,0 +1,285 @@
+---
+id: cxx-custom-types
+title: Supporting Custom C++ Types
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import constants from '@site/core/TabsConstants';
+import NewArchitectureWarning from '../\_markdown-new-architecture-warning.mdx';
+
+
+
+By default C++ Turbo Native Modules support [bridging functionality](https://github.com/facebook/react-native/tree/main/packages/react-native/ReactCommon/react/bridging) for most `std::` standard types.
+
+If you want to add support for new / custom types in your app / library, you only need to provide the necessary `bridging` header file.
+
+This guide continues the previous [C++ Turbo Native Modules](./cxx-cxxturbomodules) section.
+
+## Example: Int64
+
+C++ Turbo Native Modules don't support `int64_t` numbers yet - because JavaScript doesn't support numbers greater `2^53`.
+
+We can't represent numbers > `2^53` as JavaScript `number`'s - but we can represent them as JavaScript `string`'s and automatically convert (aka. `bridge`) them to C++ `int64_t`'s by creating a custom Bridging header file called `Int64.h` in the `tm` folder:
+
+```cpp Int64.h
+#pragma once
+
+#include
+
+namespace facebook::react {
+
+template <>
+struct Bridging {
+ static int64_t fromJs(jsi::Runtime &rt, const jsi::String &value) {
+ try {
+ size_t pos;
+ auto str = value.utf8(rt);
+ auto num = std::stoll(str, &pos);
+ if (pos != str.size()) {
+ throw std::invalid_argument("Invalid number"); // don't support alphanumeric strings
+ }
+ return num;
+ } catch (const std::logic_error &e) {
+ throw jsi::JSError(rt, e.what());
+ }
+ }
+
+ static jsi::String toJs(jsi::Runtime &rt, int64_t value) {
+ return bridging::toJs(rt, std::to_string(value));
+ }
+};
+
+} // namespace facebook::react
+```
+
+The key components for your custom `bridging` header are:
+
+- Explicit specialization of the `Bridging` struct for your custom type, `int64_t` in this case
+- A `fromJs` function to convert from `jsi::` types to your custom type
+- A `toJS` function to convert from your custom type to `jsi:` types
+
+Omitting either `fromJS` or `toJS` would make you `bridging` header either _readonly_ or _writeonly_.
+
+Now you can add the following function to your JavaScript spec:
+
+
+
+
+```typescript title="NativeSampleModule.ts"
+ // ...
+ readonly cubicRoot: (input: string) => number;
+ // ..
+```
+
+
+
+
+```js title="NativeSampleModule.js"
+ // ...
+ +cubicRoot: (input: string) => number;
+ // ..
+```
+
+
+
+
+Declare it in your `NativeSampleModule.h` file and include the `Int64.h` header file:
+
+```cpp
+//...
+#include "Int64.h"
+//...
+int32_t cubicRoot(jsi::Runtime& rt, int64_t input);
+```
+
+And implement it in `NativeSampleModule.cpp`:
+
+```cpp
+//...
+#include
+//...
+int32_t NativeSampleModule::cubicRoot(jsi::Runtime& rt, int64_t input) {
+ return std::cbrt(input);
+}
+```
+
+In your app you can call this new native function via:
+
+```js
+
+ NativeSampleModule.cubicRoot(...) ={' '}
+ {JSON.stringify(
+ NativeSampleModule.cubicRoot('9223372036854775807'),
+ )}
+
+```
+
+which should return `2097152`.
+
+## Any custom type
+
+Similar to the example above you can now write custom `bridging` functionality for any custom C++ type you want to expose to react-native. E.g., you can add support for `folly::StringPiece`, `QString`, `boost::filesystem::path`, `absl::optional` or any other type you need to support in your C++ Turbo Native Modules.
+
+```cpp title="Path.h"
+#pragma once
+
+#include
+#include
+
+namespace facebook::react {
+
+template<>
+struct Bridging