Skip to content

Commit d08e2fc

Browse files
Merge pull request #13657 from guardian/dcar-fullpage-interactives
Full-page interactives in DCAR apps
2 parents 33e280f + 8c31f71 commit d08e2fc

File tree

2 files changed

+117
-59
lines changed

2 files changed

+117
-59
lines changed

dotcom-rendering/src/layouts/DecideLayout.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,13 @@ const DecideLayoutApps = ({ article, format, renderingTarget }: AppProps) => {
100100
);
101101

102102
case ArticleDesign.FullPageInteractive: {
103-
// Should be FullPageInteractiveLayout once implemented for apps
104-
return notSupported;
103+
return (
104+
<FullPageInteractiveLayout
105+
article={article}
106+
format={format}
107+
renderingTarget={renderingTarget}
108+
/>
109+
);
105110
}
106111
case ArticleDesign.LiveBlog:
107112
case ArticleDesign.DeadBlog:
@@ -157,6 +162,7 @@ const DecideLayoutWeb = ({
157162
article={article}
158163
NAV={NAV}
159164
format={format}
165+
renderingTarget={renderingTarget}
160166
/>
161167
);
162168
}
@@ -234,6 +240,7 @@ const DecideLayoutWeb = ({
234240
article={article}
235241
NAV={NAV}
236242
format={format}
243+
renderingTarget={renderingTarget}
237244
/>
238245
);
239246
}

dotcom-rendering/src/layouts/FullPageInteractiveLayout.tsx

Lines changed: 108 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,31 @@ import { palette as themePalette } from '../palette';
2424
import type { ArticleDeprecated } from '../types/article';
2525
import type { ServerSideTests, Switches } from '../types/config';
2626
import type { FEElement } from '../types/content';
27+
import type { RenderingTarget } from '../types/renderingTarget';
2728
import { interactiveGlobalStyles } from './lib/interactiveLegacyStyling';
2829
import { BannerWrapper, Stuck } from './lib/stickiness';
2930

