3b86ea2da0
Choose a contrasting header foreground for custom accents and keep public colour and font overrides inside safe supported values.
6.4 KiB
6.4 KiB
CAREER-002 CV Builder redesign
Updated: 2026-08-15
Status: IMPLEMENTED — NOT VERIFIED. Repository, automated and pathological Chromium/PDF gates are complete; authenticated application-browser and production gates remain.
Revalidated capability matrix
| Requirement | Existing implementation | Current status |
|---|---|---|
| Ordered section list | Default plus persisted section order | Implemented; browser pending |
| Expand/collapse | Entry-based sections use explicit collapse controls | Implemented; deeper tests pending |
| Inline editing | Section title and per-entry title/subtitle/bullets overrides | Implemented; validation depth pending |
| Add entries | Explicit custom-section entries; master entries remain profile-owned | Implemented; browser pending |
| Delete entries/sections | Confirmed deletion for populated custom entries/sections; profile entries hide instead of mutating the profile | Implemented; browser pending |
| Reorder sections/entries | Native drag plus named up/down keyboard buttons | Implemented and persistence-tested |
| Visibility | Named section/entry/custom-section hide/show controls | Implemented and persistence-tested |
| Save feedback | Unsaved/Saving/Saved/failed badge existed | Hardened in b58cc19 |
| Navigation safety | Debounced/failed state could be abandoned silently | Hardened in b58cc19 |
| Preview | Debounced live server render beside editor; visible failure/retry; below editor on narrow layout | Implemented; responsive/browser review pending |
| Versions/public/PDF | Existing history/restore, public toggle/link and PDF export | Preserved; regression/production gates remain |
Multi-page/rendering increment
- Removed page-level clipping and added wrapping/min-width protections for names, titles, employers, contact values, URLs, tags and two-column content.
- Short entries remain intact. Large entries and large list items flow at safe internal boundaries instead of becoming unsplittable blocks taller than a page.
- The legacy job-specific CV templates receive the same wrapping/pagination rules; sidebar values are now HTML-encoded consistently.
- Preview measures both document/body height, uses the selected A4 or Letter dimensions, applies ceiling-based page counts, exposes real Fit/percentage controls, and reports horizontal overflow.
- Three-page and longer CVs receive content-density guidance. Text size is not silently reduced.
- Custom sections now participate in the same section order as master-profile sections.
- Autosaves are serialized; stale preview responses are ignored; export/public actions save pending edits first.
- CV deletion and version restore use the shared application dialog system.
- The non-functional page-number switch is no longer advertised;
ShowPageNumbersremains a backward-compatible exporter extension point until the Chromium CLI path supports controlled PDF footers. - Header-band contact/headline text now owns a computed black-or-white foreground chosen for the stronger WCAG contrast against both theme and custom accents. Sidebar contact/headline text owns
SidebarInkinstead of inheriting the main-page muted colour. - Accent overrides are restricted to six-digit hex colours and font overrides to the six editor-supported stacks before CSS generation, preventing malformed/public settings from escaping the generated stylesheet.
Save-integrity increment
- Latest settings/name are retained independently of render closures.
- Monotonic save revisions prevent an older overlapping request from changing a newer edit to
SavedorSave failed. - Blank names show inline validation and are not sent as misleading no-op renames.
- Unsaved and failed states expose Save now; failed saves retry the latest settings.
- Data-router navigation is blocked until the user explicitly confirms discarding pending/failed changes. Reload/tab close uses the browser's before-unload warning.
- The debounce timer is cleared on intentional unmount. Existing version creation and API payloads are unchanged.
Interaction and error increments
- Custom sections retain the existing
string[]storage model but expose entries individually: add, multiline edit, inline empty validation, arrow reorder and confirmation before destructive deletion. - Custom sections can be reordered and hidden without changing the Career Profile. Deleting an original profile-backed entry is intentionally not offered; variant-specific hide/override preserves source-of-truth ownership.
- Profile-backed section and entry controls include the affected section/entry name. Expand controls expose
aria-expanded. - Preview failure no longer silently preserves stale output without explanation; an error state and in-context retry are available.
Verification to date
- Focused Builder list/helper/deep-link/save/navigation: 3 suites, 21/21 tests; editor deep-link/interaction 9/9.
- Focused renderer/template backend: 25/25 tests, including header/sidebar contrast ownership and visual-override sanitization.
- Full frontend: 49/49 suites, 184/184 tests.
- Production build/TypeScript and
git diff --check: pass. - Pathological Chromium render: 14 long roles, 75 long skills, oversized name/email/URL, zero horizontal-overflow elements, nine-page PDF (173,196 bytes) with extractable final-page content.
- Contrast rerun in real Chromium: Modern default computed white on
rgb(37, 99, 235), light custom accent computed black onrgb(248, 250, 252), Technical sidebar computed white onrgb(15, 76, 92), and all three reported zero element overflow at a 1400px viewport. The harder 14-role/75-skill fixture exported a 17-page A4 PDF (259,447 bytes) with 1,685 extractable characters on the final page. - Implementation commits:
b58cc19,a5b74e0,2043349plus the V-165 checkpoint.
Product research
Public current material for Reactive Resume, Resume.io, Enhancv, Novorésumé, FlowCV and Canva was reviewed. Repeated patterns and adopted/rejected decisions are recorded in docs/research/cv-builder-patterns.md. No authenticated/private competitor session was used or claimed.
Remaining verification
- Run 375/768/1440, Light/Dark, keyboard/focus, empty/error and production synthetic-variant checks.
- Recheck DOCX status honestly: the current architecture documents it as an extension point, while PDF/public rendering are implemented.
Rollback
Revert 2043349, a5b74e0 and b58cc19 in reverse order. No schema, dependency, configuration, CV data rewrite or version migration is involved.