{props.renderAds ? (
@@ -404,7 +419,7 @@ const BannerAndMasthead = (props: {
idApiUrl={props.config.idApiUrl}
contributionsServiceUrl={props.contributionsServiceUrl}
showSubNav={false}
- showSlimNav={true}
+ showSlimNav={props.showSlimNav ?? true}
hasPageSkin={false}
hasPageSkinContentSelfConstrain={false}
pageId={props.pageId}
diff --git a/dotcom-rendering/src/layouts/InteractiveLayout.tsx b/dotcom-rendering/src/layouts/InteractiveLayout.tsx
index c2f9f24deee..0fc4f979ba4 100644
--- a/dotcom-rendering/src/layouts/InteractiveLayout.tsx
+++ b/dotcom-rendering/src/layouts/InteractiveLayout.tsx
@@ -18,7 +18,7 @@ import { ArticleTitle } from '../components/ArticleTitle';
import { Border } from '../components/Border';
import { Carousel } from '../components/Carousel.island';
import { DecideLines } from '../components/DecideLines';
-import { DirectoryPageNav } from '../components/DirectoryPageNav';
+import { DirectoryPageNavIsland } from '../components/DirectoryPageNavIsland';
import { DiscussionLayout } from '../components/DiscussionLayout';
import { Footer } from '../components/Footer';
import { GridItem } from '../components/GridItem';
@@ -311,7 +311,7 @@ export const InteractiveLayout = (props: WebProps | AppsProps) => {
>
)}
-
diff --git a/dotcom-rendering/src/layouts/LiveLayout.tsx b/dotcom-rendering/src/layouts/LiveLayout.tsx
index ff64da7bd6f..353a5b570dd 100644
--- a/dotcom-rendering/src/layouts/LiveLayout.tsx
+++ b/dotcom-rendering/src/layouts/LiveLayout.tsx
@@ -20,6 +20,7 @@ import { ArticleMeta } from '../components/ArticleMeta.web';
import { ArticleTitle } from '../components/ArticleTitle';
import { Carousel } from '../components/Carousel.island';
import { DecideLines } from '../components/DecideLines';
+import { DirectoryPageNavIsland } from '../components/DirectoryPageNavIsland';
import { DiscussionLayout } from '../components/DiscussionLayout';
import { FilterKeyEventsToggle } from '../components/FilterKeyEventsToggle.island';
import { FootballMatchHeaderFallback } from '../components/FootballMatchHeader/FootballMatchHeaderFallback';
@@ -50,6 +51,8 @@ import { canRenderAds } from '../lib/canRenderAds';
import { getContributionsServiceUrl } from '../lib/contributions';
import { decideStoryPackageTrails } from '../lib/decideTrail';
import { getZIndex } from '../lib/getZIndex';
+import { useBetaAB } from '../lib/useAB';
+import { worldCupTagId } from '../lib/worldCup2026';
import type { NavType } from '../model/extract-nav';
import { palette as themePalette } from '../palette';
import type { ArticleDeprecated } from '../types/article';
@@ -305,6 +308,12 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
const renderAds = canRenderAds(article);
+ const ab = useBetaAB();
+
+ const isWorldCup2026 =
+ article.tags.some((tag) => tag.id === worldCupTagId) &&
+ ab?.isUserInTest('webx-world-cup-2026-subnav');
+
const isWeb = renderingTarget === 'Web';
const isApps = renderingTarget === 'Apps';
@@ -337,7 +346,7 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
discussionApiUrl={article.config.discussionApiUrl}
idApiUrl={article.config.idApiUrl}
contributionsServiceUrl={contributionsServiceUrl}
- showSubNav={true}
+ showSubNav={!isWorldCup2026}
showSlimNav={false}
hasPageSkin={false}
hasPageSkinContentSelfConstrain={false}
@@ -354,6 +363,10 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
)}
+
{isWeb && renderAds && hasLiveBlogTopAd && (
{
const renderAds = canRenderAds(article);
+ const ab = useBetaAB();
+
+ const isWorldCup2026 =
+ article.tags.some((tag) => tag.id === worldCupTagId) &&
+ ab?.isUserInTest('webx-world-cup-2026-subnav');
+
const avatarUrl = getSoleContributor(article.tags, article.byline)
?.bylineLargeImageUrl;
@@ -303,7 +312,7 @@ export const PictureLayout = (props: WebProps | AppsProps) => {
discussionApiUrl={article.config.discussionApiUrl}
idApiUrl={article.config.idApiUrl}
contributionsServiceUrl={contributionsServiceUrl}
- showSubNav={true}
+ showSubNav={!isWorldCup2026}
showSlimNav={false}
hasPageSkin={false}
hasPageSkinContentSelfConstrain={false}
@@ -330,6 +339,10 @@ export const PictureLayout = (props: WebProps | AppsProps) => {
)}
+
{
const contributionsServiceUrl = getContributionsServiceUrl(article);
+ const ab = useBetaAB();
+
+ const isWorldCup2026 =
+ article.tags.some((tag) => tag.id === worldCupTagId) &&
+ ab?.isUserInTest('webx-world-cup-2026-subnav');
+
const renderAds = canRenderAds(article);
const isLabs = format.theme === ArticleSpecial.Labs;
@@ -282,7 +290,7 @@ export const ShowcaseLayout = (props: WebProps | AppsProps) => {
contributionsServiceUrl={
contributionsServiceUrl
}
- showSubNav={true}
+ showSubNav={!isWorldCup2026}
showSlimNav={false}
hasPageSkin={false}
hasPageSkinContentSelfConstrain={false}
@@ -365,7 +373,7 @@ export const ShowcaseLayout = (props: WebProps | AppsProps) => {
)}
-
diff --git a/dotcom-rendering/src/layouts/StandardLayout.tsx b/dotcom-rendering/src/layouts/StandardLayout.tsx
index 65ebfbc5994..8c181465d57 100644
--- a/dotcom-rendering/src/layouts/StandardLayout.tsx
+++ b/dotcom-rendering/src/layouts/StandardLayout.tsx
@@ -22,7 +22,7 @@ import { ArticleTitle } from '../components/ArticleTitle';
import { Border } from '../components/Border';
import { Carousel } from '../components/Carousel.island';
import { DecideLines } from '../components/DecideLines';
-import { DirectoryPageNav } from '../components/DirectoryPageNav';
+import { DirectoryPageNavIsland } from '../components/DirectoryPageNavIsland';
import { DiscussionLayout } from '../components/DiscussionLayout';
import { FootballMatchHeaderWrapper } from '../components/FootballMatchHeaderWrapper.island';
import { FootballMatchInfoWrapper } from '../components/FootballMatchInfoWrapper.island';
@@ -57,6 +57,8 @@ import { decideStoryPackageTrails } from '../lib/decideTrail';
import type { EditionId } from '../lib/edition';
import { safeParseURL } from '../lib/parse';
import { parse } from '../lib/slot-machine-flags';
+import { useBetaAB } from '../lib/useAB';
+import { worldCupTagId } from '../lib/worldCup2026';
import type { NavType } from '../model/extract-nav';
import { palette as themePalette } from '../palette';
import type { ArticleDeprecated } from '../types/article';
@@ -383,6 +385,12 @@ export const StandardLayout = (props: WebProps | AppProps) => {
const isLabs = format.theme === ArticleSpecial.Labs;
+ const ab = useBetaAB();
+
+ const isWorldCup2026 =
+ article.tags.some((tag) => tag.id === worldCupTagId) &&
+ ab?.isUserInTest('webx-world-cup-2026-subnav');
+
const renderAds = canRenderAds(article);
return (
@@ -410,7 +418,7 @@ export const StandardLayout = (props: WebProps | AppProps) => {
discussionApiUrl={article.config.discussionApiUrl}
idApiUrl={article.config.idApiUrl}
contributionsServiceUrl={contributionsServiceUrl}
- showSubNav={!isLabs}
+ showSubNav={!isLabs && !isWorldCup2026}
showSlimNav={false}
hasPageSkinContentSelfConstrain={true}
pageId={article.pageId}
@@ -455,7 +463,7 @@ export const StandardLayout = (props: WebProps | AppProps) => {
)}
-
diff --git a/dotcom-rendering/src/layouts/TagPageLayout.tsx b/dotcom-rendering/src/layouts/TagPageLayout.tsx
index 10933b47239..4a22b11253e 100644
--- a/dotcom-rendering/src/layouts/TagPageLayout.tsx
+++ b/dotcom-rendering/src/layouts/TagPageLayout.tsx
@@ -3,7 +3,7 @@ import { palette } from '@guardian/source/foundations';
import { Fragment } from 'react';
import { Accessibility } from '../components/Accessibility.island';
import { DecideContainerByTrails } from '../components/DecideContainerByTrails';
-import { DirectoryPageNav } from '../components/DirectoryPageNav';
+import { DirectoryPageNavIsland } from '../components/DirectoryPageNavIsland';
import { Footer } from '../components/Footer';
import {
FrontsBannerAdSlot,
@@ -110,7 +110,7 @@ export const TagPageLayout = ({ tagPage, NAV }: Props) => {