feat(templates): add the NavySidebar CV preset and a portrait on CvIdentity - #614
Merged
DemchaAV merged 2 commits intoAug 30, 2026
Merged
Conversation
The sample addresses in both sidebar CV examples were wider than the sidebar's text column, so the row wrapped and left the mark alone on its first line. A channel is one paragraph by design — the mark and the value share a line — so the fix is a value that fits, and both preset classes now say how much room there is.
This was referenced Aug 30, 2026
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 second CV bundle in the promotion queue is the first one with a face in it. The family had nowhere to put one:
CvIdentitycarried the name, the title, the contact triple and the links, andSidebarPortrait— the preset named for portraits — draws a packaged silhouette because there was no field to read.So this promotion is two things: the sheet, and the one model change the CV family actually needed.
What changed
CvIdentitycarries an optional portrait.Optional<DocumentImageData> portrait, set throughCvIdentity.Builder.portrait(...)— the image itself, because a photograph is caller-supplied content rather than template chrome, and because it belongs to the person rather than to one preset's options. The four- and three-argument constructors are kept explicitly, so existing calls compile and link unchanged;CvIdentityPortraitTestpins that, along with the null normalisation.cv/presets/NavySidebar— aDocumentTemplate<CvDocument>viacreate(), split for the 500-LOC rule into package-privateNavySidebarStyles(the measured geometry and the Lato scale),NavySidebarWidgets(the two headings and the indented list),NavySidebarAside,NavySidebarMainandNavySidebarIcons. It sets A4 with no margin and paints the navy plate as a page background.NavySidebarStylesso the ends of the band cannot drift apart.RowsSection, not levelled skills. This design writes the proficiency out — "Native", "Advanced", "Intermediate" — which a number could not carry back.templates/cv/navy-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 plus the new data test 15/15; examples suite 75/75 including
CommittedAssetDriftTestwith the new preview;javadoc:javadoc→ BUILD SUCCESS with no warning naming a new file.Port parity, verified against the published template itself: the preset fed the template's own fixture is pixel-identical to the standalone render — 0 / 2,173,720 differing pixels, and the layout snapshot matches node for node — 87 of 87, zero geometry delta. The only difference in the two snapshots is that eight education paragraphs the bundle left unnamed are named here. The bundle's geometry is the same on its pinned 2.2.0 and on this branch (87/87 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.
Notes
AtomicNodeTooLargeExceptionrather than flowing onto a second page. It caps nothing, which is the deliberate half: the capped sidebar presets drop entries silently, and a CV that quietly loses a job is worse than one that refuses to compose. Documented on the class, inusing-templates.mdbeside the caps table, and pinned by a test — the same contractProfessionalSidebarlanded with.SidebarPortraitstill draws its packaged silhouette and does not read the new field — teaching it to would move its pixel baseline, which is not this PR's business. Worth a follow-up.Lane: canonical (templates.cv.data + templates.cv.presets + qa + examples) — no engine changes.