# Visual Parity Report — Angular vs React _Captured 2026-04-17, SVO→LED route, SU 6805 details page, viewport 1440×900._ Screenshots (checked in under `/` root): - `parity-angular-search.png`, `parity-react-search.png` - `parity-angular-details.png`, `parity-react-details.png` --- ## Search results (`/ru/onlineboard/route/SVO-LED-20260417`) | Angular | React (pre-fix) | Notes | | --- | --- | --- | | Flight list sits on a white card with drop shadow (`section.frame`) | Flight rows rendered on the dark-blue page background → text barely readable | **fixed**: wrap `` in `
` | | Calendar strip uses paged weekday tabs: `16 апр.` / `17 апреля` (active, bold) / `18 апр.` … with `‹ ›` arrows | Thin strip of naked numbered buttons wrapping across two rows (`16 17 18 … 1 2 3 …`) | **fixed**: replace inline `.calendar-day` with existing `` component | | Each row is clickable; hovering highlights the row | Rows are not interactive; navigation to details only via off-screen test-only buttons | **fixed**: `FlightCard` accepts `onClick` and renders with `role="button"` + hover highlight | | Row shows: flight # · operator logo + name · scheduled time (big) · actual time struck-through in orange on delay · city + terminal link · status with plane icon · arrival mirror · expand arrow | Row shows: flight # · scheduled time · city name · status text. Missing operator logo, terminal link, actual-time strike-through, delay arrow glyph, expanded panel | open — operator logo, terminal link, expanded-state layout still pending | | Filter sidebar has collapsible Route accordion + time slider inside; "Sheremetyevo" populated in departure input | Filter sidebar shows `SVO` / `LED` codes and sliders; labels don't render the city name | open — filter should pre-populate with the airport display name | | Footer note `* Время в системе - МЕСТНОЕ.` | Not rendered | open | ## Details page (`/ru/onlineboard/SU6805-20260417`) | Angular | React (pre-fix) | Notes | | --- | --- | --- | | All right-hand content on a single white card | Content directly on dark blue — text invisible | **fixed**: wrap in `
` | | `DayTabs` used at the top of the card (already present in React) | Same component, but on dark bg | **fixed** by moving into frame | | React console warning: `Each child in a list should have a unique "key" prop. Check the render method of FlightLegs` | — | **fixed**: key now falls back to the array index when `leg.index` is absent | | Header shows: flight # · airline name · big `РОССИЯ` logo · share button · last-update timestamp | React header currently shows only flight # + share + last-update | open — needs operator name/logo treatment in `BoardDetailsHeader` | | Route row: departure city + plane + status word (`Запланирован`) + arrival city; "+1" day indicator sits above the arrival time | React leg row renders raw station codes, city names, times stacked vertically | open — `FlightLegs` block needs to be rewritten as a horizontal route strip like Angular's `flight-board-details` | | Accordion first section (`Детали рейса`) open by default with Регистрация / Посадка rows visible; others (Борт, Питание, Услуги, Деплайнинг) below | 5 accordions all rendered, all collapsed by default; no `Детали рейса` wrapper | open — open primary section by default, hide `Share` button (Angular hides it on board view) | | `Борт` (aircraft) panel has a table with columns: Название / Количество мест / Эконом / Бизнес / Предыдущий рейс | React's `AircraftPanel` renders the same fields but as a list, not a table | open | --- ## Priority fixes shipped in this commit 1. **White card** (`section.frame`) around flight list + details body — the single biggest readability issue. 2. **`DayTabs` calendar strip** replaces the inline number-only strip on the search page. 3. **Clickable `FlightCard`** with keyboard support and hover highlight, so users don't have to use the off-screen test button. 4. **Fixed React key warning** in the `FlightLegs` renderer. ## Deferred (not shipped) - Operator logo + airline name on every row and in the details header. - Delay arrow + `+1` day-change indicators in Angular's layout. - Inline per-row expansion with Registration/Boarding/Deboarding mini-grid. - `Борт` aircraft panel as a table. - Pre-populate the filter with the selected city's display name. - Hide `Share` button on the board details page (Angular only shows it on schedule details). These need targeted, per-component changes against the Angular HTML templates referenced in `ClientApp/src/app/modules/pages/board/` and `ClientApp/src/app/modules/pages/details/`. They don't affect readability, so they're listed for a follow-up pass.