diff --git a/src/components/page_template/__snapshots__/page_template.test.tsx.snap b/src/components/page_template/__snapshots__/page_template.test.tsx.snap
index 3d42b4f9565..470faaac135 100644
--- a/src/components/page_template/__snapshots__/page_template.test.tsx.snap
+++ b/src/components/page_template/__snapshots__/page_template.test.tsx.snap
@@ -3,10 +3,9 @@
exports[`EuiPageTemplate _EuiPageInnerProps is rendered 1`] = `
-
diff --git a/src/components/page_template/inner/__snapshots__/page_inner.test.tsx.snap b/src/components/page_template/inner/__snapshots__/page_inner.test.tsx.snap
index 9700410a893..42b11bb74ff 100644
--- a/src/components/page_template/inner/__snapshots__/page_inner.test.tsx.snap
+++ b/src/components/page_template/inner/__snapshots__/page_inner.test.tsx.snap
@@ -6,12 +6,23 @@ exports[`_EuiPageInner border is rendered 1`] = `
/>
`;
-exports[`_EuiPageInner component is rendered 1`] = `
+exports[`_EuiPageInner component renders HTML tag strings 1`] = `
`;
+exports[`_EuiPageInner component renders custom React components 1`] = `
+Array [
+
+ hello
+
,
+
+ world
+
,
+]
+`;
+
exports[`_EuiPageInner is rendered 1`] = `
{
expect(component).toMatchSnapshot();
});
- test('component is rendered', () => {
- const component = render();
+ describe('component', () => {
+ it('renders HTML tag strings', () => {
+ const component = render();
- expect(component).toMatchSnapshot();
+ expect(component).toMatchSnapshot();
+ });
+
+ it('renders custom React components', () => {
+ const TestComponent: React.FC<{ test?: boolean }> = ({ test }) => (
+ {test ? 'hello' : 'world'}
+ );
+
+ const component = render(
+ <>
+
+
+ >
+ );
+ expect(component).toMatchSnapshot();
+ });
});
describe('paddingSize', () => {
diff --git a/src/components/page_template/inner/page_inner.tsx b/src/components/page_template/inner/page_inner.tsx
index b738ad8e6dc..accfe8c4da9 100644
--- a/src/components/page_template/inner/page_inner.tsx
+++ b/src/components/page_template/inner/page_inner.tsx
@@ -16,7 +16,7 @@ import {
import { useEuiTheme, useIsWithinBreakpoints } from '../../../services';
import { euiPageInnerStyles } from './page_inner.styles';
-type ComponentTypes = keyof JSX.IntrinsicElements | ComponentType;
+export type ComponentTypes = keyof JSX.IntrinsicElements | ComponentType;
export type _EuiPageInnerProps<
T extends ComponentTypes = 'main'
@@ -40,7 +40,7 @@ export type _EuiPageInnerProps<
*/
paddingSize?: EuiPaddingSize;
/**
- * Decides at which point the component will be 100vw.
+ * Decides at which point the main content wrapper will be 100vw.
*/
responsive?: _EuiThemeBreakpoint[];
};
diff --git a/src/components/page_template/outer/page_outer.tsx b/src/components/page_template/outer/page_outer.tsx
index 089d14ea862..b61aad83ad3 100644
--- a/src/components/page_template/outer/page_outer.tsx
+++ b/src/components/page_template/outer/page_outer.tsx
@@ -26,7 +26,7 @@ export interface _EuiPageOuterProps
*/
direction?: 'row' | 'column';
/**
- * When direction is `row`, it will flip to `column` when within these breakpoints
+ * When direction is `row`, it will flip to `column` when within these breakpoints.
*/
responsive?: _EuiThemeBreakpoint[];
}
diff --git a/src/components/page_template/page_template.test.tsx b/src/components/page_template/page_template.test.tsx
index 3c011bbf7ad..077926ffe31 100644
--- a/src/components/page_template/page_template.test.tsx
+++ b/src/components/page_template/page_template.test.tsx
@@ -35,7 +35,7 @@ describe('EuiPageTemplate', () => {
test('_EuiPageInnerProps is rendered', () => {
const component = render(
&
+ Omit<_EuiPageInnerProps, 'border' | 'component'> &
_EuiPageRestrictWidth &
_EuiPageBottomBorder & {
/**
@@ -71,6 +72,11 @@ export type EuiPageTemplateProps = _EuiPageOuterProps &
* Passes through some common HTML attributes to the `main` content wrapper
*/
mainProps?: CommonProps & HTMLAttributes;
+ /**
+ * Sets which HTML element to render for the `main` content wrapper
+ * @default main
+ */
+ component?: ComponentTypes;
};
/**
@@ -80,6 +86,7 @@ export type EuiPageTemplateProps = _EuiPageOuterProps &
export const _EuiPageTemplate: FunctionComponent = ({
children,
// Shared props
+ responsive = ['xs', 's'],
restrictWidth = true,
paddingSize = 'l',
grow = true,
@@ -88,11 +95,11 @@ export const _EuiPageTemplate: FunctionComponent = ({
panelled,
// Inner props
contentBorder,
+ component,
mainProps,
// Outer props
className,
minHeight = '460px',
- responsive = ['xs', 's'],
...rest
}) => {
const { euiTheme } = useEuiTheme();
@@ -205,6 +212,7 @@ export const _EuiPageTemplate: FunctionComponent = ({