Files
school_compare/nextjs-app/components/SecondarySchoolRow.module.css
T
TudorandClaude Opus 4.8 ce2bfea91b
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 13s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 54s
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Successful in 12s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s
fix(search): badge inspected-but-ungraded schools as "Inspected", not "Not yet inspected"
A school inspected under the OEIF framework after September 2024 has an
inspection on record (ofsted_date set) but no overall_effectiveness grade,
since Ofsted no longer issues an overall judgement. buildOfstedListBadge
had no branch for this and fell through to "Not yet inspected", while the
detail page's hero chip correctly reported it as inspected — so the same
school read two contradictory ways.

Add an "Inspected · YYYY" branch that fires when an inspection is on record
(date or framework present) but no grade and not a Report Card, mirroring
the hero chip's fallback. Genuinely un-inspected schools (all Ofsted fields
null) still show "Not yet inspected". Add an .ofstedInspected badge style
(neutral slate) distinct from the grey pending state, and cover both cases
with tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 13:36:23 +01:00

263 lines
6.1 KiB
CSS

.row {
display: flex;
align-items: center;
gap: 1rem;
background: var(--bg-card, white);
border: 1px solid var(--border-color, #e5dfd5);
border-left: 3px solid transparent;
border-radius: 8px;
padding: 1rem 1.25rem;
transition: border-color 0.15s ease, box-shadow 0.15s ease;
animation: rowFadeIn 0.3s ease-out both;
}
.row:hover {
box-shadow: 0 2px 8px rgba(26, 22, 18, 0.06);
}
/* Phase border colours */
.phaseSecondary { border-left-color: var(--phase-secondary, #9b6bb0); }
.phaseAllThrough { border-left-color: var(--phase-all-through, #7a9a6d); }
.phasePost16 { border-left-color: var(--phase-post16, #c4915e); }
.rowInCompare {
border-left-color: var(--accent-teal, #2d7d7d);
background: var(--bg-secondary, #f3ede4);
}
@keyframes rowFadeIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── Left content column ─────────────────────────────── */
.rowContent {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.35rem;
}
/* Line 1: name + ofsted */
.line1 {
display: flex;
align-items: baseline;
gap: 0.625rem;
min-width: 0;
}
.schoolName {
font-size: 0.9375rem;
font-weight: 600;
color: var(--text-primary, #1a1612);
text-decoration: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex-shrink: 1;
min-width: 0;
}
.schoolName:hover {
color: var(--accent-coral, #e07256);
}
/* Line 2: context tags */
.line2 {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.25rem 0;
font-size: 0.8rem;
color: var(--text-muted, #8a847a);
}
.line2 > span:not(.provisionTag):not(:last-child)::after {
content: '·';
margin: 0 0.4rem;
color: var(--border-color, #e5dfd5);
}
/* Line 3: KS4 stats */
.line3 {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0 1.25rem;
}
.stat {
display: inline-flex;
align-items: baseline;
gap: 0.3rem;
}
.statValueLarge {
font-size: 1.125rem;
font-weight: 700;
color: var(--text-primary, #1a1612);
font-family: var(--font-playfair), 'Playfair Display', serif;
}
.statValue {
font-size: 0.9375rem;
font-weight: 700;
color: var(--text-primary, #1a1612);
font-family: var(--font-playfair), 'Playfair Display', serif;
}
.statLabel {
font-size: 0.75rem;
color: var(--text-muted, #8a847a);
white-space: nowrap;
}
.delta {
font-size: 0.8125rem;
font-weight: 600;
white-space: nowrap;
}
.deltaPositive { color: #3c8c3c; }
.deltaNegative { color: var(--accent-coral, #e07256); }
/* Line 4: location + distance */
.line4 {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0;
font-size: 0.8rem;
color: var(--text-muted, #8a847a);
}
.line4 span:not(:last-child)::after {
content: '·';
margin: 0 0.4rem;
color: var(--border-color, #e5dfd5);
}
.distanceBadge {
display: inline-block;
padding: 0.0625rem 0.375rem;
font-size: 0.75rem;
font-weight: 600;
background: var(--accent-teal, #2d7d7d);
color: white;
border-radius: 3px;
}
/* Phase label pill */
.phaseLabel {
display: inline-block;
padding: 0.0625rem 0.375rem;
font-size: 0.6875rem;
font-weight: 600;
border-radius: 3px;
white-space: nowrap;
margin-right: 0.25rem;
}
.phaseLabelSecondary { background: var(--phase-secondary-bg); color: var(--phase-secondary-text); }
.phaseLabelAllThrough { background: var(--phase-all-through-bg); color: var(--phase-all-through-text); }
.phaseLabelPost16 { background: var(--phase-post16-bg); color: var(--phase-post16-text); }
.provisionTag {
display: inline-block;
padding: 0.0625rem 0.375rem;
font-size: 0.75rem;
font-weight: 500;
background: var(--bg-secondary, #f3ede4);
color: var(--text-secondary, #5c5650);
border-radius: 3px;
white-space: nowrap;
margin-left: 0.375rem;
}
.selectiveTag {
background: rgba(180, 120, 0, 0.1);
color: #8a6200;
}
/* ── Ofsted badge ────────────────────────────────────── */
.ofstedBadge {
display: inline-block;
padding: 0.0625rem 0.375rem;
font-size: 0.6875rem;
font-weight: 600;
border-radius: 3px;
white-space: nowrap;
flex-shrink: 0;
line-height: 1.4;
}
.ofstedDate {
font-weight: 400;
}
.ofsted1 { background: var(--accent-teal-bg); color: var(--accent-teal, #2d7d7d); }
.ofsted2 { background: rgba(60, 140, 60, 0.12); color: #3c8c3c; }
.ofsted3 { background: var(--accent-gold-bg); color: #b8920e; }
.ofsted4 { background: var(--accent-coral-bg); color: var(--accent-coral, #e07256); }
/* ── Ofsted badge variants ──────────────────────────────────────────────── */
.ofstedRc { background: #5a3a6e; color: #fff; }
/* Inspected but with no overall grade (OEIF post-Sept-2024) — neutral slate,
distinct from the grey "Not yet inspected" pending state. */
.ofstedInspected { background: #e6ecf2; color: #45586b; }
.ofstedPending { background: #e0e0e0; color: #666; }
/* ── Right actions column ────────────────────────────── */
.rowActions {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
}
.rowActions > * {
height: 2rem;
line-height: 1;
font-family: inherit;
box-sizing: border-box;
}
/* ── Mobile ──────────────────────────────────────────── */
@media (max-width: 640px) {
.row {
flex-wrap: wrap;
padding: 0.875rem;
gap: 0.625rem;
}
.rowContent {
flex-basis: 100%;
}
.schoolName {
white-space: normal;
}
/* Promote the headline metric (Attainment 8) onto its own line so
the secondary stats — delta vs LA, pupils — wrap below it with
visible row gap instead of crowding the same row. */
.line3 {
row-gap: 0.25rem;
column-gap: 1rem;
}
.line3 > .stat:first-child {
flex-basis: 100%;
}
.rowActions {
width: 100%;
gap: 0.375rem;
}
.rowActions > * {
flex: 1;
justify-content: center;
}
}