Skip to content

feat(templates): add the Violet Grid banded CV preset - #631

Merged
DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/violet-ux-cv-preset
Aug 31, 2026
Merged

DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/violet-ux-cv-preset

Conversation

@DemchaAV

Copy link
Copy Markdown
Owner

Why

The last CV in the promotion queue that needs no new fonts, and structurally the odd one out: a single column with no page-level grid, where four separate bands each split their own way. It is the case that tests whether the preset conventions hold for a sheet built out of local arrangements rather than one shared skeleton.

They do: it lands with no model change, reading a rated language's wording from the CvSkill.note added for SlateOrange.

What

cv.presets.VioletGrid, composed from five package-private files — the measured geometry and type scale, the icon loader, the idioms the sheet repeats, and one per half of the page.

Every split is local to one band — the masthead splits where the contact marks begin, the timeline into dates / rail / content, a project into tile / copy, the credentials into two halves — and none of the four knows about the others. That is why every horizontal arrangement is either a top-level row or a table, and why none of them nests.

Three marks are relationships, not lengths. A section rule starts where its heading ends, because it is a weighted column taking what an auto column leaves. The timeline rail is the left border of every entry but the last, so consecutive entries butt into one unbroken line that stops at the final marker. A project's hairline is its copy's left border, so it is exactly as tall as the copy. None of the three has to be re-measured when the content changes.

Past one page it flows. Each experience entry is held together, so a longer CV runs onto a second page rather than cutting a role in half — pinned by a test, as on TealPulse.

As on the presets before it, a link is drawn as its own label with the address behind it — the one deliberate departure from the ported sheet, measured at 1 882 of 2 173 720 pixels.

Also here: the example (cv-violet-grid-v2), its showcase row and its committed preview.

Tests

./mvnw -B -ntp clean verify -pl :graph-compose-core,:graph-compose-render-pdf,:graph-compose-render-docx,:graph-compose-render-pptx,:graph-compose-templates,:graph-compose-testing,:graph-compose-qa,:graph-compose-coverage -am — BUILD SUCCESS, 1014 tests.

  • VioletGridSmokeTest (12) — identity, the canonical render, every band's text, the two-tone name, the quotation's title staying off the sheet, the contact and link targets, a link showing its label, a linked role, project and degree, an unknown mark reported as a data error, a skill with no mark, an identity with no links, a document with nothing but an identity, and the run onto a second page.
  • VioletGridLayoutSnapshotTest (1) and VioletGridVisualParityTest (1).

The port was proven before the gates were written: the preset rendered against the bundle's own fixture differs by 0 of 2 173 720 pixels, with 140 of 140 layout nodes identical in geometry — the only differences being the six node names the promotion deliberately changes.

As with the last two, this bundle does not reproduce its own published preview — 45 526 pixels, identically on both engines. Here the cause is the engine's Latin-ligature fix: the preview's text layer reads "sofia.mar nez.design", so it was rendered before that landed. The published source is self-consistent and is what was ported.

A one-page sheet with no page-level grid at all: a two-tone name beside the
contact list, three opening lines, a six-up grid of marked skills divided by
dotted rules, a strip of tools on inline discs, the roles held on a dated
timeline whose dates sit outside the rail, the projects behind tinted tiles,
education and languages side by side, and a tinted band closing on a
quotation.

Every split is local to one band, and none of the four knows about the
others — which is why every horizontal arrangement is either a top-level row
or a table and none of them nests: a row cannot sit inside a row's cell.

Three marks are relationships rather than lengths. A section rule starts where
its heading ends because it is a weighted column taking what an auto column
leaves; the timeline rail is the left border of every entry but the last, so
consecutive entries butt into one line that stops at the final marker; and a
project's hairline is its copy's left border, so it is exactly as tall as the
copy. None has to be re-measured when the content changes.

Unlike its ported siblings this sheet flows: each experience entry is held
together, so a longer CV runs onto a second page rather than cutting a role in
half.

As on the presets before it a link is drawn as its own label with the address
behind it, the one deliberate departure from the ported sheet, at 1,882 of
2,173,720 pixels.

Guarded by a smoke test, an exact layout snapshot and a pixel-parity gate; the
examples showcase gains `cv-violet-grid-v2`.
@DemchaAV
DemchaAV merged commit dc7d905 into feature/template-promotion Aug 31, 2026
12 checks passed
@DemchaAV
DemchaAV deleted the feat/violet-ux-cv-preset branch August 31, 2026 18:19
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