Skip to content

Commit 34e5dda

Browse files
authored
Merge pull request #14956 from guardian/ih/hosted-article-layout
Add layout scaffolds for hosted content
2 parents 1b30bf2 + 9e87841 commit 34e5dda

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { Meta, StoryObj } from '@storybook/react-webpack5';
2+
import { allModes } from '../../.storybook/modes';
3+
import { HostedArticleLayout } from './HostedArticleLayout';
4+
5+
const meta = {
6+
title: 'Layouts/HostedArticle',
7+
component: HostedArticleLayout,
8+
parameters: {
9+
chromatic: {
10+
modes: {
11+
'light leftCol': allModes['light leftCol'],
12+
},
13+
},
14+
},
15+
} satisfies Meta<typeof HostedArticleLayout>;
16+
17+
export default meta;
18+
19+
type Story = StoryObj<typeof meta>;
20+
21+
export const Apps = {
22+
args: {
23+
renderingTarget: 'Apps',
24+
},
25+
parameters: {
26+
config: {
27+
renderingTarget: 'Apps',
28+
},
29+
},
30+
} satisfies Story;
31+
32+
export const Web = {
33+
args: {
34+
renderingTarget: 'Web',
35+
},
36+
parameters: {
37+
config: {
38+
renderingTarget: 'Web',
39+
},
40+
},
41+
} satisfies Story;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { css } from '@emotion/react';
2+
import { grid } from '../grid';
3+
import type { RenderingTarget } from '../types/renderingTarget';
4+
5+
interface Props {
6+
renderingTarget: RenderingTarget;
7+
}
8+
9+
interface WebProps extends Props {
10+
renderingTarget: 'Web';
11+
}
12+
13+
interface AppProps extends Props {
14+
renderingTarget: 'Apps';
15+
}
16+
17+
const border = css`
18+
border: 1px solid black;
19+
`;
20+
21+
export const HostedArticleLayout = (props: WebProps | AppProps) => {
22+
return (
23+
<>
24+
{props.renderingTarget === 'Web' ? 'Masthead' : null}
25+
<main>
26+
<header css={[grid.container, border]}>
27+
<div css={[grid.column.all]}>Main media</div>
28+
<div
29+
css={[grid.between('centre-column-start', 'grid-end')]}
30+
>
31+
Headline
32+
</div>
33+
</header>
34+
<div css={[grid.container]}>
35+
<div css={[grid.column.left, 'grid-row: 1']}>
36+
Left column
37+
</div>
38+
<div css={[grid.column.right, 'grid-row: 1']}>
39+
Onward content
40+
</div>
41+
<div css={[border, grid.column.centre, 'grid-row: 1']}>
42+
Standfirst
43+
</div>
44+
<div css={[border, grid.column.centre]}>Meta</div>
45+
<article css={[border, grid.column.centre]}>Body</article>
46+
</div>
47+
<div css={[grid.container, border]}>
48+
<div css={[grid.column.all]}>Footer</div>
49+
</div>
50+
</main>
51+
</>
52+
);
53+
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { Meta, StoryObj } from '@storybook/react-webpack5';
2+
import { allModes } from '../../.storybook/modes';
3+
import { HostedGalleryLayout } from './HostedGalleryLayout';
4+
5+
const meta = {
6+
title: 'Layouts/HostedGallery',
7+
component: HostedGalleryLayout,
8+
parameters: {
9+
chromatic: {
10+
modes: {
11+
'light leftCol': allModes['light leftCol'],
12+
},
13+
},
14+
},
15+
} satisfies Meta<typeof HostedGalleryLayout>;
16+
17+
export default meta;
18+
19+
type Story = StoryObj<typeof meta>;
20+
21+
export const Apps = {
22+
args: {
23+
renderingTarget: 'Apps',
24+
},
25+
parameters: {
26+
config: {
27+
renderingTarget: 'Apps',
28+
},
29+
},
30+
} satisfies Story;
31+
32+
export const Web = {
33+
args: {
34+
renderingTarget: 'Web',
35+
},
36+
parameters: {
37+
config: {
38+
renderingTarget: 'Web',
39+
},
40+
},
41+
} satisfies Story;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { css } from '@emotion/react';
2+
import { grid } from '../grid';
3+
import type { RenderingTarget } from '../types/renderingTarget';
4+
5+
interface Props {
6+
renderingTarget: RenderingTarget;
7+
}
8+
9+
interface WebProps extends Props {
10+
renderingTarget: 'Web';
11+
}
12+
13+
interface AppProps extends Props {
14+
renderingTarget: 'Apps';
15+
}
16+
17+
const border = css`
18+
border: 1px solid black;
19+
`;
20+
21+
export const HostedGalleryLayout = (props: WebProps | AppProps) => {
22+
return (
23+
<>
24+
{props.renderingTarget === 'Web' ? 'Masthead' : null}
25+
<main>
26+
<header css={[grid.container, border]}>
27+
<div
28+
css={[grid.between('centre-column-start', 'grid-end')]}
29+
>
30+
Headline
31+
</div>
32+
</header>
33+
<div css={[grid.container]}>
34+
<article css={[grid.column.all]}>
35+
<div css={border}>Gallery</div>
36+
<div css={border}>Onward</div>
37+
</article>
38+
</div>
39+
<div css={[grid.container, border]}>
40+
<div css={[grid.column.all]}>Footer</div>
41+
</div>
42+
</main>
43+
</>
44+
);
45+
};

0 commit comments

Comments
 (0)