diff --git a/dotcom-rendering/src/components/InteractiveLayoutAtom.stories.tsx b/dotcom-rendering/src/components/InteractiveLayoutAtom.stories.tsx
index 42e17066399..27fd4e99906 100644
--- a/dotcom-rendering/src/components/InteractiveLayoutAtom.stories.tsx
+++ b/dotcom-rendering/src/components/InteractiveLayoutAtom.stories.tsx
@@ -21,7 +21,7 @@ export const InteractiveLayoutAtom = meta.story({
design: 0,
theme: 0,
},
- articleArrangement: 'interactive',
+ articleArrangement: 'interactiveStandard',
},
decorators: (StoryComponent) => (
{
design: 0,
theme: 0,
}}
- articleArrangement="interactive"
+ articleArrangement="interactiveStandard"
/>,
);
diff --git a/dotcom-rendering/src/components/SeriesSectionLink.tsx b/dotcom-rendering/src/components/SeriesSectionLink.tsx
index 3af813da98b..c632a50e2b3 100644
--- a/dotcom-rendering/src/components/SeriesSectionLink.tsx
+++ b/dotcom-rendering/src/components/SeriesSectionLink.tsx
@@ -470,13 +470,22 @@ export const SeriesSectionLink = ({
marginRight,
fontStyles(format),
breakWord,
- css`
- box-shadow:
- -6px 0 0 0
- ${themePalette('--series-title-background')},
- 6px 0 0 0
- ${themePalette('--series-title-background')};
- `,
+ layoutType !== 'interactiveTopHatFull' &&
+ css`
+ box-shadow:
+ -6px 0 0 0
+ ${themePalette(
+ '--series-title-background',
+ )},
+ 6px 0 0 0
+ ${themePalette(
+ '--series-title-background',
+ )};
+ `,
+ layoutType === 'interactiveTopHatFull' &&
+ css`
+ padding: 0 4px;
+ `,
]}
data-component="series"
data-link-name="article series"
diff --git a/dotcom-rendering/src/layouts/StandardLayoutArticleGrid.tsx b/dotcom-rendering/src/layouts/StandardLayoutArticleGrid.tsx
index 2fbb6d13567..c0cb2948728 100644
--- a/dotcom-rendering/src/layouts/StandardLayoutArticleGrid.tsx
+++ b/dotcom-rendering/src/layouts/StandardLayoutArticleGrid.tsx
@@ -1,6 +1,11 @@
import { css } from '@emotion/react';
import { log } from '@guardian/libs';
-import { from, space, until } from '@guardian/source/foundations';
+import {
+ from,
+ headlineMedium17,
+ space,
+ until,
+} from '@guardian/source/foundations';
import { Hide } from '@guardian/source/react-components';
import { StraightLines } from '@guardian/source-development-kitchen/react-components';
import { AffiliateDisclaimer } from '../components/AffiliateProducts/AffiliateDisclaimer';
@@ -161,6 +166,41 @@ const GridItem = ({
);
+const TopHatScrollPrompt = ({ topGap }: { topGap: number }) => (
+
+
+
Scroll to continue
+
+);
+
export const StandardLayoutArticleGrid = ({
article,
format,
@@ -229,11 +269,38 @@ export const StandardLayoutArticleGrid = ({
const layoutType = getLayoutType(format, mainMediaOrientation);
+ const setCentreRule = (gridLayout: LayoutType) => {
+ if (isLabs || gridLayout === 'interactiveStandard') return undefined;
+
+ const getColumnCount = () => {
+ switch (gridLayout) {
+ case 'immersivePortrait':
+ case 'immersiveLandscape':
+ return 4;
+ case 'interactiveTopHatFull':
+ return 6;
+ case 'interactiveTopHatLite':
+ return 5;
+ default:
+ return 3;
+ }
+ };
+
+ return css`
+ ${from.leftCol} {
+ ${grid.centreRule(getColumnCount())}
+ }
+ `;
+ };
+
const contentLayoutName = `${ArticleDisplay[format.display]}Layout`;
const isImmersivePortrait = layoutType === 'immersivePortrait';
const isImmersiveLandscape = layoutType === 'immersiveLandscape';
const isImmersive = isImmersivePortrait || isImmersiveLandscape;
+ const isInteractiveTopHat =
+ layoutType === 'interactiveTopHatLite' ||
+ layoutType === 'interactiveTopHatFull';
const hasMinimumImageHeight =
isLabs && isImmersivePortrait && isMainMediaImage;
@@ -259,7 +326,16 @@ export const StandardLayoutArticleGrid = ({
}
`;
const hideCaptionBeneathMainMedia =
- layoutType === 'media' || isImmersiveLandscape || isImmersivePortrait;
+ layoutType === 'media' ||
+ isInteractiveTopHat ||
+ isImmersiveLandscape ||
+ isImmersivePortrait;
+
+ const topHatFurnitureBackgroundStyles = css`
+ z-index: ${getZIndex('mediaOverlay')};
+ background: rgba(255, 255, 255, 0.9);
+ padding: 0 10px;
+ `;
return (
{layoutType === 'picture' || layoutType === 'comment' ? (
@@ -535,6 +614,9 @@ export const StandardLayoutArticleGrid = ({
area="standfirst"
layoutType={layoutType}
css={[
+ css`
+ position: relative;
+ `,
isImmersive &&
css`
${until.tablet} {
@@ -551,6 +633,7 @@ export const StandardLayoutArticleGrid = ({
padding-bottom: 14px;
}
`,
+ isInteractiveTopHat && topHatFurnitureBackgroundStyles,
]}
>
+ {layoutType === 'interactiveTopHatLite' && (
+
+ )}
{isImmersive && (
{format.display !== ArticleDisplay.Immersive &&
format.design !== ArticleDesign.Audio &&
- layoutType !== 'immersivePortrait' && (
+ layoutType !== 'immersivePortrait' &&
+ !isInteractiveTopHat && (
>
)}
+ {layoutType === 'interactiveTopHatFull' && (
+
+ )}
)}
- {layoutType === 'interactive' && (
+ {layoutType === 'interactiveStandard' && (
= {
standard: standardCss,
showcase: showcaseCss,
media: mediaCss,
picture: pictureCss,
comment: commentCss,
- interactive: standardCss,
+ interactiveStandard: standardCss,
+ interactiveTopHatLite: interactiveTopHatLiteCss,
+ interactiveTopHatFull: interactiveTopHatFullCss,
immersiveLandscape: immersiveLandscapeCss,
immersivePortrait: immersivePortraitCss,
};
@@ -389,6 +452,8 @@ export const getLayoutType = (
format: ArticleFormat,
mainMediaOrientation: 'portrait' | 'landscape' | 'square',
): LayoutType => {
+ // return 'interactiveTopHatLite';
+ // return 'interactiveTopHatFull';
if (format.display === ArticleDisplay.Immersive) {
if (
mainMediaOrientation === 'portrait' ||
@@ -414,6 +479,8 @@ export const getLayoutType = (
) {
return 'comment';
}
- if (format.design === ArticleDesign.Interactive) return 'interactive';
+ if (format.design === ArticleDesign.Interactive) {
+ return 'interactiveStandard';
+ }
return 'standard';
};
diff --git a/dotcom-rendering/src/lib/interactiveAtoms.test.tsx b/dotcom-rendering/src/lib/interactiveAtoms.test.tsx
index 19230706a52..b195f3dfa46 100644
--- a/dotcom-rendering/src/lib/interactiveAtoms.test.tsx
+++ b/dotcom-rendering/src/lib/interactiveAtoms.test.tsx
@@ -64,7 +64,7 @@ describe('Interactive atom custom data attributes', () => {
design: 0,
theme: 0,
}}
- articleArrangement="interactive"
+ articleArrangement="interactiveStandard"
/>,
);
const el = container.querySelector(