30-
interface Props {
31+
interface CommonProps {
3132
article: ArticleDeprecated;
32-
NAV: NavType;
3333
format: ArticleFormat;
34+
renderingTarget: RenderingTarget;
35+
}
36+
37+
interface WebProps extends CommonProps {
38+
NAV: NavType;
39+
renderingTarget: 'Web';
40+
}
41+
42+
interface AppsProps extends CommonProps {
43+
renderingTarget: 'Apps';
3444
}
3545

46+
type HeaderProps = {
47+
article: ArticleDeprecated;
48+
NAV: NavType;
49+
format: ArticleFormat;
50+
};
51+
3652
type RendererProps = {
3753
format: ArticleFormat;
3854
elements: FEElement[];
@@ -120,7 +136,7 @@ const Renderer = ({
120136
return <div css={adStyles}>{output}</div>;
121137
};
122138

123-
const NavHeader = ({ article, NAV, format }: Props) => {
139+
const NavHeader = ({ article, NAV, format }: HeaderProps) => {
124140
// Typically immersives use the slim nav, but this switch is used to force
125141
// the full nav - typically during special events such as Project 200, or
126142
// the Euros. The motivation is to better onboard new visitors; interactives
@@ -180,25 +196,54 @@ const NavHeader = ({ article, NAV, format }: Props) => {
180196
);
181197
};
182198

183-
export const FullPageInteractiveLayout = ({ article, NAV, format }: Props) => {
199+
export const FullPageInteractiveLayout = (props: WebProps | AppsProps) => {
200+
const { article, format, renderingTarget } = props;
184201
const {
185202
config: { host },
186203
editionId,
187204
} = article;
205+
const isWeb = renderingTarget === 'Web';
206+
const isApps = renderingTarget === 'Apps';
188207

189208
return (
190209
<>
191210
{article.isLegacyInteractive && (
192211
<Global styles={interactiveGlobalStyles} />
193212
)}
194-
<header
195-
css={css`
196-
background-color: ${themePalette('--article-background')};
197-
`}
198-
>
199-
<NavHeader article={article} NAV={NAV} format={format} />
213+
{isWeb && (
214+
<>
215+
<header
216+
css={css`
217+
background-color: ${themePalette(
218+
'--article-background',
219+
)};
220+
`}
221+
>
222+
<NavHeader
223+
article={article}
224+
NAV={props.NAV}
225+
format={format}
226+
/>
200227

201-
{format.theme === ArticleSpecial.Labs && (
228+
{format.theme === ArticleSpecial.Labs && (
229+
<Stuck>
230+
<Section
231+
fullWidth={true}
232+
showTopBorder={false}
233+
padSides={true}
234+
backgroundColour={sourcePalette.labs[400]}
235+
borderColour={sourcePalette.neutral[60]}
236+
sectionId="labs-header"
237+
>
238+
<LabsHeader editionId={editionId} />
239+
</Section>
240+
</Stuck>
241+
)}
242+
</header>
243+
</>
244+
)}
245+
{isApps && format.theme === ArticleSpecial.Labs && (
246+
<header>
202247
<Stuck>
203248
<Section
204249
fullWidth={true}
@@ -211,8 +256,8 @@ export const FullPageInteractiveLayout = ({ article, NAV, format }: Props) => {
211256
<LabsHeader editionId={editionId} />
212257
</Section>
213258
</Stuck>
214-
)}
215-
</header>
259+
</header>
260+
)}
216261

217262
<Section
218263
fullWidth={true}
@@ -246,7 +291,7 @@ export const FullPageInteractiveLayout = ({ article, NAV, format }: Props) => {
246291
</article>
247292
</Section>
248293

249-
{NAV.subNavSections && (
294+
{isWeb && props.NAV.subNavSections && (
250295
<Section
251296
fullWidth={true}
252297
padSides={false}
@@ -255,60 +300,66 @@ export const FullPageInteractiveLayout = ({ article, NAV, format }: Props) => {
255300
>
256301
<Island priority="enhancement" defer={{ until: 'visible' }}>
257302
<SubNav
258-
subNavSections={NAV.subNavSections}
259-
currentNavLink={NAV.currentNavLink}
303+
subNavSections={props.NAV.subNavSections}
304+
currentNavLink={props.NAV.currentNavLink}
260305
position="footer"
261306
isInteractive={true}
262307
/>
263308
</Island>
264309
</Section>
265310
)}
266311

267-
<Section
268-
fullWidth={true}
269-
padSides={false}
270-
backgroundColour={sourcePalette.brand[400]}
271-
borderColour={sourcePalette.brand[600]}
272-
showSideBorders={false}
273-
element="footer"
274-
>
275-
<Footer
276-
pageFooter={article.pageFooter}
277-
selectedPillar={NAV.selectedPillar}
278-
pillars={NAV.pillars}
279-
urls={article.nav.readerRevenueLinks.footer}
280-
editionId={article.editionId}
281-
/>
282-
</Section>
312+
{isWeb && (
313+
<>
314+
<Section
315+
fullWidth={true}
316+
padSides={false}
317+
backgroundColour={sourcePalette.brand[400]}
318+
borderColour={sourcePalette.brand[600]}
319+
showSideBorders={false}
320+
element="footer"
321+
>
322+
<Footer
323+
pageFooter={article.pageFooter}
324+
selectedPillar={props.NAV.selectedPillar}
325+
pillars={props.NAV.pillars}
326+
urls={article.nav.readerRevenueLinks.header}
327+
editionId={article.editionId}
328+
/>
329+
</Section>
283330

284-
<BannerWrapper>
285-
<Island priority="feature" defer={{ until: 'idle' }}>
286-
<StickyBottomBanner
331+
<BannerWrapper>
332+
<Island priority="feature" defer={{ until: 'idle' }}>
333+
<StickyBottomBanner
334+
contentType={article.contentType}
335+
contributionsServiceUrl={
336+
article.contributionsServiceUrl
337+
}
338+
idApiUrl={article.config.idApiUrl}
339+
isMinuteArticle={
340+
article.pageType.isMinuteArticle
341+
}
342+
isPaidContent={article.pageType.isPaidContent}
343+
isPreview={!!article.config.isPreview}
344+
isSensitive={article.config.isSensitive}
345+
pageId={article.pageId}
346+
sectionId={article.config.section}
347+
shouldHideReaderRevenue={
348+
article.shouldHideReaderRevenue
349+
}
350+
remoteBannerSwitch={
351+
!!article.config.switches.remoteBanner
352+
}
353+
tags={article.tags}
354+
/>
355+
</Island>
356+
</BannerWrapper>
357+
<MobileStickyContainer
287358
contentType={article.contentType}
288-
contributionsServiceUrl={
289-
article.contributionsServiceUrl
290-
}
291-
idApiUrl={article.config.idApiUrl}
292-
isMinuteArticle={article.pageType.isMinuteArticle}
293-
isPaidContent={article.pageType.isPaidContent}
294-
isPreview={!!article.config.isPreview}
295-
isSensitive={article.config.isSensitive}
296359
pageId={article.pageId}
297-
sectionId={article.config.section}
298-
shouldHideReaderRevenue={
299-
article.shouldHideReaderRevenue
300-
}
301-
remoteBannerSwitch={
302-
!!article.config.switches.remoteBanner
303-
}
304-
tags={article.tags}
305360
/>
306-
</Island>
307-
</BannerWrapper>
308-
<MobileStickyContainer
309-
contentType={article.contentType}
310-
pageId={article.pageId}
311-
/>
361+
</>
362+
)}
312363
</>
313364
);
314365
};

0 commit comments

Comments
 (0)