Skip to content
Draft
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c27fe8b
detect portrait image + add style
emilysaffron Nov 14, 2025
1625b1b
add gradient
emilysaffron Nov 14, 2025
95dffb3
update tests
emilysaffron Nov 14, 2025
f49add0
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 14, 2025
4f4886e
undo commented out effect
emilysaffron Nov 14, 2025
7b630d5
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 14, 2025
154c975
update bundle size max
emilysaffron Nov 14, 2025
cae21d3
update integration snapshots
emilysaffron Nov 14, 2025
c35f5a2
update z index for play button
emilysaffron Nov 14, 2025
72bcb8c
add isCurationPromo condition
emilysaffron Nov 17, 2025
6269515
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 17, 2025
6182c31
add storybook example
emilysaffron Nov 17, 2025
581ea37
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 17, 2025
f5a3c88
update default state
emilysaffron Nov 17, 2025
5ba9a81
clean up
emilysaffron Nov 17, 2025
4e2d44a
clean up
emilysaffron Nov 17, 2025
2de54b5
snapshots
emilysaffron Nov 17, 2025
899ceb0
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 17, 2025
741bda6
remove conditional
emilysaffron Nov 18, 2025
0358f97
conditinal on all promos
emilysaffron Nov 18, 2025
501c66b
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 18, 2025
4b06899
fix accidental changes
emilysaffron Nov 18, 2025
d631a25
integration
emilysaffron Nov 18, 2025
693cfd2
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 18, 2025
0e0bd24
default to false for portrait
emilysaffron Nov 18, 2025
23164e3
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 18, 2025
58f222c
use white from theme
emilysaffron Nov 18, 2025
8c83113
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 18, 2025
eafae85
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 19, 2025
a048344
use originalSize to set isPortrait
emilysaffron Nov 20, 2025
e48de6c
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 20, 2025
e68ff73
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 20, 2025
74b8bd4
add default
emilysaffron Nov 20, 2025
3a09577
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 20, 2025
3c8f771
extend conditional
emilysaffron Nov 24, 2025
17b1b0d
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 24, 2025
3f0d5b2
conditionally call hook
emilysaffron Nov 24, 2025
826c9cb
Merge branch 'WS-1674-PVdisplayintopicpromo' of github.com:bbc/simorg…
emilysaffron Nov 24, 2025
ca0a81d
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 24, 2025
fabf938
Merge branch 'latest' into WS-1674-PVdisplayintopicpromo
emilysaffron Nov 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
315 changes: 315 additions & 0 deletions data/persian/topics/c6z7mnr559gt.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion scripts/bundleSize/bundleSizeConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
export const VARIANCE = 5;

export const MIN_SIZE = 916;
export const MAX_SIZE = 1257;
export const MAX_SIZE = 1269;
14 changes: 10 additions & 4 deletions src/app/components/Curation/CurationGrid/index.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from 'react';
import fixture from '#data/pidgin/topics/c95y35941vrt.json';
import highImpactPromoFixture from '#data/ws/homePage/index.json';
import curationWithPVs from '#data/persian/topics/c6z7mnr559gt.json';
import { Summary } from '#app/models/types/curationData';

import CurationGrid from '.';
Expand All @@ -22,14 +23,19 @@ export default {
};

export const Example = () => {
return (
<Component summaries={fixture.data?.curations[0].summaries} />
);
return <Component summaries={fixture.data?.curations[0].summaries} />;
};

export const CurationGridWithPortraitVideos = () => {
return <Component summaries={curationWithPVs.data?.curations[0].summaries} />;
};

