Adds "Within 0.25 miles" to the Distance control; 0.5 stays the default.
The radius shown in the results heading and drawn on the map was rounded
to one decimal place, which would have turned 0.25 into 0.3. It now keeps
two, and the list heading says "1 mile" rather than "1.0 miles".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The results toolbar wrapped wherever it ran out of room, and the List/Map
switch only appears when there are results, so the same search took two
lines with results and one without.
From 1340px the controls never wrap away from the search, which takes
what they leave (at least 12rem); phase and type chips cap at 11rem to
fit. Between 641px and 1339px the controls always take a full line of
their own. The switch now sits in FilterBar's row via a viewSwitch slot,
so that line runs the full width instead of stopping short of it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Beside the map, "19 schools within 1.0 miles of SW196AR" (359px) and the
sort menu (281px, as wide as its longest option) could not share the
pane's 427px, so the sort dropped to a second line.
In the map view the heading now reads "19 schools within 1 mile": the
postcode is already in the search box just above, and the radius reads
as the toolbar's does. The sort menu is capped at 11rem, truncating a
long choice, and the header no longer wraps; on a narrow pane the count
truncates rather than pushing the sort down. List view keeps the full
heading. Tried on staging by injecting the change: 243px + 176px, one
line at 1440.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The rows' narrow layout now switches at a 608px list, not 600px. Below
769px the page pads 1rem each side, so a 640px screen gives a 608px
list: exactly the old max-width: 640px media query, where 600px left
633-640px screens on the wide layout.
- rowContainerGuard.test.ts fails if anything other than HomeView renders
SchoolRow or SecondarySchoolRow, or if one of HomeView's row lists loses
its `results` container. Outside one the rows silently keep their wide
layout on phones. (Checked: HomeView is the only importer today.)
- Picking a pin from the list beside the map now works from the keyboard:
each row carries a "Show <school> on the map" button, visually hidden
until focused, with aria-pressed for the selected school. The row itself
cannot be the button, since it holds links and buttons of its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The list beside the map used its own cut-down card, so it showed less
than the list view (no phase, age range, denomination, trend, local
authority) and looked different. It now renders the list view's
SchoolRow / SecondarySchoolRow, through one renderRow shared by the list
view, the map pane and the phone's bottom sheet, which also gains
Remove from compare. CompactSchoolItem and its styles are gone.
The rows switched to their stacked layout on a max-width: 640px media
query, which never fires in a ~430px pane on a desktop screen. It is now
a container query on the list the row sits in (`results`, set on the
list view, the map pane and the bottom sheet). 600px of list is a 632px
screen less padding, so phones lay out as before.
Clicking a row, outside its links and buttons, still picks its pin, and
the selected row is outlined. The pane widens to 360–460px for the
taller rows.
The bottom sheet's close button was a 30px target; it is now 44px with
the same 30px circle (MOBILE.md), and the phone journey checks it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Trial the map as the default for every postcode search, not only on
desktop (DEFAULT_LOCATION_VIEW in HomeView; results_view_changed shows
how often readers switch away). The view is now derived: the reader's
choice once made, else the default for the kind of search. That follows
a hero search through client-side navigation without syncing state.
With nothing left varying by device, the user-agent default goes
(lib/device.ts, the headers() read in page.tsx). That settles two review
points: the HTML no longer needs Vary: User-Agent, and there is no
narrow-window fallback left to flash the map before the list.
Review fix in LeafletMapInner: the card reopened only when the selection
or the school list changed, so a rebuild caused by the centre, reference
point or radius closed it for good while the page still had the school
selected. The selection effect now follows a pins-rebuilt counter.
SchoolMap memoises its fallback centre, which was a fresh array on every
render and would have rebuilt every pin each time.
Phones hide the map view's list pane, so it no longer builds up to 500
hidden cards there (decided after mount, so hydration still matches).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The map view now follows option B of the results-controls mockups:
- The list sits in a pane on the left, under the result count and sort,
and the map fills the rest of the screen below the pinned toolbar. The
toolbar's height is measured, so the split ends 1rem above the bottom
of the screen however the controls wrap.
- Pins are brand-teal dots and the selected one is coral. The search
location is an ink dot, the search radius a dashed circle with its
distance, and the view fits that circle. Tiles are muted and the zoom
sits under the fullscreen button.
- A school picked on the map or in the list opens a card on the map
(View, + Compare, following the basket), and its list card is ringed
and scrolled into view. Phones keep the bottom sheet.
- The list cards show the full name, Ofsted and school type, the
headline figure and pupils.
The map cards now follow the list rows: no England benchmark for
special schools, PRUs and AP, and no placeholder all-zero RWM (Greenmead
showed "0% RWM -62 pts vs national"). That rule moves to a shared
listRwmValue helper.
A postcode search opens on the map for desktop browsers, chosen on the
server from the user agent so the list never paints first. The client
falls back to the list below 1024px, and follows the default through
client-side navigation from the hero until the reader picks a view.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>