Skip to content

feat(templates): add the Terracotta Rail two-column CV preset - #624

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

DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/oliver-bennett-cv-preset

Conversation

@DemchaAV

Copy link
Copy Markdown
Owner

Why

The CV family's model was finished by the presets before this one — a portrait, a
place, a mark, a link — and the claim that it now carries a drawn sheet needs the next
published design to land on it without asking for anything. This one does: an
architect's two-column CV, ported from a published standalone template, on the existing
CvDocument with no model change at all.

What

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

The sheet: a narrow column with a serif monogram over a terracotta rule, the contact
channels behind their marks, two bulleted lists, the credentials and a block of closing
facts; a wide column with a letter-spaced masthead, the summary, the roles held on a
ringed rail, a projects grid and the degrees. Like CharcoalGold it leaves the page to
the caller and holds one page: the body is a single atomic row, so a longer CV raises
AtomicNodeTooLargeException rather than dropping an entry to a silent cap.

Eight berths reach their sections by title. The two bulleted lists are skills without
levels — this design writes them as plain lines, so a rating would have nowhere to go —
and one takes a terracotta square with no dash under its heading while the other takes
a disc and a dash, which is how the sheet tells two lists of one-liners apart. The
software berth is claimed first and the competency berth then skips whatever it took,
so a section titled for both ("Software Skills") is drawn once rather than twice.

Three details worth naming. The monogram is drawn from the name's own initials rather
than a field of its own: a document states its name once, and a second place to keep
true is a second place to be wrong. A link in the contact block is set smaller than the
channels above it — a URL is one long token that cannot be broken, so it is the line
that outgrows that column first — and it takes the mark of the network it points at, or
a globe. And the headings are letter-spaced with a real space character rather than a
style property: a hair space in the sidebar, because a full one would set ADDITIONAL
INFORMATION wider than the column and wrap it, and a thin space in the wider column.

Also here: the example (cv-terracotta-rail-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.

  • TerracottaRailSmokeTest (11) — identity, the canonical render, every column's text,
    the monogram drawn from the name, the contact and link targets, a project title
    linked, an entry with no mark, an unknown mark reported as a data error, an identity
    with no links, a document with nothing but an identity, and the refusal of a CV
    longer than the sheet.
  • TerracottaRailLayoutSnapshotTest (1) — an exact snapshot of the one-page sheet.
  • TerracottaRailVisualParityTest (1) — pixel baseline, same budget and tolerance as
    the other CV gates.

The port was proven before the gates were written. The published bundle reproduces its
own approved preview exactly on the engine it was cut against and again on this one, and
the preset rendered against the bundle's own fixture differs by 0 of 2 173 720
pixels
, with 154 of 154 layout nodes identical in geometry — the only differences
being the five node names the promotion deliberately changes.

An architect's one-page CV: a narrow column with a serif monogram over a
terracotta rule, the contact channels behind their marks, two bulleted lists,
the credentials and a block of closing facts, beside a wide column with a
letter-spaced masthead, the summary, the roles held on a ringed rail, a
projects grid and the degrees.

It ports a published standalone template onto the existing CvDocument with no
model change: eight berths reach their sections by title, and the software
berth is claimed before the competency one so a section titled for both is
drawn once rather than twice.

The monogram is drawn from the name's own initials rather than a field of its
own, so a document states its name once. A link in the contact block is set
smaller than the channels above it, because a URL is one long token that
cannot be broken and is the line that outgrows that column first; it takes the
mark of the network it points at, or a globe. The headings are letter-spaced
with a real space character rather than a style property — a hair space in the
sidebar, a thin space in the wider column.

Like its siblings it holds one page: the body is a single atomic row, so a
longer CV raises AtomicNodeTooLargeException rather than losing an entry.

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