Skip to content

feat(templates): add the ProfessionalSidebar layered CV preset - #613

Merged
DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/professional-sidebar-cv-preset
Aug 30, 2026
Merged

DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/professional-sidebar-cv-preset

Conversation

@DemchaAV

Copy link
Copy Markdown
Owner

Why

The CV family has sixteen presets and every one of them composes onto the page the caller sets. The design this PR promotes does not work that way: it is a specific sheet — 491.6 x 737.28pt, a navy plate capping a pale sidebar, geometry measured to two decimals — and it existed only as a published standalone template pinned to graph-compose:2.2.0, rendering from a JSON file and a folder of PNGs on disk.

It is also the first of the nine CV bundles in the promotion queue, so what it settles it settles for the rest: whether the family's CvDocument can carry a sheet drawn around slots it never had.

What changed

  • cv/presets/ProfessionalSidebar — a DocumentTemplate<CvDocument> via create(), split for the 500-LOC rule into package-private ProfessionalSidebarStyles (the measured geometry, palette and Barlow Condensed / Lato scale), ProfessionalSidebarWidgets (headings, hairlines, the title-and-dates band), ProfessionalSidebarAside (monogram plate, contact channels, skill meters, education rail, language dots), ProfessionalSidebarMain (identity, profile, roles, projects, references) and ProfessionalSidebarIcons (the five packaged marks).
  • The model needed no change — that is the result this PR reports, and it makes the remaining eight CV promotions preset-only. CvSkill already carries an optional level, so the skill bars and the language dots read the same field; CvEntry covers experience, education and projects; the five contact rows come off CvIdentity, with the tel: and mailto: targets built from the values rather than carried twice in the document.
  • The preset owns its page and takes no BrandTheme — the first in the package to do either. Its palette and geometry are constants of its own, because a swappable one would stop it being the sheet it reproduces. package-info now describes both shapes the package holds.
  • Sections reach their berth by title, not by Slot: the columns are fixed, so a document that never set a slot still renders, and one that sets them differently is overruled. Skills and languages are both SkillsSections — the same shape drawn in two hands, which is why a title naming both berths fills only the first.
  • Letter-spacing is a run of its own: a text style carries no tracking, so each letter is written separately with a sized space between, and the spacer's type size is chosen to advance by the design's em value.
  • The five PNG marks ship inside the templates artifact under templates/cv/professional-sidebar/icons/, each at the point size the design draws it at.

Verification

Full reactor gate (the eight CI modules) → BUILD SUCCESS; the preset's qa suite 12/12; examples suite 75/75 including CommittedAssetDriftTest with the new preview; javadoc:javadoc → 0 warnings.

Port parity, verified against the published template itself: the preset fed the template's own fixture is pixel-identical to the standalone render — 0 / 1,572,864 differing pixels, and the committed layout snapshot is node-identical to the bundle's — 158 of 158 nodes, same names, no geometry delta. The bundle's geometry is the same on its pinned 2.2.0 and on this branch (158/158 nodes, zero deltas > 0.01pt); the two engines differ only by the released ligature fix (#601), so the current-engine render is the parity target and the approved preview differs from it by that fix alone.

Notes

  • The sheet holds one page, and says so. Its two columns are a single row, and a row is atomic, so a CV longer than the sheet raises AtomicNodeTooLargeException — it does not flow onto a second page. The preset draws no cap of its own, which is the deliberate half: MonogramSidebar, SidebarPortrait and MintEditorial cap each block and drop the rest silently, and a CV that quietly loses a job is worse than one that refuses to compose. The class documentation, using-templates.md and a test all carry it, and the natural follow-up is the ColumnPagination treatment this package already applies to TimelineMinimal.
  • Three fields have nowhere to go on this sheet — a project's subtitle, an education entry's body, a SkillGroup's category — and a berth is filled by the first section that names it. All four are stated on the class and pinned by a test, because silently-dropped content is what a caller finds out the hard way.
  • The sidebar's rows are one line each; a degree, skill or language longer than the narrow column overflows its band rather than wrapping. That is inherited from the design rather than introduced here.

Lane: canonical (templates.cv.presets + qa + examples) — no engine changes, no model changes.

@DemchaAV
DemchaAV merged commit a5dbd61 into feature/template-promotion Aug 30, 2026
12 checks passed
@DemchaAV
DemchaAV deleted the feat/professional-sidebar-cv-preset branch August 30, 2026 21:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant