diff --git a/docs/manifest.json b/docs/manifest.json index 8cc39af57531e..07910088feb5e 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -1055,6 +1055,12 @@ "markdown_source": "../packages/components/src/navigator/navigator-button/README.md", "parent": "components" }, + { + "title": "NavigatorContainer", + "slug": "navigator-container", + "markdown_source": "../packages/components/src/navigator/navigator-container/README.md", + "parent": "components" + }, { "title": "NavigatorProvider", "slug": "navigator-provider", diff --git a/packages/block-editor/src/components/inserter/block-patterns-tab.js b/packages/block-editor/src/components/inserter/block-patterns-tab.js index 83d7b899f181f..9ddd2f0606ce8 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-tab.js +++ b/packages/block-editor/src/components/inserter/block-patterns-tab.js @@ -15,6 +15,7 @@ import { __experimentalItem as Item, __experimentalHStack as HStack, __experimentalNavigatorProvider as NavigatorProvider, + __experimentalNavigatorContainer as NavigatorContainer, __experimentalNavigatorScreen as NavigatorScreen, __experimentalNavigatorButton as NavigatorButton, __experimentalNavigatorBackButton as NavigatorBackButton, @@ -252,47 +253,51 @@ function BlockPatternsTabNavigation( { onInsert, rootClientId } ) { return ( - - - { categories.map( ( category ) => ( - - - { category.label } - - - - ) ) } - - + + + + { categories.map( ( category ) => ( + + + { category.label } + + + + ) ) } + + - { categories.map( ( category ) => ( - - ( + - { __( 'Back' ) } - - - - ) ) } + + { __( 'Back' ) } + + + + ) ) } + ); } diff --git a/packages/block-editor/src/components/inserter/media-tab/media-tab.js b/packages/block-editor/src/components/inserter/media-tab/media-tab.js index 639a63df271d0..bae1b1381393d 100644 --- a/packages/block-editor/src/components/inserter/media-tab/media-tab.js +++ b/packages/block-editor/src/components/inserter/media-tab/media-tab.js @@ -13,6 +13,7 @@ import { __experimentalItem as Item, __experimentalHStack as HStack, __experimentalNavigatorProvider as NavigatorProvider, + __experimentalNavigatorContainer as NavigatorContainer, __experimentalNavigatorScreen as NavigatorScreen, __experimentalNavigatorButton as NavigatorButton, __experimentalNavigatorBackButton as NavigatorBackButton, @@ -134,47 +135,51 @@ function MediaTab( { function MediaTabNavigation( { onInsert, rootClientId, mediaCategories } ) { return ( - - - { mediaCategories.map( ( category ) => ( - - - { category.label } - - - - ) ) } - - - { mediaCategories.map( ( category ) => ( - - - { __( 'Back' ) } - - + + + + { mediaCategories.map( ( category ) => ( + + + { category.label } + + + + ) ) } + - ) ) } + { mediaCategories.map( ( category ) => ( + + + { __( 'Back' ) } + + + + ) ) } + ); } diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 22a08c2f0dd08..76cd4f9b54b7f 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -14,6 +14,10 @@ - NumberControl: refactor styles/tests/stories to TypeScript, replace fireEvent with user-event ([#45990](https://github.com/WordPress/gutenberg/pull/45990)). +### Experimental + +- `Navigator`: `NavigatorScreen` components must now be placed in a `NavigatorCnotainer` component ([#XXX](https://github.com/WordPress/gutenberg/pull/XXX)). + ## 22.1.0 (2022-11-16) ### Enhancements diff --git a/packages/components/src/index.js b/packages/components/src/index.js index 114884690e482..b3838592818d5 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.js @@ -112,6 +112,7 @@ export { default as __experimentalNavigationItem } from './navigation/item'; export { default as __experimentalNavigationMenu } from './navigation/menu'; export { NavigatorProvider as __experimentalNavigatorProvider, + NavigatorContainer as __experimentalNavigatorContainer, NavigatorScreen as __experimentalNavigatorScreen, NavigatorButton as __experimentalNavigatorButton, NavigatorBackButton as __experimentalNavigatorBackButton, diff --git a/packages/components/src/navigator/index.ts b/packages/components/src/navigator/index.ts index 49f5655dc4b39..e5c19c26fcc52 100644 --- a/packages/components/src/navigator/index.ts +++ b/packages/components/src/navigator/index.ts @@ -1,4 +1,5 @@ export { NavigatorProvider } from './navigator-provider'; +export { NavigatorContainer } from './navigator-container'; export { NavigatorScreen } from './navigator-screen'; export { NavigatorButton } from './navigator-button'; export { NavigatorBackButton } from './navigator-back-button'; diff --git a/packages/components/src/navigator/navigator-back-button/README.md b/packages/components/src/navigator/navigator-back-button/README.md index d147027697597..526931fd3fd55 100644 --- a/packages/components/src/navigator/navigator-back-button/README.md +++ b/packages/components/src/navigator/navigator-back-button/README.md @@ -4,7 +4,7 @@ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -The `NavigatorBackButton` component can be used to navigate to a screen and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorScreen`](/packages/components/src/navigator/navigator-screen/README.md) and the [`NavigatorButton`](/packages/components/src/navigator/navigator-button/README.md) components (or the `useNavigator` hook). +The `NavigatorBackButton` component can be used to navigate to a screen and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorContainer`](/packages/components/src/navigator/navigator-container/README.md), the [`NavigatorScreen`](/packages/components/src/navigator/navigator-screen/README.md) and the [`NavigatorButton`](/packages/components/src/navigator/navigator-button/README.md) components (or the `useNavigator` hook). ## Usage diff --git a/packages/components/src/navigator/navigator-back-button/component.tsx b/packages/components/src/navigator/navigator-back-button/component.tsx index 498096edd7d46..8a77adab0a621 100644 --- a/packages/components/src/navigator/navigator-back-button/component.tsx +++ b/packages/components/src/navigator/navigator-back-button/component.tsx @@ -23,13 +23,15 @@ function UnconnectedNavigatorBackButton( /** * The `NavigatorBackButton` component can be used to navigate to a screen and * should be used in combination with the `NavigatorProvider`, the - * `NavigatorScreen` and the `NavigatorButton` components (or the `useNavigator` + * `NavigatorContainer`, the `NavigatorScreen` and the `NavigatorButton` + * components (or the `useNavigator` * hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, + * __experimentalNavigatorContainer as NavigatorContainer, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, @@ -37,19 +39,21 @@ function UnconnectedNavigatorBackButton( * * const MyNavigation = () => ( * - * - *

This is the home screen.

- * - * Navigate to child screen. - * - *
+ * + * + *

This is the home screen.

+ * + * Navigate to child screen. + * + *
* - * - *

This is the child screen.

- * - * Go back - * - *
+ * + *

This is the child screen.

+ * + * Go back + * + *
+ *
*
* ); * ``` diff --git a/packages/components/src/navigator/navigator-button/README.md b/packages/components/src/navigator/navigator-button/README.md index fc96c358cdb02..638d4a15f78b8 100644 --- a/packages/components/src/navigator/navigator-button/README.md +++ b/packages/components/src/navigator/navigator-button/README.md @@ -4,7 +4,7 @@ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -The `NavigatorButton` component can be used to navigate to a screen and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorScreen`](/packages/components/src/navigator/navigator-screen/README.md) and the [`NavigatorBackButton`](/packages/components/src/navigator/navigator-back-button/README.md) components (or the `useNavigator` hook). +The `NavigatorButton` component can be used to navigate to a screen and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorContainer`](/packages/components/src/navigator/navigator-container/README.md), the [`NavigatorScreen`](/packages/components/src/navigator/navigator-screen/README.md) and the [`NavigatorBackButton`](/packages/components/src/navigator/navigator-back-button/README.md) components (or the `useNavigator` hook). ## Usage diff --git a/packages/components/src/navigator/navigator-button/component.tsx b/packages/components/src/navigator/navigator-button/component.tsx index 2e446dac010c0..e48fe4a432204 100644 --- a/packages/components/src/navigator/navigator-button/component.tsx +++ b/packages/components/src/navigator/navigator-button/component.tsx @@ -21,14 +21,16 @@ function UnconnectedNavigatorButton( } /** - * The `NavigatorButton` component can be used to navigate to a screen and should - * be used in combination with the `NavigatorProvider`, the `NavigatorScreen` - * and the `NavigatorBackButton` components (or the `useNavigator` hook). + * The `NavigatorButton` component can be used to navigate to a screen and + * should be used in combination with the `NavigatorProvider`, the + * `NavigatorContainer`, the `NavigatorScreen` and the `NavigatorBackButton` + * components (or the `useNavigator` hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, + * __experimentalNavigatorContainer as NavigatorContainer, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, @@ -36,19 +38,21 @@ function UnconnectedNavigatorButton( * * const MyNavigation = () => ( * - * - *

This is the home screen.

- * - * Navigate to child screen. - * - *
+ * + * + *

This is the home screen.

+ * + * Navigate to child screen. + * + *
* - * - *

This is the child screen.

- * - * Go back - * - *
+ * + *

This is the child screen.

+ * + * Go back + * + *
+ *
*
* ); * ``` diff --git a/packages/components/src/navigator/navigator-container/README.md b/packages/components/src/navigator/navigator-container/README.md new file mode 100644 index 0000000000000..8b51cabafab1a --- /dev/null +++ b/packages/components/src/navigator/navigator-container/README.md @@ -0,0 +1,21 @@ +# `NavigatorContainer` + +
+This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. +
+ +The `NavigatorContainer` component is a container for `NavigatorScreen` components to be placed in. It should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorContainer`](/packages/components/src/navigator/navigator-container/README.md), the [`NavigatorScreen`](/packages/components/src/navigator/navigator-screen/README.md) and the [`NavigatorBackButton`](/packages/components/src/navigator/navigator-back-button/README.md) components (or the `useNavigator` hook). + +## Usage + +Refer to [the `NavigatorProvider` component](/packages/components/src/navigator/navigator-provider/README.md#usage) for a usage example. + +## Props + +The component accepts the following props: + +### `className`: `string` + +Class name to add to the container element. + +- Required: No diff --git a/packages/components/src/navigator/navigator-container/component.tsx b/packages/components/src/navigator/navigator-container/component.tsx new file mode 100644 index 0000000000000..06e72de6f7680 --- /dev/null +++ b/packages/components/src/navigator/navigator-container/component.tsx @@ -0,0 +1,89 @@ +/** + * External dependencies + */ +import type { ForwardedRef } from 'react'; +import { css } from '@emotion/react'; + +/** + * WordPress dependencies + */ +import { useMemo } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { + contextConnect, + useContextSystem, + WordPressComponentProps, +} from '../../ui/context'; +import { useCx } from '../../utils/hooks/use-cx'; +import { View } from '../../view'; +import type { NavigatorContainerProps } from '../types'; + +function UnconnectedNavigatorContainer( + props: WordPressComponentProps< NavigatorContainerProps, 'div' >, + forwardedRef: ForwardedRef< any > +) { + const { children, className, ...otherProps } = useContextSystem( + props, + 'NavigatorContainer' + ); + + const cx = useCx(); + const classes = useMemo( + // Prevents horizontal overflow while animating screen transitions. + () => cx( css( { overflowX: 'hidden' } ), className ), + [ className, cx ] + ); + + return ( + + { children } + + ); +} + +/** + * The `NavigatorContainer` component is a container for `NavigatorScreen` + * components to be placed in. It should be used in combination with the + * `NavigatorProvider`, the `NavigatorContainer`, the `NavigatorScreen` and the + * `NavigatorBackButton` components (or the `useNavigator` hook). + * + * @example + * ```jsx + * import { + * __experimentalNavigatorProvider as NavigatorProvider, + * __experimentalNavigatorContainer as NavigatorContainer, + * __experimentalNavigatorScreen as NavigatorScreen, + * __experimentalNavigatorButton as NavigatorButton, + * __experimentalNavigatorBackButton as NavigatorBackButton, + * } from '@wordpress/components'; + * + * const MyNavigation = () => ( + * + * + * + *

This is the home screen.

+ * + * Navigate to child screen. + * + *
+ * + * + *

This is the child screen.

+ * + * Go back + * + *
+ *
+ *
+ * ); + * ``` + */ +export const NavigatorContainer = contextConnect( + UnconnectedNavigatorContainer, + 'NavigatorContainer' +); + +export default NavigatorContainer; diff --git a/packages/components/src/navigator/navigator-container/index.ts b/packages/components/src/navigator/navigator-container/index.ts new file mode 100644 index 0000000000000..8e329cc3699b9 --- /dev/null +++ b/packages/components/src/navigator/navigator-container/index.ts @@ -0,0 +1 @@ +export { default as NavigatorContainer } from './component'; diff --git a/packages/components/src/navigator/navigator-provider/README.md b/packages/components/src/navigator/navigator-provider/README.md index d552d2bb20634..ff3200a2e9429 100644 --- a/packages/components/src/navigator/navigator-provider/README.md +++ b/packages/components/src/navigator/navigator-provider/README.md @@ -11,6 +11,7 @@ The `NavigatorProvider` component allows rendering nested views/panels/menus (vi ```jsx import { __experimentalNavigatorProvider as NavigatorProvider, + __experimentalNavigatorContainer as NavigatorContainer, __experimentalNavigatorScreen as NavigatorScreen, __experimentalNavigatorButton as NavigatorButton, __experimentalNavigatorBackButton as NavigatorBackButton, @@ -18,19 +19,21 @@ import { const MyNavigation = () => ( - -

This is the home screen.

- - Navigate to child screen. - -
- - -

This is the child screen.

- - Go back - -
+ + +

This is the home screen.

+ + Navigate to child screen. + +
+ + +

This is the child screen.

+ + Go back + +
+
); ``` diff --git a/packages/components/src/navigator/navigator-provider/component.tsx b/packages/components/src/navigator/navigator-provider/component.tsx index 57b18f6d92dba..6cccefd452b80 100644 --- a/packages/components/src/navigator/navigator-provider/component.tsx +++ b/packages/components/src/navigator/navigator-provider/component.tsx @@ -1,37 +1,47 @@ -/** - * External dependencies - */ -import type { ForwardedRef } from 'react'; -import { css } from '@emotion/react'; - /** * WordPress dependencies */ -import { useMemo, useState, useCallback } from '@wordpress/element'; +import { + useMemo, + useState, + useCallback, + Children, + isValidElement, +} from '@wordpress/element'; +import deprecated from '@wordpress/deprecated'; /** * Internal dependencies */ -import { - contextConnect, - useContextSystem, - WordPressComponentProps, -} from '../../ui/context'; -import { useCx } from '../../utils/hooks/use-cx'; -import { View } from '../../view'; +import { useContextSystem, WordPressComponentProps } from '../../ui/context'; +import { contextConnectWithoutRef } from '../../ui/context/context-connect'; import { NavigatorContext } from '../context'; import type { NavigatorProviderProps, NavigatorLocation, NavigatorContext as NavigatorContextType, } from '../types'; +import { NavigatorScreen } from '../navigator-screen'; +import { NavigatorContainer } from '../navigator-container'; function UnconnectedNavigatorProvider( - props: WordPressComponentProps< NavigatorProviderProps, 'div' >, - forwardedRef: ForwardedRef< any > + props: WordPressComponentProps< NavigatorProviderProps, 'div', false > ) { - const { initialPath, children, className, ...otherProps } = - useContextSystem( props, 'NavigatorProvider' ); + const contextProps = useContextSystem( props, 'NavigatorProvider' ); + const { initialPath } = contextProps; + let { children } = contextProps; + + const hasScreenChildren = Children.toArray( children ).some( + ( child ) => isValidElement( child ) && child.type === NavigatorScreen + ); + if ( hasScreenChildren ) { + deprecated( 'NavigatorScreen as child of NavigatorProvider', { + since: '6.2', + version: '6.3', + alternative: 'NavigatorContainer', + } ); + children = { children }; + } const [ locationHistory, setLocationHistory ] = useState< NavigatorLocation[] @@ -81,25 +91,16 @@ function UnconnectedNavigatorProvider( [ locationHistory, goTo, goBack ] ); - const cx = useCx(); - const classes = useMemo( - // Prevents horizontal overflow while animating screen transitions. - () => cx( css( { overflowX: 'hidden' } ), className ), - [ className, cx ] - ); - return ( - - - { children } - - + + { children } + ); } /** * The `NavigatorProvider` component allows rendering nested views/panels/menus - * (via the `NavigatorScreen` component and navigate between these different + * (via the `NavigatorScreen` component) and navigate between these different * view (via the `NavigatorButton` and `NavigatorBackButton` components or the * `useNavigator` hook). * @@ -107,6 +108,7 @@ function UnconnectedNavigatorProvider( * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, + * __experimentalNavigatorContainer as NavigatorContainer, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, @@ -114,24 +116,26 @@ function UnconnectedNavigatorProvider( * * const MyNavigation = () => ( * - * - *

This is the home screen.

- * - * Navigate to child screen. - * - *
+ * + * + *

This is the home screen.

+ * + * Navigate to child screen. + * + *
* - * - *

This is the child screen.

- * - * Go back - * - *
+ * + *

This is the child screen.

+ * + * Go back + * + *
+ *
*
* ); * ``` */ -export const NavigatorProvider = contextConnect( +export const NavigatorProvider = contextConnectWithoutRef( UnconnectedNavigatorProvider, 'NavigatorProvider' ); diff --git a/packages/components/src/navigator/navigator-screen/README.md b/packages/components/src/navigator/navigator-screen/README.md index 5ba5af44fe8c1..c58062bad971e 100644 --- a/packages/components/src/navigator/navigator-screen/README.md +++ b/packages/components/src/navigator/navigator-screen/README.md @@ -4,7 +4,7 @@ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -The `NavigatorScreen` component represents a single view/screen/panel and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorButton`](/packages/components/src/navigator/navigator-button/README.md) and the [`NavigatorBackButton`](/packages/components/src/navigator/navigator-back-button/README.md) components (or the `useNavigator` hook). +The `NavigatorScreen` component represents a single view/screen/panel and should be used in combination with the [`NavigatorProvider`](/packages/components/src/navigator/navigator-provider/README.md), the [`NavigatorContainer`](/packages/components/src/navigator/navigator-container/README.md), the [`NavigatorButton`](/packages/components/src/navigator/navigator-button/README.md) and the [`NavigatorBackButton`](/packages/components/src/navigator/navigator-back-button/README.md) components (or the `useNavigator` hook). ## Usage diff --git a/packages/components/src/navigator/navigator-screen/component.tsx b/packages/components/src/navigator/navigator-screen/component.tsx index 266bd553e0a8d..9892608df1d1f 100644 --- a/packages/components/src/navigator/navigator-screen/component.tsx +++ b/packages/components/src/navigator/navigator-screen/component.tsx @@ -209,6 +209,7 @@ function UnconnectedNavigatorScreen( * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, + * __experimentalNavigatorContainer as NavigatorContainer, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, @@ -216,19 +217,21 @@ function UnconnectedNavigatorScreen( * * const MyNavigation = () => ( * - * - *

This is the home screen.

- * - * Navigate to child screen. - * - *
+ * + * + *

This is the home screen.

+ * + * Navigate to child screen. + * + *
* - * - *

This is the child screen.

- * - * Go back - * - *
+ * + *

This is the child screen.

+ * + * Go back + * + *
+ *
*
* ); * ``` diff --git a/packages/components/src/navigator/stories/index.tsx b/packages/components/src/navigator/stories/index.tsx index a1f6e2fbf0c9a..1236554b4fc1d 100644 --- a/packages/components/src/navigator/stories/index.tsx +++ b/packages/components/src/navigator/stories/index.tsx @@ -12,6 +12,7 @@ import { HStack } from '../../h-stack'; import Dropdown from '../../dropdown'; import { NavigatorProvider, + NavigatorContainer, NavigatorScreen, NavigatorButton, NavigatorBackButton, @@ -22,7 +23,6 @@ const meta: ComponentMeta< typeof NavigatorProvider > = { title: 'Components (Experimental)/Navigator', subcomponents: { NavigatorScreen, NavigatorButton, NavigatorBackButton }, argTypes: { - as: { control: { type: null } }, children: { control: { type: null } }, initialPath: { control: { type: null } }, }, @@ -37,135 +37,139 @@ const Template: ComponentStory< typeof NavigatorProvider > = ( { style, ...props } ) => ( - - - - -

This is the home screen.

+ + + + + +

This is the home screen.

- - - Navigate to child screen. - + + + Navigate to child screen. + - - Navigate to screen with horizontal overflow. - + + Navigate to screen with horizontal overflow. + - - Navigate to screen with sticky content. - + + Navigate to screen with sticky content. + - void; - } ) => ( - - ) } - renderContent={ () => ( - - Go - Stuff - - ) } - /> - -
-
-
+ void; + } ) => ( + + ) } + renderContent={ () => ( + + Go + Stuff + + ) } + /> + +
+
+
- - - -

This is the child screen.

- - Go back - -
-
-
+ + + +

This is the child screen.

+ + Go back + +
+
+
- - - - - Go back - -
- + + + + Go back + +
- ¯\_(ツ)_/¯ - -
-
-
- + + ¯\_(ツ)_/¯ + +
+
+
+
- - - - - Go back - - - -
-

A wild sticky element appears

-
- -
- -
+ + + + Go back + + + +
+

A wild sticky element appears

+
+ +
+ +
+

Another wild sticky element appears

+
+ +
+ -

Another wild sticky element appears

-
- -
- - - -
-
+ + + + +
); diff --git a/packages/components/src/navigator/test/index.tsx b/packages/components/src/navigator/test/index.tsx index be836f0152fc2..ba4c081972a81 100644 --- a/packages/components/src/navigator/test/index.tsx +++ b/packages/components/src/navigator/test/index.tsx @@ -15,6 +15,7 @@ import { useState } from '@wordpress/element'; */ import { NavigatorProvider, + NavigatorContainer, NavigatorScreen, NavigatorButton, NavigatorBackButton, @@ -146,73 +147,75 @@ const MyNavigation = ( { return ( <> - -

{ SCREEN_TEXT.home }

- - { BUTTON_TEXT.toNonExistingScreen } - - - { BUTTON_TEXT.toChildScreen } - - - { BUTTON_TEXT.toInvalidHtmlPathScreen } - -
- - -

{ SCREEN_TEXT.child }

- - { BUTTON_TEXT.toNestedScreen } - - - { BUTTON_TEXT.back } - - - - { - setInnerInputValue( e.target.value ); - } } - value={ innerInputValue } - /> -
- - -

{ SCREEN_TEXT.nested }

- - { BUTTON_TEXT.back } - -
- - -

{ SCREEN_TEXT.invalidHtmlPath }

- - { BUTTON_TEXT.back } - -
- - { /* A `NavigatorScreen` with `path={ PATHS.NOT_FOUND }` is purposefully not included. */ } + + +

{ SCREEN_TEXT.home }

+ + { BUTTON_TEXT.toNonExistingScreen } + + + { BUTTON_TEXT.toChildScreen } + + + { BUTTON_TEXT.toInvalidHtmlPathScreen } + +
+ + +

{ SCREEN_TEXT.child }

+ + { BUTTON_TEXT.toNestedScreen } + + + { BUTTON_TEXT.back } + + + + { + setInnerInputValue( e.target.value ); + } } + value={ innerInputValue } + /> +
+ + +

{ SCREEN_TEXT.nested }

+ + { BUTTON_TEXT.back } + +
+ + +

{ SCREEN_TEXT.invalidHtmlPath }

+ + { BUTTON_TEXT.back } + +
+ + { /* A `NavigatorScreen` with `path={ PATHS.NOT_FOUND }` is purposefully not included. */ } +
diff --git a/packages/components/src/navigator/types.ts b/packages/components/src/navigator/types.ts index 0b1a6a077ea7a..f58f2a07518be 100644 --- a/packages/components/src/navigator/types.ts +++ b/packages/components/src/navigator/types.ts @@ -34,6 +34,13 @@ export type NavigatorProviderProps = { children: ReactNode; }; +export type NavigatorContainerProps = { + /** + * The children elements. + */ + children: ReactNode; +}; + export type NavigatorScreenProps = { /** * The screen's path, matched against the current path stored in the navigator. diff --git a/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap b/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap index f9f7be89c82a0..d13f1a2de0861 100644 --- a/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap +++ b/packages/edit-post/src/components/preferences-modal/test/__snapshots__/index.js.snap @@ -696,9 +696,9 @@ exports[`EditPostPreferencesModal should match snapshot when the modal is active
- - - - - - - - - - - + + + + + - { blocks.map( ( block ) => ( - - + + - ) ) } - + + + - { blocks.map( ( block ) => ( - - ) ) } + { blocks.map( ( block ) => ( + + + + ) ) } + + + + { blocks.map( ( block ) => ( + + ) ) } + ); } diff --git a/packages/interface/src/components/preferences-modal-tabs/index.js b/packages/interface/src/components/preferences-modal-tabs/index.js index bc8f7358b834d..3772e09b65f1c 100644 --- a/packages/interface/src/components/preferences-modal-tabs/index.js +++ b/packages/interface/src/components/preferences-modal-tabs/index.js @@ -4,6 +4,7 @@ import { useViewportMatch } from '@wordpress/compose'; import { __experimentalNavigatorProvider as NavigatorProvider, + __experimentalNavigatorContainer as NavigatorContainer, __experimentalNavigatorScreen as NavigatorScreen, __experimentalNavigatorButton as NavigatorButton, __experimentalNavigatorBackButton as NavigatorBackButton, @@ -76,78 +77,77 @@ export default function PreferencesModalTabs( { sections } ) { ); } else { modalContent = ( - - - - - - { tabs.map( ( tab ) => { - return ( - + + + + + + { tabs.map( ( tab ) => { + return ( + + + + + { tab.title } + + + + + + + + ); + } ) } + + + + + { sections.length && + sections.map( ( section ) => { + return ( + + + - - - - { tab.title } - - - - - - - - ); - } ) } - - - - - { sections.length && - sections.map( ( section ) => { - return ( - - - - - - { section.tabLabel } - - - { section.content } - - - ); - } ) } + + + { section.tabLabel } + + + { section.content } + + + ); + } ) } + ); }