feat(templates): add the ProfessionalSidebar layered CV preset - #613
Merged
DemchaAV merged 1 commit intoAug 30, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
CvDocumentcan carry a sheet drawn around slots it never had.What changed
cv/presets/ProfessionalSidebar— aDocumentTemplate<CvDocument>viacreate(), split for the 500-LOC rule into package-privateProfessionalSidebarStyles(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) andProfessionalSidebarIcons(the five packaged marks).CvSkillalready carries an optional level, so the skill bars and the language dots read the same field;CvEntrycovers experience, education and projects; the five contact rows come offCvIdentity, with thetel:andmailto:targets built from the values rather than carried twice in the document.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-infonow describes both shapes the package holds.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 bothSkillsSections — the same shape drawn in two hands, which is why a title naming both berths fills only the first.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
CommittedAssetDriftTestwith 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
AtomicNodeTooLargeException— it does not flow onto a second page. The preset draws no cap of its own, which is the deliberate half:MonogramSidebar,SidebarPortraitandMintEditorialcap 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.mdand a test all carry it, and the natural follow-up is theColumnPaginationtreatment this package already applies toTimelineMinimal.subtitle, an education entry'sbody, aSkillGroup'scategory— 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.Lane: canonical (templates.cv.presets + qa + examples) — no engine changes, no model changes.