- Parenthetical blocks (Author year; Author year) now expand into individual
cite spans so each is independently clickable rather than linking only to the
first author
- Detected citation patterns always emit a cite segment regardless of whether
the reference is in citeIndex; empty-refs spans fall back to a fielded ADS
search (first_author:"Surname" year:YEAR) on click
- Matched corpus citations get a rubric-tinted dotted underline; unmatched get
a grey dotted underline; both turn rubric on hover
- Cite elements changed from <span> to <button> for accessibility
- Add .vite to frontend .gitignore; fix FakeCorpus test stub (arxiv_ids/bibcodes)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements Task 20: clickable Fig./Figure N mentions in paragraph text open a
FigurePopover with the figure image, caption, and five-mode streaming annotator,
reusing CitePopover chrome and NoteBody extracted from MarginNote. Adds the 7th
pipeline stage row (vii · Tipping in the plates · pymupdf), extends session
round-trip with figures/litByFig, and generalises generate() to resolve both
paragraph and figure targets.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix: parse CRLF-framed SSE events from sse-starlette
The browser pipeline screen stalled at the first stage: parseSseChunk
split events on '\n\n' but sse-starlette frames with '\r\n\r\n', so
no event ever parsed. Accept CRLF/LF separators per the SSE spec.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>