Test the UI in real browsers without a native build master
The frontend is an ordinary web page, so it can be driven in a real browser with the IPC boundary mocked — no Tauri build, no app window, and no system permissions. That was the gap: the only way to look at this before was screen recording, which needs a permission that cannot be granted from a terminal, and poking at a console by hand, which HMR wiped on every reload. Vitest covers components and stores, Playwright covers flows across WebKit and Chromium. WebKit is the one that earns its place: it is what WKWebView on macOS actually is, so it is the only way to find out whether something works in the shipped app rather than only in Chrome. It found a real bug within minutes. WebKit leaves links out of the tab order unless the system's keyboard navigation setting is on, and that is off by default — so the skip link, whose entire job is to be the first thing a keyboard reaches, was unreachable in the shipped app. Fixed one branch down; the assertion that catches it lives here. Also verified here for the first time: infinite scrolling. Loading more on scroll depends on IntersectionObserver, which does not run in a hidden document, so it could not be checked in the tooling available before. Some deliberate choices: - No screenshot baselines. They differ by operating system and font rendering, so they fail for reasons unrelated to the change. The appearance tests assert computed colours instead, which is the actual claim being made — that light-dark() resolves per scheme with no JavaScript. - Fixtures are typed as the real GraphRow, so a change to the Rust types stops the tests compiling rather than letting them drift. - One file knows about window.__TAURI_INTERNALS__, so an upgrade that moves it breaks in one place. Two lint rules needed configuring for tests specifically: a mock has to keep the signature of what it imitates, and commands reject with a plain { kind, message }, so a mock throwing an Error would misrepresent what the frontend has to handle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>