feat(cv): harden multi-page builder
CI and Deploy / test (pull_request) Failing after 3m0s
CI and Deploy / deploy (pull_request) Has been skipped

Wrap pathological content, paginate oversized entries, measure A4 and Letter previews correctly, unify section ordering, and gate stored-output actions on saved state.
This commit is contained in:
cesnimda
2026-08-15 14:09:51 +02:00
parent d424633f95
commit 5203ddea72
19 changed files with 508 additions and 206 deletions
+9 -2
View File
@@ -76,8 +76,15 @@ variant, never on the profile. Each entry exposes hide, title/subtitle override,
editing (`RichTextField` — a markdown toolbar over a textarea; storage stays plain text, the server
renderer converts the `**bold** *italic* __underline__ [text](url)` whitelist to safe HTML).
**Preview** has zoom presets (±, slider, Fit), a measured page count with prev/next page navigation
and dashed page-break indicators, and an "updating…" chip. **Customize** badges ATS-friendly themes.
**Preview** has zoom presets (±, slider, measured Fit), physical A4/Letter dimensions, a ceiling-based
page count with prev/next navigation and page-break indicators, and an "updating…" chip. Three-page
and longer documents receive content-focus guidance rather than automatic font shrinking. Preview
requests and autosaves are ordered so stale responses cannot replace newer edits; PDF/public actions
save the current variant before consuming the stored render. **Customize** badges ATS-friendly themes.
Profile-backed and custom sections share one section order. Custom-section content remains stored in
`CustomSections`, while `Sections` holds its `custom:<key>` position and visibility. Legacy variants
without those order rows still append custom sections and acquire the shared order on their next edit.
## AI
+5 -3
View File
@@ -51,9 +51,11 @@ dense), `ats-classic` (single, no graphics), `nordic` (sidebar-right), `elegant`
- **ATS-friendliness** is a data flag: `CvTheme.AtsFriendly` (set on the single-column themes),
surfaced in `GET /api/cv/themes` and badged in the Customize tab. Two-column (sidebar) themes are not
flagged, as sidebar layouts can trip naive resume parsers.
- **Print quality**: the renderer emits `break-inside: avoid` on entries, `break-after: avoid` on
section headings, and widow/orphan control, so entries don't split across a page in the Playwright
PDF pass.
- **Print quality**: ordinary entries use `break-inside: avoid-page`; content classified as too tall
for a page is allowed to flow between bullets/paragraphs so Chromium cannot clip an unsplittable
block. Section headings avoid a following break, list items carry widow/orphan rules, and long
names/titles/contact values/URLs/tags wrap within `minmax(0, …)` columns. Typography is not scaled
down to mask overflow.
## Deliberately not here (yet)