- getDocument() now explicitly lists all block fields including url
- loadDocument() initializes url/series_id for backward compat with older JSONs
- Cache-busting query params (?v=4.8) on all static assets
- PDF generator uses block.url directly (proper model field)
- Added 7 new URL tests (model, API, PDF link annotations)
- Version bumped to 4.8.0
- Remove all Excel code (import, export, template, pandas, openpyxl)
- New canvas-based schedule editor with drag & drop (interact.js)
- Modern 3-panel UI: sidebar, canvas, documentation tab
- New data model: Block with id/date/start/end, ProgramType with id/name/color
- Clean API: GET /api/health, POST /api/validate, GET /api/sample, POST /api/generate-pdf
- Rewritten PDF generator using ScenarioDocument directly (no DataFrame)
- Professional PDF output: dark header, colored blocks, merged cells, legend, footer
- Sample JSON: "Zimní výjezd oddílu" with 11 blocks, 3 program types
- 30 tests passing (API, core models, PDF generation)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>