// Server component: pure markup, no client state. // Rendered into HomeView via a slot prop so its JSX doesn't bloat the // HomeView client bundle. import styles from './HomeView.module.css'; export function HowItWorksSection() { // "exc" is the school's above-expected result. DfE names this differently // by subject: "higher standard" for the reading and maths tests, "greater // depth" for teacher-assessed writing. "nat" is the national expected %. const miniCascade = [ { subj: 'Reading', exp: 96, exc: 44, nat: 75, excLabel: 'Higher std' }, { subj: 'Writing', exp: 81, exc: 26, nat: 72, excLabel: 'Greater depth' }, { subj: 'Maths', exp: 85, exc: 41, nat: 74, excLabel: 'Higher std' }, ]; /* * The columns are deliberately unnamed. * * They previously carried two real school names — "Our Lady Queen of Heaven" * and "St Mary's Catholic Primary" — beside invented results and invented * Ofsted grades. On a site whose entire proposition is official DfE and * Ofsted data, publishing made-up figures against identifiable schools is * the one thing it cannot do, and no illustrative intent survives being * screenshotted. Generic labels make the layout point just as well. */ const compareRows = [ { label: 'Reading, Writing & Maths', a: '70%', b: '64%', aHi: true }, { label: 'Higher standard (RWM)', a: '13%', b: '6%', aHi: true }, { label: 'Ofsted', a: 'Outstanding', b: 'Good', aHi: true }, ]; // Report card (Ofsted's framework from Nov 2025): one rating per area of // school life on a five-point scale. Safeguarding is judged separately, as a // binary met/not-met outcome — kept out of this list and shown on its own. const reportCard: Array<{ area: string; grade: string; good: boolean }> = [ { area: 'Achievement', grade: 'Strong', good: true }, { area: 'Curriculum & teaching', grade: 'Expected standard', good: false }, { area: 'Attendance & behaviour', grade: 'Strong', good: true }, ]; return (
{/* One header pattern across every band on this page: kicker, heading, optional aside. The page previously ran four different treatments (two uppercase micro-labels — one left, one centred — a large heading with right-aligned grey text, and a kicker-plus-heading), which is most of why a designed page read as a stack of unrelated strips. */}

Every school page

What you'll see on every school

Primary or secondary — the page adapts to the phase

{/* Card 1 — Performance */}
Primary · Year 6 · Key Stage 2 SATs
{miniCascade.map(({ subj, exp, exc, nat, excLabel }) => (
{subj}
Expected{exp}%
{nat}%
{excLabel}{exc}%
))}
Secondary · Year 11 · GCSE Attainment 8
This schoolNational avg 45.9
54.8
+8.9 vs national
Performance
Results against the national average

For primary schools, each subject's Expected and Exceeding percentages side by side. For secondary schools, GCSE Attainment 8 with the national benchmark overlaid.

{/* Card 2 — Ofsted */}
Latest Ofsted inspection
Report card · five-point scale
{reportCard.map(({ area, grade, good }) => (
{area} {grade}
))}
Safeguarding · separate check Met
Full inspection · March 2026
Judgement
Ofsted at a glance

Since November 2025, Ofsted rates each area of school life on a five-point scale rather than one overall word. We show every area and the inspection date — and, for schools not yet reinspected, the older overall grade they still carry.

{/* Card 3 — Compare */}
Metric
School A
School B
{compareRows.map(({ label, a, b, aHi }) => (
{label} {a} {b}
))}
+ compare up to 5 schools
Compare
Side by side
{/* One verb for one feature. The site previously called this "compare" in the nav, "shortlist" in the footer and "pin" here, which reads as three separate things it does not have. */}

Compare up to five schools and every metric aligns in the same columns — works for primary and secondary alike.

); }