- Add RobotoCondensed-Bold.ttf and RobotoCondensed-Light.ttf; embed all three
weights (300/normal/bold) in SVG @font-face for correct browser preview
- Dockerfile: install fontconfig and register fonts as system fonts so
CairoSVG/Pango resolves Roboto Condensed in PNG/PDF exports (not a fallback)
- Export PNG/PDF at dpi=150 for higher quality output
- Add SVG <clipPath> per panel so data series cannot overflow axis boundaries
- Replace np.arange tick generation with safe while-loop (no float artifacts)
- Legend: multi-row wrapping when items exceed chart width; improved per-char
text width estimation; legend_row_count() helper for dynamic layout
- Dynamic pad_top in compute_layout() based on legend rows + subtitle presence,
preventing title/subtitle/legend overlap regardless of series count
- Y-axis: skip overlapping labels (gridlines always drawn); adaptive tick
precision so -0.0042% shows correctly instead of -0.00%
- transformer.py: strip % signs from string-formatted percentages before
pd.to_numeric; handle pandas 2.x StringDtype; expand date column detection
to cover Year, Quarter, report_date, substring matches (start_datetime etc.)
- Sync _find_date_column() in engine.py with transformer.py detection logic
- prompts.py: enforce Roboto Condensed for all text; add axis range, label
length, and decimal-percentage guidance rules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>