copy(web): replace em dashes in public copy
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m14s
PR Checks / Backend Smoke (pull_request) Successful in 10s
PR Checks / Build Backend (no push) (pull_request) Successful in 19s
PR Checks / Build Frontend (no push) (pull_request) Successful in 1m19s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 11s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 1m20s

Rewrites every visitor-facing string that used an em dash, choosing the
punctuation for what the dash was doing: a colon before a list or
explanation, a comma for an aside, a full stop between two thoughts,
parentheses for an aside mid-sentence. Covers page titles and meta
descriptions, the home and admissions guide copy, school page headings
and notes, the compare page, metric labels and tooltips.

Two rewrites also fix the sentence around them: the closure banner no
longer repeats "proposed for closure", and the cut-off caveat's list of
priorities now parses.

A lone dash marking a missing value in a table cell stays: it is a data
convention, not prose. A Jest guard walks the source with the TypeScript
parser and fails on any other em dash in a string or JSX text node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
TudorandClaude Opus 5.5 committed 2026-09-24 22:04:27 +01:00
1 parent 271ffe92d4
commit d1688ac150
39 files changed
+183 -111

No files matched your search

@@ -26,7 +26,7 @@ interface StripSpec {
const TIER1_PRIMARY: StripSpec[] = [
{
label: 'Reading, writing & maths — expected standard',
label: 'Reading, writing & maths: expected standard',
metric: 'rwm_expected_pct',
anchorKey: 'rwm_expected_pct',
tip: '% of Year 6 pupils reaching the expected standard in reading, writing and maths.',
@@ -49,18 +49,18 @@ const TIER1_PRIMARY: StripSpec[] = [
const TIER2_PRIMARY: StripSpec[] = [
{
label: 'Grammar, punctuation & spelling — expected standard',
label: 'Grammar, punctuation & spelling: expected standard',
metric: 'gps_expected_pct',
anchorKey: 'gps_expected_pct',
},
{
label: 'Science — expected standard (teacher-assessed)',
label: 'Science: expected standard (teacher-assessed)',
metric: 'science_expected_pct',
anchorKey: 'science_expected_pct',
tip: 'Teacher-assessed, like writing — there has been no KS2 science test since 2009, so comparisons are indicative.',
tip: 'Teacher-assessed, like writing. There has been no KS2 science test since 2009, so comparisons are indicative.',
},
{
label: 'Average scaled score — reading',
label: 'Average scaled score: reading',
metric: 'reading_avg_score',
anchorKey: 'reading_avg_score',
min: 100,
@@ -68,7 +68,7 @@ const TIER2_PRIMARY: StripSpec[] = [
unit: '',
},
{
label: 'Average scaled score — maths',
label: 'Average scaled score: maths',
metric: 'maths_avg_score',
anchorKey: 'maths_avg_score',
min: 100,
@@ -76,7 +76,7 @@ const TIER2_PRIMARY: StripSpec[] = [
unit: '',
},
{
label: 'Average scaled score — grammar, punctuation & spelling',
label: 'Average scaled score: grammar, punctuation & spelling',
metric: 'gps_avg_score',
anchorKey: 'gps_avg_score',
min: 100,
@@ -193,7 +193,7 @@ export function CompareAcademics({
return (
<Section
title="How students do academically"
how="GCSE results (latest year). Attainment 8 averages performance across eight subjects; Progress 8 shows how much progress students make compared with similar students nationally — the wording is DfE's own banding."
how="GCSE results (latest year). Attainment 8 averages performance across eight subjects; Progress 8 shows how much progress students make compared with similar students nationally. The wording is DfE's own banding."
>
<SectionGrid schools={schools}>
<RowLabel tip="Average Attainment 8 score across eight GCSE subjects.">Attainment 8</RowLabel>
@@ -230,7 +230,7 @@ export function CompareAcademics({
</Chip>
) : p8NotPublished[i] ? (
<span className={s.small}>
Not published — this GCSE year group sat no KS2 tests (COVID), so DfE has no
Not published: this GCSE year group sat no KS2 tests (COVID), so DfE has no
baseline to measure progress from
</span>
) : (
@@ -308,7 +308,7 @@ export function CompareAcademics({
return (
<Section
title="How children do academically"
how="Results from national tests and teacher assessments at the end of Year 6 — writing is assessed by teachers, not tested. Each line runs from 0–100%; the grey tick marks the England average, so dots to its right are above average."
how="Results from national tests and teacher assessments at the end of Year 6 (writing is assessed by teachers, not tested). Each line runs from 0–100%; the grey tick marks the England average, so dots to its right are above average."
>
<div className={s.card}>
{TIER1_PRIMARY.map((spec) => (
@@ -324,7 +324,7 @@ export function CompareAcademics({
))}
<details className={styles.moreMeasures}>
<summary>More measures — grammar, punctuation &amp; spelling, science, average scaled scores</summary>
<summary>More measures: grammar, punctuation &amp; spelling, science, average scaled scores</summary>
{TIER2_PRIMARY.map((spec) => (
<Strip
key={spec.metric}