292bd21abe406f39063326830b67db0248c27286
Mckinley's PDFs kept cutting off content mid-page with no way to fix it short of regenerating the whole report — a fixed-layout PDF isn't the right format for something meant to be edited. Adds report.build_report_docx(), a python-docx equivalent of build_report_pdf() sharing the exact same compute_period_stats() data and section order (KPI table, section abstracts, weekly pace, audience composition, follower growth chart, all posts table with the same excluded-post strikethrough treatment, format performance, competitor snapshot, and the full Section Deep Dives for a monthly campaign report), so the two can never silently drift apart on numbers even though the rendering layer is completely different. Word reflows content automatically, so there's no more fixed page grid to fight when editing. The Reports tab's download button now produces .docx instead of PDF. Verified via python-docx re-read (KPI values, the 10/07 repost row's strikethrough, embedded chart images) and strict OOXML schema validation (including fixing a `w:zoom` attribute python-docx's own default template omits). build_report_pdf() is left in place, only report.py's ctx docstring rewritten since the doubly-stale "sidebar's generic PDF control" no longer exists as an actual call site. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Languages
Python
50.8%
HTML
48.9%
CSS
0.3%