levineuwirth.org/static/js
Levi Neuwirth 1027b88429 Rich reference popups: arXiv lead figures, prominent Wikipedia images
Reference popups (provider-rendered: arXiv, Wikipedia, CrossRef, …)
get a glanceable layout: wider container (560px), larger title and
body type, and a full-width image banner under the source label.
Internal page previews and item-card popups (new/library pages) keep
the compact layout — the shared popup element toggles
.link-popup--rich per show based on the rendered content.

- arXiv: a new best-effort enrich step fetches the paper's LaTeXML
  HTML rendition and pulls the first figure as a lead image. Enrich is
  time-boxed (1.8s) so the metadata popup is never held hostage; late
  results refresh the cache for the next hover. Figures letterbox with
  object-fit: contain (plots must not crop); Wikipedia photos
  cover-crop with an upper focal point. width/height attrs reserve
  aspect ratio so positioning is stable before the image loads.
- Wikipedia thumbnails request 480px for the banner width.
- nginx: new ^~ /proxy/arxiv-html/ location backed by arxiv.org proper
  (export.arxiv.org serves the Atom API but 429s the /html/ asset
  tree); 404s cached 1d (the common no-HTML-rendition case). All four
  proxy locations switched to ^~ — without it, static-assets.conf's
  per-extension regex location outranks plain prefixes and serves a
  local 404 for any proxied URL ending in an image extension, which is
  exactly how the first figure fetch failed.

Installed and verified live: proxied page (200, 298KB), figure (200
image/png), API unchanged, no-rendition 404 path; the full client
resolution chain (relative src -> proxy path -> guard -> image)
validated against production.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 13:02:15 -04:00
..
annotations.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
collapse.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
copy.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
gallery.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
katex-bootstrap.js audit: frontend a11y, JS shared utils, CSS variable definitions 2026-04-10 17:41:21 -04:00
lightbox.js Frontend: search races, lightbox a11y, popup edge cases 2026-06-10 09:43:25 -04:00
list-pagination.js Navigation refactor 2026-04-19 14:35:41 -04:00
nav.js Frontend: search races, lightbox a11y, popup edge cases 2026-06-10 09:43:25 -04:00
now.js Add now.js: recompute "Last updated" relative phrase client-side 2026-05-23 12:06:49 -04:00
photography-map.js Spec dilemma 2026-05-01 21:22:01 -04:00
photography-modes.js Spec dilemma 2026-05-01 21:22:01 -04:00
popups.js Rich reference popups: arXiv lead figures, prominent Wikipedia images 2026-06-10 13:02:15 -04:00
prism.min.js initial deploy! whoop 2026-03-17 21:56:14 -04:00
random.js affiliation, cabal helper script 2026-03-26 08:14:50 -04:00
reading.js initial deploy! whoop 2026-03-17 21:56:14 -04:00
score-reader.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
search-filters.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
search.js Frontend: search races, lightbox a11y, popup edge cases 2026-06-10 09:43:25 -04:00
selection-popup.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
semantic-search.js Frontend: search races, lightbox a11y, popup edge cases 2026-06-10 09:43:25 -04:00
settings.js yum cappuccino yay! 2026-05-03 21:16:58 -04:00
sidenotes.js mobile fixes 2026-04-12 15:29:35 -04:00
theme.js yum cappuccino yay! 2026-05-03 21:16:58 -04:00
toc.js mobile fixes 2026-04-12 15:29:35 -04:00
transclude.js Frontend tail: keyboard access, idempotence, input edge cases 2026-06-10 11:25:19 -04:00
utils.js audit: frontend a11y, JS shared utils, CSS variable definitions 2026-04-10 17:41:21 -04:00
viz.js Fix audit frontend MEDs 2026-06-10 09:21:47 -04:00