feat: theSVG sender logos and app-drawn window controls#4

merged
main
feat/svg-logos-traffic-lights
opened6h agobySScreen

Mirrors GitHub PR #6.

Stacked on #1 (GitHub #5) (chore/setup-ci-v013). Merge #1 (GitHub #5) first, and this PR will retarget to main.

What

  • Sender logos: /api/logo/:domain tries theSVG first, then the existing favicon service. The route now sends nosniff and a sandboxing CSP, because third-party SVG bytes are served from our own origin. New POST /api/logos/sync scans every non-free-mail sender domain and returns a LogoSummary. Tests are in server/logos.test.ts.
  • Window controls: on Windows and Linux the window is now frameless with no caption overlay. The top bar draws its own traffic lights (close, minimize, maximize over IPC), and they grey out while the window is unfocused. Settings → Appearance can move them to the right. Double-clicking the bar maximizes the window.
  • Icons: lucide-react is replaced with iconsax-react.

Fitting in with what's already on main and open

  • macOS (GitHub #1, already merged): macOS keeps hiddenInset and its native traffic lights at (16, 16). The app-drawn dots, the double-click handler and the right-side toggle are all turned off on darwin. Appearance shows a note there instead of the toggle. DESIGN.md describes both platforms.
  • #1 (GitHub #5): this PR builds on #1 (GitHub #5)'s version bump to 0.1.3 and adds no version change of its own.
  • #2 (GitHub #4): this PR's src/App.tsx and src/style.css changes merge cleanly with #2 (GitHub #4). #2 (GitHub #4) and #1 (GitHub #5) already conflict with each other (in package.json test script, CHANGELOG, CONTRIBUTING, KB), and this PR doesn't change that.
  • #3 (GitHub #2) (revert macOS): already conflicting. If it ever lands, the isMac branches here stay harmless.

Verification

  • npx tsc --noEmit passes
  • npm test: 32/32 pass
  • npm run build passes
  • Not yet run by hand on Windows or macOS

🤖 Generated with Claude Code

SScreenopened·6h ago