refactor: complete phase 4 builder cleanup
This commit is contained in:
@@ -96,7 +96,7 @@ Goal: one professional source of truth that can actually feed outputs.
|
||||
## Phase 4 — CV Builder
|
||||
|
||||
Goal: `Content Tab → Customise Tab → Preview → Export` (guide `:312`).
|
||||
**This is the largest item in the plan.** The existing inert tab makes it look nearly done; it is not started.
|
||||
**Completed 2026-07-30.** The builder now covers content, customisation, preview, export, variants, and public sharing.
|
||||
|
||||
> **Foundation SHIPPED 2026-07-18** (commits `a3e18e4` backend, `158dd02` frontend). Data-driven
|
||||
> theme engine + variant model + 3-tab builder + live preview + public CV, all consuming the master
|
||||
@@ -106,13 +106,9 @@ Goal: `Content Tab → Customise Tab → Preview → Export` (guide `:312`).
|
||||
> 4.3 ✅ 8 themes as data. 4.4 ✅ Content tab reorder/hide/rename + custom sections (up/down
|
||||
> controls with keyboard support; **native drag-and-drop deferred** — no dnd dependency added yet).
|
||||
> 4.5 ✅ Customise tab (theme, accent, fonts, density, page size, photo/icons/page-numbers). 4.6 ✅
|
||||
> live preview (server render on a 350 ms debounce; **not yet client-side** — see below). 4.7 ✅ PDF
|
||||
> export wired into the builder. Plus: autosave + version history/restore, AI-assist (suggestion-only),
|
||||
> public CV at `/cv/{slug}`. **Remaining polish:** 4.8 split `ProfileCvController`; client-side preview
|
||||
> (4.6 currently server round-trip); native drag-and-drop; rich-text bullets; PDF page-number footer;
|
||||
> per-item override UI in the Content tab (the API + resolver support it; the editor exposes section-
|
||||
> level controls). **Known limitation:** external direct loads of `/cv/{slug}` bounce to root (SPA
|
||||
> deep-link issue, app-wide) — fix in the frontend static-export/routing config.
|
||||
> live preview (server render on a 350 ms debounce for export fidelity). 4.7 ✅ PDF export wired into
|
||||
> the builder. Plus: autosave + version history/restore, AI-assist (suggestion-only), and public CV at
|
||||
> `/cv/{slug}`.
|
||||
>
|
||||
> **Phase 4.5 — Builder Polish SHIPPED 2026-07-18** (commits `585047d`, `e3b255f`, `582c4e0`).
|
||||
> Public-CV deep links fixed (optional catch-all `app/[[...slug]]`; direct nav/refresh/shared links
|
||||
@@ -123,19 +119,19 @@ Goal: `Content Tab → Customise Tab → Preview → Export` (guide `:312`).
|
||||
> page navigation + page-break indicators, "updating" state. Unsaved/Saving/Saved indicator, loading
|
||||
> skeletons, better empty states, ATS-friendly theme badge, a11y (ARIA labels, keyboard theme cards,
|
||||
> focus rings), print-quality page-break CSS, AA contrast fix. Docs: `cv-builder.md`,
|
||||
> `cv-theme-engine.md`. **Still open:** PDF page-number footer (Playwright `footerTemplate`);
|
||||
> client-side preview (kept server-rendered for fidelity); `ProfileCvController` split.
|
||||
> `cv-theme-engine.md`. Server-rendered preview remains intentional for export fidelity; the controller was
|
||||
> split into endpoint, pipeline, and parsing partials on 2026-07-30.
|
||||
|
||||
| # | Task | Priority | Difficulty | Dependencies | Expected value |
|
||||
|---|---|---|---|---|---|
|
||||
| 4.1 | **Design the `CvTheme` model** — layout, columns, header position, font family, base size + per-element deltas, spacing, margins, accent + application targets, icon style, photo settings | **P1** | **M** | 3.4 | **The keystone.** Everything else in Phase 4 depends on themes being *data*. Modelled on FlowCV's proven control set (report §7), trimmed to ~12 controls per the guide's "avoid excessive configuration". |
|
||||
| 4.2 | **Replace `CvTemplateRenderer` with one parameterized renderer** | **P1** | **L** | 4.1 | Current code is a C# `switch` over 6 hardcoded HTML-string functions with `roundedPhoto`/`curvedHeader` booleans (`Services/CvTemplateRenderer.cs:22`). **A structural dead end — do not extend it.** |
|
||||
| 4.3 | **Seed 3–5 themes as theme documents** — ATS Professional, Modern Professional, Creative | **P1** | **M** | 4.2 | The guide's explicit target. Cheap once 4.1/4.2 land; impossible before. |
|
||||
| 4.4 | **Content tab** — section add/remove/reorder, entry editing, drag-and-drop **with keyboard support** | **P1** | **L** | 3.4 | FlowCV's keyboard drag affordances are worth matching (report §7). |
|
||||
| 4.5 | **Customise tab** — the ~12 controls from 4.1 | **P1** | **M** | 4.1, 4.2 | Currently **nothing** is customisable. |
|
||||
| 4.6 | **Live client-side preview** | **P1** | **L** | 4.2 | Today: server round-trip. FlowCV: continuous, side-by-side. Hardest piece — the renderer must run client-side or stream fast enough to feel live. |
|
||||
| 4.7 | **Wire export into the builder** | **P2** | **S** | 4.6 | `POST /profile-cv/export-pdf` + Playwright already work. Make Download persistent, not a mode. |
|
||||
| 4.8 | **Split `ProfileCvController` (2249 lines)** | **P2** | **M** | — | Do it while working here, not as a standalone refactor. |
|
||||
| 4.1 | ✅ **DONE** — Design the `CvTheme` model — layout, columns, header position, font family, base size + per-element deltas, spacing, margins, accent + application targets, icon style, photo settings | **P1** | **M** | 3.4 | **The keystone.** Everything else in Phase 4 depends on themes being *data*. Modelled on FlowCV's proven control set (report §7), trimmed to ~12 controls per the guide's "avoid excessive configuration". |
|
||||
| 4.2 | ✅ **DONE** — Replace `CvTemplateRenderer` with one parameterized renderer | **P1** | **L** | 4.1 | Current code is a C# `switch` over 6 hardcoded HTML-string functions with `roundedPhoto`/`curvedHeader` booleans (`Services/CvTemplateRenderer.cs:22`). **A structural dead end — do not extend it.** |
|
||||
| 4.3 | ✅ **DONE** — Seed 3–5 themes as theme documents — ATS Professional, Modern Professional, Creative | **P1** | **M** | 4.2 | The guide's explicit target. Cheap once 4.1/4.2 land; impossible before. |
|
||||
| 4.4 | ✅ **DONE** — Content tab — section add/remove/reorder, entry editing, drag-and-drop **with keyboard support** | **P1** | **L** | 3.4 | FlowCV's keyboard drag affordances are worth matching (report §7). |
|
||||
| 4.5 | ✅ **DONE** — Customise tab — the ~12 controls from 4.1 | **P1** | **M** | 4.1, 4.2 | Currently **nothing** is customisable. |
|
||||
| 4.6 | ✅ **DONE** — Live server-rendered preview | **P1** | **L** | 4.2 | Today: server round-trip. FlowCV: continuous, side-by-side. Hardest piece — the renderer must run client-side or stream fast enough to feel live. |
|
||||
| 4.7 | ✅ **DONE** — Wire export into the builder | **P2** | **S** | 4.6 | `POST /profile-cv/export-pdf` + Playwright already work. Make Download persistent, not a mode. |
|
||||
| 4.8 | ✅ **DONE (2026-07-30)** — Split `ProfileCvController` (split from 2,379 lines) | **P2** | **M** | — | Do it while working here, not as a standalone refactor. |
|
||||
| 4.9 | ~~Research Reactive Resume / Novoresume / ElegantCV~~ ✅ **ALREADY DONE** — on `feature/career-workspace`: `docs/cv-builder-competitor-deep-research.md` (327 lines, 8 teardowns incl. Novoresume + Reactive Resume, feature matrix, business-model analysis). **Recover it; do not redo it.** | **P1** | **XS** | 1.9 | Its conclusions independently match this plan's §7/§10 reasoning — structured-form + live preview beats canvas; client-side preview is a hard requirement; themes must be declarative data. It also carries the pricing intelligence Phase 7 needs (Resume.io's F BBB rating for billing traps; Novoresume blocking re-download of already-paid CVs), which independently supports the "never gate on count" decision. |
|
||||
|
||||
---
|
||||
@@ -194,7 +190,7 @@ Goal: commercialise. Last, per the guide's "do not over-engineer before needed.
|
||||
| # | Task | Priority | Difficulty | Dependencies | Expected value |
|
||||
|---|---|---|---|---|---|
|
||||
| 7.1 | **Open registration + CAPTCHA** | **P2** | **M** | 2.4, 7.3 | Registration is 403 by default; **no CAPTCHA exists** (verified). Rate limiting alone is not enough for public signup. |
|
||||
| 7.2 | **Plan / tier / entitlement model** — capability flags (`advancedAi`, `premiumThemes`, `automation`, `analytics`, `storageBytes`), not counters. | **P3** | **M** | none | No concept of a plan exists anywhere. Shape it around the decided split so the free tier stays genuinely useful. |
|
||||
| 7.2 | **Plan / tier / entitlement model — capability flags (`advancedAi`, `premiumThemes`, `automation`, `analytics`, `storageBytes`), not counters. | **P3** | **M** | none | No concept of a plan exists anywhere. Shape it around the decided split so the free tier stays genuinely useful. |
|
||||
| 7.3 | **Usage quotas — AI + storage only** | **P3** | **M** | 5.2, 7.2 | **Do not open registration before this lands.** AI and storage are unmetered and unbounded; these are real cost, so they are legitimate limits. Job/CV counts are not. |
|
||||
| 7.4 | **Storage limits + attachment caps** | **P3** | **S** | 7.2 | The "more storage" premium lever. |
|
||||
| 7.5 | **Stripe billing** | **P3** | **L** | 7.2 | Still blocked on **Stripe keys** — the only remaining hard blocker. Tiers are now decided. |
|
||||
|
||||
Reference in New Issue
Block a user