Skip to content

feat(web): visual coherence — slate palette, density bumps, Skeleton adoption#79

Merged
github-actions[bot] merged 2 commits intodevelopfrom
feat/web-coherencia-visual
May 8, 2026
Merged

feat(web): visual coherence — slate palette, density bumps, Skeleton adoption#79
github-actions[bot] merged 2 commits intodevelopfrom
feat/web-coherencia-visual

Conversation

@frapercan
Copy link
Copy Markdown
Owner

Why

The platform shell polish (#68) introduced slate- on the header / home / nav, but every other page kept gray-. Same session, two neutral palettes side by side. This PR retires that drift in one sweep, plus two adjacent density / loading-state cleanups identified in the UX audit.

What

1. Palette unification — gray → slate

  • Single sed sweep across 24 page and component files (641 occurrences of gray-{50…900}slate-{50…900}).
  • Semantic colors (red / blue / emerald / amber / violet) untouched.
  • No tone shift in the visible result; uniform now across the whole app.

2. Density bump in body cells

  • text-xs (12px) is hostile for tabular numbers in the data-heavy pages. Selective bump to text-[13px] inside <td> cells and body paragraphs in /scoring, /annotations, /reranker, /evaluation, /jobs/[id], /proteins/[accession].
  • Labels, chips, badges, and tracking-* uppercase section headers stay at text-xs — intentional hierarchy.

3. Skeleton adoption

  • The repo ships components/Skeleton.tsx but pages were rolling their own bg-gray-100 rounded animate-pulse.
  • Migrated the most visible loading screen (/benchmark) to use <Skeleton />.
  • Other ad-hoc pulse patterns inside card grids are wrapper-level pulses, not inner skeletons — left intact for a follow-up that designs proper skeleton card variants.

Test plan

  • next build green; 18 routes
  • Backend untouched — no changes outside apps/web/
  • Visual: open a previously-gray page (e.g. /jobs, /embeddings, /scoring) — color rhymes with the polished header now
  • Body text in /scoring, /annotations, /reranker reads cleaner; chip/label sizes unchanged
  • /benchmark loading state uses the canonical <Skeleton/> look (compare to fast initial paint)

Notes

  • Worktree protea-coherencia-visual, fully isolated. Sister PR (#TBA) for benchmark heatmap small-multiples is in flight from protea-benchmark-heatmap, no overlap.

…adoption

Three swings across the Next.js app to retire mismatched style choices
that landed in different sessions. No logic changes.

1) Palette unification: gray-* → slate-*
   The platform polish (#68) introduced slate on the header / home / nav
   while every other page kept gray-. The same session showed two
   neutral palettes side-by-side. Single sed sweep across 24 page and
   component files (641 occurrences) brings everything to slate-.
   Semantic colors (red / blue / emerald / amber / violet) untouched.

2) Density bump in body cells
   text-xs (12px) is hostile for tabular numbers in the data-heavy
   pages. Selective bump to text-[13px] inside <td> cells and body
   paragraphs in /scoring, /annotations, /reranker, /evaluation,
   /jobs/[id], /proteins/[accession]. Labels, chips, badges and
   tracking-* uppercase headers stay at text-xs (intentional).

3) Skeleton adoption
   The repo ships components/Skeleton.tsx but pages roll their own
   `bg-gray-100 rounded animate-pulse`. Migrated the most visible
   loading screen (/benchmark) to use <Skeleton/>. Other ad-hoc
   pulse patterns in cards (jobs / proteins / annotations / fa[id])
   are wrapper-level pulses, not inner skeletons — left intact for a
   follow-up that designs proper skeleton card variants.

CI: next build green; backend untouched.
@github-actions github-actions Bot enabled auto-merge (squash) May 8, 2026 16:02
@github-actions github-actions Bot merged commit 5afe7fa into develop May 8, 2026
13 checks passed
github-actions Bot pushed a commit that referenced this pull request May 8, 2026
#81)

## Why

`/benchmark` ships a flat row-per-cell table. With 8 PLMs × ~9 (cat ×
aspect) cells × 3 stages × 3 K values, the narrative thesis defenders
care about — *which* model wins *where*, with *which* scoring + K — gets
buried in scrolling. A small-multiples view shows it in one screen.

## What

### New `<BenchmarkHeatmap />` component
- 3-aspects × N-categories grid of compact cards.
- Each card lists embeddings sorted by Fmax descending, one horizontal
bar each.
- Bar **width** is proportional to Fmax (primary signal for
accessibility); **color** sits on a perceptual blue→violet HSL gradient
(secondary signal).
- Leader marked with a medal 🥇.
- Aspect-tinted card header (MFO blue / BPO violet / CCO emerald) so the
per-aspect column reads at a glance.
- Hover tooltip exposes `stage / K / Fmax`. Reserved slot for
**bootstrap CI whiskers** — when the persisted CIs land (per the
`thesis_bootstrap_cis` roadmap entry), they render in the same row
without layout churn.

### Toggle wired into `/benchmark`
- New `viewMode` state, default `"heatmap"`.
- `role="tablist"` toggle (`aria-selected` per button) sits between the
leaderboards and the matrix.
- Original full matrix table preserved verbatim under the **Table**
toggle — export-friendly raw numbers stay one click away.

### Existing surface preserved
- Filters (stage / K / evaluation_set) drive both views.
- Both leaderboards (Global champions + In-selection) stay above the
toggle.
- CSV export untouched.

## Test plan
- [x] `next build` green; 18 routes; no TS errors
- [x] Backend untouched — no changes outside `apps/web/`
- [ ] Visual: open `/benchmark` — heatmap grid renders by default with
NK row, then LK, then PK; aspects flow MFO → BPO → CCO across each row.
- [ ] Click a stage chip — both leaderboards + heatmap recompute; bars
resort.
- [ ] Click **Table** in the toggle — original matrix table appears,
toggle reflects active state.
- [ ] Hover any bar — tooltip shows `display_name · stage · K=N ·
0.xxx`.
- [ ] Empty cell (no data for cat × aspect under the active filter) —
card shows "No data" placeholder.

## Notes
- Worktree `protea-benchmark-heatmap`, fully isolated. Sister PR (#79
coherence sweep) is in flight from `protea-coherencia-visual` — touches
different files, no conflict expected.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant