feat(mobile): mobile cleanups for deadlines, result cards, tooltips, ofsted, rankings
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 12s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 48s
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Successful in 13s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s

MOB-07: Admissions deadlines strip becomes a horizontal snap-scroller
on ≤640px instead of a cramped 2×2 grid (which forced "Secondary ·
Deadline" track labels down to 9.6px). Cards stay readable, the right
edge fades to signal more content past the viewport, .chipTrack font
bumped to 0.7rem.

MOB-09: Result-card line3 (headline metric + secondary stats) was
crowding everything onto one row. Force the first .stat (Attainment
8 / RWM headline) to flex-basis 100% on mobile so delta-vs-LA and
pupil count wrap below it with a visible row-gap. Applied to both
SchoolRow (primary) and SecondarySchoolRow.

MOB-12: MetricTooltip ⓘ icons rendered at ~9px and relied on :hover
(which doesn't fire on touch). Hide the whole .wrapper at ≤640px —
metric labels themselves carry the meaning. Saves building a
tap-to-show layer for now.

MOB-13: The "Ofsted pending / No inspection on record" empty state
took a full hero card to communicate non-information. Add a
data-ofsted-state attribute on the hero chip; on ≤640px, the
"none" state collapses to a single muted line.

MOB-17: Already had Type+Action columns hidden on rankings mobile —
no change needed beyond marking complete.

MOB-18: Long metric headers ("Reading, Writing & Maths Combined %")
forced the value column wide. Drop .valueHeader to 0.625rem with
white-space: normal at ≤640px so labels wrap onto 2 short lines.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Tudor Sitaru
2026-05-19 09:38:48 +01:00
parent 38d033f6a9
commit 59f13a74f9
7 changed files with 85 additions and 3 deletions
+32
View File
@@ -1361,3 +1361,35 @@
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
} }
} }
/* On phones the 2×2 grid cramped each chip so badly the "Secondary ·
Deadline" track label dropped to 9.6px. Switch to a horizontal
snap-scroller — each card is full-width-ish and stays readable,
and the rightmost card peeks past the edge to signal there's more. */
@media (max-width: 640px) {
.countdownRail {
display: flex;
grid-template-columns: none;
overflow-x: auto;
scroll-snap-type: x mandatory;
scrollbar-width: none;
gap: 0.75rem;
padding-right: 1.25rem;
margin-inline: -1rem;
padding-inline: 1rem;
-webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
}
.countdownRail::-webkit-scrollbar {
display: none;
}
.countdownChip {
flex: 0 0 auto;
width: 78%;
min-width: 220px;
scroll-snap-align: start;
}
.chipTrack {
font-size: 0.7rem;
}
}
@@ -81,3 +81,13 @@
width: 180px; width: 180px;
} }
} }
/* On phones the icon was rendering at ~9px and the tooltip relied on
:hover, which doesn't fire on touch. Rather than build a tap-to-show
layer with backdrop dismissal, hide the helper entirely — the metric
labels themselves carry the meaning. */
@media (max-width: 640px) {
.wrapper {
display: none;
}
}
@@ -396,6 +396,16 @@
min-width: 60px; min-width: 60px;
} }
/* Long metric labels like "Reading, Writing & Maths Combined %" used to
force the whole column wide; let them wrap onto 2 short lines with a
tighter font so the value cell can stay compact. */
.valueHeader {
font-size: 0.625rem;
white-space: normal;
line-height: 1.15;
letter-spacing: 0.03em;
}
.rankHeader { .rankHeader {
width: 40px; width: 40px;
} }
@@ -1077,6 +1077,20 @@
min-width: 100%; min-width: 100%;
} }
/* Collapse the "Ofsted pending / No inspection on record" empty state
into a single compact line on phones — it's a non-result, not worth
a full hero card. */
.heroChip[data-ofsted-state="none"] {
padding: 0.5rem 0.75rem;
}
.heroChip[data-ofsted-state="none"] .heroChipSub {
display: none;
}
.heroChip[data-ofsted-state="none"] .heroChipTitle {
font-size: 0.85rem;
color: var(--text-muted, #6d685f);
}
.heroStats { .heroStats {
gap: 1rem 1.5rem; gap: 1rem 1.5rem;
} }
+4 -1
View File
@@ -295,7 +295,10 @@ export function SchoolDetailView({
{/* Hero signal chip strip */} {/* Hero signal chip strip */}
<div className={styles.heroChips}> <div className={styles.heroChips}>
<div className={`${styles.heroChip} ${styles[`tone-${ofstedHeroChip.tone}`]}`}> <div
className={`${styles.heroChip} ${styles[`tone-${ofstedHeroChip.tone}`]}`}
data-ofsted-state={ofstedHeroChip.state}
>
<div className={styles.heroChipTitle}>{ofstedHeroChip.title}</div> <div className={styles.heroChipTitle}>{ofstedHeroChip.title}</div>
<div className={styles.heroChipSub}>{ofstedHeroChip.subtitle}</div> <div className={styles.heroChipSub}>{ofstedHeroChip.subtitle}</div>
{ofstedHeroChip.detail && ( {ofstedHeroChip.detail && (
+7 -1
View File
@@ -225,8 +225,14 @@
white-space: normal; white-space: normal;
} }
/* Promote the headline metric onto its own line; secondary stats
(delta vs LA, pupils) wrap below with a visible row gap. */
.line3 { .line3 {
gap: 0 1rem; row-gap: 0.25rem;
column-gap: 1rem;
}
.line3 > .stat:first-child {
flex-basis: 100%;
} }
.rowActions { .rowActions {
@@ -236,8 +236,15 @@
white-space: normal; 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 { .line3 {
gap: 0 1rem; row-gap: 0.25rem;
column-gap: 1rem;
}
.line3 > .stat:first-child {
flex-basis: 100%;
} }
.rowActions { .rowActions {