export const HighImpactPromo = () => {
return (
<Component summaries={highImpactPromoFixture.data.curations[0].summaries as Summary[]} />
<Component
summaries={
highImpactPromoFixture.data.curations[0].summaries as Summary[]
}
/>
);
};
1 change: 1 addition & 0 deletions src/app/components/Curation/CurationPromo/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ const CurationPromo = ({
alt={imageAlt}
lazyLoad={lazy}
isAmp={isAmp}
isCurationPromo
{...(isLite && { css: styles.image })}
>
{isMedia && (
Expand Down
15 changes: 15 additions & 0 deletions src/app/components/Image/index.styles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ const styles = {
width: '100%',
objectFit: 'cover', // objectFit used in combination with inline style aspectRatio will center the image horizontally and vertically if aspectRatio prop is different from image's intrinsic aspect ratio
}),
portraitImage: css({
position: 'relative',
width: '100%',
objectFit: 'contain',
}),
imageFixedAspectRatio: css({
height: 'auto',
}),
Expand All @@ -38,6 +43,16 @@ const styles = {
portraitOrientation: css({
position: 'absolute',
}),

gradientBackground: css({
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
pointerEvents: 'none',
filter: `blur(15px)`,
}),
};

export default styles;
12 changes: 0 additions & 12 deletions src/app/components/Image/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,6 @@ describe('Image - Canonical', () => {
});
});

it('should render a placeholder image when placeholder is true', () => {
render(<Fixture />);
const imageEl = screen.getByAltText('Test image alt text');
expect(imageEl.parentNode).toHaveStyle({
backgroundImage: `url(${BASE64_PLACEHOLDER_IMAGE})`,
});
});

it('should render a placeholder image when placeholder is true', () => {
render(<Fixture darkPlaceholder />);
const imageEl = screen.getByAltText('Test image alt text');
Expand All @@ -156,7 +148,6 @@ describe('Image - Canonical', () => {

it('should render the container with an aspect ratio based on width and height', () => {
render(<Fixture />);

const imageEl = screen.getByAltText('Test image alt text');
expect(imageEl.parentNode).toHaveStyle({
paddingBottom: '56.2%',
Expand All @@ -167,7 +158,6 @@ describe('Image - Canonical', () => {
render(<Fixture width={undefined} height={undefined} />);

const imageEl = screen.getByAltText('Test image alt text');

expect(imageEl.parentNode).toHaveStyle({
paddingBottom: '0',
});
Expand All @@ -179,7 +169,6 @@ describe('Image - Canonical', () => {
);

const imageEl = screen.getByAltText('Test image alt text');

expect(imageEl.parentNode).toHaveStyle({
paddingBottom: '75%',
});
Expand All @@ -189,7 +178,6 @@ describe('Image - Canonical', () => {
render(<Fixture aspectRatio={[4, 3]} />);

const imageEl = screen.getByAltText('Test image alt text');

expect(imageEl.parentNode).toHaveStyle({
paddingBottom: '75%',
});
Expand Down
67 changes: 63 additions & 4 deletions src/app/components/Image/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
/** @jsx jsx */
/* @jsxFrag React.Fragment */
import React, { Fragment, PropsWithChildren, useState, use } from 'react';
import { Global, jsx } from '@emotion/react';
import React, {
Fragment,
PropsWithChildren,
useState,
use,
useEffect,
} from 'react';
import { Global, jsx, useTheme } from '@emotion/react';
import { Helmet } from 'react-helmet';
import useImageColour from '#app/hooks/useImageColour';
import styles from './index.styles';
import { RequestContext } from '../../contexts/RequestContext';
import { HOME_PAGE } from '../../routes/utils/pageTypes';
Expand All @@ -27,6 +34,7 @@ export type ImageProps = {
fetchPriority?: 'high';
hasCaption?: boolean;
isPortraitOrientation?: boolean;
isCurationPromo?: boolean;
};

const roundNumber = (num: number) => Math.round(num * 100) / 100;
Expand Down Expand Up @@ -56,9 +64,32 @@ const Image = ({
fetchPriority,
hasCaption,
isPortraitOrientation,
isCurationPromo,
}: PropsWithChildren<ImageProps>) => {
const { pageType, isLite, isAmp } = use(RequestContext);
const [isLoaded, setIsLoaded] = useState(false);
const [isPortrait, setIsPortrait] = useState(true);
const imgRef = React.useRef<HTMLImageElement | null>(null);

useEffect(() => {
const img = imgRef.current;
if (img?.complete) {
setIsPortrait(img.naturalHeight > img.naturalWidth);
setIsLoaded(true);
}
}, []);

const {
palette: { GREY_8 },
} = useTheme();

const { isLoading, colour } = useImageColour(src, {
fallbackColour: GREY_8,
minimumContrast: 0,
contrastColour: '#ffffff',
paletteSize: 10,
});

if (isLite) return null;

const showPlaceholder = placeholder && !isLoaded;
Expand Down Expand Up @@ -164,8 +195,25 @@ const Image = ({
/>
</>
)}
{isPortrait && isCurationPromo && (
<div
css={[
styles.gradientBackground,
{
background: colour
? `linear-gradient(200deg,rgba(${colour.rgb.join(',')}, 0.6) 0%, #180109 54%, #180109 90%)`
: `linear-gradient(200deg, ${GREY_8} 0%, #180109 54%, #180109 90%)`,
},
]}
/>
)}
<img
onLoad={() => setIsLoaded(true)}
ref={imgRef}
onLoad={e => {
const img = e.currentTarget;
setIsPortrait(img.naturalHeight > img.naturalWidth);
setIsLoaded(true);
}}
src={src}
{...(srcSet && { srcSet: imgSrcSet })}
{...(imgSizes && { sizes: imgSizes })}
Expand All @@ -174,10 +222,21 @@ const Image = ({
width={width}
height={height}
css={[
styles.image,
isPortrait && isCurationPromo
? styles.portraitImage
: styles.image,
hasFixedAspectRatio
? styles.imageFixedAspectRatio
: styles.imageResponsiveRatio,
isCurationPromo &&
!isLoading && {
[`@supports (filter: blur(15px))`]: {
background: `rgba(${colour?.rgb?.join(',')}, 0.62)`,
},
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with Aaron on making a separate component for this as I'm not 100% sure about having these changes in our native image component for this "temporary" fix. It feels like the colour stuff should be encapsulated within it's own component to prevent any accidental re-rendering or other side effects.

This feels more permanent than temporary. Is there something simpler we could do like just having a black background across the board? If we stick with the isPortrait mechanism, we should probably align the API we have already for the orientation value that we use on media players, to make it a lil more consistent.

Maybe we do a huddle on this to discuss our options?

isCurationPromo && {
background: `rgb(${colour?.rgb?.join(',')})`,
},
]}
fetchPriority={fetchPriority}
style={{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ exports[`Canonical Home Page Page content First item in the first curation is th
exports[`Canonical Home Page Page content First item in the first curation is the correct image 1`] = `
<img
alt="الرياضه"
class="bbc-139onq"
class="bbc-4ejld5"
fetchpriority="high"
loading="eager"
src="https://ichef.test.bbci.co.uk/ace/standard/240/cpsdevpb/36C4/test/_63702041_tv000117434.jpg"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ exports[`Canonical Home Page Page content First item in the first curation is th
exports[`Canonical Home Page Page content First item in the first curation is the correct image 1`] = `
<img
alt="पहलगाम"
class="bbc-139onq"
class="bbc-4ejld5"
loading="lazy"
src="https://ichef.bbci.co.uk/ace/ws/240/cpsprodpb/8b52/live/6c11f130-2c01-11f0-8da1-ad2bbee6cda5.jpg.webp"
style="aspect-ratio:16 / 9"
Expand Down Expand Up @@ -823,7 +823,7 @@ exports[`Canonical Home Page messageBanner has a link 1`] = `"https://whatsapp.c
exports[`Canonical Home Page messageBanner has an image 1`] = `
<img
alt=""
class="bbc-139onq"
class="bbc-4ejld5"
loading="eager"
sizes="(max-width: 37.4375rem) 184px, 224px"
src="https://ichef.bbci.co.uk/ace/ws/224/cpsprodpb/3bc3/live/e712bd90-225e-11ef-80aa-699d54c46324.png.webp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ exports[`Canonical Home Page Page content First item in the first curation is th

exports[`Canonical Home Page Page content First item in the first curation is the correct image 1`] = `
<img
class="bbc-139onq"
class="bbc-4ejld5"
fetchpriority="high"
loading="eager"
src="https://ichef.bbci.co.uk/ace/ws/240/cpsprodpb/36D1/production/_127933041__63970643_bbc-news-world-service-logo-nc.png.webp"
Expand Down Expand Up @@ -748,7 +748,7 @@ exports[`Canonical Home Page messageBanner has a link 1`] = `"https://www.bbc.co
exports[`Canonical Home Page messageBanner has an image 1`] = `
<img
alt=""
class="bbc-139onq"
class="bbc-4ejld5"
loading="eager"
sizes="(max-width: 37.4375rem) 184px, 224px"
src="https://ichef.test.bbci.co.uk/ace/ws/224/cpsdevpb/0af7/test/5a5151c0-a3aa-11ed-9015-6935ab4fa6ca.png.webp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ exports[`Canonical Home Page Page content First item in the first curation is th
exports[`Canonical Home Page Page content First item in the first curation is the correct image 1`] = `
<img
alt="Promena kod svake žene"
class="bbc-139onq"
class="bbc-4ejld5"
fetchpriority="high"
loading="eager"
src="https://ichef.bbci.co.uk/ace/ws/240/cpsdevpb/3d07/test/7ea19630-8d4a-11ef-8e34-ef6bbfe11731.jpg.webp"
Expand Down Expand Up @@ -492,7 +492,7 @@ exports[`Canonical Home Page messageBanner has a link 1`] = `"https://www.whatsa
exports[`Canonical Home Page messageBanner has an image 1`] = `
<img
alt=""
class="bbc-139onq"
class="bbc-4ejld5"
loading="eager"
sizes="(max-width: 37.4375rem) 184px, 224px"
src="https://ichef.test.bbci.co.uk/ace/ws/224/cpsdevpb/0409/test/6d7272a0-abfc-11ef-b4f6-4568dfb1f4fc.png.webp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ exports[`Canonical Home Page Page content First item in the first curation is th
exports[`Canonical Home Page Page content First item in the first curation is the correct image 1`] = `
<img
alt="Promena kod svake žene"
class="bbc-139onq"
class="bbc-4ejld5"
fetchpriority="high"
loading="eager"
src="https://ichef.bbci.co.uk/ace/ws/240/cpsdevpb/3d07/test/7ea19630-8d4a-11ef-8e34-ef6bbfe11731.jpg.webp"
Expand Down Expand Up @@ -492,7 +492,7 @@ exports[`Canonical Home Page messageBanner has a link 1`] = `"https://www.whatsa
exports[`Canonical Home Page messageBanner has an image 1`] = `
<img
alt=""
class="bbc-139onq"
class="bbc-4ejld5"
loading="eager"
sizes="(max-width: 37.4375rem) 184px, 224px"
src="https://ichef.test.bbci.co.uk/ace/ws/224/cpsdevpb/0409/test/6d7272a0-abfc-11ef-b4f6-4568dfb1f4fc.png.webp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a figure caption 1`]
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p08b216l.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p08b216l.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p08b216l.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p08b216l.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p08b216l.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p08b216l.png.webp 800w"
Expand Down Expand Up @@ -320,7 +320,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a placeholder 1`] = `
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p08b216l.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p08b216l.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p08b216l.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p08b216l.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p08b216l.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p08b216l.png.webp 800w"
Expand Down Expand Up @@ -401,7 +401,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a valid container 1`]
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p08b216l.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p08b216l.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p08b216l.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p08b216l.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p08b216l.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p08b216l.png.webp 800w"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a figure caption 1`]
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p0k5s1yz.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p0k5s1yz.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p0k5s1yz.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p0k5s1yz.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p0k5s1yz.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p0k5s1yz.png.webp 800w"
Expand Down Expand Up @@ -344,7 +344,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a placeholder 1`] = `
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p0k5s1yz.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p0k5s1yz.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p0k5s1yz.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p0k5s1yz.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p0k5s1yz.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p0k5s1yz.png.webp 800w"
Expand Down Expand Up @@ -425,7 +425,7 @@ exports[`Canonical On Demand T V Page Media Loader renders a valid container 1`]
>
<img
alt=""
class="bbc-ipdj63"
class="bbc-1uq6tv3"
loading="eager"
src="https://ichef.bbci.co.uk/images/ic/$recipe/p0k5s1yz.png"
srcset="https://ichef.bbci.co.uk/images/ic/240xn/p0k5s1yz.png.webp 240w, https://ichef.bbci.co.uk/images/ic/320xn/p0k5s1yz.png.webp 320w, https://ichef.bbci.co.uk/images/ic/480xn/p0k5s1yz.png.webp 480w, https://ichef.bbci.co.uk/images/ic/624xn/p0k5s1yz.png.webp 624w, https://ichef.bbci.co.uk/images/ic/800xn/p0k5s1yz.png.webp 800w"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ exports[`Canonical Articles Media Loader renders a figure caption 1`] = `
>
<img
alt=""
class="css-1uq6tv3"
class="css-9508jy"
loading="eager"
src="https://ichef.test.bbci.co.uk/images/ic/512xn/p01t1jn0.jpg.webp"
srcset="https://ichef.test.bbci.co.uk/images/ic/240xn/p01t1jn0.jpg.webp 240w, https://ichef.test.bbci.co.uk/images/ic/320xn/p01t1jn0.jpg.webp 320w, https://ichef.test.bbci.co.uk/images/ic/480xn/p01t1jn0.jpg.webp 480w, https://ichef.test.bbci.co.uk/images/ic/624xn/p01t1jn0.jpg.webp 624w, https://ichef.test.bbci.co.uk/images/ic/800xn/p01t1jn0.jpg.webp 800w"
Expand Down Expand Up @@ -150,7 +150,7 @@ exports[`Canonical Articles Media Loader renders a placeholder 1`] = `
>
<img
alt=""
class="css-1uq6tv3"
class="css-9508jy"
loading="eager"
src="https://ichef.test.bbci.co.uk/images/ic/512xn/p01t1jn0.jpg.webp"
srcset="https://ichef.test.bbci.co.uk/images/ic/240xn/p01t1jn0.jpg.webp 240w, https://ichef.test.bbci.co.uk/images/ic/320xn/p01t1jn0.jpg.webp 320w, https://ichef.test.bbci.co.uk/images/ic/480xn/p01t1jn0.jpg.webp 480w, https://ichef.test.bbci.co.uk/images/ic/624xn/p01t1jn0.jpg.webp 624w, https://ichef.test.bbci.co.uk/images/ic/800xn/p01t1jn0.jpg.webp 800w"
Expand Down Expand Up @@ -231,7 +231,7 @@ exports[`Canonical Articles Media Loader renders a valid container 1`] = `
>
<img
alt=""
class="css-1uq6tv3"
class="css-9508jy"
loading="eager"
src="https://ichef.test.bbci.co.uk/images/ic/512xn/p01t1jn0.jpg.webp"
srcset="https://ichef.test.bbci.co.uk/images/ic/240xn/p01t1jn0.jpg.webp 240w, https://ichef.test.bbci.co.uk/images/ic/320xn/p01t1jn0.jpg.webp 320w, https://ichef.test.bbci.co.uk/images/ic/480xn/p01t1jn0.jpg.webp 480w, https://ichef.test.bbci.co.uk/images/ic/624xn/p01t1jn0.jpg.webp 624w, https://ichef.test.bbci.co.uk/images/ic/800xn/p01t1jn0.jpg.webp 800w"
Expand Down
Loading
Loading