diff --git a/packages/components/src/font-size-picker/index.native.js b/packages/components/src/font-size-picker/index.native.js
index 2be833c450a82a..1da82363c47896 100644
--- a/packages/components/src/font-size-picker/index.native.js
+++ b/packages/components/src/font-size-picker/index.native.js
@@ -84,10 +84,12 @@ function FontSizePicker( {
showSheet={ showSubSheet }
>
<>
-
+
+
+
+ { label }
+
+
<>
-
+
+
+
+ { label }
+
+
{ items.map( ( item, index ) => (
<>
-
+
+
+
+ { label }
+
+
(
+
+
+ {} } />
+ A Sheet Title
+ {} } />
+
+
+);
+```
+
+## BottomSheet.NavBar
+
+Provides structural styles for left-center-right layout for header UI.
+
+## BottomSheet.NavBar.Title
+
+Displays a styled title for a bottom sheet.
+
+## BottomSheet.NavBar.ApplyButton
+
+Displays a styled button to apply settings of bottom sheet controls.
+
+### Props
+
+#### onPress
+
+Callback invoked once the button is pressed.
+
+## BottomSheet.NavBar.BackButton
+
+Displays a styled button to navigate backwards from a bottom sheet.
+
+### Props
+
+#### onPress
+
+Callback invoked once the button is pressed.
+
+## BottomSheet.NavBar.DismissButton
+
+Displays a styled button to dismiss a full screen bottom sheet.
+
+### Props
+
+#### onPress
+
+Callback invoked once the button is pressed.
+
+#### iosText
+
+Used to display iOS text if different from "Cancel".
\ No newline at end of file
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/action-button.native.js b/packages/components/src/mobile/bottom-sheet/nav-bar/action-button.native.js
new file mode 100644
index 00000000000000..6b11f30959fe5d
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/action-button.native.js
@@ -0,0 +1,30 @@
+/**
+ * External dependencies
+ */
+import { View, TouchableWithoutFeedback } from 'react-native';
+
+/**
+ * Internal dependencies
+ */
+import styles from './styles.scss';
+
+// Action button component is used by both Back and Apply Button componenets.
+function ActionButton( {
+ onPress,
+ accessibilityLabel,
+ accessibilityHint,
+ children,
+} ) {
+ return (
+
+ { children }
+
+ );
+}
+
+export default ActionButton;
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/apply-button.native.js b/packages/components/src/mobile/bottom-sheet/nav-bar/apply-button.native.js
new file mode 100644
index 00000000000000..a5362f1a67a098
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/apply-button.native.js
@@ -0,0 +1,53 @@
+/**
+ * External dependencies
+ */
+import { View, Text, Platform } from 'react-native';
+
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+import { Icon, check } from '@wordpress/icons';
+import { usePreferredColorSchemeStyle } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import styles from './styles.scss';
+import ActionButton from './action-button';
+
+function ApplyButton( { onPress } ) {
+ const buttonTextStyle = usePreferredColorSchemeStyle(
+ styles[ 'button-text' ],
+ styles[ 'button-text-dark' ]
+ );
+
+ const applyButtonStyle = usePreferredColorSchemeStyle(
+ styles[ 'apply-button-icon' ],
+ styles[ 'apply-button-icon-dark' ]
+ );
+
+ return (
+
+
+ { Platform.OS === 'ios' ? (
+
+ { __( 'Apply' ) }
+
+ ) : (
+
+ ) }
+
+
+ );
+}
+
+export default ApplyButton;
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/back-button.native.js b/packages/components/src/mobile/bottom-sheet/nav-bar/back-button.native.js
new file mode 100644
index 00000000000000..859eba98b9604a
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/back-button.native.js
@@ -0,0 +1,94 @@
+/**
+ * External dependencies
+ */
+import { View, Platform, Text } from 'react-native';
+
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+import { Icon, arrowLeft, close } from '@wordpress/icons';
+import { usePreferredColorSchemeStyle } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import styles from './styles.scss';
+import ActionButton from './action-button';
+import chevronBack from './../chevron-back';
+
+function Button( { onPress, icon, text } ) {
+ const buttonTextStyle = usePreferredColorSchemeStyle(
+ styles[ 'button-text' ],
+ styles[ 'button-text-dark' ]
+ );
+
+ return (
+
+
+ { icon }
+ { text && (
+
+ { text }
+
+ ) }
+
+
+ );
+}
+
+function BackButton( { onPress } ) {
+ const chevronLeftStyle = usePreferredColorSchemeStyle(
+ styles[ 'chevron-left-icon' ],
+ styles[ 'chevron-left-icon-dark' ]
+ );
+ const arrowLeftStyle = usePreferredColorSchemeStyle(
+ styles[ 'arrow-left-icon' ],
+ styles[ 'arrow-right-icon-dark' ]
+ );
+
+ let backIcon;
+ let backText;
+
+ if ( Platform.OS === 'ios' ) {
+ backIcon = (
+
+ );
+ backText = __( 'Back' );
+ } else {
+ backIcon = (
+
+ );
+ }
+
+ return ;
+}
+
+function DismissButton( { onPress, iosText } ) {
+ const arrowLeftStyle = usePreferredColorSchemeStyle(
+ styles[ 'arrow-left-icon' ],
+ styles[ 'arrow-right-icon-dark' ]
+ );
+
+ let backIcon;
+ let backText;
+
+ if ( Platform.OS === 'ios' ) {
+ backText = iosText ? iosText : __( 'Cancel' );
+ } else {
+ backIcon = ;
+ }
+
+ return ;
+}
+
+Button.Back = BackButton;
+Button.Dismiss = DismissButton; // Cancel or Close Button
+
+export default Button;
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/heading.native.js b/packages/components/src/mobile/bottom-sheet/nav-bar/heading.native.js
new file mode 100644
index 00000000000000..9bbae77dbde5e9
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/heading.native.js
@@ -0,0 +1,33 @@
+/**
+ * External dependencies
+ */
+import { Text } from 'react-native';
+
+/**
+ * WordPress dependencies
+ */
+import { usePreferredColorSchemeStyle } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import styles from './styles.scss';
+
+function Heading( { children } ) {
+ const headingStyle = usePreferredColorSchemeStyle(
+ styles.heading,
+ styles[ 'heading-dark' ]
+ );
+
+ return (
+
+ { children }
+
+ );
+}
+
+export default Heading;
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/index.native.js b/packages/components/src/mobile/bottom-sheet/nav-bar/index.native.js
new file mode 100644
index 00000000000000..57b4c23d4b49a7
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/index.native.js
@@ -0,0 +1,23 @@
+/**
+ * External dependencies
+ */
+import { View } from 'react-native';
+
+/**
+ * Internal dependencies
+ */
+import ApplyButton from './apply-button';
+import Button from './back-button';
+import Heading from './heading';
+import styles from './styles.scss';
+function NavBar( { children } ) {
+ return { children };
+}
+
+NavBar.ApplyButton = ApplyButton;
+NavBar.BackButton = Button.Back;
+NavBar.DismissButton = Button.Dismiss;
+
+NavBar.Heading = Heading;
+
+export default NavBar;
diff --git a/packages/components/src/mobile/bottom-sheet/nav-bar/styles.native.scss b/packages/components/src/mobile/bottom-sheet/nav-bar/styles.native.scss
new file mode 100644
index 00000000000000..a6fe92ea37626a
--- /dev/null
+++ b/packages/components/src/mobile/bottom-sheet/nav-bar/styles.native.scss
@@ -0,0 +1,69 @@
+.nav-bar {
+ align-items: center;
+ flex-direction: row;
+ height: 44px;
+ justify-content: center;
+}
+
+.heading {
+ color: $light-primary;
+ text-align: center;
+ font-weight: 600;
+ font-size: 16px;
+ position: absolute;
+ width: 100%;
+}
+
+.heading-dark {
+ color: $dark-primary;
+}
+
+.action-button {
+ align-items: center;
+ flex-direction: row;
+ height: 100%;
+ justify-content: center;
+ min-width: 44px;
+ padding-left: $grid-unit-20;
+ padding-right: $grid-unit-20;
+}
+
+.back-button {
+ align-items: flex-start;
+ flex: 1;
+ justify-content: center;
+ z-index: 2;
+}
+
+.apply-button {
+ align-items: flex-end;
+ flex: 1;
+ justify-content: center;
+ z-index: 2;
+}
+
+.button-text {
+ color: $blue-50;
+ font-size: 16px;
+}
+
+.button-text-dark {
+ color: $blue-30;
+}
+
+.chevron-left-icon {
+ color: $blue-50;
+ margin-left: -11px;
+}
+
+.chevron-left-icon-dark {
+ color: $blue-30;
+}
+
+.arrow-left-icon {
+ color: $gray-60;
+}
+
+.arrow-left-icon-dark {
+ color: $dark-secondary;
+}
diff --git a/packages/components/src/mobile/bottom-sheet/navigation-header.native.js b/packages/components/src/mobile/bottom-sheet/navigation-header.native.js
deleted file mode 100644
index d0a28e2482c408..00000000000000
--- a/packages/components/src/mobile/bottom-sheet/navigation-header.native.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * External dependencies
- */
-import { View, TouchableWithoutFeedback, Text, Platform } from 'react-native';
-
-/**
- * WordPress dependencies
- */
-import { __ } from '@wordpress/i18n';
-import { check, Icon, arrowLeft, close } from '@wordpress/icons';
-import { usePreferredColorSchemeStyle } from '@wordpress/compose';
-
-/**
- * Internal dependencies
- */
-import styles from './styles.scss';
-import chevronBack from './chevron-back';
-
-function BottomSheetNavigationHeader( {
- leftButtonText,
- leftButtonOnPress,
- screen,
- applyButtonOnPress,
- isFullscreen,
-} ) {
- const isIOS = Platform.OS === 'ios';
-
- const bottomSheetHeaderTitleStyle = usePreferredColorSchemeStyle(
- styles.bottomSheetHeaderTitle,
- styles.bottomSheetHeaderTitleDark
- );
- const bottomSheetButtonTextStyle = usePreferredColorSchemeStyle(
- styles.bottomSheetButtonText,
- styles.bottomSheetButtonTextDark
- );
- const chevronLeftStyle = usePreferredColorSchemeStyle(
- styles.chevronLeftIcon,
- styles.chevronLeftIconDark
- );
- const arrowLeftStyle = usePreferredColorSchemeStyle(
- styles.arrowLeftIcon,
- styles.arrowLeftIconDark
- );
- const applyButtonStyle = usePreferredColorSchemeStyle(
- styles.applyButton,
- styles.applyButtonDark
- );
-
- const renderBackButton = () => {
- let backIcon;
- let backText;
-
- if ( isIOS ) {
- backIcon = isFullscreen ? undefined : (
-
- );
- if ( leftButtonText ) {
- backText = leftButtonText;
- } else if ( isFullscreen ) {
- backText = __( 'Cancel' );
- } else {
- backText = __( 'Back' );
- }
- } else {
- backIcon = (
-
- );
- }
-
- return (
-
-
- <>
- { backIcon }
- { backText && (
-
- { backText }
-
- ) }
- >
-
-
- );
- };
-
- return (
-
-
- { renderBackButton() }
-
-
- { screen }
-
-
- { !! applyButtonOnPress && (
-
-
- { isIOS ? (
-
- { __( 'Apply' ) }
-
- ) : (
-
- ) }
-
-
- ) }
-
-
- );
-}
-
-export default BottomSheetNavigationHeader;
diff --git a/packages/components/src/mobile/bottom-sheet/sub-sheet/README.md b/packages/components/src/mobile/bottom-sheet/sub-sheet/README.md
index 592039a8a5b140..1e60bb74ac5347 100644
--- a/packages/components/src/mobile/bottom-sheet/sub-sheet/README.md
+++ b/packages/components/src/mobile/bottom-sheet/sub-sheet/README.md
@@ -49,10 +49,10 @@ const ExampleControl = () => {
showSheet={ showSubSheet }
>
<>
-
+
+
+ { 'Howdy' }
+
{ 'World' }
diff --git a/packages/components/src/mobile/color-settings/gradient-picker-screen.native.js b/packages/components/src/mobile/color-settings/gradient-picker-screen.native.js
index 74d4e9d30bda50..c94d9e37a17ec6 100644
--- a/packages/components/src/mobile/color-settings/gradient-picker-screen.native.js
+++ b/packages/components/src/mobile/color-settings/gradient-picker-screen.native.js
@@ -13,7 +13,7 @@ import { __ } from '@wordpress/i18n';
* Internal dependencies
*/
import CustomGradientPicker from '../../custom-gradient-picker';
-import NavigationHeader from '../bottom-sheet/navigation-header';
+import NavBar from '../bottom-sheet/nav-bar';
const GradientPickerScreen = () => {
const navigation = useNavigation();
@@ -21,10 +21,10 @@ const GradientPickerScreen = () => {
const { setColor, currentValue, isGradientColor } = route.params;
return (
-
+
+
+ { __( 'Customize Gradient' ) }
+
{
}
return (
-
+
+
+ { label }
+
- onButtonPress( 'cancel' ) }
- applyButtonOnPress={ () => onButtonPress( 'apply' ) }
- isFullscreen
- />
+
+ onButtonPress( 'cancel' ) }
+ />
+
+ { __( 'Edit focal point' ) }
+
+ onButtonPress( 'apply' ) }
+ />
+
-
+
+
+ { __( 'Link to' ) }
+
+
{
return (
-
+
+
+
+ { label }
+
+
-
+
+
+
+ { title }
+
+
{ ( { listProps } ) => {
const contentContainerStyle = StyleSheet.flatten(