Date: Tue, 30 Jun 2026 17:30:25 +0100
Subject: [PATCH 10/15] implemented design of mini stats component
---
.../src/components/CricketMatchStat.tsx | 226 +++++++++++++-----
.../CricketMiniMatchStats.stories.tsx | 2 +-
.../src/components/CricketMiniMatchStats.tsx | 24 +-
.../CricketMiniMatchStatsWrapper.island.tsx | 5 +-
dotcom-rendering/src/cricketMatchV2.ts | 4 +-
.../src/frontend/feCricketMatchPage.ts | 6 +-
.../schemas/feFootballMatchInfoPage.json | 20 +-
.../schemas/feFootballMatchListPage.json | 10 +-
8 files changed, 201 insertions(+), 96 deletions(-)
diff --git a/dotcom-rendering/src/components/CricketMatchStat.tsx b/dotcom-rendering/src/components/CricketMatchStat.tsx
index 36819f611e3..33cf9b48b02 100644
--- a/dotcom-rendering/src/components/CricketMatchStat.tsx
+++ b/dotcom-rendering/src/components/CricketMatchStat.tsx
@@ -1,70 +1,186 @@
import { css } from '@emotion/react';
-import { visuallyHidden } from '@guardian/source/foundations';
+import {
+ from,
+ space,
+ textSans14,
+ textSans15,
+ textSansBold14,
+ textSansBold15,
+ visuallyHidden,
+} from '@guardian/source/foundations';
import type { Batter } from '../cricketMatchV2';
+import { palette } from '../palette';
-export const CricketMatchStatStatus = ({
- matchStatus,
-}: {
- matchStatus: string;
-}) => {
- return (
-
-
Match Status
-
-
- Match Status
-
- {matchStatus}
-
-
- );
-};
+const containerCss = css`
+ position: relative;
+ padding: 5px 10px 10px;
+ color: ${palette('--football-match-stat-text')};
+ border: 1px solid ${palette('--football-match-stat-border')};
+ border-radius: 6px;
+`;
-export const CricketMatchStatCurrentBattingTeam = ({
- currentBattingTeam,
-}: {
- currentBattingTeam: string;
-}) => {
- return (
-
-
Current Batting Team
-
-
- Current Batting Team
-
- {currentBattingTeam}
-
-
- );
-};
+const desktopPaddingCss = css`
+ ${from.desktop} {
+ padding-bottom: 14px;
+ }
+`;
+
+const visuallyHiddenStyles = css`
+ ${visuallyHidden}
+`;
+
+const responsiveTextSans = css`
+ ${textSans14}
+ ${from.desktop} {
+ ${textSans15}
+ }
+`;
+
+const responsiveTextSansBold = css`
+ ${textSansBold14}
+ ${from.desktop} {
+ ${textSansBold15}
+ }
+`;
+
+const tableStyles = css`
+ width: 100%;
+ border-collapse: collapse;
+ ${responsiveTextSans}
+`;
+
+const cellBaseStyles = css`
+ padding: ${space[2]}px ${space[3]}px ${space[1]}px 0;
+ text-align: left;
+ vertical-align: middle;
+`;
+
+const tableHeadCellStyles = css`
+ ${cellBaseStyles}
+ ${responsiveTextSansBold}
+ color: ${palette('--football-match-stat-text')};
+`;
+
+const tableCellStyles = css`
+ ${cellBaseStyles}
+ ${responsiveTextSans}
+`;
+
+const tableRowHeaderStyles = css`
+ ${cellBaseStyles}
+ display: flex;
+ align-items: center;
+ ${responsiveTextSans}
+`;
+
+const batterNameTextStyles = css`
+ display: flex;
+ flex-direction: column;
+`;
+
+const tableRowStyles = css`
+ border-top: 1px solid ${palette('--football-match-stat-border')};
+`;
+
+const numericCellStyles = css`
+ white-space: nowrap;
+ text-align: left;
+`;
+
+const fixedColStyles = css`
+ flex-shrink: 0;
+`;
+
+const batColWidthStyles = css`
+ ${fixedColStyles}
+ width: 42px;
+`;
+
+const howOutStyles = css`
+ color: ${palette('--football-match-info-team-number')};
+`;
export const CricketMatchStatNotOutBatters = ({
notOutBatters,
}: {
notOutBatters: Batter[];
}) => {
- const names = notOutBatters.map((batter) => batter.name).join(', ');
+ const currentBatters = notOutBatters.filter(
+ (batter) => !batter.out && (batter.onStrike || batter.nonStrike),
+ );
return (
-
-
Not Out Batters
-
-
- Not Out Batters
-
- {names}
+
+
+ Not Out Batters
+
+
+
+ | Batter |
+
+ Runs
+ |
+
+ Balls
+ |
+
+
+
+ {currentBatters.map((batter) => {
+ return (
+
+
+
+ {batter.onStrike
+ ? '(on strike)'
+ : '(at crease)'}
+
+
+ {batter.name}
+
+ {batter.howOut}
+
+
+ |
+
+ {batter.runs}
+ |
+
+ {batter.ballsFaced}
+ |
+
+ );
+ })}
+
+
);
};
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
index 70d23b7394c..dc1bfa11700 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
@@ -41,7 +41,7 @@ const meta = preview.meta({
});
const feMatchStatsSummaryData: FECricketMatchStatsSummary = {
- matchStatus: 'In Play',
+ status: 'In Play',
currentBattingTeam: 'England',
notOutBatters: [
{
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
index 3b09d5e5332..f362989f6a3 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
@@ -14,11 +14,7 @@ import { feCricketMatchStatsSummarySchema } from '../frontend/feCricketMatchPage
import type { Result } from '../lib/result';
import { error, fromValibot, ok } from '../lib/result';
import { palette } from '../palette';
-import {
- CricketMatchStatCurrentBattingTeam,
- CricketMatchStatNotOutBatters,
- CricketMatchStatStatus,
-} from './CricketMatchStat';
+import { CricketMatchStatNotOutBatters } from './CricketMatchStat';
import { Placeholder } from './Placeholder';
const containerCss = css`
@@ -57,13 +53,13 @@ type Props = {
};
export const CricketMiniMatchStats = (props: Props) => {
- const { data, error: swrError } = useSWR(
+ const { data, error: swrError } = useSWR(
props.matchStatsUrl,
fetcher(props.getMatchStatsData),
swrOptions(props.refreshInterval),
);
- if (swrError != null) {
+ if (swrError) {
return null;
}
@@ -82,14 +78,6 @@ export const CricketMiniMatchStats = (props: Props) => {
return (
-
-
- {data.currentBattingTeam != null && (
-
- )}
-
{data.notOutBatters != null && (
{
),
}}
>
- More match info
- More match info
+ View full scorecard
+ View full scorecard
);
@@ -122,7 +110,7 @@ const swrOptions = (
): SWRConfiguration => ({
errorRetryCount: 1,
refreshInterval: (latestData: CricketMatchStatsSummary | undefined) =>
- latestData?.matchStatus === 'FT' ? 0 : refreshInterval,
+ latestData?.status === 'FT' ? 0 : refreshInterval,
});
const fetcher =
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStatsWrapper.island.tsx b/dotcom-rendering/src/components/CricketMiniMatchStatsWrapper.island.tsx
index 527f1fc89ff..691ca75f4b4 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStatsWrapper.island.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStatsWrapper.island.tsx
@@ -12,5 +12,6 @@ export const CricketMiniMatchStatsWrapper = ({
/>
);
-const getMatchStatsData = (url: string): Promise =>
- fetch(url).then((res) => res.json());
+const getMatchStatsData = (url: string): Promise => {
+ return fetch(url).then((res) => res.json());
+};
diff --git a/dotcom-rendering/src/cricketMatchV2.ts b/dotcom-rendering/src/cricketMatchV2.ts
index 30a9b854d69..073f8c8896a 100644
--- a/dotcom-rendering/src/cricketMatchV2.ts
+++ b/dotcom-rendering/src/cricketMatchV2.ts
@@ -132,7 +132,7 @@ export type CricketMatch = {
};
export type CricketMatchStatsSummary = {
- matchStatus: string;
+ status: string;
currentBattingTeam?: string;
notOutBatters?: Batter[];
};
@@ -232,7 +232,7 @@ export const parseMatchStatsSummary = (
feCricketMatchStatsSummary: FECricketMatchStatsSummary,
): Result =>
ok({
- matchStatus: feCricketMatchStatsSummary.matchStatus,
+ status: feCricketMatchStatsSummary.status,
currentBattingTeam: feCricketMatchStatsSummary.currentBattingTeam,
notOutBatters: feCricketMatchStatsSummary.notOutBatters,
});
diff --git a/dotcom-rendering/src/frontend/feCricketMatchPage.ts b/dotcom-rendering/src/frontend/feCricketMatchPage.ts
index c649eaf59fe..45cc2adfbf5 100644
--- a/dotcom-rendering/src/frontend/feCricketMatchPage.ts
+++ b/dotcom-rendering/src/frontend/feCricketMatchPage.ts
@@ -115,9 +115,9 @@ export type FECricketMatchPage = {
};
export const feCricketMatchStatsSummarySchema = object({
- matchStatus: string(),
- currentBattingTeam: string(),
- notOutBatters: array(feCricketBatterSchema),
+ status: string(),
+ currentBattingTeam: optional(string()),
+ notOutBatters: optional(array(feCricketBatterSchema)),
});
export type FECricketMatchStatsSummary = Output<
diff --git a/dotcom-rendering/src/frontend/schemas/feFootballMatchInfoPage.json b/dotcom-rendering/src/frontend/schemas/feFootballMatchInfoPage.json
index 3b3e7dccd76..e7ded6b79b2 100644
--- a/dotcom-rendering/src/frontend/schemas/feFootballMatchInfoPage.json
+++ b/dotcom-rendering/src/frontend/schemas/feFootballMatchInfoPage.json
@@ -46,12 +46,12 @@
"type": "object",
"properties": {
"matchStats": {
- "$ref": "#/definitions/{id:string;homeTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};awayTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};status:string;comments?:string;}"
+ "$ref": "#/definitions/{id:string;status:string;homeTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};awayTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};comments?:string;}"
},
"matchInfo": {
"anyOf": [
{
- "$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};status:string;venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}"
+ "$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";status:string;date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}"
},
{
"$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"Fixture\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;competition?:{name:string;id:string;};}"
@@ -828,21 +828,21 @@
"url"
]
},
- "{id:string;homeTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};awayTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};status:string;comments?:string;}": {
+ "{id:string;status:string;homeTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};awayTeam:{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;};comments?:string;}": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
+ "status": {
+ "type": "string"
+ },
"homeTeam": {
"$ref": "#/definitions/{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;}"
},
"awayTeam": {
"$ref": "#/definitions/{name:string;id:string;scorers:string[];codename:string;players:{name:string;id:string;position:string;lastName:string;substitute:boolean;timeOnPitch:string;shirtNumber:string;events:{eventTime:string;eventType:string;}[];}[];possession:number;shotsOn:number;shotsOff:number;corners:number;fouls:number;colours:string;crest:string;score?:number;}"
},
- "status": {
- "type": "string"
- },
"comments": {
"type": "string"
}
@@ -975,7 +975,7 @@
"eventType"
]
},
- "{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};status:string;venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}": {
+ "{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";status:string;date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}": {
"type": "object",
"properties": {
"stage": {
@@ -988,6 +988,9 @@
"type": "string",
"const": "LiveMatch"
},
+ "status": {
+ "type": "string"
+ },
"date": {
"type": "string"
},
@@ -1003,9 +1006,6 @@
"awayTeam": {
"$ref": "#/definitions/{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;}"
},
- "status": {
- "type": "string"
- },
"venue": {
"$ref": "#/definitions/{name:string;id:string;}"
},
diff --git a/dotcom-rendering/src/frontend/schemas/feFootballMatchListPage.json b/dotcom-rendering/src/frontend/schemas/feFootballMatchListPage.json
index 359ef7e84e8..3cf9c22066d 100644
--- a/dotcom-rendering/src/frontend/schemas/feFootballMatchListPage.json
+++ b/dotcom-rendering/src/frontend/schemas/feFootballMatchListPage.json
@@ -96,7 +96,7 @@
"items": {
"anyOf": [
{
- "$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};status:string;venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}"
+ "$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";status:string;date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}"
},
{
"$ref": "#/definitions/{stage:{stageNumber:string;};id:string;type:\"Fixture\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;competition?:{name:string;id:string;};}"
@@ -709,7 +709,7 @@
"Record": {
"type": "object"
},
- "{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};status:string;venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}": {
+ "{stage:{stageNumber:string;};id:string;type:\"LiveMatch\";status:string;date:string;round:{roundNumber:string;name?:string;};leg:string;homeTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};awayTeam:{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;};venue?:{name:string;id:string;};comments?:string;attendance?:string;referee?:{name:string;id:string;};}": {
"type": "object",
"properties": {
"stage": {
@@ -722,6 +722,9 @@
"type": "string",
"const": "LiveMatch"
},
+ "status": {
+ "type": "string"
+ },
"date": {
"type": "string"
},
@@ -737,9 +740,6 @@
"awayTeam": {
"$ref": "#/definitions/{name:string;id:string;score?:number;htScore?:number;aggregateScore?:number;scorers?:string;}"
},
- "status": {
- "type": "string"
- },
"venue": {
"$ref": "#/definitions/{name:string;id:string;}"
},
From 9c07feace19b45de0ea964acd9f93852942dd964 Mon Sep 17 00:00:00 2001
From: William Mead <285652121+williammead@users.noreply.github.com>
Date: Tue, 30 Jun 2026 17:33:07 +0100
Subject: [PATCH 11/15] removed abtest override
---
dotcom-rendering/src/layouts/LiveLayout.tsx | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/dotcom-rendering/src/layouts/LiveLayout.tsx b/dotcom-rendering/src/layouts/LiveLayout.tsx
index ad4a1f1229e..836def40fe4 100644
--- a/dotcom-rendering/src/layouts/LiveLayout.tsx
+++ b/dotcom-rendering/src/layouts/LiveLayout.tsx
@@ -271,6 +271,9 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
} = article;
const ab = useAB();
+ const isCricketRedesignEnabled = Boolean(
+ ab?.isUserInTestGroup('webx-cricket-redesign', 'enable'),
+ );
// TODO:
// 1) Read 'forceEpic' value from URL parameter and use it to force the slot to render
@@ -317,11 +320,6 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
const liveBlogAreaId = 'liveblog';
- // const isCricketRedesignEnabled = Boolean(
- // ab?.isUserInTestGroup('webx-cricket-redesign', 'enable'),
- // );
- const isCricketRedesignEnabled = true;
-
return (
<>
{isWeb && (
@@ -1175,10 +1173,9 @@ const Header = (props: {
: undefined;
const ab = useAB();
- // const isCricketRedesignEnabled = Boolean(
- // ab?.isUserInTestGroup('webx-cricket-redesign', 'enable'),
- // );
- const isCricketRedesignEnabled = true;
+ const isCricketRedesignEnabled = Boolean(
+ ab?.isUserInTestGroup('webx-cricket-redesign', 'enable'),
+ );
const isApps = props.renderingTarget === 'Apps';
From cc78b468d6f29c0dfec7469f4644cec96ffd22d0 Mon Sep 17 00:00:00 2001
From: William Mead <285652121+williammead@users.noreply.github.com>
Date: Wed, 1 Jul 2026 11:52:22 +0100
Subject: [PATCH 12/15] hide stats component if no batters are present
---
.../src/components/CricketMiniMatchStats.stories.tsx | 12 ++++++------
.../src/components/CricketMiniMatchStats.tsx | 12 ++++++------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
index dc1bfa11700..f20a0a54bd4 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
@@ -51,8 +51,8 @@ const feMatchStatsSummaryData: FECricketMatchStatsSummary = {
runs: 151,
fours: 15,
sixes: 0,
- out: true,
- howOut: 'c Smith b Stokes',
+ out: false,
+ howOut: 'not out',
onStrike: false,
nonStrike: true,
},
@@ -63,10 +63,10 @@ const feMatchStatsSummaryData: FECricketMatchStatsSummary = {
runs: 157,
fours: 22,
sixes: 3,
- out: true,
- howOut: 'c Sub b Root',
- onStrike: false,
- nonStrike: true,
+ out: false,
+ howOut: 'not out',
+ onStrike: true,
+ nonStrike: false,
},
],
};
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
index f362989f6a3..c9a063b92d6 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
@@ -76,16 +76,16 @@ export const CricketMiniMatchStats = (props: Props) => {
);
}
+ if (data.notOutBatters == null) {
+ return null;
+ }
+
return (
- {data.notOutBatters != null && (
-
- )}
+
}
iconSide="right"
From cc8cf6b9069895a9a04a9367ccaddac88c152711 Mon Sep 17 00:00:00 2001
From: William Mead <285652121+williammead@users.noreply.github.com>
Date: Wed, 1 Jul 2026 15:44:25 +0100
Subject: [PATCH 13/15] fix show old scorecard if not viewing new design
---
dotcom-rendering/src/layouts/LiveLayout.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dotcom-rendering/src/layouts/LiveLayout.tsx b/dotcom-rendering/src/layouts/LiveLayout.tsx
index 14c09694463..bbe3f9c6d70 100644
--- a/dotcom-rendering/src/layouts/LiveLayout.tsx
+++ b/dotcom-rendering/src/layouts/LiveLayout.tsx
@@ -598,7 +598,7 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
{!!cricketMatchUrl &&
- isCricketRedesignEnabled && (
+ !isCricketRedesignEnabled && (
Date: Thu, 2 Jul 2026 15:48:58 +0100
Subject: [PATCH 14/15] small tweaks
---
.../src/components/CricketMatchStat.tsx | 51 +++----------------
.../CricketMiniMatchStats.stories.tsx | 14 ++++-
.../src/components/CricketMiniMatchStats.tsx | 5 +-
3 files changed, 23 insertions(+), 47 deletions(-)
diff --git a/dotcom-rendering/src/components/CricketMatchStat.tsx b/dotcom-rendering/src/components/CricketMatchStat.tsx
index 33cf9b48b02..84e2927e3be 100644
--- a/dotcom-rendering/src/components/CricketMatchStat.tsx
+++ b/dotcom-rendering/src/components/CricketMatchStat.tsx
@@ -87,15 +87,6 @@ const numericCellStyles = css`
text-align: left;
`;
-const fixedColStyles = css`
- flex-shrink: 0;
-`;
-
-const batColWidthStyles = css`
- ${fixedColStyles}
- width: 42px;
-`;
-
const howOutStyles = css`
color: ${palette('--football-match-info-team-number')};
`;
@@ -106,37 +97,19 @@ export const CricketMatchStatNotOutBatters = ({
notOutBatters: Batter[];
}) => {
const currentBatters = notOutBatters.filter(
- (batter) => !batter.out && (batter.onStrike || batter.nonStrike),
+ (batter) => batter.onStrike || batter.nonStrike,
);
return (
-
- Not Out Batters
-
+
Current Batters
| Batter |
-
+ |
Runs
|
-
+ |
Balls
|
@@ -158,22 +131,10 @@ export const CricketMatchStatNotOutBatters = ({
-
+ |
{batter.runs}
|
-
+ |
{batter.ballsFaced}
|
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
index f20a0a54bd4..3b56f24846b 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.stories.tsx
@@ -41,7 +41,7 @@ const meta = preview.meta({
});
const feMatchStatsSummaryData: FECricketMatchStatsSummary = {
- status: 'In Play',
+ status: 'abandoned',
currentBattingTeam: 'England',
notOutBatters: [
{
@@ -68,6 +68,18 @@ const feMatchStatsSummaryData: FECricketMatchStatsSummary = {
onStrike: true,
nonStrike: false,
},
+ {
+ name: 'Devon Conway',
+ order: 2,
+ ballsFaced: 224,
+ runs: 157,
+ fours: 22,
+ sixes: 3,
+ out: false,
+ howOut: 'not out',
+ onStrike: false,
+ nonStrike: false,
+ },
],
};
diff --git a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
index c9a063b92d6..623fc39e561 100644
--- a/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
+++ b/dotcom-rendering/src/components/CricketMiniMatchStats.tsx
@@ -105,12 +105,15 @@ export const CricketMiniMatchStats = (props: Props) => {
);
};
+const isMatchOver = (matchStatus: string | undefined) =>
+ matchStatus === 'result' || matchStatus === 'abandoned';
+
const swrOptions = (
refreshInterval: number,
): SWRConfiguration => ({
errorRetryCount: 1,
refreshInterval: (latestData: CricketMatchStatsSummary | undefined) =>
- latestData?.status === 'FT' ? 0 : refreshInterval,
+ isMatchOver(latestData?.status) ? 0 : refreshInterval,
});
const fetcher =
From 2574276d38c73e63a19c7095a0eaa87cb8789bc9 Mon Sep 17 00:00:00 2001
From: William Mead <285652121+williammead@users.noreply.github.com>
Date: Fri, 3 Jul 2026 14:05:05 +0100
Subject: [PATCH 15/15] refactored mini match stats into separate component
---
dotcom-rendering/src/layouts/LiveLayout.tsx | 75 ++++++++++++---------
1 file changed, 42 insertions(+), 33 deletions(-)
diff --git a/dotcom-rendering/src/layouts/LiveLayout.tsx b/dotcom-rendering/src/layouts/LiveLayout.tsx
index bbe3f9c6d70..bdcb67d4730 100644
--- a/dotcom-rendering/src/layouts/LiveLayout.tsx
+++ b/dotcom-rendering/src/layouts/LiveLayout.tsx
@@ -395,6 +395,7 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
format={format}
article={article}
liveBlogAreaId={liveBlogAreaId}
+ isCricketRedesignEnabled={isCricketRedesignEnabled}
/>
{/* This element is used to replace the liveblog with the scorecard when the scorecard tab is clicked */}
@@ -699,33 +700,17 @@ export const LiveLayout = (props: WebProps | AppsProps) => {
)}
-
- {/* Match stats */}
- {!!footballMatchStatsUrl && (
-
-
-
- )}
- {!!cricketMatchStatsUrl &&
- isCricketRedesignEnabled && (
-
-
-
- )}
+
{
);
};
+const MiniMatchStats = (props: {
+ footballMatchStatsUrl: string | undefined;
+ cricketMatchStatsUrl: string | undefined;
+ isCricketRedesignEnabled: boolean;
+}) => {
+ if (props.footballMatchStatsUrl) {
+ return (
+
+
+
+ );
+ }
+
+ if (props.cricketMatchStatsUrl && props.isCricketRedesignEnabled) {
+ return (
+
+
+
+ );
+ }
+
+ return null;
+};
+
const Header = (props: {
renderingTarget: RenderingTarget;
format: ArticleFormat;
article: ArticleDeprecated;
liveBlogAreaId: string;
+ isCricketRedesignEnabled: boolean;
}) => {
const footballMatchLeagueName = props.article.sectionLabel;
const footballMatchLeagueUrl = `${props.article.guardianBaseURL}/${props.article.sectionUrl}`;
@@ -1170,11 +1184,6 @@ const Header = (props: {
? props.article.matchHeaderUrl
: undefined;
- const ab = useAB();
- const isCricketRedesignEnabled = Boolean(
- ab?.isUserInTestGroup('webx-cricket-redesign', 'enable'),
- );
-
const isApps = props.renderingTarget === 'Apps';
if (footballMatchHeaderUrl) {
@@ -1202,7 +1211,7 @@ const Header = (props: {
);
}
- if (!isApps && cricketMatchHeaderUrl && isCricketRedesignEnabled) {
+ if (!isApps && cricketMatchHeaderUrl && props.isCricketRedesignEnabled) {
return (
<>