74f5693fec
wire:click="exportPdf" attempted to return a binary Response through Livewire's JSON channel — it re-encoded the PDF bytes as JSON and triggered "Malformed UTF-8 characters, possibly incorrectly encoded". Added GET /app/appointments/pdf?from=...&to=... that streams the PDF with Content-Disposition: inline (or attachment when ?download=1) and switched the calendar button to a plain <a target="_blank"> pointing at that URL. The button now includes the currently visible period via query params. The old exportPdf() method is retained (still returns a plain PDF Response) because CalendarEnhancementsTest asserts against it — it's just no longer wired to the UI. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>