From dc1c69e4fec7a267e391faef45ccae918d93ed76 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 02:15:13 +0100 Subject: [PATCH 1/9] fix(templates): track ProfessionalSidebar and NavySidebar headings with the pen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both presets faked tracking by writing a heading one character at a time with a sized space run between each pair. The gaps were real space characters, so the file said what it drew: PROFILE copied, searched and read back as "P R O F I L E", and the name as "M A R T A L I N D Q V I S T". Native tracking already exists and already solves this — a tracked run keeps its string whole, moves the pen with Tc, and states its own ActualText so an extractor cannot mistake the gaps for word breaks. These two presets simply predated it. - ProfessionalSidebarStyles.tracked and NavySidebarStyles.tracked now write one run carrying DocumentLetterSpacing.ofFontSize(trackingEm). - Drop SPACE_ADVANCE_EM from both: it existed only to size the spacer runs. The advance is equivalent by construction — a space glyph at trackingEm*size/SPACE_ADVANCE_EM advanced by trackingEm*size, which is what ofFontSize(trackingEm) adds — with one measured difference: Tc also advances after the final glyph, so each tracked run is one gap wider. Measured on the ProfessionalSidebar snapshot: placementWidth/contentWidth on 10 headings grow by +1.390, +1.357 and +1.457 pt (trackingEm x font size); x, y, page assignment and pagination are unchanged, which is why the two layout snapshots move and nothing else does. Verified: extracted text via PDFBox 3.0.8 goes from 13 suspicious runs to 0 for cv-professional-sidebar-v2 and 9 to 0 for cv-navy-sidebar-v2; both visual parity gates stay green within budget; 25 preset tests pass. Co-Authored-By: Claude Opus 5 --- .../cv-v2/navy_sidebar_layout.json | 32 +++++++-------- .../cv-v2/professional_sidebar_layout.json | 40 +++++++++---------- .../cv/presets/NavySidebarStyles.java | 25 ++++-------- .../cv/presets/ProfessionalSidebarStyles.java | 25 ++++-------- 4 files changed, 52 insertions(+), 70 deletions(-) diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json index f467275c7..c87be121d 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json @@ -265,11 +265,11 @@ "computedY" : 653.493, "placementX" : 26.5, "placementY" : 653.493, - "placementWidth" : 69.473, + "placementWidth" : 71.856, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 69.473, + "contentWidth" : 71.856, "contentHeight" : 14.4, "margin" : { "top" : 0.0, @@ -475,11 +475,11 @@ "computedY" : 517.693, "placementX" : 26.5, "placementY" : 517.693, - "placementWidth" : 86.807, + "placementWidth" : 89.304, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 86.807, + "contentWidth" : 89.304, "contentHeight" : 14.4, "margin" : { "top" : 18.0, @@ -805,11 +805,11 @@ "computedY" : 316.593, "placementX" : 26.5, "placementY" : 316.593, - "placementWidth" : 47.366, + "placementWidth" : 49.692, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 47.366, + "contentWidth" : 49.692, "contentHeight" : 14.4, "margin" : { "top" : 18.0, @@ -925,11 +925,11 @@ "computedY" : 162.993, "placementX" : 26.5, "placementY" : 162.993, - "placementWidth" : 87.863, + "placementWidth" : 90.36, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 87.863, + "contentWidth" : 90.36, "contentHeight" : 14.4, "margin" : { "top" : 18.0, @@ -1345,11 +1345,11 @@ "computedY" : 753.69, "placementX" : 202.197, "placementY" : 753.69, - "placementWidth" : 187.31, + "placementWidth" : 190.719, "placementHeight" : 16.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 187.31, + "contentWidth" : 190.719, "contentHeight" : 16.2, "margin" : { "top" : 0.0, @@ -1585,11 +1585,11 @@ "computedY" : 632.95, "placementX" : 232.097, "placementY" : 632.95, - "placementWidth" : 89.402, + "placementWidth" : 91.956, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 89.402, + "contentWidth" : 91.956, "contentHeight" : 14.4, "margin" : { "top" : 0.0, @@ -3295,11 +3295,11 @@ "computedY" : 211.675, "placementX" : 232.097, "placementY" : 211.675, - "placementWidth" : 114.332, + "placementWidth" : 117.0, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 114.332, + "contentWidth" : 117.0, "contentHeight" : 14.4, "margin" : { "top" : 0.0, @@ -3505,11 +3505,11 @@ "computedY" : 95.325, "placementX" : 232.097, "placementY" : 95.325, - "placementWidth" : 122.041, + "placementWidth" : 124.824, "placementHeight" : 14.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 122.041, + "contentWidth" : 124.824, "contentHeight" : 14.4, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json index 17e496e80..d1690216a 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json @@ -265,11 +265,11 @@ "computedY" : 606.284, "placementX" : 17.8, "placementY" : 606.284, - "placementWidth" : 47.723, + "placementWidth" : 49.113, "placementHeight" : 10.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 47.723, + "contentWidth" : 49.113, "contentHeight" : 10.2, "margin" : { "top" : 0.0, @@ -535,11 +535,11 @@ "computedY" : 438.234, "placementX" : 17.8, "placementY" : 438.234, - "placementWidth" : 32.312, + "placementWidth" : 33.669, "placementHeight" : 10.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 32.312, + "contentWidth" : 33.669, "contentHeight" : 10.2, "margin" : { "top" : 0.0, @@ -1885,11 +1885,11 @@ "computedY" : 206.784, "placementX" : 17.8, "placementY" : 206.784, - "placementWidth" : 59.505, + "placementWidth" : 60.962, "placementHeight" : 10.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 59.505, + "contentWidth" : 60.962, "contentHeight" : 10.2, "margin" : { "top" : 0.0, @@ -2935,11 +2935,11 @@ "computedY" : 82.854, "placementX" : 17.8, "placementY" : 82.854, - "placementWidth" : 60.253, + "placementWidth" : 61.71, "placementHeight" : 10.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 60.253, + "contentWidth" : 61.71, "contentHeight" : 10.2, "margin" : { "top" : 0.0, @@ -3805,11 +3805,11 @@ "computedY" : 671.34, "placementX" : 170.056, "placementY" : 671.34, - "placementWidth" : 176.476, + "placementWidth" : 187.319, "placementHeight" : 44.04, "startPage" : 0, "endPage" : 0, - "contentWidth" : 176.476, + "contentWidth" : 187.319, "contentHeight" : 44.04, "margin" : { "top" : 0.0, @@ -3835,11 +3835,11 @@ "computedY" : 653.64, "placementX" : 170.056, "placementY" : 653.64, - "placementWidth" : 163.438, + "placementWidth" : 164.246, "placementHeight" : 11.4, "startPage" : 0, "endPage" : 0, - "contentWidth" : 163.438, + "contentWidth" : 164.246, "contentHeight" : 11.4, "margin" : { "top" : 0.0, @@ -3985,11 +3985,11 @@ "computedY" : 606.75, "placementX" : 170.056, "placementY" : 606.75, - "placementWidth" : 42.147, + "placementWidth" : 43.584, "placementHeight" : 10.44, "startPage" : 0, "endPage" : 0, - "contentWidth" : 42.147, + "contentWidth" : 43.584, "contentHeight" : 10.44, "margin" : { "top" : 0.0, @@ -4135,11 +4135,11 @@ "computedY" : 515.14, "placementX" : 170.056, "placementY" : 515.14, - "placementWidth" : 62.533, + "placementWidth" : 64.078, "placementHeight" : 10.44, "startPage" : 0, "endPage" : 0, - "contentWidth" : 62.533, + "contentWidth" : 64.078, "contentHeight" : 10.44, "margin" : { "top" : 0.0, @@ -4765,11 +4765,11 @@ "computedY" : 155.19, "placementX" : 170.056, "placementY" : 155.19, - "placementWidth" : 50.795, + "placementWidth" : 52.268, "placementHeight" : 10.44, "startPage" : 0, "endPage" : 0, - "contentWidth" : 50.795, + "contentWidth" : 52.268, "contentHeight" : 10.44, "margin" : { "top" : 0.0, @@ -5215,11 +5215,11 @@ "computedY" : 34.66, "placementX" : 170.056, "placementY" : 34.66, - "placementWidth" : 64.021, + "placementWidth" : 65.566, "placementHeight" : 10.44, "startPage" : 0, "endPage" : 0, - "contentWidth" : 64.021, + "contentWidth" : 65.566, "contentHeight" : 10.44, "margin" : { "top" : 0.0, diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java index 0584c1372..c4ccb783b 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java @@ -4,6 +4,7 @@ import com.demcha.compose.document.dsl.ParagraphBuilder; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.document.templates.core.text.TextStyles; import com.demcha.compose.font.FontName; @@ -78,12 +79,6 @@ private NavySidebarStyles() { static final double TRACKING_EM = 0.17; - /** - * The advance of a space in Lato, as a fraction of type size. - * {@link #tracked} sizes its spacer runs against this. - */ - static final double SPACE_ADVANCE_EM = 0.25; - // -- bands ----------------------------------------------------------- static final double HEADING_BAND_HEIGHT = BADGE_DIAMETER; @@ -166,23 +161,19 @@ static DocumentTextStyle style(double size, DocumentColor color, } /** - * Writes text letter by letter with a sized space between each pair, - * which is how this design gets its letter-spacing: a text style carries - * no tracking, so the gap is a run of its own whose type size is chosen - * to advance by {@link #TRACKING_EM} of the surrounding size. + * Writes {@code text} as one run tracked by {@link #TRACKING_EM}. + * + *

The design wants the letters held apart; it does not want the gaps to + * become part of the text. Native tracking keeps the run a single string, + * so a heading is drawn spaced but reads, copies and searches as the word + * it is.

* * @param paragraph the paragraph being built * @param text the text to space out * @param style the style of the letters */ static void tracked(ParagraphBuilder paragraph, String text, DocumentTextStyle style) { - DocumentTextStyle spacer = style.withSize(TRACKING_EM * style.size() / SPACE_ADVANCE_EM); - for (int i = 0; i < text.length(); i++) { - paragraph.inlineText(String.valueOf(text.charAt(i)), style); - if (i < text.length() - 1) { - paragraph.inlineText(" ", spacer); - } - } + paragraph.inlineText(text, style.withLetterSpacing(DocumentLetterSpacing.ofFontSize(TRACKING_EM))); } /** Strips a title down to the letters and digits a node name can carry. */ diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java index 37a76b04d..fdb6025e4 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java @@ -4,6 +4,7 @@ import com.demcha.compose.document.dsl.ParagraphBuilder; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.document.templates.core.text.TextStyles; import com.demcha.compose.font.FontName; @@ -122,12 +123,6 @@ private ProfessionalSidebarStyles() { static final double HEADING_TRACKING_EM = 0.14; static final double ROLE_TRACKING_EM = 0.18; - /** - * The advance of a space in the body face, as a fraction of type size. - * {@link #tracked} sizes its spacer runs against this to hit a tracking - * measured in ems. - */ - static final double SPACE_ADVANCE_EM = 0.25; // -- vertical rhythm ------------------------------------------------- @@ -197,10 +192,12 @@ static DocumentTextStyle style(FontName font, double size, DocumentColor color, } /** - * Writes text letter by letter with a sized space between each pair, - * which is how this design gets its letter-spacing: a text style carries - * no tracking, so the gap is a run of its own whose type size is chosen - * to advance by {@code trackingEm} of the surrounding size. + * Writes {@code text} as one run tracked by {@code trackingEm}. + * + *

The design wants the letters held apart; it does not want the gaps to + * become part of the text. Native tracking keeps the run a single string, + * so the heading is drawn spaced but reads, copies and searches as the word + * it is — {@code PROFILE}, not {@code P R O F I L E}.

* * @param paragraph the paragraph being built * @param text the text to space out @@ -209,13 +206,7 @@ static DocumentTextStyle style(FontName font, double size, DocumentColor color, */ static void tracked(ParagraphBuilder paragraph, String text, DocumentTextStyle style, double trackingEm) { - DocumentTextStyle spacer = style.withSize(trackingEm * style.size() / SPACE_ADVANCE_EM); - for (int i = 0; i < text.length(); i++) { - paragraph.inlineText(String.valueOf(text.charAt(i)), style); - if (i + 1 < text.length()) { - paragraph.inlineText(" ", spacer); - } - } + paragraph.inlineText(text, style.withLetterSpacing(DocumentLetterSpacing.ofFontSize(trackingEm))); } /** Strips a title down to the letters and digits a node name can carry. */ From 9c3c9f8c03ed18c27cce1d5acd98b35fb10bf147 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 02:35:27 +0100 Subject: [PATCH 2/9] fix(templates): track five more CV presets with the pen, not with spaces TealPulse, VioletGrid, CharcoalGold, MidnightNavy and TerracottaRail each built their tracking by writing characters that are not in the text: a space run between every letter, or a StringBuilder splicing spaces into the string before it was ever authored. Whatever the shape, the gaps were real characters, so a heading copied as "S K I L L S" and a name as "O L I V E R B E N N E T T". Each now carries DocumentLetterSpacing on the style and hands the engine the word it means. The gap measures are preserved as named constants rather than re-derived: - TealPulse: tracked and knockedOut share one spacedBy(style, em); the spacer run count and its style are gone. - VioletGrid: the gap was authored in points, so it tracks in points. - CharcoalGold, MidnightNavy: the gap was one space of the face, so 0.25 em. - TerracottaRail: the hair and thin space characters were already tracking measures - a tenth and a fifth of an em - so heading/headingWithDash take the measure instead of the character, and the masthead's full space is 0.25 em. Geometry, measured rather than assumed: - TealPulse, TerracottaRail: width only, no x, y or page change. - VioletGrid: the heading text grows 1.239 and the rule that follows it shrinks by exactly 1.239, so placementX moves with the text and the row total is conserved - the rule still starts where the words end. - CharcoalGold: +1.926 on the job title, which is deliberately NOT one trailing gap. The old helper set three spaces between words and one between letters; tracking adds its gap after every glyph, so the word gaps tighten while a trailing gap is added. The look moves slightly and stays inside the visual parity budget. - MidnightNavy: no snapshot movement at all, though its role line is centred. Verified: the CV text-layer gate now covers all 26 presets and only serif_headline still fails it, which is the coupled trackedWidth case and lands next. 129 preset tests green, every visual parity gate green. Co-Authored-By: Claude Opus 5 --- .../cv-v2/charcoal_gold_layout.json | 4 +- .../cv-v2/teal_pulse_layout.json | 40 +++--- .../cv-v2/terracotta_rail_layout.json | 48 +++---- .../cv-v2/violet_grid_layout.json | 132 +++++++++--------- .../cv/presets/CharcoalGoldMain.java | 8 +- .../cv/presets/CharcoalGoldStyles.java | 41 ++---- .../cv/presets/MidnightNavyAside.java | 7 +- .../cv/presets/MidnightNavyWidgets.java | 34 +---- .../cv/presets/TealPulseWidgets.java | 28 ++-- .../cv/presets/TerracottaRailAside.java | 10 +- .../cv/presets/TerracottaRailMain.java | 21 +-- .../cv/presets/TerracottaRailStyles.java | 18 +-- .../cv/presets/TerracottaRailWidgets.java | 58 ++------ .../cv/presets/VioletGridWidgets.java | 18 +-- 14 files changed, 188 insertions(+), 279 deletions(-) diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/charcoal_gold_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/charcoal_gold_layout.json index 0732e455a..171315c1b 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/charcoal_gold_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/charcoal_gold_layout.json @@ -3625,11 +3625,11 @@ "computedY" : 704.83, "placementX" : 214.01, "placementY" : 704.83, - "placementWidth" : 152.099, + "placementWidth" : 154.025, "placementHeight" : 13.92, "startPage" : 0, "endPage" : 0, - "contentWidth" : 152.099, + "contentWidth" : 154.025, "contentHeight" : 13.92, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json index 0c6a6e2cc..98800da2f 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json @@ -235,11 +235,11 @@ "computedY" : 676.575, "placementX" : 120.891, "placementY" : 676.575, - "placementWidth" : 340.363, + "placementWidth" : 340.604, "placementHeight" : 74.676, "startPage" : 0, "endPage" : 0, - "contentWidth" : 340.363, + "contentWidth" : 340.604, "contentHeight" : 74.676, "margin" : { "top" : 0.0, @@ -265,11 +265,11 @@ "computedY" : 695.951, "placementX" : 120.891, "placementY" : 695.951, - "placementWidth" : 340.363, + "placementWidth" : 340.604, "placementHeight" : 55.3, "startPage" : 0, "endPage" : 0, - "contentWidth" : 340.363, + "contentWidth" : 340.604, "contentHeight" : 55.3, "margin" : { "top" : 0.0, @@ -295,11 +295,11 @@ "computedY" : 676.575, "placementX" : 120.891, "placementY" : 676.575, - "placementWidth" : 205.712, + "placementWidth" : 225.213, "placementHeight" : 19.376, "startPage" : 0, "endPage" : 0, - "contentWidth" : 205.712, + "contentWidth" : 225.213, "contentHeight" : 19.376, "margin" : { "top" : 0.0, @@ -625,11 +625,11 @@ "computedY" : 239.229, "placementX" : 28.604, "placementY" : 239.229, - "placementWidth" : 118.648, + "placementWidth" : 121.642, "placementHeight" : 378.25, "startPage" : 0, "endPage" : 0, - "contentWidth" : 118.648, + "contentWidth" : 121.642, "contentHeight" : 378.25, "margin" : { "top" : 0.0, @@ -685,11 +685,11 @@ "computedY" : 590.967, "placementX" : 28.604, "placementY" : 590.967, - "placementWidth" : 110.685, + "placementWidth" : 121.642, "placementHeight" : 12.48, "startPage" : 0, "endPage" : 0, - "contentWidth" : 110.685, + "contentWidth" : 121.642, "contentHeight" : 12.48, "margin" : { "top" : 0.0, @@ -985,11 +985,11 @@ "computedY" : 594.208, "placementX" : 229.118, "placementY" : 594.208, - "placementWidth" : 144.93, + "placementWidth" : 152.393, "placementHeight" : 15.24, "startPage" : 0, "endPage" : 0, - "contentWidth" : 144.93, + "contentWidth" : 152.393, "contentHeight" : 15.24, "margin" : { "top" : 0.0, @@ -1255,11 +1255,11 @@ "computedY" : 438.259, "placementX" : 229.118, "placementY" : 438.259, - "placementWidth" : 160.457, + "placementWidth" : 168.85, "placementHeight" : 15.24, "startPage" : 0, "endPage" : 0, - "contentWidth" : 160.457, + "contentWidth" : 168.85, "contentHeight" : 15.24, "margin" : { "top" : 0.0, @@ -1825,11 +1825,11 @@ "computedY" : 122.272, "placementX" : 65.842, "placementY" : 122.272, - "placementWidth" : 51.84, + "placementWidth" : 57.17, "placementHeight" : 11.52, "startPage" : 0, "endPage" : 0, - "contentWidth" : 51.84, + "contentWidth" : 57.17, "contentHeight" : 11.52, "margin" : { "top" : 0.0, @@ -2215,11 +2215,11 @@ "computedY" : 122.272, "placementX" : 228.038, "placementY" : 122.272, - "placementWidth" : 77.117, + "placementWidth" : 84.491, "placementHeight" : 11.52, "startPage" : 0, "endPage" : 0, - "contentWidth" : 77.117, + "contentWidth" : 84.491, "contentHeight" : 11.52, "margin" : { "top" : 0.0, @@ -2545,11 +2545,11 @@ "computedY" : 122.272, "placementX" : 431.37, "placementY" : 122.272, - "placementWidth" : 123.773, + "placementWidth" : 134.418, "placementHeight" : 11.52, "startPage" : 0, "endPage" : 0, - "contentWidth" : 123.773, + "contentWidth" : 134.418, "contentHeight" : 11.52, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/terracotta_rail_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/terracotta_rail_layout.json index 7f8208ff9..dbd376bfc 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/terracotta_rail_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/terracotta_rail_layout.json @@ -355,11 +355,11 @@ "computedY" : 457.063, "placementX" : 25.4, "placementY" : 457.063, - "placementWidth" : 106.829, + "placementWidth" : 107.671, "placementHeight" : 210.926, "startPage" : 0, "endPage" : 0, - "contentWidth" : 106.829, + "contentWidth" : 107.671, "contentHeight" : 210.926, "margin" : { "top" : 0.0, @@ -385,11 +385,11 @@ "computedY" : 657.463, "placementX" : 25.4, "placementY" : 657.463, - "placementWidth" : 101.553, + "placementWidth" : 107.671, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 101.553, + "contentWidth" : 107.671, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -835,11 +835,11 @@ "computedY" : 429.537, "placementX" : 25.4, "placementY" : 429.537, - "placementWidth" : 52.0, + "placementWidth" : 55.172, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 52.0, + "contentWidth" : 55.172, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -1165,11 +1165,11 @@ "computedY" : 279.961, "placementX" : 25.4, "placementY" : 279.961, - "placementWidth" : 77.553, + "placementWidth" : 82.689, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 77.553, + "contentWidth" : 82.689, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -1345,11 +1345,11 @@ "computedY" : 210.134, "placementX" : 25.4, "placementY" : 210.134, - "placementWidth" : 131.334, + "placementWidth" : 139.089, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 131.334, + "contentWidth" : 139.089, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -2065,11 +2065,11 @@ "computedY" : 759.69, "placementX" : 205.345, "placementY" : 759.69, - "placementWidth" : 321.748, + "placementWidth" : 331.296, "placementHeight" : 62.2, "startPage" : 0, "endPage" : 0, - "contentWidth" : 321.748, + "contentWidth" : 331.296, "contentHeight" : 62.2, "margin" : { "top" : 0.0, @@ -2095,11 +2095,11 @@ "computedY" : 788.29, "placementX" : 205.345, "placementY" : 788.29, - "placementWidth" : 321.748, + "placementWidth" : 331.296, "placementHeight" : 33.6, "startPage" : 0, "endPage" : 0, - "contentWidth" : 321.748, + "contentWidth" : 331.296, "contentHeight" : 33.6, "margin" : { "top" : 0.0, @@ -2125,11 +2125,11 @@ "computedY" : 764.69, "placementX" : 205.345, "placementY" : 764.69, - "placementWidth" : 169.468, + "placementWidth" : 174.083, "placementHeight" : 15.6, "startPage" : 0, "endPage" : 0, - "contentWidth" : 169.468, + "contentWidth" : 174.083, "contentHeight" : 15.6, "margin" : { "top" : 0.0, @@ -2215,11 +2215,11 @@ "computedY" : 738.163, "placementX" : 205.345, "placementY" : 738.163, - "placementWidth" : 133.212, + "placementWidth" : 147.378, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 133.212, + "contentWidth" : 147.378, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -2425,11 +2425,11 @@ "computedY" : 630.417, "placementX" : 205.345, "placementY" : 630.417, - "placementWidth" : 143.475, + "placementWidth" : 159.602, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 143.475, + "contentWidth" : 159.602, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -3955,11 +3955,11 @@ "computedY" : 279.286, "placementX" : 205.345, "placementY" : 279.286, - "placementWidth" : 104.79, + "placementWidth" : 116.996, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 104.79, + "contentWidth" : 116.996, "contentHeight" : 10.526, "margin" : { "top" : 0.0, @@ -5035,11 +5035,11 @@ "computedY" : 115.876, "placementX" : 205.345, "placementY" : 115.876, - "placementWidth" : 60.632, + "placementWidth" : 67.61, "placementHeight" : 10.526, "startPage" : 0, "endPage" : 0, - "contentWidth" : 60.632, + "contentWidth" : 67.61, "contentHeight" : 10.526, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/violet_grid_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/violet_grid_layout.json index f05e0141b..60902ae5d 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/violet_grid_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/violet_grid_layout.json @@ -145,11 +145,11 @@ "computedY" : 754.683, "placementX" : 29.905, "placementY" : 754.683, - "placementWidth" : 157.277, + "placementWidth" : 162.826, "placementHeight" : 20.319, "startPage" : 0, "endPage" : 0, - "contentWidth" : 157.277, + "contentWidth" : 162.826, "contentHeight" : 20.319, "margin" : { "top" : 0.0, @@ -505,11 +505,11 @@ "computedY" : 650.396, "placementX" : 29.905, "placementY" : 650.396, - "placementWidth" : 76.844, + "placementWidth" : 78.083, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 76.844, + "contentWidth" : 78.083, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -535,11 +535,11 @@ "computedY" : 650.396, "placementX" : 29.905, "placementY" : 650.396, - "placementWidth" : 76.844, + "placementWidth" : 78.083, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 76.844, + "contentWidth" : 78.083, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -561,15 +561,15 @@ "childIndex" : 1, "depth" : 3, "layer" : 3, - "computedX" : 106.749, + "computedX" : 107.988, "computedY" : 656.562, - "placementX" : 106.749, + "placementX" : 107.988, "placementY" : 656.562, - "placementWidth" : 458.622, + "placementWidth" : 457.383, "placementHeight" : 8.617, "startPage" : 0, "endPage" : 0, - "contentWidth" : 458.622, + "contentWidth" : 457.383, "contentHeight" : 8.617, "margin" : { "top" : 0.0, @@ -591,15 +591,15 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 118.034, + "computedX" : 119.273, "computedY" : 656.562, - "placementX" : 118.034, + "placementX" : 119.273, "placementY" : 656.562, - "placementWidth" : 447.337, + "placementWidth" : 446.098, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 447.337, + "contentWidth" : 446.098, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -2065,11 +2065,11 @@ "computedY" : 532.469, "placementX" : 29.905, "placementY" : 532.469, - "placementWidth" : 34.064, + "placementWidth" : 34.991, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 34.064, + "contentWidth" : 34.991, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -2095,11 +2095,11 @@ "computedY" : 532.469, "placementX" : 29.905, "placementY" : 532.469, - "placementWidth" : 34.064, + "placementWidth" : 34.991, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 34.064, + "contentWidth" : 34.991, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -2121,15 +2121,15 @@ "childIndex" : 1, "depth" : 3, "layer" : 3, - "computedX" : 63.969, + "computedX" : 64.895, "computedY" : 538.635, - "placementX" : 63.969, + "placementX" : 64.895, "placementY" : 538.635, - "placementWidth" : 501.402, + "placementWidth" : 500.475, "placementHeight" : 8.617, "startPage" : 0, "endPage" : 0, - "contentWidth" : 501.402, + "contentWidth" : 500.475, "contentHeight" : 8.617, "margin" : { "top" : 0.0, @@ -2151,15 +2151,15 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 75.254, + "computedX" : 76.18, "computedY" : 538.635, - "placementX" : 75.254, + "placementX" : 76.18, "placementY" : 538.635, - "placementWidth" : 490.117, + "placementWidth" : 489.19, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 490.117, + "contentWidth" : 489.19, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -2245,11 +2245,11 @@ "computedY" : 477.259, "placementX" : 29.905, "placementY" : 477.259, - "placementWidth" : 63.841, + "placementWidth" : 64.963, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 63.841, + "contentWidth" : 64.963, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -2275,11 +2275,11 @@ "computedY" : 477.259, "placementX" : 29.905, "placementY" : 477.259, - "placementWidth" : 63.841, + "placementWidth" : 64.963, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 63.841, + "contentWidth" : 64.963, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -2301,15 +2301,15 @@ "childIndex" : 1, "depth" : 3, "layer" : 3, - "computedX" : 93.746, + "computedX" : 94.868, "computedY" : 483.425, - "placementX" : 93.746, + "placementX" : 94.868, "placementY" : 483.425, - "placementWidth" : 471.625, + "placementWidth" : 470.503, "placementHeight" : 8.617, "startPage" : 0, "endPage" : 0, - "contentWidth" : 471.625, + "contentWidth" : 470.503, "contentHeight" : 8.617, "margin" : { "top" : 0.0, @@ -2331,15 +2331,15 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 105.031, + "computedX" : 106.153, "computedY" : 483.425, - "placementX" : 105.031, + "placementX" : 106.153, "placementY" : 483.425, - "placementWidth" : 460.34, + "placementWidth" : 459.218, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 460.34, + "contentWidth" : 459.218, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -3985,11 +3985,11 @@ "computedY" : 231.717, "placementX" : 29.905, "placementY" : 231.717, - "placementWidth" : 105.864, + "placementWidth" : 107.26, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 105.864, + "contentWidth" : 107.26, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -4015,11 +4015,11 @@ "computedY" : 231.717, "placementX" : 29.905, "placementY" : 231.717, - "placementWidth" : 105.864, + "placementWidth" : 107.26, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 105.864, + "contentWidth" : 107.26, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -4041,15 +4041,15 @@ "childIndex" : 1, "depth" : 3, "layer" : 3, - "computedX" : 135.769, + "computedX" : 137.165, "computedY" : 237.883, - "placementX" : 135.769, + "placementX" : 137.165, "placementY" : 237.883, - "placementWidth" : 429.602, + "placementWidth" : 428.206, "placementHeight" : 8.617, "startPage" : 0, "endPage" : 0, - "contentWidth" : 429.602, + "contentWidth" : 428.206, "contentHeight" : 8.617, "margin" : { "top" : 0.0, @@ -4071,15 +4071,15 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 147.054, + "computedX" : 148.45, "computedY" : 237.883, - "placementX" : 147.054, + "placementX" : 148.45, "placementY" : 237.883, - "placementWidth" : 418.317, + "placementWidth" : 416.921, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 418.317, + "contentWidth" : 416.921, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -4675,11 +4675,11 @@ "computedY" : 101.109, "placementX" : 29.905, "placementY" : 101.109, - "placementWidth" : 62.401, + "placementWidth" : 63.484, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 62.401, + "contentWidth" : 63.484, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -4701,15 +4701,15 @@ "childIndex" : 1, "depth" : 3, "layer" : 3, - "computedX" : 103.591, + "computedX" : 104.673, "computedY" : 107.276, - "placementX" : 103.591, + "placementX" : 104.673, "placementY" : 107.276, - "placementWidth" : 171.131, + "placementWidth" : 170.064, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 171.131, + "contentWidth" : 170.064, "contentHeight" : 1.0, "margin" : { "top" : 7.617, @@ -4731,9 +4731,9 @@ "childIndex" : 2, "depth" : 3, "layer" : 3, - "computedX" : 274.722, + "computedX" : 274.738, "computedY" : 115.893, - "placementX" : 274.722, + "placementX" : 274.738, "placementY" : 115.893, "placementWidth" : 39.497, "placementHeight" : 0.0, @@ -4761,15 +4761,15 @@ "childIndex" : 3, "depth" : 3, "layer" : 3, - "computedX" : 314.219, + "computedX" : 314.235, "computedY" : 101.109, - "placementX" : 314.219, + "placementX" : 314.235, "placementY" : 101.109, - "placementWidth" : 63.291, + "placementWidth" : 64.374, "placementHeight" : 14.783, "startPage" : 0, "endPage" : 0, - "contentWidth" : 63.291, + "contentWidth" : 64.374, "contentHeight" : 14.783, "margin" : { "top" : 0.0, @@ -4791,15 +4791,15 @@ "childIndex" : 4, "depth" : 3, "layer" : 3, - "computedX" : 388.794, + "computedX" : 389.893, "computedY" : 107.276, - "placementX" : 388.794, + "placementX" : 389.893, "placementY" : 107.276, - "placementWidth" : 176.576, + "placementWidth" : 175.478, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 176.576, + "contentWidth" : 175.478, "contentHeight" : 1.0, "margin" : { "top" : 7.617, diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldMain.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldMain.java index d94a8882f..c4aecacd5 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldMain.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldMain.java @@ -5,6 +5,7 @@ import com.demcha.compose.document.node.LayerAlign; import com.demcha.compose.document.node.ListMarker; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentRowColumn; import com.demcha.compose.document.templates.cv.components.SectionLookup; import com.demcha.compose.document.templates.cv.data.CvEntry; @@ -47,7 +48,7 @@ import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldStyles.SUMMARY_TO_EXPERIENCE; import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldStyles.TITLE_TO_RULE; import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldStyles.textStyle; -import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldStyles.tracked; +import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldStyles.JOB_TITLE_TRACKING_EM; import static com.demcha.compose.document.templates.cv.presets.CharcoalGoldWidgets.mainHeading; /** @@ -102,8 +103,9 @@ private static void renderMasthead(SectionBuilder main, CvIdentity identity) { .margin(0f, 0f, (float) MASTHEAD_TO_TITLE, 0f)); block.addParagraph(p -> p .name("JobTitle") - .text(tracked(identity.jobTitle())) - .textStyle(textStyle(JOB_TITLE_SIZE, INK, false)) + .text(identity.jobTitle()) + .textStyle(textStyle(JOB_TITLE_SIZE, INK, false) + .withLetterSpacing(DocumentLetterSpacing.ofFontSize(JOB_TITLE_TRACKING_EM))) .margin(0f, 0f, (float) TITLE_TO_RULE, 0f)); block.addLine(line -> line .name("MastheadRule") diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldStyles.java index a8c3eda27..85f32bec2 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/CharcoalGoldStyles.java @@ -45,6 +45,14 @@ private CharcoalGoldStyles() { static final double NAME_GIVEN_SIZE = 35.7; static final double NAME_FAMILY_SIZE = 45.5; static final double JOB_TITLE_SIZE = 11.6; + + /** + * Tracking on the masthead job title. The look used to be made by writing a + * space between each letter, so the gap this replaces is one space advance + * of the body face — a quarter of the type size. + */ + static final double JOB_TITLE_TRACKING_EM = 0.25; + static final double MAIN_HEADING_SIZE = 11.0; static final double SIDEBAR_HEADING_SIZE = 10.0; static final double ROLE_SIZE = 10.5; @@ -160,39 +168,6 @@ static double gap(double pitch, double size) { return Math.max(0.0, pitch - size * LINE_FACTOR); } - /** - * Letter-spacing by spaces rather than by sized runs: a space between - * letters and three between words. - * - *

This design tracks only one line — the job title — and does it - * coarsely enough that real spaces reach it, which is simpler than the - * per-letter spacer runs the other ported sheets need.

- * - * @param text the text to space out - * @return the spaced text - */ - static String tracked(String text) { - if (text == null || text.isEmpty()) { - return ""; - } - StringBuilder out = new StringBuilder(text.length() * 2); - boolean startOfWord = true; - for (int i = 0; i < text.length(); i++) { - char ch = text.charAt(i); - if (ch == ' ') { - out.append(" "); - startOfWord = true; - continue; - } - if (!startOfWord) { - out.append(' '); - } - out.append(ch); - startOfWord = false; - } - return out.toString(); - } - /** Strips a title down to the letters and digits a node name can carry. */ static String compact(String text) { return text == null ? "" : text.replaceAll("[^A-Za-z0-9]", ""); diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyAside.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyAside.java index c059b9849..f00898157 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyAside.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyAside.java @@ -12,6 +12,7 @@ import com.demcha.compose.document.node.RowVerticalAlign; import com.demcha.compose.document.node.TextAlign; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentRowColumn; import com.demcha.compose.document.style.DocumentStroke; import com.demcha.compose.document.style.DocumentTextDecoration; @@ -159,8 +160,10 @@ private static void renderNamePlate(SectionBuilder column, CvIdentity identity) column.addParagraph(p -> p .name("Role") - .text(MidnightNavyWidgets.tracked(identity.jobTitle().toUpperCase(Locale.ROOT))) - .textStyle(style(ROLE_SIZE, WHITE, DocumentTextDecoration.DEFAULT)) + .text(identity.jobTitle().toUpperCase(Locale.ROOT)) + .textStyle(style(ROLE_SIZE, WHITE, DocumentTextDecoration.DEFAULT) + .withLetterSpacing(DocumentLetterSpacing.ofFontSize( + MidnightNavyWidgets.ROLE_TRACKING_EM))) .align(TextAlign.CENTER) .margin(new DocumentInsets(px(13.1), 0, 0, 0))); diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyWidgets.java index 438f8034c..3f6bf31e0 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/MidnightNavyWidgets.java @@ -109,37 +109,13 @@ static void nameDivider(SectionBuilder column, double width, double leftInset, d } /** - * The role line's wide tracking, as spaces between characters. + * The role line's wide tracking. * - *

There is no letter-spacing API, so the tracking is real spaces and its - * width depends on the face's space advance: change the family and the - * tracking has to be re-checked.

- * - * @param text the line to track - * @return the same line with a space between every pair of characters and - * three between words + *

The look used to be made by writing a space between each letter, so + * the gap this replaces is one space advance of the face — a quarter of the + * type size.

*/ - static String tracked(String text) { - if (text == null || text.isEmpty()) { - return ""; - } - StringBuilder out = new StringBuilder(text.length() * 2); - boolean startOfWord = true; - for (int i = 0; i < text.length(); i++) { - char ch = text.charAt(i); - if (ch == ' ') { - out.append(" "); - startOfWord = true; - continue; - } - if (!startOfWord) { - out.append(' '); - } - out.append(ch); - startOfWord = false; - } - return out.toString(); - } + static final double ROLE_TRACKING_EM = 0.25; /** A label reduced to what can go in a node name. */ static String compact(String text) { diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java index c2f35dfeb..c726c017c 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java @@ -9,6 +9,7 @@ import com.demcha.compose.document.node.TextAlign; import com.demcha.compose.document.style.ClipPolicy; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextDecoration; import com.demcha.compose.document.style.DocumentTextStyle; @@ -38,8 +39,6 @@ import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SECTION_GAP; import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.compact; import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.gapRun; -import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.spacerRuns; -import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.spacerStyle; import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.style; /** @@ -69,30 +68,21 @@ private TealPulseWidgets() { */ static void tracked(ParagraphBuilder paragraph, String text, DocumentTextStyle textStyle, double trackingEm) { - int runs = spacerRuns(trackingEm); - DocumentTextStyle spacer = spacerStyle(textStyle, trackingEm, runs); - for (int index = 0; index < text.length(); index++) { - paragraph.inlineText(String.valueOf(text.charAt(index)), textStyle); - if (index + 1 < text.length()) { - paragraph.inlineText(" ".repeat(runs), spacer); - } - } + paragraph.inlineText(text, spacedBy(textStyle, trackingEm)); } /** - * The same, with the paper laid behind every run, so a rule the heading is + * The same, with the paper laid behind the run, so a rule the heading is * drawn over shows only past the end of the words. */ static void knockedOut(ParagraphBuilder paragraph, String text, DocumentTextStyle textStyle, double trackingEm) { - int runs = spacerRuns(trackingEm); - DocumentTextStyle spacer = spacerStyle(textStyle, trackingEm, runs); - for (int index = 0; index < text.length(); index++) { - knockedOutRun(paragraph, String.valueOf(text.charAt(index)), textStyle); - if (index + 1 < text.length()) { - knockedOutRun(paragraph, " ".repeat(runs), spacer); - } - } + knockedOutRun(paragraph, text, spacedBy(textStyle, trackingEm)); + } + + /** {@code textStyle} tracked by {@code trackingEm}, the letters left whole. */ + private static DocumentTextStyle spacedBy(DocumentTextStyle textStyle, double trackingEm) { + return textStyle.withLetterSpacing(DocumentLetterSpacing.ofFontSize(trackingEm)); } /** One knocked-out run. No horizontal padding, so neighbours abut. */ diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailAside.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailAside.java index e72a7b111..128a25f8f 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailAside.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailAside.java @@ -34,7 +34,7 @@ import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.RULE_THICKNESS; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_DASH_WIDTH; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_DIVIDER_GAP; -import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_HEADING_SPACER; +import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_HEADING_TRACKING_EM; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_PAD_LEFT; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_PAD_RIGHT; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.SIDEBAR_PAD_TOP; @@ -189,10 +189,10 @@ private static void renderBulletedSkills(SectionBuilder side, SkillsSection sect side.addSection(blockName, block -> { block.spacing(0); if (discBullet) { - headingWithDash(block, section.title(), SIDEBAR_HEADING_SPACER, + headingWithDash(block, section.title(), SIDEBAR_HEADING_TRACKING_EM, SIDEBAR_DASH_WIDTH); } else { - heading(block, section.title(), SIDEBAR_HEADING_SPACER); + heading(block, section.title(), SIDEBAR_HEADING_TRACKING_EM); } int index = 0; for (SkillGroup group : section.groups()) { @@ -216,7 +216,7 @@ private static void renderBulletedSkills(SectionBuilder side, SkillsSection sect private static void renderCertifications(SectionBuilder side, EntriesSection section) { side.addSection("Certifications", block -> { block.spacing(0); - headingWithDash(block, section.title(), SIDEBAR_HEADING_SPACER, SIDEBAR_DASH_WIDTH); + headingWithDash(block, section.title(), SIDEBAR_HEADING_TRACKING_EM, SIDEBAR_DASH_WIDTH); List entries = section.entries(); for (int index = 0; index < entries.size(); index++) { CvEntry entry = entries.get(index); @@ -236,7 +236,7 @@ private static void renderCertifications(SectionBuilder side, EntriesSection sec private static void renderFacts(SectionBuilder side, EntriesSection section) { side.addSection("AdditionalInformation", block -> { block.spacing(0); - heading(block, section.title(), SIDEBAR_HEADING_SPACER); + heading(block, section.title(), SIDEBAR_HEADING_TRACKING_EM); List entries = section.entries(); for (int i = 0; i < entries.size(); i++) { CvEntry entry = entries.get(i); diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailMain.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailMain.java index fa43204bf..fe1e9988d 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailMain.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailMain.java @@ -36,7 +36,8 @@ import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_DASH_WIDTH; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_DIVIDER_BOTTOM; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_DIVIDER_TOP; -import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_HEADING_SPACER; +import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_HEADING_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MASTHEAD_TRACKING_EM; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_PAD_LEFT; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_PAD_RIGHT; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailStyles.MAIN_PAD_TOP; @@ -70,7 +71,7 @@ import static com.demcha.compose.document.templates.cv.presets.TerracottaRailWidgets.entryLine; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailWidgets.ringMarker; import static com.demcha.compose.document.templates.cv.presets.TerracottaRailWidgets.titleAndDate; -import static com.demcha.compose.document.templates.cv.presets.TerracottaRailWidgets.trackedWide; +import static com.demcha.compose.document.templates.cv.presets.TerracottaRailWidgets.spacedBy; /** * The wide column: the masthead, the summary, the roles held on a rail, the @@ -123,13 +124,13 @@ private static void renderMasthead(SectionBuilder main, CvIdentity identity) { block.spacing(0); block.addParagraph(p -> p .name("FullName") - .text(trackedWide(identity.name().full().toUpperCase(Locale.ROOT))) - .textStyle(text(NAME_SIZE, INK, true)) + .text(identity.name().full().toUpperCase(Locale.ROOT)) + .textStyle(spacedBy(text(NAME_SIZE, INK, true), MASTHEAD_TRACKING_EM)) .margin(0f, 0f, (float) NAME_TO_SUBTITLE_GAP, 0f)); block.addParagraph(p -> p .name("JobTitle") - .text(trackedWide(identity.jobTitle().toUpperCase(Locale.ROOT))) - .textStyle(text(SUBTITLE_SIZE, ACCENT, true)) + .text(identity.jobTitle().toUpperCase(Locale.ROOT)) + .textStyle(spacedBy(text(SUBTITLE_SIZE, ACCENT, true), MASTHEAD_TRACKING_EM)) .margin(0f, 0f, (float) SUBTITLE_TO_RULE_GAP, 0f)); }); } @@ -140,7 +141,7 @@ private static void renderMasthead(SectionBuilder main, CvIdentity identity) { private static void renderSummary(SectionBuilder main, ParagraphSection summary) { main.addSection("Summary", block -> { block.spacing(0); - headingWithDash(block, summary.title(), MAIN_HEADING_SPACER, MAIN_DASH_WIDTH); + headingWithDash(block, summary.title(), MAIN_HEADING_TRACKING_EM, MAIN_DASH_WIDTH); List paragraphs = lines(summary.body()); for (int i = 0; i < paragraphs.size(); i++) { int index = i; @@ -164,7 +165,7 @@ private static void renderSummary(SectionBuilder main, ParagraphSection summary) private static void renderExperience(SectionBuilder main, EntriesSection experience) { main.addSection("Experience", block -> { block.spacing(0); - heading(block, experience.title(), MAIN_HEADING_SPACER); + heading(block, experience.title(), MAIN_HEADING_TRACKING_EM); SectionBuilder holder = new SectionBuilder(); holder.name("ExperienceRailHolder"); holder.spacing(0); @@ -232,7 +233,7 @@ private static void renderExperience(SectionBuilder main, EntriesSection experie private static void renderProjects(SectionBuilder main, EntriesSection projects) { main.addSection("SelectedProjects", block -> { block.spacing(0); - headingWithDash(block, projects.title(), MAIN_HEADING_SPACER, MAIN_DASH_WIDTH); + headingWithDash(block, projects.title(), MAIN_HEADING_TRACKING_EM, MAIN_DASH_WIDTH); List entries = projects.entries(); for (int i = 0; i < entries.size(); i++) { CvEntry entry = entries.get(i); @@ -306,7 +307,7 @@ private static void renderProjects(SectionBuilder main, EntriesSection projects) private static void renderEducation(SectionBuilder main, EntriesSection education) { main.addSection("Education", block -> { block.spacing(0); - headingWithDash(block, education.title(), MAIN_HEADING_SPACER, MAIN_DASH_WIDTH); + headingWithDash(block, education.title(), MAIN_HEADING_TRACKING_EM, MAIN_DASH_WIDTH); layeredRow(block, "EducationBand", 0.0, 0.0, band -> { band.weights(EDUCATION_BAND_WEIGHT, 1.0 - EDUCATION_BAND_WEIGHT); band.addSection("EducationEntries", cell -> { diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailStyles.java index 89be2b0a5..31f105fe3 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailStyles.java @@ -134,15 +134,17 @@ private TerracottaRailStyles() { // -- tracking ---------------------------------------------------------- /** - * The gaps a heading is letter-spaced with. A text style carries no - * tracking, so a tracked line is written with a space character between - * the letters, and which space is the whole choice: the sidebar takes a - * hair space (a tenth of an em) because a full one would set ADDITIONAL - * INFORMATION wider than the column and wrap it, and the main column, - * being wider, takes a thin space (a fifth). + * The gaps a heading is letter-spaced with. These were hair and thin space + * characters written between the letters; they are the same measures as + * tracking. The sidebar takes a tenth of an em because a wider one sets + * ADDITIONAL INFORMATION past the column and wraps it, and the main column, + * being wider, takes a fifth. */ - static final char SIDEBAR_HEADING_SPACER = '\u200A'; - static final char MAIN_HEADING_SPACER = '\u2009'; + static final double SIDEBAR_HEADING_TRACKING_EM = 0.10; + static final double MAIN_HEADING_TRACKING_EM = 0.20; + + /** The masthead's own tracking \u2014 it used a full space between letters. */ + static final double MASTHEAD_TRACKING_EM = 0.25; // -- helpers ------------------------------------------------------------ diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailWidgets.java index 3e2e1d269..2f095ff80 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TerracottaRailWidgets.java @@ -13,7 +13,9 @@ import com.demcha.compose.document.node.TextAlign; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.document.table.DocumentTableCell; import com.demcha.compose.document.table.DocumentTableColumn; import com.demcha.compose.document.table.DocumentTableStyle; @@ -61,63 +63,27 @@ private TerracottaRailWidgets() { * @param spacer the space to set between letters * @return the tracked string */ - static String tracked(String text, char spacer) { - if (text == null || text.isEmpty()) { - return ""; - } - StringBuilder out = new StringBuilder(text.length() * 2); - for (int index = 0; index < text.length(); index++) { - char letter = text.charAt(index); - if (letter == ' ') { - out.append(spacer).append(' ').append(spacer); - continue; - } - if (index > 0 && text.charAt(index - 1) != ' ') { - out.append(spacer); - } - out.append(letter); - } - return out.toString(); - } - - /** The masthead's own tracking: a full space between letters. */ - static String trackedWide(String text) { - if (text == null || text.isEmpty()) { - return ""; - } - StringBuilder out = new StringBuilder(text.length() * 2); - boolean startOfWord = true; - for (int index = 0; index < text.length(); index++) { - char letter = text.charAt(index); - if (letter == ' ') { - out.append(" "); - startOfWord = true; - continue; - } - if (!startOfWord) { - out.append(' '); - } - out.append(letter); - startOfWord = false; - } - return out.toString(); + /** {@code style} tracked by {@code trackingEm}, the letters left whole. */ + static DocumentTextStyle spacedBy(DocumentTextStyle style, double trackingEm) { + return style.withLetterSpacing(DocumentLetterSpacing.ofFontSize(trackingEm)); } /** A heading with nothing under it. */ - static void heading(SectionBuilder block, String title, char spacer) { + static void heading(SectionBuilder block, String title, double trackingEm) { block.addParagraph(p -> p .name("Heading_" + compact(title)) - .text(tracked(title, spacer)) - .textStyle(text(SECTION_HEADING_SIZE, INK, true)) + .text(title) + .textStyle(spacedBy(text(SECTION_HEADING_SIZE, INK, true), trackingEm)) .margin(0f, 0f, (float) HEADING_TO_BODY_GAP, 0f)); } /** A heading over a short terracotta dash. */ - static void headingWithDash(SectionBuilder block, String title, char spacer, double dashWidth) { + static void headingWithDash(SectionBuilder block, String title, double trackingEm, + double dashWidth) { block.addParagraph(p -> p .name("Heading_" + compact(title)) - .text(tracked(title, spacer)) - .textStyle(text(SECTION_HEADING_SIZE, INK, true)) + .text(title) + .textStyle(spacedBy(text(SECTION_HEADING_SIZE, INK, true), trackingEm)) .margin(0f, 0f, (float) HEADING_TO_DASH_GAP, 0f)); block.addLine(line -> line .name("AccentLine_" + compact(title)) diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/VioletGridWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/VioletGridWidgets.java index 6b215eeab..0c17a0cf3 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/VioletGridWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/VioletGridWidgets.java @@ -6,6 +6,7 @@ import com.demcha.compose.document.node.InlineImageAlignment; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentRowColumn; import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.font.FontName; @@ -22,7 +23,6 @@ import static com.demcha.compose.document.templates.cv.presets.VioletGridStyles.HEADING_SIZE; import static com.demcha.compose.document.templates.cv.presets.VioletGridStyles.HEADING_TRACKING; import static com.demcha.compose.document.templates.cv.presets.VioletGridStyles.HEADING_TO_RULE; -import static com.demcha.compose.document.templates.cv.presets.VioletGridStyles.SPACE_RATIO; import static com.demcha.compose.document.templates.cv.presets.VioletGridStyles.style; /** @@ -57,21 +57,15 @@ private VioletGridWidgets() { static ParagraphBuilder tracked(String name, String text, FontName font, double size, DocumentColor color, boolean bold, double tracking) { DocumentTextStyle glyph = style(font, size, color, bold); + if (tracking > 0.0) { + // The gap was authored in points, so the tracking is read in points. + glyph = glyph.withLetterSpacing(DocumentLetterSpacing.points(tracking)); + } ParagraphBuilder paragraph = new ParagraphBuilder(); paragraph.name(name); paragraph.lineSpacing(0); paragraph.textStyle(glyph); - if (tracking <= 0.0) { - paragraph.text(text); - return paragraph; - } - DocumentTextStyle gap = style(BODY_FONT, tracking / SPACE_RATIO, color, bold); - for (int index = 0; index < text.length(); index++) { - paragraph.inlineText(String.valueOf(text.charAt(index)), glyph); - if (index < text.length() - 1) { - paragraph.inlineText(" ", gap); - } - } + paragraph.text(text); return paragraph; } From 1dc84358ec293c28a9818aceacdf9aee3a4aea7c Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 03:02:56 +0100 Subject: [PATCH 3/9] fix(templates): let the engine measure SerifHeadline's tracked headings The heading band was a layer stack holding three absolutely positioned children, and the rule that trails a title was sized by subtracting an estimate of the letters from the band: trackedWidth summed three advance classes for capitals, added (n-1) gaps, and padded the result by 3% so the rule would never run under the words. That estimate was a second implementation of text measurement, and its error is visible in the old snapshot - the gap between the words and the rule came out 10.603, 11.538 and 10.607 on the three tailed headings, when one number was intended. The band is now a row: a fixed column for the dash, an auto column for the words, and a weight column whose line fills what is left. The engine measures the tracked capitals and the rule takes the remainder, so nothing here predicts a width. tracked() writes one run carrying DocumentLetterSpacing, and trackedWidth, capAdvanceEm, the three CAP_ADVANCE constants and TRACKED_WIDTH_SAFETY are gone. A row may not nest directly in the body's column row, so the stack stays as the host - which is also what gives the row a width for its last column to resolve against. The stack carries the dash's overhang as a negative left inset, which both hangs the dash into the margin and hands back the width it borrows. Structure changed (the snapshot grows 266 -> 290 nodes: a RowNode per heading plus its cells). Geometry held: - title x unchanged on all six headings (36.623 / 430.457); title y unchanged. - dash x, width and thickness unchanged (14.533 / 408.367, 12.789, 1.744). - band right edge unchanged to the point: 374.658 and 563.593. - every rule still ends on that edge. - the words-to-rule gap is now 11.045-11.046 on all three tailed headings, where it was 10.603-11.538. The spread was the estimate; it is gone. - title widths grow 1.174-1.466, the trailing tracking advance plus the old spacer approximation's error. - measured deltas: the dash and rule sit 0.484 higher, because cells align to the row top and the row is centred in the 12.595 band rather than each child being centred in it. Sub-half-point, inside the visual parity budget. - one page before and after; no pagination change. Verified: 65 tests green, including the visual parity gate and the CV text-layer gate, which now covers all 26 presets. Co-Authored-By: Claude Opus 5 --- .../cv-v2/serif_headline_layout.json | 1016 ++++++++++++++--- .../cv/presets/SerifHeadlineStyles.java | 59 +- .../cv/presets/SerifHeadlineWidgets.java | 102 +- 3 files changed, 937 insertions(+), 240 deletions(-) diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/serif_headline_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/serif_headline_layout.json index a743fc3bf..fa3c4a599 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/serif_headline_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/serif_headline_layout.json @@ -145,11 +145,11 @@ "computedY" : 751.271, "placementX" : 31.682, "placementY" : 751.271, - "placementWidth" : 172.592, + "placementWidth" : 174.011, "placementHeight" : 15.502, "startPage" : 0, "endPage" : 0, - "contentWidth" : 172.592, + "contentWidth" : 174.011, "contentHeight" : 15.502, "margin" : { "top" : 0.0, @@ -801,21 +801,21 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 31.682, + "computedX" : 14.533, "computedY" : 657.394, - "placementX" : 31.682, + "placementX" : 14.533, "placementY" : 657.394, - "placementWidth" : 342.976, + "placementWidth" : 360.125, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 342.976, + "contentWidth" : 360.125, "contentHeight" : 12.595, "margin" : { "top" : 0.0, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -17.149 }, "padding" : { "top" : 0.0, @@ -824,17 +824,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/HeadingDash_Experience[0]", - "entityName" : "HeadingDash_Experience", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]", + "entityName" : "SectionHeadingRow_Experience", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]", "childIndex" : 0, "depth" : 5, "layer" : 5, "computedX" : 14.533, - "computedY" : 662.819, + "computedY" : 657.878, + "placementX" : 14.533, + "placementY" : 657.878, + "placementWidth" : 360.125, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 360.125, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 14.533, + "computedY" : 662.335, "placementX" : 14.533, - "placementY" : 662.819, + "placementY" : 662.335, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[0]/HeadingDash_Experience[0]", + "entityName" : "HeadingDash_Experience", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 14.533, + "computedY" : 662.335, + "placementX" : 14.533, + "placementY" : 662.335, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -854,22 +914,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionTitle_Experience[1]", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 27.322, + "computedY" : 657.878, + "placementX" : 27.322, + "placementY" : 657.878, + "placementWidth" : 82.974, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.974, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[1]/SectionTitle_Experience[0]", "entityName" : "SectionTitle_Experience", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]", - "childIndex" : 1, - "depth" : 5, - "layer" : 5, + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, "computedX" : 36.623, "computedY" : 657.878, "placementX" : 36.623, "placementY" : 657.878, - "placementWidth" : 72.353, + "placementWidth" : 73.673, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 72.353, + "contentWidth" : 73.673, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -883,6 +973,36 @@ "bottom" : 0.0, "left" : 0.0 } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Experience[0]/SectionHeadingRow_Experience[0]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 110.297, + "computedY" : 663.556, + "placementX" : 110.297, + "placementY" : 663.556, + "placementWidth" : 11.045, + "placementHeight" : 5.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.045, + "contentHeight" : 5.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } }, { "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/ExperienceRail[1]", "entityName" : "ExperienceRail", @@ -2481,21 +2601,21 @@ "childIndex" : 2, "depth" : 4, "layer" : 4, - "computedX" : 31.682, + "computedX" : 14.533, "computedY" : 285.277, - "placementX" : 31.682, + "placementX" : 14.533, "placementY" : 285.277, - "placementWidth" : 342.976, + "placementWidth" : 360.125, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 342.976, + "contentWidth" : 360.125, "contentHeight" : 12.595, "margin" : { "top" : 23.605, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -17.149 }, "padding" : { "top" : 0.0, @@ -2504,17 +2624,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/HeadingDash_Projects[0]", - "entityName" : "HeadingDash_Projects", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]", + "entityName" : "SectionHeadingRow_Projects", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]", "childIndex" : 0, "depth" : 5, "layer" : 5, "computedX" : 14.533, - "computedY" : 290.703, + "computedY" : 285.762, + "placementX" : 14.533, + "placementY" : 285.762, + "placementWidth" : 360.125, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 360.125, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 14.533, + "computedY" : 290.218, + "placementX" : 14.533, + "placementY" : 290.218, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[0]/HeadingDash_Projects[0]", + "entityName" : "HeadingDash_Projects", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 14.533, + "computedY" : 290.218, "placementX" : 14.533, - "placementY" : 290.703, + "placementY" : 290.218, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -2534,22 +2714,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionTitle_Projects[1]", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 27.322, + "computedY" : 285.762, + "placementX" : 27.322, + "placementY" : 285.762, + "placementWidth" : 69.317, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 69.317, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[1]/SectionTitle_Projects[0]", "entityName" : "SectionTitle_Projects", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]", - "childIndex" : 1, - "depth" : 5, - "layer" : 5, + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, "computedX" : 36.623, "computedY" : 285.762, "placementX" : 36.623, "placementY" : 285.762, - "placementWidth" : 58.622, + "placementWidth" : 60.016, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 58.622, + "contentWidth" : 60.016, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -2564,22 +2774,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/HeadingTail_Projects[2]", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 96.639, + "computedY" : 290.439, + "placementX" : 96.639, + "placementY" : 290.439, + "placementWidth" : 278.019, + "placementHeight" : 6.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 278.019, + "contentHeight" : 6.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[2]/HeadingTail_Projects[0]", "entityName" : "HeadingTail_Projects", "entityKind" : "LineNode", - "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]", - "childIndex" : 2, - "depth" : 5, - "layer" : 5, - "computedX" : 105.848, - "computedY" : 291.075, - "placementX" : 105.848, - "placementY" : 291.075, - "placementWidth" : 268.81, + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/MainColumn[0]/SectionHeading_Projects[2]/SectionHeadingRow_Projects[0]/SectionNode[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 107.685, + "computedY" : 290.439, + "placementX" : 107.685, + "placementY" : 290.439, + "placementWidth" : 266.974, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 268.81, + "contentWidth" : 266.974, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -3141,21 +3381,21 @@ "childIndex" : 0, "depth" : 4, "layer" : 4, - "computedX" : 413.009, + "computedX" : 408.367, "computedY" : 657.394, - "placementX" : 413.009, + "placementX" : 408.367, "placementY" : 657.394, - "placementWidth" : 150.584, + "placementWidth" : 155.226, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 150.584, + "contentWidth" : 155.226, "contentHeight" : 12.595, "margin" : { "top" : 0.0, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -4.642 }, "padding" : { "top" : 0.0, @@ -3164,17 +3404,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/HeadingDash_Education[0]", - "entityName" : "HeadingDash_Education", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]", + "entityName" : "SectionHeadingRow_Education", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]", "childIndex" : 0, "depth" : 5, "layer" : 5, "computedX" : 408.367, - "computedY" : 662.819, + "computedY" : 657.878, + "placementX" : 408.367, + "placementY" : 657.878, + "placementWidth" : 155.226, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 155.226, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 408.367, + "computedY" : 662.335, + "placementX" : 408.367, + "placementY" : 662.335, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[0]/HeadingDash_Education[0]", + "entityName" : "HeadingDash_Education", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 408.367, + "computedY" : 662.335, "placementX" : 408.367, - "placementY" : 662.819, + "placementY" : 662.335, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -3194,22 +3494,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionTitle_Education[1]", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 421.156, + "computedY" : 657.878, + "placementX" : 421.156, + "placementY" : 657.878, + "placementWidth" : 80.888, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 80.888, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[1]/SectionTitle_Education[0]", "entityName" : "SectionTitle_Education", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]", - "childIndex" : 1, - "depth" : 5, - "layer" : 5, + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, "computedX" : 430.457, "computedY" : 657.878, "placementX" : 430.457, "placementY" : 657.878, - "placementWidth" : 70.23, + "placementWidth" : 71.587, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 70.23, + "contentWidth" : 71.587, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -3223,6 +3553,36 @@ "bottom" : 0.0, "left" : 0.0 } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Education[0]/SectionHeadingRow_Education[0]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 502.045, + "computedY" : 663.556, + "placementX" : 502.045, + "placementY" : 663.556, + "placementWidth" : 11.045, + "placementHeight" : 5.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.045, + "contentHeight" : 5.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } }, { "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/Degree_MSinComputerScience[1]", "entityName" : "Degree_MSinComputerScience", @@ -3441,21 +3801,21 @@ "childIndex" : 8, "depth" : 4, "layer" : 4, - "computedX" : 413.009, + "computedX" : 408.367, "computedY" : 525.864, - "placementX" : 413.009, + "placementX" : 408.367, "placementY" : 525.864, - "placementWidth" : 150.584, + "placementWidth" : 155.226, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 150.584, + "contentWidth" : 155.226, "contentHeight" : 12.595, "margin" : { "top" : 16.973, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -4.642 }, "padding" : { "top" : 0.0, @@ -3464,17 +3824,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/HeadingDash_Skills[0]", - "entityName" : "HeadingDash_Skills", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]", + "entityName" : "SectionHeadingRow_Skills", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]", "childIndex" : 0, "depth" : 5, "layer" : 5, "computedX" : 408.367, - "computedY" : 531.29, + "computedY" : 526.349, + "placementX" : 408.367, + "placementY" : 526.349, + "placementWidth" : 155.226, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 155.226, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 408.367, + "computedY" : 530.806, "placementX" : 408.367, - "placementY" : 531.29, + "placementY" : 530.806, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[0]/HeadingDash_Skills[0]", + "entityName" : "HeadingDash_Skills", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 408.367, + "computedY" : 530.806, + "placementX" : 408.367, + "placementY" : 530.806, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -3491,25 +3911,55 @@ "top" : 0.0, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 421.156, + "computedY" : 526.349, + "placementX" : 421.156, + "placementY" : 526.349, + "placementWidth" : 48.82, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 48.82, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 } }, { - "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionTitle_Skills[1]", + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[1]/SectionTitle_Skills[0]", "entityName" : "SectionTitle_Skills", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]", - "childIndex" : 1, - "depth" : 5, - "layer" : 5, + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, "computedX" : 430.457, "computedY" : 526.349, "placementX" : 430.457, "placementY" : 526.349, - "placementWidth" : 38.052, + "placementWidth" : 39.518, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 38.052, + "contentWidth" : 39.518, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -3523,6 +3973,36 @@ "bottom" : 0.0, "left" : 0.0 } + }, { + "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SectionHeading_Skills[8]/SectionHeadingRow_Skills[0]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 469.976, + "computedY" : 532.026, + "placementX" : 469.976, + "placementY" : 532.026, + "placementWidth" : 11.045, + "placementHeight" : 5.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.045, + "contentHeight" : 5.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } }, { "path" : "SerifHeadlineCv[0]/BodyColumns[3]/AsideColumn[1]/SkillCaption_Languages[9]", "entityName" : "SkillCaption_Languages", @@ -3535,11 +4015,11 @@ "computedY" : 506.519, "placementX" : 413.009, "placementY" : 506.519, - "placementWidth" : 50.545, + "placementWidth" : 51.949, "placementHeight" : 8.284, "startPage" : 0, "endPage" : 0, - "contentWidth" : 50.545, + "contentWidth" : 51.949, "contentHeight" : 8.284, "margin" : { "top" : 11.061, @@ -4075,11 +4555,11 @@ "computedY" : 438.072, "placementX" : 413.009, "placementY" : 438.072, - "placementWidth" : 115.415, + "placementWidth" : 117.201, "placementHeight" : 8.284, "startPage" : 0, "endPage" : 0, - "contentWidth" : 115.415, + "contentWidth" : 117.201, "contentHeight" : 8.284, "margin" : { "top" : 12.605, @@ -4735,11 +5215,11 @@ "computedY" : 359.064, "placementX" : 413.009, "placementY" : 359.064, - "placementWidth" : 49.012, + "placementWidth" : 50.417, "placementHeight" : 8.284, "startPage" : 0, "endPage" : 0, - "contentWidth" : 49.012, + "contentWidth" : 50.417, "contentHeight" : 8.284, "margin" : { "top" : 12.605, @@ -5155,11 +5635,11 @@ "computedY" : 301.178, "placementX" : 413.009, "placementY" : 301.178, - "placementWidth" : 105.596, + "placementWidth" : 107.322, "placementHeight" : 8.284, "startPage" : 0, "endPage" : 0, - "contentWidth" : 105.596, + "contentWidth" : 107.322, "contentHeight" : 8.284, "margin" : { "top" : 12.605, @@ -5815,11 +6295,11 @@ "computedY" : 222.169, "placementX" : 413.009, "placementY" : 222.169, - "placementWidth" : 52.046, + "placementWidth" : 53.509, "placementHeight" : 8.284, "startPage" : 0, "endPage" : 0, - "contentWidth" : 52.046, + "contentWidth" : 53.509, "contentHeight" : 8.284, "margin" : { "top" : 12.605, @@ -5961,21 +6441,21 @@ "childIndex" : 0, "depth" : 3, "layer" : 3, - "computedX" : 31.682, + "computedX" : 14.533, "computedY" : 171.346, - "placementX" : 31.682, + "placementX" : 14.533, "placementY" : 171.346, - "placementWidth" : 531.911, + "placementWidth" : 549.06, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 531.911, + "contentWidth" : 549.06, "contentHeight" : 12.595, "margin" : { "top" : 0.0, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -17.149 }, "padding" : { "top" : 0.0, @@ -5984,17 +6464,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/HeadingDash_Certifications[0]", - "entityName" : "HeadingDash_Certifications", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]", + "entityName" : "SectionHeadingRow_Certifications", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]", "childIndex" : 0, "depth" : 4, "layer" : 4, "computedX" : 14.533, - "computedY" : 176.772, + "computedY" : 171.831, + "placementX" : 14.533, + "placementY" : 171.831, + "placementWidth" : 549.06, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 549.06, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 14.533, + "computedY" : 176.287, "placementX" : 14.533, - "placementY" : 176.772, + "placementY" : 176.287, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[0]/HeadingDash_Certifications[0]", + "entityName" : "HeadingDash_Certifications", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 14.533, + "computedY" : 176.287, + "placementX" : 14.533, + "placementY" : 176.287, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -6014,22 +6554,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionTitle_Certifications[1]", + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 27.322, + "computedY" : 171.831, + "placementX" : 27.322, + "placementY" : 171.831, + "placementWidth" : 109.078, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.078, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 + } + }, { + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[1]/SectionTitle_Certifications[0]", "entityName" : "SectionTitle_Certifications", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]", - "childIndex" : 1, - "depth" : 4, - "layer" : 4, + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, "computedX" : 36.623, "computedY" : 171.831, "placementX" : 36.623, "placementY" : 171.831, - "placementWidth" : 98.603, + "placementWidth" : 99.777, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 98.603, + "contentWidth" : 99.777, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -6044,22 +6614,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/HeadingTail_Certifications[2]", + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 136.4, + "computedY" : 176.508, + "placementX" : 136.4, + "placementY" : 176.508, + "placementWidth" : 427.193, + "placementHeight" : 6.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 427.193, + "contentHeight" : 6.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } + }, { + "path" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[2]/HeadingTail_Certifications[0]", "entityName" : "HeadingTail_Certifications", "entityKind" : "LineNode", - "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]", - "childIndex" : 2, - "depth" : 4, - "layer" : 4, - "computedX" : 146.764, - "computedY" : 177.144, - "placementX" : 146.764, - "placementY" : 177.144, - "placementWidth" : 416.83, + "parentPath" : "SerifHeadlineCv[0]/Certifications[4]/SectionHeading_Certifications[0]/SectionHeadingRow_Certifications[0]/SectionNode[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 147.445, + "computedY" : 176.508, + "placementX" : 147.445, + "placementY" : 176.508, + "placementWidth" : 416.148, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 416.83, + "contentWidth" : 416.148, "contentHeight" : 1.0, "margin" : { "top" : 0.0, @@ -7281,21 +7881,21 @@ "childIndex" : 0, "depth" : 3, "layer" : 3, - "computedX" : 31.682, + "computedX" : 14.533, "computedY" : 97.242, - "placementX" : 31.682, + "placementX" : 14.533, "placementY" : 97.242, - "placementWidth" : 531.911, + "placementWidth" : 549.06, "placementHeight" : 12.595, "startPage" : 0, "endPage" : 0, - "contentWidth" : 531.911, + "contentWidth" : 549.06, "contentHeight" : 12.595, "margin" : { "top" : 0.0, "right" : 0.0, "bottom" : 0.0, - "left" : 0.0 + "left" : -17.149 }, "padding" : { "top" : 0.0, @@ -7304,17 +7904,77 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/HeadingDash_Achievements[0]", - "entityName" : "HeadingDash_Achievements", - "entityKind" : "LineNode", + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]", + "entityName" : "SectionHeadingRow_Achievements", + "entityKind" : "RowNode", "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]", "childIndex" : 0, "depth" : 4, "layer" : 4, "computedX" : 14.533, - "computedY" : 102.668, + "computedY" : 97.727, + "placementX" : 14.533, + "placementY" : 97.727, + "placementWidth" : 549.06, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 549.06, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[0]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 14.533, + "computedY" : 102.183, + "placementX" : 14.533, + "placementY" : 102.183, + "placementWidth" : 12.789, + "placementHeight" : 7.17, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.789, + "contentHeight" : 7.17, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.426, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[0]/HeadingDash_Achievements[0]", + "entityName" : "HeadingDash_Achievements", + "entityKind" : "LineNode", + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 14.533, + "computedY" : 102.183, "placementX" : 14.533, - "placementY" : 102.668, + "placementY" : 102.183, "placementWidth" : 12.789, "placementHeight" : 1.744, "startPage" : 0, @@ -7334,22 +7994,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionTitle_Achievements[1]", + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[1]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 27.322, + "computedY" : 97.727, + "placementX" : 27.322, + "placementY" : 97.727, + "placementWidth" : 102.997, + "placementHeight" : 11.626, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 102.997, + "contentHeight" : 11.626, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 9.301 + } + }, { + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[1]/SectionTitle_Achievements[0]", "entityName" : "SectionTitle_Achievements", "entityKind" : "ParagraphNode", - "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]", - "childIndex" : 1, - "depth" : 4, - "layer" : 4, + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, "computedX" : 36.623, "computedY" : 97.727, "placementX" : 36.623, "placementY" : 97.727, - "placementWidth" : 92.449, + "placementWidth" : 93.696, "placementHeight" : 11.626, "startPage" : 0, "endPage" : 0, - "contentWidth" : 92.449, + "contentWidth" : 93.696, "contentHeight" : 11.626, "margin" : { "top" : 0.0, @@ -7364,22 +8054,52 @@ "left" : 0.0 } }, { - "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/HeadingTail_Achievements[2]", + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[2]", + "entityName" : null, + "entityKind" : "SectionNode", + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 130.319, + "computedY" : 102.404, + "placementX" : 130.319, + "placementY" : 102.404, + "placementWidth" : 433.274, + "placementHeight" : 6.949, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 433.274, + "contentHeight" : 6.949, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 5.949, + "right" : 0.0, + "bottom" : 0.0, + "left" : 11.045 + } + }, { + "path" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[2]/HeadingTail_Achievements[0]", "entityName" : "HeadingTail_Achievements", "entityKind" : "LineNode", - "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]", - "childIndex" : 2, - "depth" : 4, - "layer" : 4, - "computedX" : 139.679, - "computedY" : 103.04, - "placementX" : 139.679, - "placementY" : 103.04, - "placementWidth" : 423.915, + "parentPath" : "SerifHeadlineCv[0]/Achievements[5]/SectionHeading_Achievements[0]/SectionHeadingRow_Achievements[0]/SectionNode[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 141.365, + "computedY" : 102.404, + "placementX" : 141.365, + "placementY" : 102.404, + "placementWidth" : 422.229, "placementHeight" : 1.0, "startPage" : 0, "endPage" : 0, - "contentWidth" : 423.915, + "contentWidth" : 422.229, "contentHeight" : 1.0, "margin" : { "top" : 0.0, diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineStyles.java index 1d06ab064..61d7967cd 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineStyles.java @@ -5,6 +5,7 @@ import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.document.templates.core.text.TextStyles; import com.demcha.compose.font.FontName; @@ -330,65 +331,19 @@ static double titleOffset(double leftSurfaceDistance) { // -- tracked capitals ------------------------------------------------ - static final double CAP_ADVANCE_NARROW = 0.30; - static final double CAP_ADVANCE_WIDE = 0.85; - static final double CAP_ADVANCE_EM = 0.62; - - /** Headroom on the estimate, so a tail never runs under its heading. */ - static final double TRACKED_WIDTH_SAFETY = 1.03; - /** - * Writes text letter by letter with a sized space between each pair, - * which is how this design gets its letter-spacing: a text style carries - * no tracking, so the gap is a run of its own whose type size is chosen - * to advance by {@link #TRACKING_EM} of the surrounding size. + * Writes {@code text} as one run tracked by {@link #TRACKING_EM}. + * + *

The letters stay one string, so a caption reads and copies as the + * word it is rather than as its letters with spaces between them.

* * @param paragraph the paragraph being built * @param text the text to space out * @param style the style of the letters */ static void tracked(ParagraphBuilder paragraph, String text, DocumentTextStyle style) { - DocumentTextStyle spacer = style.withSize(TRACKING_EM * style.size() / SPACE_ADVANCE_EM); - for (int i = 0; i < text.length(); i++) { - paragraph.inlineText(String.valueOf(text.charAt(i)), style); - if (i < text.length() - 1) { - paragraph.inlineText(" ", spacer); - } - } - } - - /** - * How wide a run of tracked capitals will be, estimated from per-letter - * advances rather than measured. - * - *

The heading rule that trails a title has to stop before the letters - * start, and its width is authored — the engine offers no measurement at - * compose time. Three advance classes are enough for capitals, and the - * result is padded by {@link #TRACKED_WIDTH_SAFETY} so the estimate errs - * towards a shorter rule.

- * - * @param text the capitals to measure - * @param size the type size - * @return the estimated width in points - */ - static double trackedWidth(String text, double size) { - if (text.isEmpty()) { - return 0.0; - } - double glyphs = 0.0; - for (int i = 0; i < text.length(); i++) { - glyphs += capAdvanceEm(text.charAt(i)); - } - return (glyphs * size + (text.length() - 1) * size * TRACKING_EM) - * TRACKED_WIDTH_SAFETY; - } - - private static double capAdvanceEm(char glyph) { - return switch (glyph) { - case 'I', 'J' -> CAP_ADVANCE_NARROW; - case 'M', 'W' -> CAP_ADVANCE_WIDE; - default -> CAP_ADVANCE_EM; - }; + paragraph.inlineText(text, style.withLetterSpacing( + DocumentLetterSpacing.ofFontSize(TRACKING_EM))); } // -- bands ----------------------------------------------------------- diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java index 8dd32fb0e..161e13f0a 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java @@ -3,11 +3,14 @@ import com.demcha.compose.document.dsl.ImageBuilder; import com.demcha.compose.document.dsl.LineBuilder; import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.RowBuilder; import com.demcha.compose.document.dsl.SectionBuilder; import com.demcha.compose.document.dsl.ShapeContainerBuilder; import com.demcha.compose.document.node.DocumentNode; import com.demcha.compose.document.node.LayerAlign; import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentLetterSpacing; +import com.demcha.compose.document.style.DocumentRowColumn; import com.demcha.compose.document.style.DocumentInsets; import com.demcha.compose.document.style.DocumentTextDecoration; import com.demcha.compose.document.style.DocumentTextStyle; @@ -24,6 +27,7 @@ import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.PLATE; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.RULE; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.TAIL_GAP; +import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.TRACKING_EM; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.TIGHT_LEADING; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.COLUMN_TAIL_GUTTER; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.columnInsets; @@ -31,7 +35,6 @@ import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.dashOffset; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.style; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.titleOffset; -import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.trackedWidth; import static com.demcha.compose.document.templates.cv.presets.SerifHeadlineStyles.tracked; /** @@ -69,46 +72,65 @@ static void sectionHeading(SectionBuilder section, String title, double width, double dashAt = dashOffset(leftSurfaceDistance); double titleAt = titleOffset(leftSurfaceDistance); - DocumentTextStyle headingStyle = style(HEADING_SIZE, INK, DocumentTextDecoration.DEFAULT); - DocumentNode dash = new LineBuilder() - .name("HeadingDash_" + compact(title)) - .horizontal(DASH_WIDTH) - .thickness(DASH_THICKNESS) - .color(INK) - .margin(DocumentInsets.zero()) - .build(); - ParagraphBuilder heading = new ParagraphBuilder() - .name("SectionTitle_" + compact(title)) - .textStyle(headingStyle) - .lineSpacing(TIGHT_LEADING); - tracked(heading, caps, headingStyle); - DocumentNode headingNode = heading.margin(DocumentInsets.zero()).build(); - - // The rule is authored, so its width comes from an estimate of what - // the letters will measure — see trackedWidth. - double tailWidth = width - titleAt - trackedWidth(caps, HEADING_SIZE) - TAIL_GAP; - DocumentNode tailNode = tail && tailWidth > 0 - ? new LineBuilder() - .name("HeadingTail_" + compact(title)) - .horizontal(tailWidth) - .thickness(HAIRLINE_THICKNESS) - .color(RULE) - .margin(DocumentInsets.zero()) - .build() - : null; + DocumentTextStyle headingStyle = style(HEADING_SIZE, INK, DocumentTextDecoration.DEFAULT) + .withLetterSpacing(DocumentLetterSpacing.ofFontSize(TRACKING_EM)); + double band = HEADING_SIZE * TIGHT_LEADING; - section.addContainer(band -> { - band.name("SectionHeading_" + compact(title)) - .rectangle(width, HEADING_SIZE * TIGHT_LEADING) - .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) - .padding(DocumentInsets.zero()) - .margin(new DocumentInsets(gapAbove, 0, 0, 0)) - .position(dash, dashAt, 0, LayerAlign.CENTER_LEFT) - .position(headingNode, titleAt, 0, LayerAlign.CENTER_LEFT); - if (tailNode != null) { - band.position(tailNode, 0, 0, LayerAlign.CENTER_RIGHT); - } - }); + // A row, not a stack of positioned layers: the words take what they + // measure and the rule takes the rest, so nothing here has to predict + // how wide tracked capitals will be. The row hangs left by the dash + // offset — a negative inset, which also hands back the width it + // borrows, leaving the right edge where it was. + RowBuilder row = new RowBuilder(); + { + row.name("SectionHeadingRow_" + compact(title)); + row.spacing(0); + row.margin(DocumentInsets.zero()); + row.columns(DocumentRowColumn.fixed(DASH_WIDTH), + DocumentRowColumn.auto(), + DocumentRowColumn.weight(1.0)); + row.addSection(cell -> { + cell.spacing(0); + cell.padding((float) ((band - DASH_THICKNESS) / 2), 0f, 0f, 0f); + cell.addLine(line -> line + .name("HeadingDash_" + compact(title)) + .horizontal(DASH_WIDTH) + .thickness(DASH_THICKNESS) + .color(INK)); + }); + row.addSection(cell -> { + cell.spacing(0); + cell.padding(0f, 0f, 0f, (float) (titleAt - dashAt - DASH_WIDTH)); + cell.addParagraph(p -> p + .name("SectionTitle_" + compact(title)) + .text(caps) + .textStyle(headingStyle) + .lineSpacing(TIGHT_LEADING)); + }); + row.addSection(cell -> { + cell.spacing(0); + cell.padding((float) ((band - HAIRLINE_THICKNESS) / 2), 0f, 0f, (float) TAIL_GAP); + if (tail) { + cell.addLine(line -> line + .name("HeadingTail_" + compact(title)) + .fill() + .thickness(HAIRLINE_THICKNESS) + .color(RULE)); + } + }); + } + + // The band stays a layer stack: a row may not nest directly inside the + // body's column row, and the stack is also what hands the row a width + // for its last column to take what the words leave. It is widened by + // the dash's overhang so the rule still ends on the column's edge. + section.addContainer(bandHost -> bandHost + .name("SectionHeading_" + compact(title)) + .rectangle(width - dashAt, band) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .padding(DocumentInsets.zero()) + .margin(new DocumentInsets(gapAbove, 0, 0, dashAt)) + .position(row.build(), 0, 0, LayerAlign.CENTER_LEFT)); } /** From 0565c518c3438ab10d5c1cccfa14b84deaada6b8 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 09:16:51 +0100 Subject: [PATCH 4/9] fix(templates): track both invoice mastheads with the pen The last two presets built tracking by writing something that is not the text. ConsultingText.tracked spliced a space between every character of the authored String, so "BILLED" was authored as "B I L L E D" and copied that way. LumaStudioWidgets.tracked kept the String whole but pushed a 0.05pt rectangle of the ground colour between each pair of letters, so the glyphs sat far enough apart that an extractor invented the word breaks itself. Different mechanisms, same result for a reader. Consulting: all three call sites migrate to the semantic string plus ConsultingStyles.HEADING_TRACKING, one space advance of whichever size the run is set at, and the String helper is deleted. The section rule beneath a heading is a fixed 30pt, so no width depended on the mutated text. LumaStudio: the three overloads now build one run carrying DocumentLetterSpacing.points(tracking) - the gaps were authored in points, so the tracking is read in points. The six tracking measures and their differing styles, alignments and vertical alignments are untouched. The ground colour is gone from the signature and its seven call sites: it existed only to paint the spacer rectangles, and there are none. Geometry, measured on all four invoice snapshots: width only. Same node count, same totalPages - 1, 2, 1 and 3 - and zero nodes changed page ownership, including both overflow cases. 29 tests green, both visual parity gates green. Co-Authored-By: Claude Opus 5 --- .../invoice/consulting_invoice_layout.json | 20 +++---- .../consulting_invoice_overflow_layout.json | 20 +++---- .../invoice/luma_studio_invoice_layout.json | 56 +++++++++---------- .../luma_studio_invoice_overflow_layout.json | 56 +++++++++---------- .../invoice/presets/ConsultingMasthead.java | 14 ++--- .../invoice/presets/ConsultingStyles.java | 10 ++++ .../invoice/presets/ConsultingText.java | 17 ------ .../invoice/presets/LumaStudioClosing.java | 3 +- .../invoice/presets/LumaStudioLines.java | 2 +- .../invoice/presets/LumaStudioMasthead.java | 6 +- .../invoice/presets/LumaStudioSidebar.java | 2 +- .../invoice/presets/LumaStudioWidgets.java | 47 +++++++--------- 12 files changed, 118 insertions(+), 135 deletions(-) diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json index 71f81a1bc..01549e355 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json @@ -565,11 +565,11 @@ "computedY" : 778.406, "placementX" : 339.231, "placementY" : 778.406, - "placementWidth" : 128.001, + "placementWidth" : 139.263, "placementHeight" : 32.984, "startPage" : 0, "endPage" : 0, - "contentWidth" : 128.001, + "contentWidth" : 139.263, "contentHeight" : 32.984, "margin" : { "top" : 0.0, @@ -1135,11 +1135,11 @@ "computedY" : 647.17, "placementX" : 30.5, "placementY" : 647.17, - "placementWidth" : 56.469, + "placementWidth" : 61.266, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 56.469, + "contentWidth" : 61.266, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -1345,11 +1345,11 @@ "computedY" : 647.17, "placementX" : 340.102, "placementY" : 647.17, - "placementWidth" : 109.748, + "placementWidth" : 116.508, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 109.748, + "contentWidth" : 116.508, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -1945,11 +1945,11 @@ "computedY" : 276.092, "placementX" : 30.5, "placementY" : 276.092, - "placementWidth" : 139.604, + "placementWidth" : 147.672, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 139.604, + "contentWidth" : 147.672, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -2635,11 +2635,11 @@ "computedY" : 276.092, "placementX" : 353.129, "placementY" : 276.092, - "placementWidth" : 36.122, + "placementWidth" : 39.611, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 36.122, + "contentWidth" : 39.611, "contentHeight" : 12.236, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json index fda4ec506..a89205baf 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json @@ -565,11 +565,11 @@ "computedY" : 778.406, "placementX" : 339.231, "placementY" : 778.406, - "placementWidth" : 128.001, + "placementWidth" : 139.263, "placementHeight" : 32.984, "startPage" : 0, "endPage" : 0, - "contentWidth" : 128.001, + "contentWidth" : 139.263, "contentHeight" : 32.984, "margin" : { "top" : 0.0, @@ -1135,11 +1135,11 @@ "computedY" : 647.17, "placementX" : 30.5, "placementY" : 647.17, - "placementWidth" : 56.469, + "placementWidth" : 61.266, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 56.469, + "contentWidth" : 61.266, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -1345,11 +1345,11 @@ "computedY" : 647.17, "placementX" : 340.102, "placementY" : 647.17, - "placementWidth" : 109.748, + "placementWidth" : 116.508, "placementHeight" : 12.236, "startPage" : 0, "endPage" : 0, - "contentWidth" : 109.748, + "contentWidth" : 116.508, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -1945,11 +1945,11 @@ "computedY" : 350.872, "placementX" : 30.5, "placementY" : 350.872, - "placementWidth" : 139.604, + "placementWidth" : 147.672, "placementHeight" : 12.236, "startPage" : 1, "endPage" : 1, - "contentWidth" : 139.604, + "contentWidth" : 147.672, "contentHeight" : 12.236, "margin" : { "top" : 0.0, @@ -2635,11 +2635,11 @@ "computedY" : 350.872, "placementX" : 353.129, "placementY" : 350.872, - "placementWidth" : 36.122, + "placementWidth" : 39.611, "placementHeight" : 12.236, "startPage" : 1, "endPage" : 1, - "contentWidth" : 36.122, + "contentWidth" : 39.611, "contentHeight" : 12.236, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json index 129d7aebb..a5d36c9cd 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json @@ -385,11 +385,11 @@ "computedY" : 675.395, "placementX" : 33.288, "placementY" : 675.395, - "placementWidth" : 82.984, + "placementWidth" : 83.966, "placementHeight" : 9.524, "startPage" : 0, "endPage" : 0, - "contentWidth" : 82.984, + "contentWidth" : 83.966, "contentHeight" : 9.524, "margin" : { "top" : 0.0, @@ -1045,11 +1045,11 @@ "computedY" : 736.636, "placementX" : 389.878, "placementY" : 736.636, - "placementWidth" : 164.751, + "placementWidth" : 164.817, "placementHeight" : 55.553, "startPage" : 0, "endPage" : 0, - "contentWidth" : 164.751, + "contentWidth" : 164.817, "contentHeight" : 55.553, "margin" : { "top" : 0.0, @@ -1135,11 +1135,11 @@ "computedY" : 720.957, "placementX" : 389.878, "placementY" : 720.957, - "placementWidth" : 57.062, + "placementWidth" : 58.497, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 57.062, + "contentWidth" : 58.497, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1225,11 +1225,11 @@ "computedY" : 703.458, "placementX" : 389.878, "placementY" : 703.458, - "placementWidth" : 51.552, + "placementWidth" : 52.989, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 51.552, + "contentWidth" : 52.989, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1315,11 +1315,11 @@ "computedY" : 685.958, "placementX" : 389.878, "placementY" : 685.958, - "placementWidth" : 43.963, + "placementWidth" : 45.405, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 43.963, + "contentWidth" : 45.405, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1405,11 +1405,11 @@ "computedY" : 668.458, "placementX" : 389.878, "placementY" : 668.458, - "placementWidth" : 75.89, + "placementWidth" : 77.32, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 75.89, + "contentWidth" : 77.32, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1495,11 +1495,11 @@ "computedY" : 650.958, "placementX" : 389.878, "placementY" : 650.958, - "placementWidth" : 46.267, + "placementWidth" : 47.709, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 46.267, + "contentWidth" : 47.709, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1645,11 +1645,11 @@ "computedY" : 611.326, "placementX" : 160.808, "placementY" : 611.326, - "placementWidth" : 33.342, + "placementWidth" : 34.786, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 33.342, + "contentWidth" : 34.786, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1735,11 +1735,11 @@ "computedY" : 611.326, "placementX" : 379.157, "placementY" : 611.326, - "placementWidth" : 35.173, + "placementWidth" : 36.618, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 35.173, + "contentWidth" : 36.618, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1885,11 +1885,11 @@ "computedY" : 248.821, "placementX" : 348.204, "placementY" : 248.821, - "placementWidth" : 46.299, + "placementWidth" : 46.895, "placementHeight" : 11.704, "startPage" : 0, "endPage" : 0, - "contentWidth" : 46.299, + "contentWidth" : 46.895, "contentHeight" : 11.704, "margin" : { "top" : 0.0, @@ -1975,11 +1975,11 @@ "computedY" : 230.712, "placementX" : 348.204, "placementY" : 230.712, - "placementWidth" : 45.982, + "placementWidth" : 46.575, "placementHeight" : 11.704, "startPage" : 0, "endPage" : 0, - "contentWidth" : 45.982, + "contentWidth" : 46.575, "contentHeight" : 11.704, "margin" : { "top" : 0.0, @@ -2065,11 +2065,11 @@ "computedY" : 204.85, "placementX" : 348.204, "placementY" : 204.85, - "placementWidth" : 52.971, + "placementWidth" : 53.564, "placementHeight" : 12.507, "startPage" : 0, "endPage" : 0, - "contentWidth" : 52.971, + "contentWidth" : 53.564, "contentHeight" : 12.507, "margin" : { "top" : 0.0, @@ -2365,11 +2365,11 @@ "computedY" : 165.271, "placementX" : 188.974, "placementY" : 165.271, - "placementWidth" : 28.177, + "placementWidth" : 29.626, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 28.177, + "contentWidth" : 29.626, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -2665,11 +2665,11 @@ "computedY" : 165.271, "placementX" : 380.304, "placementY" : 165.271, - "placementWidth" : 82.727, + "placementWidth" : 84.151, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 82.727, + "contentWidth" : 84.151, "contentHeight" : 9.765, "margin" : { "top" : 0.0, diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json index 7592ce06c..edc19a435 100644 --- a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json @@ -385,11 +385,11 @@ "computedY" : 675.395, "placementX" : 33.288, "placementY" : 675.395, - "placementWidth" : 82.984, + "placementWidth" : 83.966, "placementHeight" : 9.524, "startPage" : 0, "endPage" : 0, - "contentWidth" : 82.984, + "contentWidth" : 83.966, "contentHeight" : 9.524, "margin" : { "top" : 0.0, @@ -1045,11 +1045,11 @@ "computedY" : 736.636, "placementX" : 389.878, "placementY" : 736.636, - "placementWidth" : 164.751, + "placementWidth" : 164.817, "placementHeight" : 55.553, "startPage" : 0, "endPage" : 0, - "contentWidth" : 164.751, + "contentWidth" : 164.817, "contentHeight" : 55.553, "margin" : { "top" : 0.0, @@ -1135,11 +1135,11 @@ "computedY" : 720.957, "placementX" : 389.878, "placementY" : 720.957, - "placementWidth" : 57.062, + "placementWidth" : 58.497, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 57.062, + "contentWidth" : 58.497, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1225,11 +1225,11 @@ "computedY" : 703.458, "placementX" : 389.878, "placementY" : 703.458, - "placementWidth" : 51.552, + "placementWidth" : 52.989, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 51.552, + "contentWidth" : 52.989, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1315,11 +1315,11 @@ "computedY" : 685.958, "placementX" : 389.878, "placementY" : 685.958, - "placementWidth" : 43.963, + "placementWidth" : 45.405, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 43.963, + "contentWidth" : 45.405, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1405,11 +1405,11 @@ "computedY" : 668.458, "placementX" : 389.878, "placementY" : 668.458, - "placementWidth" : 75.89, + "placementWidth" : 77.32, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 75.89, + "contentWidth" : 77.32, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1495,11 +1495,11 @@ "computedY" : 650.958, "placementX" : 389.878, "placementY" : 650.958, - "placementWidth" : 46.267, + "placementWidth" : 47.709, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 46.267, + "contentWidth" : 47.709, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1645,11 +1645,11 @@ "computedY" : 611.326, "placementX" : 160.808, "placementY" : 611.326, - "placementWidth" : 33.342, + "placementWidth" : 34.786, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 33.342, + "contentWidth" : 34.786, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1735,11 +1735,11 @@ "computedY" : 611.326, "placementX" : 379.157, "placementY" : 611.326, - "placementWidth" : 35.173, + "placementWidth" : 36.618, "placementHeight" : 9.765, "startPage" : 0, "endPage" : 0, - "contentWidth" : 35.173, + "contentWidth" : 36.618, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -1885,11 +1885,11 @@ "computedY" : 159.439, "placementX" : 348.204, "placementY" : 159.439, - "placementWidth" : 46.299, + "placementWidth" : 46.895, "placementHeight" : 11.704, "startPage" : 1, "endPage" : 1, - "contentWidth" : 46.299, + "contentWidth" : 46.895, "contentHeight" : 11.704, "margin" : { "top" : 0.0, @@ -1975,11 +1975,11 @@ "computedY" : 141.331, "placementX" : 348.204, "placementY" : 141.331, - "placementWidth" : 45.982, + "placementWidth" : 46.575, "placementHeight" : 11.704, "startPage" : 1, "endPage" : 1, - "contentWidth" : 45.982, + "contentWidth" : 46.575, "contentHeight" : 11.704, "margin" : { "top" : 0.0, @@ -2065,11 +2065,11 @@ "computedY" : 115.468, "placementX" : 348.204, "placementY" : 115.468, - "placementWidth" : 52.971, + "placementWidth" : 53.564, "placementHeight" : 12.507, "startPage" : 1, "endPage" : 1, - "contentWidth" : 52.971, + "contentWidth" : 53.564, "contentHeight" : 12.507, "margin" : { "top" : 0.0, @@ -2365,11 +2365,11 @@ "computedY" : 766.307, "placementX" : 188.974, "placementY" : 766.307, - "placementWidth" : 28.177, + "placementWidth" : 29.626, "placementHeight" : 9.765, "startPage" : 2, "endPage" : 2, - "contentWidth" : 28.177, + "contentWidth" : 29.626, "contentHeight" : 9.765, "margin" : { "top" : 0.0, @@ -2665,11 +2665,11 @@ "computedY" : 766.307, "placementX" : 380.304, "placementY" : 766.307, - "placementWidth" : 82.727, + "placementWidth" : 84.151, "placementHeight" : 9.765, "startPage" : 2, "endPage" : 2, - "contentWidth" : 82.727, + "contentWidth" : 84.151, "contentHeight" : 9.765, "margin" : { "top" : 0.0, diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java index 96ef659ae..7e7470cab 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java @@ -33,7 +33,7 @@ import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.SMALL_BOLD; import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.SUPPLIER_WIDTH; import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.link; -import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.tracked; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.HEADING_TRACKING; /** * The masthead of the Consulting Invoice: the sender's lockup and contact @@ -116,8 +116,8 @@ private static void renderTextLockup(SectionBuilder section, InvoiceBrand brand) .margin(DocumentInsets.zero())) .addParagraph(paragraph -> paragraph .text(brand.qualifier().isBlank() - ? "" : "— " + tracked(brand.qualifier()) + " —") - .textStyle(BRAND_QUALIFIER) + ? "" : "— " + brand.qualifier() + " —") + .textStyle(BRAND_QUALIFIER.withLetterSpacing(HEADING_TRACKING)) .align(TextAlign.CENTER) .margin(DocumentInsets.zero())) .addParagraph(paragraph -> paragraph @@ -152,8 +152,8 @@ static void renderInvoiceHeader(SectionBuilder section, StructuredInvoiceData da .padding(0, 0, 0, 24) .spacing(1) .addParagraph(paragraph -> paragraph - .text(tracked(masthead.title())) - .textStyle(INVOICE_TITLE) + .text(masthead.title()) + .textStyle(INVOICE_TITLE.withLetterSpacing(HEADING_TRACKING)) .margin(DocumentInsets.bottom(8))); for (InvoiceMasthead.Entry entry : masthead.entries()) { metadataBand(section, entry); @@ -206,8 +206,8 @@ static void sectionHeading(SectionBuilder section, String heading) { return; } section.addParagraph(paragraph -> paragraph - .text(tracked(heading)) - .textStyle(SECTION_HEADING) + .text(heading) + .textStyle(SECTION_HEADING.withLetterSpacing(HEADING_TRACKING)) .lineSpacing(1.0) .margin(DocumentInsets.zero())) .addLine(line -> line diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java index 722332b7d..aca17f74a 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java @@ -3,6 +3,7 @@ import com.demcha.compose.document.api.DocumentPageSize; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentStroke; import com.demcha.compose.document.style.DocumentTextDecoration; import com.demcha.compose.document.style.DocumentTextStyle; @@ -98,6 +99,15 @@ private ConsultingStyles() { style(SECTION_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); static final DocumentTextStyle INVOICE_TITLE = style(TITLE_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + + /** + * The heading treatment's tracking. It used to be a space written between + * every pair of letters, so the gap it replaces is one space advance — a + * quarter of whichever size the run carrying it is set at. + */ + static final DocumentLetterSpacing HEADING_TRACKING = + DocumentLetterSpacing.ofFontSize(0.25); + static final DocumentTextStyle BRAND_NAME = style(BODY_SIZE * 2.45, DocumentTextDecoration.BOLD, INK); static final DocumentTextStyle BRAND_MARK = diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java index be22cabac..1bacab48c 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java @@ -82,23 +82,6 @@ private static Font loadDescriptionBoldFont() { return new Font("SansSerif", Font.BOLD, 1); } - /** - * Spaces a value out into tracked capitals (the heading treatment). - * - * @param value the text, already in the case it is set in - * @return the tracked text - */ - static String tracked(String value) { - StringBuilder tracked = new StringBuilder(value.length() * 2); - for (int index = 0; index < value.length(); index++) { - if (index > 0) { - tracked.append(' '); - } - tracked.append(value.charAt(index)); - } - return tracked.toString(); - } - /** * Formats a quantity at two decimal places, without grouping. * diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java index aed7054c3..0b85099cd 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java @@ -98,8 +98,7 @@ private static void totalsRow(SectionBuilder section, String label, String amoun .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) .position(tracked("TotalsLabel", label, emphasised ? TOTAL_DUE_LABEL : TOTAL_LABEL, - TRACK_TOTAL_LABEL, - emphasised ? PANEL_HIGHLIGHT : PAPER), + TRACK_TOTAL_LABEL), TOTALS_LABEL_INSET, 0, LayerAlign.CENTER_LEFT) .position(paragraph(amount, emphasised ? TOTAL_DUE_AMOUNT : TOTAL_AMOUNT, diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java index d1a2fc6d3..2726af7ab 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java @@ -117,7 +117,7 @@ private static DocumentTableColumn column(int index) { */ private static DocumentTableCell headerCell(String text, TextAlign align) { return DocumentTableCell.node(tracked("HeaderCell", text, TABLE_HEADER, - TRACK_TABLE_HEADER, INK_SURFACE, align, TextVerticalAlign.DEFAULT)); + TRACK_TABLE_HEADER, align, TextVerticalAlign.DEFAULT)); } /** diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java index ab75a03b0..918a1d218 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java @@ -156,7 +156,7 @@ static void renderTitle(SectionBuilder section, InvoiceMasthead masthead) { .rectangle(META_WIDTH, TITLE_BLOCK_HEIGHT) .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) .position(tracked("InvoiceTitle", masthead.title(), INVOICE_TITLE, - TRACK_TITLE, PAPER, TextVerticalAlign.TOP), + TRACK_TITLE, TextVerticalAlign.TOP), 0, TITLE_CAP_INSET, LayerAlign.TOP_LEFT) .position(new LineBuilder() .name("TitleRule") @@ -173,7 +173,7 @@ static void renderTitle(SectionBuilder section, InvoiceMasthead masthead) { .rectangle(META_WIDTH, META_ROW_HEIGHT) .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) .centerLeft(tracked("MetaLabel", entry.label(), META_LABEL, - TRACK_META_LABEL, PAPER)) + TRACK_META_LABEL)) .position(paragraph(entry.value(), BODY, TextAlign.LEFT), META_WIDTH * META_VALUE_SPLIT, 0, LayerAlign.CENTER_LEFT)); } @@ -220,7 +220,7 @@ static void renderParty(SectionBuilder section, InvoiceRecipient party, boolean section.padding(new DocumentInsets(0, 0, 0, TEXT_INSET)); } section.add(tracked("PartyHeading", heading, SECTION_HEADING, - TRACK_SECTION_HEADING, PAPER)) + TRACK_SECTION_HEADING)) .addParagraph(p -> p .name("PartyAddress") .text(String.join(NEWLINE, addressOf(party))) diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java index 4d3d39b2b..d9e81bfab 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java @@ -108,7 +108,7 @@ private static DocumentNode lockup(InvoiceBrand brand) { .build(), LOCKUP_LEFT, LOCKUP_RULE_Y, LayerAlign.TOP_LEFT) .position(tracked("Wordmark", brand.name(), WORDMARK, - TRACK_WORDMARK, ACCENT, TextVerticalAlign.TOP), + TRACK_WORDMARK, TextVerticalAlign.TOP), LOCKUP_LEFT, WORDMARK_Y, LayerAlign.TOP_LEFT) .position(seated(brand.tagline(), TAGLINE), LOCKUP_LEFT, TAGLINE_Y, LayerAlign.TOP_LEFT) diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java index ce754986a..df91ba552 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java @@ -12,6 +12,7 @@ import com.demcha.compose.document.style.ClipPolicy; import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextStyle; import com.demcha.compose.document.style.ShapeOutline; @@ -35,21 +36,20 @@ private LumaStudioWidgets() { /** * A run of letter-spaced text. * - *

A text style carries no tracking, so the gap between letters is an - * inline rectangle of the ground colour — invisible, and exactly as wide - * as the spacing asks for. The rectangle is 0.05pt tall so it takes no - * part in the line box.

+ *

The letters stay one string and the pen carries the tracking, so a + * label reads and copies as the word it is. The gaps used to be inline + * rectangles of the ground colour, which is why this once took a ground + * to paint them in and no longer does.

* * @param name the node name * @param text the text to space out * @param style the style of the letters * @param tracking the gap in points; zero or less writes the text plainly - * @param ground the colour behind the run, which the gaps are painted in * @return the paragraph node */ static DocumentNode tracked(String name, String text, DocumentTextStyle style, - double tracking, DocumentColor ground) { - return tracked(name, text, style, tracking, ground, TextVerticalAlign.DEFAULT); + double tracking) { + return tracked(name, text, style, tracking, TextVerticalAlign.DEFAULT); } /** @@ -59,14 +59,12 @@ static DocumentNode tracked(String name, String text, DocumentTextStyle style, * @param text the text to space out * @param style the style of the letters * @param tracking the gap in points - * @param ground the colour the gaps are painted in * @param verticalAlign where the text sits in its box * @return the paragraph node */ static DocumentNode tracked(String name, String text, DocumentTextStyle style, - double tracking, DocumentColor ground, - TextVerticalAlign verticalAlign) { - return tracked(name, text, style, tracking, ground, TextAlign.LEFT, verticalAlign); + double tracking, TextVerticalAlign verticalAlign) { + return tracked(name, text, style, tracking, TextAlign.LEFT, verticalAlign); } /** @@ -77,32 +75,25 @@ static DocumentNode tracked(String name, String text, DocumentTextStyle style, * @param text the text to space out * @param style the style of the letters * @param tracking the gap in points - * @param ground the colour the gaps are painted in * @param align where the run sits across its box * @param verticalAlign where the text sits in its box * @return the paragraph node */ static DocumentNode tracked(String name, String text, DocumentTextStyle style, - double tracking, DocumentColor ground, TextAlign align, + double tracking, TextAlign align, TextVerticalAlign verticalAlign) { - ParagraphBuilder paragraph = new ParagraphBuilder() + DocumentTextStyle run = tracking > 0 + ? style.withLetterSpacing(DocumentLetterSpacing.points(tracking)) + : style; + return new ParagraphBuilder() .name(name) - .textStyle(style) + .textStyle(run) .align(align) .verticalAlign(verticalAlign) .lineSpacing(0) - .margin(DocumentInsets.zero()); - if (tracking <= 0) { - return paragraph.text(text).build(); - } - return paragraph.rich(rich -> { - for (int index = 0; index < text.length(); index++) { - if (index > 0) { - rich.shape(new ShapeOutline.Rectangle(tracking, 0.05), ground); - } - rich.style(String.valueOf(text.charAt(index)), style); - } - }).build(); + .margin(DocumentInsets.zero()) + .text(text) + .build(); } /** A plain paragraph as a node, for anchoring inside a container. */ @@ -166,7 +157,7 @@ static void sectionHead(SectionBuilder section, String iconToken, String heading .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) .centerLeft(disc(SECTION_DISC_SIZE, iconToken, SECTION_DISC_ICON_SIZE)) .position(tracked("SectionHeading", heading, SECTION_HEADING, - TRACK_SECTION_HEADING, PAPER), + TRACK_SECTION_HEADING), SECTION_HEADING_OFFSET, 0, LayerAlign.CENTER_LEFT)); } } From 099991a9005a4df76febb06f9b5c6dff4ca3b66e Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 09:21:01 +0100 Subject: [PATCH 5/9] test(templates): hold the promoted templates' text layer to the words they draw Ten shipped presets spelled their headings out in the text layer and nothing caught it, because the one gate that asserts this - CvPresetTextLayerTest - listed the sixteen older CV presets and none of the promoted ones. That list is why the old presets were fine and the new ones were not. - CvPresetTextLayerTest now covers all 26 CV presets. OrangeOps names Oswald and leaves registering it to the caller, so the session carries it, as its own snapshot test does. - TemplateTextLayerGateTest covers the families the CV gate cannot reach. It pins BILLED, INVOICE and PROFILE by name, and keeps ModernReceipt as the control: that preset has carried native spaced caps since it shipped, so if a change to the detector ever reddens it, the detector is wrong. The detector is asserted against fixtures of its own, which is the part worth keeping. It matches a run of three or more single letters separated by any Unicode space separator, not just U+0020 - one preset spelled its headings with hair and thin spaces, and a plain-space class reads straight past that. Four cases pin it: ordinary spaces caught, hair and thin spaces caught, a word tracked with the pen passed, and prose left alone. That last pair is the lesson from the first sweep of this defect, which ran on a PDFBox that ignores ActualText and called twenty-two correct templates broken. A detector nobody has tried to fool is a detector nobody should trust, so this one is run against both classes before it is believed. Three fixtures widen to public to be reachable from one gate rather than three; ProfessionalSidebarFixtures already was. Co-Authored-By: Claude Opus 5 --- .../templates/TemplateTextLayerGateTest.java | 187 ++++++++++++++++++ .../cv/presets/CvPresetTextLayerTest.java | 24 ++- .../presets/ConsultingInvoiceFixtures.java | 4 +- .../presets/LumaStudioInvoiceFixtures.java | 4 +- .../receipt/presets/ReceiptFixtures.java | 4 +- 5 files changed, 216 insertions(+), 7 deletions(-) create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java diff --git a/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java new file mode 100644 index 000000000..c6c570506 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java @@ -0,0 +1,187 @@ +package com.demcha.compose.document.templates; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.style.DocumentLetterSpacing; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.templates.cv.presets.ProfessionalSidebar; +import com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarFixtures; +import com.demcha.compose.document.templates.invoice.presets.ConsultingInvoice; +import com.demcha.compose.document.templates.invoice.presets.ConsultingInvoiceFixtures; +import com.demcha.compose.document.templates.invoice.presets.LumaStudioInvoice; +import com.demcha.compose.document.templates.invoice.presets.LumaStudioInvoiceFixtures; +import com.demcha.compose.document.templates.receipt.presets.ModernReceipt; +import com.demcha.compose.document.templates.receipt.presets.ReceiptFixtures; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * The text layer of the promoted templates says the words they draw. + * + *

Ten shipped presets once made their tracking by writing something that is + * not the text — a space between every letter, a hair space, a run of sized + * spacers, an invisible rectangle — so a heading drawn as PROFILE came out of + * the file as {@code P R O F I L E} and a name could not be searched for. The + * engine tracks with the pen and states the run's own {@code ActualText}, so + * the words survive. This gate holds them to that.

+ * + *

The CV family is covered preset by preset in + * {@code CvPresetTextLayerTest}; this one covers the other families the defect + * reached, and pins the three labels by name.

+ * + *

The detector is asserted against fixtures of its own below. That matters + * more than it looks: the first sweep of this defect was run on a PDFBox that + * ignores {@code ActualText}, and it called twenty-two correct templates + * broken. A detector nobody has tried to fool is a detector nobody should + * trust.

+ */ +class TemplateTextLayerGateTest { + + /** + * Three or more single letters, each separated by one space character. + * + *

Any space separator counts, not just {@code U+0020}: one of the + * presets spelled its headings with hair and thin spaces, which a plain + * space class reads straight past.

+ */ + private static final Pattern SPELLED_OUT = + Pattern.compile("(? + ConsultingInvoice.create().compose( + session, ConsultingInvoiceFixtures.canonicalInvoice())); + + assertThat(extracted).contains("BILLED"); + assertThat(extracted).doesNotContain("B I L L E D"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + + @Test + void theLumaStudioInvoiceSaysInvoice() throws Exception { + String extracted = extract(session -> + LumaStudioInvoice.create().compose( + session, LumaStudioInvoiceFixtures.canonicalInvoice())); + + assertThat(extracted).contains("INVOICE"); + assertThat(extracted).doesNotContain("I N V O I C E"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + + @Test + void theProfessionalSidebarSaysProfile() throws Exception { + String extracted = extract(session -> + ProfessionalSidebar.create().compose( + session, ProfessionalSidebarFixtures.canonicalCv())); + + assertThat(extracted).contains("PROFILE"); + assertThat(extracted).doesNotContain("P R O F I L E"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + + /** + * The control. This preset never faked its tracking — it has carried + * native spaced caps from the day it shipped — so it is the case that must + * keep passing. If a change to the detector ever reddens this one, the + * detector is wrong, not the receipt. + */ + @Test + void theReceiptsNativeSpacedCapsStayClean() throws Exception { + String extracted = extract(session -> + ModernReceipt.create().compose(session, ReceiptFixtures.canonicalReceipt())); + + assertThat(extracted).contains("AMOUNT COLLECTED"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + + // -- the detector itself ----------------------------------------------- + + @Test + void theDetectorCatchesLettersSpelledOutWithOrdinarySpaces() throws Exception { + String extracted = extract(session -> session.pageFlow(page -> page + .addParagraph("P R O F I L E"))); + + assertThat(spelledOutRuns(extracted)).contains("P R O F I L E"); + } + + /** + * The failure one preset actually shipped: the gaps were hair and thin + * spaces, so a detector written against {@code " "} alone reads the line + * as a single word and passes it. + */ + @Test + void theDetectorCatchesLettersSpelledOutWithHairAndThinSpaces() throws Exception { + String hair = "P R O F I L E"; + String thin = "B I L L E D"; + + assertThat(spelledOutRuns(hair)).isNotEmpty(); + assertThat(spelledOutRuns(thin)).isNotEmpty(); + } + + @Test + void theDetectorPassesAWordTrackedWithThePen() throws Exception { + String extracted = extract(session -> session.pageFlow(page -> page + .addParagraph(p -> p + .text("PROFILE") + .textStyle(DocumentTextStyle.builder() + .size(18) + .letterSpacing(DocumentLetterSpacing.ofFontSize(0.3)) + .build())))); + + assertThat(extracted).contains("PROFILE"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + + @Test + void theDetectorLeavesOrdinaryProseAlone() { + // Nothing spelled out: headings, prose, and initials short enough to be + // words rather than a spelled-out run. + assertThat(spelledOutRuns("PROFILE EXPERIENCE EDUCATION")).isEmpty(); + assertThat(spelledOutRuns("Nothing here is spelled out letter by letter")).isEmpty(); + assertThat(spelledOutRuns("Ordinary prose with short words a b and c")).isEmpty(); + + // And it still fires on a genuine run buried in prose. + assertThat(spelledOutRuns("Delivery lead, a s p e c i a l case aside")) + .containsExactly("a s p e c i a l"); + } + + // -- helpers ----------------------------------------------------------- + + private static List spelledOutRuns(String text) { + Matcher matcher = SPELLED_OUT.matcher(text); + List runs = new ArrayList<>(); + while (matcher.find()) { + runs.add(matcher.group()); + } + return runs; + } + + private interface Composition { + void compose(DocumentSession session); + } + + private static String extract(Composition composition) throws IOException { + byte[] pdf; + try (DocumentSession session = GraphCompose.document().create()) { + composition.compose(session); + pdf = session.toPdfBytes(); + } + try (PDDocument document = Loader.loadPDF(pdf)) { + // One line break is a wrapping decision, not a text-layer defect. + return new PDFTextStripper().getText(document).replaceAll("\\s*\\R\\s*", " "); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvPresetTextLayerTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvPresetTextLayerTest.java index b26f46eb7..2eccef5cd 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvPresetTextLayerTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CvPresetTextLayerTest.java @@ -49,6 +49,9 @@ class CvPresetTextLayerTest { private static final List PROBES = List.of("Platform", "certification", "retired", "drafts", "fifteen"); + /** Margin for presets whose design paints to the page edge. */ + private static final double FULL_BLEED = 0.0; + @ParameterizedTest(name = "{0}") @MethodSource("presets") void theProfileTextIsInTheFileAsItWasWritten( @@ -105,6 +108,9 @@ private static String renderText(DocumentTemplate template, double m .pageSize(DocumentPageSize.A4) .margin(m, m, m, m) .create()) { + // OrangeOps names Oswald and leaves registering it to the caller, so + // every session here carries it; the other presets do not ask for it. + OrangeOpsTestFont.register(session); template.compose(session, probeDocument()); pdf = session.toPdfBytes(); } @@ -154,7 +160,23 @@ private static Stream presets() { preset("engineering_resume", EngineeringResume.RECOMMENDED_MARGIN, EngineeringResume::create), preset("monogram_sidebar", MonogramSidebar.RECOMMENDED_MARGIN, MonogramSidebar::create), preset("sidebar_portrait", SidebarPortrait.RECOMMENDED_MARGIN, SidebarPortrait::create), - preset("mint_editorial", MintEditorial.RECOMMENDED_MARGIN, MintEditorial::create)); + preset("mint_editorial", MintEditorial.RECOMMENDED_MARGIN, MintEditorial::create), + // The promoted presets. They were absent from this list while each + // grew its own letter-by-letter tracker, which is exactly how ten + // of them shipped spelling their headings out in the text layer. + preset("charcoal_gold", CharcoalGold.RECOMMENDED_MARGIN, CharcoalGold::create), + preset("navy_sidebar", NavySidebar.RECOMMENDED_MARGIN, NavySidebar::create), + preset("professional_sidebar", ProfessionalSidebar.RECOMMENDED_MARGIN, ProfessionalSidebar::create), + preset("serif_headline", SerifHeadline.RECOMMENDED_MARGIN, SerifHeadline::create), + preset("terracotta_rail", TerracottaRail.RECOMMENDED_MARGIN, TerracottaRail::create), + // Full-bleed designs: they paint to the page edge and publish no + // recommended margin, so they are composed the way their own + // snapshot tests compose them. + preset("midnight_navy", FULL_BLEED, MidnightNavy::create), + preset("orange_ops", FULL_BLEED, OrangeOps::create), + preset("slate_orange", FULL_BLEED, SlateOrange::create), + preset("teal_pulse", FULL_BLEED, TealPulse::create), + preset("violet_grid", FULL_BLEED, VioletGrid::create)); } private static Arguments preset(String slug, double margin, diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java index 17f39b942..a9a07edd6 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java @@ -36,13 +36,13 @@ * {@code ConsultingInvoiceSampleData} — the two modules cannot share a * source file, so a content change here belongs there too.

*/ -final class ConsultingInvoiceFixtures { +public final class ConsultingInvoiceFixtures { private ConsultingInvoiceFixtures() { } /** The single-page reference invoice. */ - static StructuredInvoiceDocumentSpec canonicalInvoice() { + public static StructuredInvoiceDocumentSpec canonicalInvoice() { return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(5)).build()); } diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java index b0115f9bb..f40f24f36 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java @@ -21,7 +21,7 @@ * geometry shift the pixel budget absorbs still trips the exact snapshot, * and vice versa. */ -final class LumaStudioInvoiceFixtures { +public final class LumaStudioInvoiceFixtures { /** The break the sheet stacks its multi-line notes on. */ private static final String NEWLINE = String.valueOf((char) 10); @@ -34,7 +34,7 @@ private LumaStudioInvoiceFixtures() { * exercising the sidebar lockup, both party blocks, the VAT column, the * total-due band, the notes and payment pair, and the sign-off band. */ - static StructuredInvoiceDocumentSpec canonicalInvoice() { + public static StructuredInvoiceDocumentSpec canonicalInvoice() { return StructuredInvoiceDocumentSpec.from(base().build()); } diff --git a/qa/src/test/java/com/demcha/compose/document/templates/receipt/presets/ReceiptFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/receipt/presets/ReceiptFixtures.java index b43ff1516..94a096670 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/receipt/presets/ReceiptFixtures.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/receipt/presets/ReceiptFixtures.java @@ -11,7 +11,7 @@ *

Kept in the test tree and built only from main code, so the gates depend on the * templates module and not on the examples module.

*/ -final class ReceiptFixtures { +public final class ReceiptFixtures { private ReceiptFixtures() { } @@ -23,7 +23,7 @@ private ReceiptFixtures() { * * @return the canonical receipt spec shared by every receipt gate */ - static ReceiptDocumentSpec canonicalReceipt() { + public static ReceiptDocumentSpec canonicalReceipt() { return ReceiptDocumentSpec.of(receipt -> receipt .documentTitle("Transfer confirmation") .issuerName("Northwind Pay") From 80611e12d83b9e610f5d64fa789e5670bc7f854d Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 09:23:23 +0100 Subject: [PATCH 6/9] chore(templates): drop the imports the tracking migration left behind The spacer runs are gone, so the ground colours they were painted in and the builders that assembled them are unreferenced: PAPER and INK_SURFACE across the LumaStudio sheet, DocumentColor and ShapeOutline in its widgets, and ParagraphBuilder in SerifHeadlineWidgets now that the heading is a row. Two imports in TerracottaRailWidgets are also unused - EllipseBuilder and ENTRY_INDENT - but both were already unused before this branch, so they are left where they are rather than folded into an unrelated change. Co-Authored-By: Claude Opus 5 --- .../document/templates/cv/presets/SerifHeadlineWidgets.java | 1 - .../document/templates/invoice/presets/LumaStudioClosing.java | 1 - .../document/templates/invoice/presets/LumaStudioLines.java | 1 - .../document/templates/invoice/presets/LumaStudioMasthead.java | 1 - .../document/templates/invoice/presets/LumaStudioWidgets.java | 3 --- 5 files changed, 7 deletions(-) diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java index 161e13f0a..46da72dd3 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/SerifHeadlineWidgets.java @@ -2,7 +2,6 @@ import com.demcha.compose.document.dsl.ImageBuilder; import com.demcha.compose.document.dsl.LineBuilder; -import com.demcha.compose.document.dsl.ParagraphBuilder; import com.demcha.compose.document.dsl.RowBuilder; import com.demcha.compose.document.dsl.SectionBuilder; import com.demcha.compose.document.dsl.ShapeContainerBuilder; diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java index 0b85099cd..371da5c82 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java @@ -38,7 +38,6 @@ import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_LEFT; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_RIGHT; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PANEL_HIGHLIGHT; -import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_THICKNESS; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING_OFFSET; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SMALL_BOLD; diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java index 2726af7ab..118ac4abd 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java @@ -19,7 +19,6 @@ import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BODY_BOLD; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTENT_WIDTH; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.HAIRLINE; -import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.INK_SURFACE; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_DESC; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_INDEX; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_TITLE; diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java index 918a1d218..114992963 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java @@ -29,7 +29,6 @@ import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.META_WIDTH; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MASTHEAD_TO_RULE; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MICRO_MUTED; -import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PARTIES_DIVIDER_INSET; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_THICKNESS; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING; diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java index df91ba552..26881ddb8 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java @@ -10,14 +10,11 @@ import com.demcha.compose.document.node.TextAlign; import com.demcha.compose.document.node.TextVerticalAlign; import com.demcha.compose.document.style.ClipPolicy; -import com.demcha.compose.document.style.DocumentColor; import com.demcha.compose.document.style.DocumentInsets; import com.demcha.compose.document.style.DocumentLetterSpacing; import com.demcha.compose.document.style.DocumentTextStyle; -import com.demcha.compose.document.style.ShapeOutline; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ACCENT; -import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_DISC_ICON_SIZE; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_DISC_SIZE; import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING; From d4e62b38267fbf1a42e21247ea85c52ef4853271 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 09:29:17 +0100 Subject: [PATCH 7/9] chore(examples): re-render the ten previews the tracking migration moved Every preview whose template stopped writing its tracking as characters is regenerated from the migrated engine: eight CV sheets and both invoices. CommittedAssetDriftTest is green again. Only those ten moved. A content hash over the page streams also flagged six unrelated previews - arabic-article, both engine decks, hebrew-invoice, linkedin-carousel and maven-banner - but the drift gate, which drops what the machine writes rather than comparing bytes, reads them as unchanged. They are left alone rather than committed as churn. Also drops a bare block left around the row construction in SerifHeadlineWidgets while it was being reshaped; it scoped nothing. Co-Authored-By: Claude Opus 5 --- .../readme/examples/cv-charcoal-gold-v2.pdf | Bin 35766 -> 35843 bytes .../readme/examples/cv-midnight-navy-v2.pdf | Bin 37022 -> 37075 bytes assets/readme/examples/cv-navy-sidebar-v2.pdf | Bin 34375 -> 34553 bytes .../examples/cv-professional-sidebar-v2.pdf | Bin 53171 -> 53438 bytes .../readme/examples/cv-serif-headline-v2.pdf | Bin 83129 -> 83345 bytes assets/readme/examples/cv-teal-pulse-v2.pdf | Bin 41472 -> 39420 bytes .../readme/examples/cv-terracotta-rail-v2.pdf | Bin 40771 -> 41017 bytes assets/readme/examples/cv-violet-grid-v2.pdf | Bin 45158 -> 45228 bytes .../readme/examples/invoice-consulting-v2.pdf | Bin 91964 -> 92152 bytes .../examples/invoice-luma-studio-v2.pdf | Bin 48610 -> 46408 bytes .../cv/presets/SerifHeadlineWidgets.java | 70 +++++++++--------- 11 files changed, 34 insertions(+), 36 deletions(-) diff --git a/assets/readme/examples/cv-charcoal-gold-v2.pdf b/assets/readme/examples/cv-charcoal-gold-v2.pdf index f3190db15471c5b4ad494789741ce09c894df8e7..a0ea137d29e1ebc1e8f5a49c771198a4c6cec37e 100644 GIT binary patch delta 12414 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 JNL2>;e*qvHE~fwh delta 12289 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 HIn@6J7O>%A diff --git a/assets/readme/examples/cv-midnight-navy-v2.pdf b/assets/readme/examples/cv-midnight-navy-v2.pdf index 91f11bbfebbc834c8b31b27a37f214fe45285cbb..931e5bfbea1f02a49de582c03942e8015a37d42a 100644 GIT binary patch delta 10256 zcma)>WlS7k)2@paDZaS7JBuz9cXug;;RECfkJ-hSG{DU+v4}jKU~bzR8^HeWZlVZ#h|TChej%DYU=&OX>$8s z-)?`I6ilG)fUdwkoGF?#FIBGlCb3FHS|`N=29 z^{?&Cx3`CF2gpqFWp78z$G=xuF9tp_gU`-?PL{k~CMXFZBdg?wm9=CdR?T5W9wINn zEpO@0oDZti!p}A?0-7F*Q^WcB!|RF*8bG-~PLiSqIwogWr|$SRSZNPe-egB(o7LeW zG)A2Yt^8qwZz`&bpGw=7cZS!m9D1!GH_uWe(fn_>5Aif{d{+)~oiQG>vsd$+&zi5h zuaIs3rztX$*P%6C^eag3+)Axwah}nJ@AKJ@m(Lp_T@G^y0wz@}>KFnGrZo!>_=!I3 z2Y5lb`VP$c4iTbEB4|OaB-Ep)*!^`eoPlpwIh<_78fVKC?}L-{HJR+&9g#>7Ey(TW zWISJQ$J5=>x>l#`$n3!ZdL+DdWy806wZ4>S{B}o~ee^4Ghu*(OD)0BhKhoYGe!ag! zg}c0bwweAWGyPr8ns#{ecJa7n)q0it(NmJQjrnY9xo>p&k@+^DtVfCRhwA}0=#3@p z4H3s!HeNgonPN%d#taQRc|5}eQgE{%oEuUxJI^Is-Vx`YC65$-!2G)ORMJ7i;qs{@ zLE7kaXj(RITOBG=()+5V;5_M1q4BX*;#107{;aA7pYhUSdW6rQ9LU09EkKGK-WAa_ z_>p|!Baftf9GM|t9V271_R*5y@gd#14|B5=kA}Q58j!HI-KUrz`?T{4nGH!`5<5vZ zWIfq|6PuwHom#T7PRG*y(%2B#qRn+mAFvq6Jj30>?{ht4x2-$1a19WqP*AV!1_0rH z;K}R45{65&(-Gl{kjmBJmnWwaOJ0U_g^1o+3nmHv0i`k1E!8(ut%D?fQs0ZdxCR_V zGPR)9%;Z;$w#CcfE=cA<UT3S>c=F4D{!hY_+ zjt#1tN_4s9=&~KCAb3gA6D@nk^lMz{F~mPFkwz9^yCJ|bO7qAHifKdhF>R`XK;8&x z@KQtxxtUt=6^LmsWp~r1AfD#N-!)6RHSuUDxeH}#Rew+^qEKQWV2hW>Nsa+BbD{;q zak)_@lK!R(tkvG%y}Z1=TyZPS7#>hJngs)K@;}2~ZA@a@GtZi5nsTY8cV;faCp z{1SlxVpvEL!3aBo7PFh;Wa%GaS#GMs5$mOF9!_b^oET2qgE|zcFH!GG%pSn*^de>+ z%-Xp-0({m-W@fun(la4FySZOV$i50C?*1AKl2e3EHv-)%cnx80>`ri5>^@1JVFhnWz~9V2 zuVY!2qwp*cs=*+;_|6gVDcbBDq0++z1(#vg2}+z0*i? zQd$)UDi%=X%U`lfn7f=N5vdX{9B}9iR-?rdMy;Nj-*ZsDZ}7J0eOdhQ=8I=$_AKNaS4#PT;TUndBc@Tl2D^oo{@xl;+8L% zx4a|il8Dog9+n^C7P8>*1($7tdsC(l+v6frr$gNj&KyAF3h?tq_vR zDgLfdnv9X^Tge|aiyb6u7zQcl1=||aO)o-%l}!a3#Kk(LM@CkNQWKz@Dn-S!ZOM+w zwQal_J5&?s#b{{>jC@(q0`pSJKg*xKg|#cgFc#B?XQ9XHPkiO`qb?X?9mGL$y~D&* zJs}uyAA^|={Lb!P?M#I`nJ@&@CUik%jcd1U#m8IQ*v5&2Z00mo1Om7g{=#O-KN-Up zen}F6ntc?5iHDYcRDyYd-hBk3=cRVc)4ge`V5f5y<%>Z1km&xozakO97(hLc6k&>> zKar$h#-J$3pJCdd^2mvhEk9xQFjsFIts_7=}k3FZhoKue*^F0@~JWt^048<;q z*5~_SJ#M5FX%juXCv0oH&=KVVA7(O2Q_)|?GFd3vSQ9vB+I)Fie_d~NzBUjdKj8Ci zZ!Q?ssoVRoTYK0#pHq!qSn~MoMGlze*@2zkf=-`t7bETqJGIXs@gc^q$DNanDXI}L zj1q^3?Y@$#P4jBSDI$Wht&;G=cl1&kPAA{zBsNR&XYY}bk7Ip~2~Of^Rm^2Q@+D?y z|8~3G{_tZCu4v_beV8fRc)q&A&+%zH-tilz#7Tyz_I_l$^Ej0H4IEqn7Pc7f;mywn zD>Uajy#?gCtSN;-h%Gp22@NfIb_*w-;k^v$#(jKpjLeE5k5jpaKhvpWow<(LXGS4* z;|@kp{9k&XlKvK|fZ zrejLFo!AB8{HzzZRd$XqxM)y)%;inBpuQ0hsUT);rFx6im7%C6+aM=_ilI4)C}bT| z$OpwPmqP=PhM9;edlIfpJc>q|^#vtM6;f|&aA9F7pLql5K=%Ff@Xl~rtSsTA0&xh- zdNri0AS(MhE!*Xys)8Y|Gk?lbM@X;_GHKtq2`(v%G7Ag^tYt^I@QxivvGcs z`*o=#s6KQ~HIQugh&@WcqHYpvcpKW}c#?pY)fE@q1 z*w}oaQ#!)L2d5j>XSgsgNjz{-pEHKbPhC9@hqwKBtWjD8hp54N(9N9qUNs0)BkJSe zOn}AKN0g+%8xMD_GaEXAe{DHR9~(`2%@B*}lOIn@;vUXRBF$5FuJ{dx0m zUFb{g3Tq?mGE7DE{o@&x!(of9BUh7Or)H<5UVTrSWLXW=R+Uh4YF&y^UdmK62jjrX zD+IO<5fRt;JkE^jm*Fi871sbmZy3euqo{}IE(sTx^hNM(nHL!p8#;oOm-I77A&U&w zb|qfY4c6tDPWzw58Mvry85~i?V3~Quv1#tJ1t%GA-Ns_%j&$d%$KiZqnV5rM1V~C% z*|D-&c?R9Lq#}69ZSUM9=aa)yif71_G(PjXe?&pxo?2VuP*0$hBv=`ciZ9dIv4*97 zh&6q0twcCmo4t?lzUHpacno~_1L0dtj(#J%h4%0p#)=N?|7XnB%WRAV&PRU7pmf5n zy`9p`vh^dTnx^%^8hn?Y`Q6q!3ugS8mJ(}m2aKwbLqzr8p=M9a)>D%!NJqFkIV1KLM}|u9f)~HBEZQQ?Q|2Av0>qJk8ByFI-;cSQ7OjlnZ;IQRc_D zuV>p$6AdQtRg4BVaA};&xBMF!8`~tTd;E9!(R&hE#$|>GD2BY(Od(1P%r#%q4VWnWvRQ z?B1>)iiq>q>F#(}4VgC;f`8tuzQMukG{rCgQ1_gR;PH!}oVKr(<`_J{11VAPso7wu zoy*?DV0XIG=s(d8E2Sy5uSf>v004Ato49}Y-Y!cGadm2g^uvQ8<9}1j8H#+)@^PD9 z-w?{OpV2eS6J=U=jUUW&$v@Y9PbH{Ce3&w3PPazX4Ls2B3q5IqSec1C5T1KtnBiG1 zkek~0jS?jC{A?d(Q=zS>Ti<1uQv0T`_(!+TX-yZWSdvxUo?lCtqggurAgPj5(P{m( zzUt3WgHE%B7(e} z!P<4UkO~J@3#=Z;wlQrV`$JcG9{rcRxCRqln_Z>^soniq zAH^KTL@yOW!6|&@fx#(V?1(J+Iazdp&d5SzsxJtQ3;;2_j7oiE9Zp8t5>9cac^lS^ zw{-=ZzaXeTwiv|WY;i!TJ*vNb^#gN)lo)z8qHWHQV8?i-)7v*}d%H5Kn*}sZGO+8n zQ?}4ZN8FJ@Rd_wKN*mfQgEVQHvEQQBwZ{wYR~e6j;4~f(h;`C(L~BPRFRQw#%tIGS z-RZOfc`U$#{1%YlzMh!`t++_a3v8{9-Q$o<(IV{&OjHO0Ns5T}8^``nh$Q+{3s-S> zK{Aw=qXlf>;kP^fvgHirh(`px}|dfaQ)DSKFQ2!dG#2QZOjxsrBb zqr!Ouv7puZtQNJ4Vi*5elvM*p59QoYQu{otS#i~>T`7gwU*%r{ zx8ML4{!+TVLwz?s4i9zZwZ4T`uoPd{s#7dhIK=8gfh~PtPxZn_Bei8BXHs+8F?y7& zfe1t&J*sB3=NZkP3y3J;^%z8tqP)QShwk!!(cv|m6dKl3FVsheBZ_PO1Gib2yw8jD zA8?y{<1ag2_GUM2bjU(k0VzBB0FL=`>x(;xnMVH+j zeTe|0XMbKL`Tcy}mA(E-<1j2-bAdp;yDxtvwj$ECLwghTA3VOb{BrP`pyHncxp%V7 zzAY&a$baBGXiMZG^7yY&5==IqD(sC_;fEI_yS`LiA|5G^IT44fwbt0GL>>M% zAp!AOOqeQya$>q;R{-rz4B{6w;}`}J)*jE?`;Kr9>^3i{4L#wvLe5`Q^7NC}>4s;4 zijt-mn4d3_P5XpFX>>)m>OStk=4etVWj|!HX?9K|%Ep(C@XQt9Y5bAD7TsJ^MP^(k z!C>^BP$sLMcL9ROIkI%o!*-BXB!F@8%y%9ER*MjE0Zy3;`{nN5D6=ldtE?WIBfAOE zMrgRT4@|Kb7~Qqr@QT%o#I}FITcX231m9)G|M9C@KT0dvX#|I#V?&nc z0VVj3vY^9+H0mf+g+?dVtLTp`<=vSok$xL)56LS}NShrR+NQ&AbB9WIMH>Ulnc;E6 zuS)Y6HnhUePcy&1pC=5vPSnNKuH&-{ECHOiiC$774k!)R-k0lwh{H$IyHjLS(w|$L z+_83vPkNkQH>?JPHfeK#&9DCRgODmEL{rz6Si}sVYYU1{4%yzNt?u^sXahz1lo@I} zpGqsdGMDx-9yjZ_-`hi@e%M(vbo*56VY5WLh1Y{Ve%5F9dv@!;A3;+~zxer3?C#o) z&T$^qvs=fVN}DZ*lMy*sMfj>|glW32H_trj;XD}LS8h1hZj*~^`h$8Glb}F+97s2} z3p*OA!Tqs|63Y8a&R_q^ET1MhKfe#Dv`K4t-jZ-Sg1`L{T(4G-`XoHI{s?9BO_g^> zGY_&mPcf?3N~ranXCtIAM=viXi`VqEewxtP!5{%!wZO~c4t!DI0GGfr&jqP}2^r5` z(;je09XVcYn`-le+`Th!$=HZl(Ic}lAUH5K`^DTrr|~HubqG?P89AS=qF|Qe)Re2v z$OwAy*h-3^jgj-`P+0{l|h7S*CUZnk3rktzT-=;~6mm-RLbXEq!o)VJ{51ZG4tv-iv#W5Lz=L zf#wm=5$Wv+9M=eM@P8d6bKGZbc~7aeTK=2rzc{1=-6o)fX@bHK;sNyV_G4OeM(6m6 z)*{80^;X(Z51*jSgc>+sIe$?Qd9-y8AJ(XyZyWWf>=Hr~3CST>Q%9eL(o#OV{5-eK z_yM$CeX2>#QHY#Ey!Xy;OWzf<+t8r%QnH+=M)1*#t_R^{BkNerZi!Wxt4cj_HQmU0&-k(Ss>RPU9c5iWUUJPDtqwMH+1nsg1-#7w83nhEAWzMW6 zWpO>01XCP1iZw{J><`#8vyBzH1!s|w+0oVfy=LxUmm-`*b+teoImgFIbJ+iM^dUs{t%Q1X|= z)x8uU6Y5$AgXw;YxxM#UXkH4&_SLX^4}VuA-n?==o7e!7%rdfuPe&v^!g+BYz7O^# z>#C(;(w{ld&DWdiG|4&8*3`dse!oR1wO#v8p*x6=%o5tFzqGaj>(<6LJ@YeBV$9|c zR8N-6SMNx~O#f2NSW||Ws^3GTG&4!I*#srZGqjn3N=!rdiRmE^22o5iKM(Ub+vayk zu8~V6lnk9i5;6;oi|k45_Q#9SDXf(=xU@T4{`K^tEPWuZtcyb6ZtO* zxOFK;@`*qe{iAK6z3US-)Wy{R%-uMjMn`~-e|5(_zR?Gk0nR`{M49utEcG^=aVM@FKU1lT{t! zp~LI9+T|rgCjxO{X1Ae;3q(yHZc)p&&=H<%p1S9xCrzziwA+8~P~NYK1ZPajuj)Pz;WZxJyjlD_ny?3^QFcqtqFHoE>xvNg0s z41(Y6HQG~;SjoL*s5Sbb5%t)PrBDFa^}zveZ>yPfey8`^KsY=TyVKw(luIP=t~yPc zgD+qpSbi-hJ~L=cb6h6U_-P>K*`}{0O!2JkdEgA015mcjTSa0*up+VLAe87SyK)ax zqLUY6Gt^(djoze{Z9%DDLEe=xzY4A;@$H)_JN9D4t(WuAFcbPs6EBjq&YTJ=!^+J% z^A>g+VxkN#;e~5v4qXNmPlZ+YQ$uB4(03UhejRis)kzH%{hiSr&FMGi<|^ z9CIM(Vt4T$kh1*7oLlQm%jrq2^XUP+vCmesVOzIWGBPb&u@fSyINtbq8$ak0CGYo2CC2w*K&vaOELVB+ z&Wk|_cM*qm{i$&Y$tUISjDqyXkNSlO;ht+iFv`z;<)tC_E7L+s0A0a#x#g!Z)wL2e zTP1z(bYv#G1rP>{4@=KBX4z1Fz_!XBe#VHd4wo9D=%{2*p4nXdH3mjpRZ7n979+?5 zj)JGQf19Af4Eacx`*vJ?P?N~rcKUmlechBlZjX_CTNhJv#@{*Qkstgu^}?~&YsfV5 z8l04D61MH)p^f{6fDhB*yC^*Fj=4j^i8f^#gSg&ZtEq6GGLvaStJ;g@GysZTG@*@G z>VWWQ4XtQqO^~yIbyUK-b+hEh-UxOx98%A&bA1~W_E_|z&V_nWQ>V1G-Mo`u7?OC) zqb<>5D~XU9t3Kx4t(M2;->y&~1viAAEvu7)qM?gSWOb>KrLHoDwap~8L1y!dRuV|> zfz2j}3jC0i?t!(R_8kmZKWlA%(4+v3M0UmWHOXmn=!M?10~4^LrDGLqCt{(Dy&4=wz|Nu;>e2c zhhJ|+km~q`VN?(jU>~DP{Tk6bQ+c8YlfF>s6uVk9DD>|L^DcfJD(}X6lxQ;`(vrKO z@FibM@m^P! z)?c{FHCk*(sme4U)Tm_CtiqZ5lEB%!v?0}nG?HejZ2dIJ`1#iP^a$Nw4702N20s0< zy`@ktEyU6GB}QY^tEAjiymnfd6IT97Y4YjxA%dY!t#%%Z5H`@qe)5L z^ugrfxC2Yi@r3U0g{xX&cRKE@}lL}AIq*Dhhc~e43n<$-ecKC)B|-^m#Yzf*{&ODK`*b%Vc(Dw zun$&UZ`Lw|a{8~=vIiD;KXWcdpK=HnbiMQbSgs0(cknFf0v5m+ z&Vq5Psi-7Yc!EMgEv`nqFTKdLui(Tdx)>$~E~~Ne9d&@j{RU3uNcJE&>#1xKa$34S zS1X9z22R@2OPkhvc5W?PH%Ra6ab9x?^wv(&!<|kE4G*kLbC@i~ZM}cwb_rR4qA<`m zHB;-u!tga=&|$#B@Hde&?7%<^sBxg!Ouu3HptH<4P<-ZgD1tgJ^nf`R`b8bkl*-~r z3*7(vm%QH;caPw~)mF zl$zvgaRc_CnNZwNj=6}4NpS|o?D-)6Abj~~aruJ!sv1?uA7(IM?AvF8f(S}+I^%JM z0#U(uEEW->0!qS|5aAd+>btP=kT5GsPH`g`Q=(^-c&ukCJL}_UV=51mfZiGWUHXco zA>{PAIg^lxr0cDjM2@-Hd~z0jiQY&8L&_0X7Dth_ITCoBU>v;S5Dv}V0YvQCQ{v5H`nxStg)+&Q*}>ef z*arUeH#jUjO=>_1MTA!vnRv_xf_>XC?IEy*In1%$+ES-o*6`}(xoc_gSg{V#^>#DZ zW7QoJ-`H(oW&XudM0e~*7`S)b{a@>+lr8n;pa?bD-z_^=%wH;ui(c?0BFZ_WEd|wA zujkC$kDR`3oWo{$k*qAm_@ofV2jTmcCPyjrk0Avdr?q+nPJ+wiWT58q4K;^BR9c8!3Hy83~`={Iho zGfieB_^fS$S`F-OJC2$vqED zF#xq={ADHUf^2)uIE;^a{&6K=z$0Hmb#z$yng+c+wPb#X^C=_W%6?SYirU|jyMkO~ z&0C_D)?v28WqlK}x8bL~nJ#<1Yg*QZ;!mfzC|jH6V7#MVVfHZn+dRG0lq>UAwYWQ3 z&OS5gkB3bz76D$Z)=&OQq(9^?Tmz%|X zo?(`W&Mn(+Tfd(!Lx2m~C2t?7;30dfo@>0^r;VOZ%!}9o8K>1)aIrme;{nK(uYLPK zIc`8kpw0r`?gNHumRLuC$2|U>tMO5P0ciy?O=N2L1KW(+Eb6azr*2HOByBW#F`FF| zDq%Sq>{C)R(LKV@w-K6(=3-?5Y>9Ow#TlL%zz|zGV~IyL5ng4?vDAFBEF?lm;;T)U z8r*)L*)bB48>*0*L{a(9hptnKN-&jNg{GpoCh?L|I4fp$sFkW&)DtzMYo;96;R%DZ z&ChmKMZC>QDozP9BF(r!soUuAw9=(Hp8VNE#+=nge*;xt<1PN?ngt5V=5`ta)_FV_ zr|OU?kr~-A3)^=2bf(dN$3CJlnopm2{CNxt^9y^pd+F(96v?WQV4?s1uMsSR`ufE_ zM25nEjX0jCvf5skhYvM%U!pVrez4kxu<$xwwC=BM_q)~Gwxd`602Xw$ho8ZBh1fcB zQ2j=Le=~`6ybL4QwHo{~bB6R-E77h`3981l7YdPCrtESg9RLPzhCwdlRQH4hiR-kD zEsd~Ogm?K}jUSoo={LAnDkdHMadrzju|C<_5-!1iB^H$JoDs{sat?C+mYU$M?vcP| z_R(6Jsgjp-g|+<8qQWbtrkz(GpQD=HuvAwt>g5Hd5<;~GP;V!Qb2rL7i2pGx4wJ#! zK4r09-n>#GTfXNpngue*ra+-VqMqtWZywo{*(m829qq^@x8{nxKR$%q6ncf7O3;o@ ziHz#6tUos`x4)K@bo9Mg&z+x^wZ?g_-KtbDM17~@_YsLc;!kPxoG;^)UvqzVDtR|C=5xm=zGtD$xlg;oAk zn~y6x`nUW(Iuxo5%^FFg8Trjg8`}#z9@+1lU!iQIVnfBliQ3_uUcTWtNAJ*%j1s)V zjWCK%ZAE5x5_ep#pOc$KFw3B!nA@BEuVVe@}^g$R!Ds5EtW>lH%f%7LexR;pE}t5~$gF;Iyr6P^;KYX63Q2+n{ delta 10135 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
W z&<>TY#;o;@x=aQ6><&~4=k>!!%=i>$O$nnU@fMf)vxWp(${x1l||1gaHf9cc* zTUi4*wCwz?C_(%H4n=26D_=@O&c6%jQ6eW~ycHkLj3|8b3B%(3*iuG4X*Q0cCl$6s zFg2}={Zu41kWvqMUEFuVZ&J0kIIn_QU3lpC*V|exg?@SD4}X&6;bc>>^Wy-OtovgYX;Qs-?cw80$ diff --git a/assets/readme/examples/cv-navy-sidebar-v2.pdf b/assets/readme/examples/cv-navy-sidebar-v2.pdf index d9356c094ff606f9174608ea2f0665feb270e621..06b4ef5f24678926537018ff4d8e928bf26eb6c9 100644 GIT binary patch delta 7030 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 O_=K@oSQIoBvHk}G;T|vm delta 6821 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 delta 7812 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 diff --git a/assets/readme/examples/cv-serif-headline-v2.pdf b/assets/readme/examples/cv-serif-headline-v2.pdf index b86f5b925741f45ce12cefe5688fe8adb25dc6d9..d105a3cd7d8eb5848b58090e81066a87ef1b9f37 100644 GIT binary patch delta 10793 zcmb7pWmH^Ew`OQuLvVL@ZyXx;;L><-3mSrV@Zi!o1a}QI?gR~P!3h@J39iHY-MMSc zJ9GccI)AF_sk7I!p1o_=-siMLASOg1#(#k4;^Ki$EfPQ{$FU&BFHu(g$z26FwTQuv z2=r8(H0IX9^Y_p68DDshLyQ;b4Un%1>5oPkEK`B$eS1fo&*#2stA-`xWqLIapVk-) zBe0GSpWA&a#&3kLo@xl+<{0UVgHk{Vr2Ai=S7dG%O7#?%e^fF9g!!@VJVUbr>se;QzAyrNjTLJoFbI;cF~~T9xn+=a(Huj5+zUQ6FVMM`Vyzuw=ZNz`s3sd zk%^%cn;iaz&@_qV!ZCTyu4LWxX|;t*-obB$KJ-H*$5FOe*X^xo_TlPw6pJt6qhr+w zL3WT*L1+m?cfZ6yHgi?smVx+CV^4?~Ij4~cF64!I2)BIVb}LG<;%GfHT6hMzlq4TX zSxEAmn=A8Y{F7foZ@h`g7}_RG44%_rJ&? zr=*A*cJ|uj!&w{kjJWI0-#B-h&BA8DyU8FCYpx&&?IOy1r}eYv%bERchcy+>lYV4P zcG++RZ-g}^?+q@ob~r-u@nHiiJ&u($^c-u-x~0+*n!jf2$XD?M9SaKjCFn)Qwrd-w zr8bkyZU)0jWv*|9Ik!VcNL@}b1S#B_T}}sAM1b(`m_OEQLRwt3S`_j^da37uyV^4D z1vaD*=x-%%nPW}gbLQM369JaVxTLZqzLT??{Q2+^_gf4w!!B9vu&h#5^u^Kr$1?Zr zMsZ35f7hz6d(kDWsPA9k+cYAHBahvc zL+0|0UF{bAPG2$-Y}j%`@m8*k(n82H|^)QL}&Qn2Mc~ZXP@AW zC{AJ+rPBDBb7eY{NUm+|VkBV%g?F_*!pN~*-%TW)DionJlVaEnV@5Qkwy#Z&7ffR3 zo9hj;Cw{5cWOP7}QDZAkpBd{%Pn#LNpkzTs&HyHoEjN?IqB?>ySGrjAt)zfXja zYy{X+QY3i%N;6@nLW}+4Lm_sr!dx{)RnuaEglRaMw9aZf#xs#5Rp%b|LT0HXzOZO> z$S>_sK0D7nPAe-=yn4iLnFkli&ti$GL!>~A@i^EGh94Ff?a^;S7oS+%SD@yCZ$R~G zR+K^~yXPqQl;r*V_fmW(E8hPD!Tmkt(mKZ+c;|x+x;HCSx&UXVq#31gqVGq)zRN2Da?oeW30$!#AphJ&`KS*a4%dEX-DE`E?`vxWjmZ9(j4+6!pGCLtr^e}!2QoCTKlS_a_oJ%{!ouqX-R z$669abu)9+Dg>n|)K<8tkgoHBJH-W3_fQ_P?A1hw#&o5xiRq^7u< z9qrY{GN@qwXvFe^6!A#jzR@FxXxhO*)L?RW%|lv`e*3u|H*hq#0TaFKFiA4JK^8Jq z9(wVomP^;;8tvKe(&ZGW!x^$lL)!ILW4+{U?9jljAY(ZF$9?3LhnvnvL20hZ4bg2# z>*ZiY=vigx(n@u*5Wk@?{Z`qryPYy6EQM>hahbD<(n?FzH@bKmW#Iu*ar%KZO_!Cq zqhDOhkIt8tKTbn#2Sv07^{7J=xuD~UE;I$FIRrC`vgT>79_*WJoijDt=~NZy1IH$U z7F~cRLonU&_Xk5krp3U(qi@|$_oSD79yRSk524|TIos`03E4Xet7(6=x!v{xlQAn8 z=zu@1cnv4@#|OO?V5LSD?jiE@0&NfrY=~qo>_bUk{6PcFJIEdGx{ylrq^{|x6D0AawBZ$4oI_{TtI{sWPm|3|DG|jX{#8l)NPb#>L zSpfsF6ra z%W|wWwyfit;*I!+M2<>4;uIsp)g<8sDVOILomDNz7VjWAQ94z}IQ=)l0*bJ6Mp}8s zHc{!=K*SV65AL;QIg#hI5!Y-yiUV9_)JaMZ}Ar}l3d5M=nEiVT_f3Jq{}GX9+*-jg>Sd0 z=leCWTvsy`9K&{3C-lWmioqbNZc$o{`+%IZw+ezi(y`zkQv{x)hHlMP;N`o0D{Xf= zxT00Szq~BrDP9C_&By3VDLZ&DCCLn3Hz65Y*m~`AonM4U=s5*pLF+AghUMbzxa_vl z=wmBCyu`*BdQSQBc^VkL2xHBHH@lk7l}U$>WGC0OR3wz|O2gR<)hOU)$LGeXueJh_ z{UMe!aywxbnT&sYL?N3_p&i;Z^ZEKuX*_U?&umsn#0~<*I)hzbZ!&a}WRY@GYhzi# zPKP+-+Ne^c)&q#~Nn_(D528}!6Y%01?rlMQL8Z&BVN+n_ zZ2Z~wxVQtdXgOpO!j|Hzjvlh|U*=fCkj(B~byC4J>4v58IT7-4(eQ(Lq1l^~91z<* zqph|{j(C=M^T(^-sOe$4?-cqJLF*%d7QP8~d`YgPD;WOLUqu;;gbnAFFm0_IWx;Rf^xw_xn74=Q%=0XI z!yDm#yW9>8=E)!5$a|GVg|qn7iS;WcWpY=5u)ndUlab8XyFLuD zr)NQsja&KB*EwcYfvQQo9YY`K89klFxKMcVLggYA0mr`Z!Z780qNomJNbMr()C_;s z@rjKVi{h_TR=co~CXSM_B^HC3jgY4RsB4*n;!yN?bY2u6z10u>I`tv3f_9GoNUbThm|?-8(?*hcz;5RS-w zPJ-E)>8^Anl)RHw8P5q)=?qCw*EiSksGMdnmm?FK_pnKkB!-49?O>% z!3XV!scT-iju=v8xS zP0c?!rNu(aKQ}ft2oVVJY7?Jqy9q$Oi#Ew@Pw@~t-l2ExvmTqD|F!4#lz5sbz=S*8 z?Wp)Z$HM@}0^m5mJ!avY7TJ!6 zrpe871Jo1v<^G0ic){05dp!d!Jd*7GbBMqQ2UZF7->W?rI*3#p?$dBl|Avb$$|j3+ zOK(GJVmA2+!jko-gz!|~Y4E&Q%?Qyj-J=%Q?^OAidFjgO9@Zu&`flI#lT%d*36mJk z?N(^H(67hKn9&LUnw=Z!p$EiqGnKCJFXtXhYqQwSc=uuq*4#lqFDBO}&G&B1>L%@l z{C6fP=Ov+rR2f=)(@Se zu%aw*2=n5nxHGvRPVWbKBn@TeBx$;#*(hqCp@v*MBMAiZ(K>9F(S`ZhqMN{q^9Gys zPDj5$3^~NG#xX7q-=S=bQr!KPXChd|^la13KNf zua#hAT3GJSiVb~Q_mC424|C|eRzG*5wQ|pUfqGh{bE;H?}pCUCGu2WEA&2=bXx7boP|GE z+OE-sEo1C0nq-%aRBy*MS;xob_NeLs`m=IOMIaT%@O6`*3ORl9!gq3Gt2z-LihHSs z0o~olMi*84{knS5Se?2WjqwO*dUQ!GIA)Tu4G{9Mhm$sfMD>lxcLBT_h9{9-Fm8C5FH_!MI^y!+(^eC#PW}C zz8gxVuWIn)R9MEUn>Y0_)RaV8(2Y55gs}D>3KS~KKALehU8(6>UM4F`qPrjI3aFD@?&6EXI-!W=NQWt^> ztB~R*dZT2I#^P+*BLDwpv22aG-c|fver48Jf%M<_$g8<7xv{`a&;>^?MC!i;DSVY_vGd` zVOvsvSePL;Xg=)Pui_;BBaSS6C5fhD!R~muj9|@}bt6N64EsTa)!KQ~e)9g+eoRai z^NF$26j8!~Kzy5}bfz-(PNG_EFIW7Kc2k~jVC&)`o|i*pn!wK!BC-D{Q|%APyawZw zInezla@bypFv%sZ{E3&Mp4$q*|78b30M4hkf2=m-*YxBr)lsgHLy#jO&h-sUl+zc} zp^eTJDaYB5*O*|LN!*29r8R&VgV&f?6HGeX&=!0!giV~tW&XZ*K#2do~JjHo9Yc8wiqk9f@X0 zmqd)K(_8!6_^f{3`|;nQbRNixIKRwbG)GepFxJ3tF2;8Kow}>Q2%!D;pIpPJjcymB z;r>~N#(2j3w$}SE-dQW+hYD$_7bIamH4Jy4x*%QNXx^I{aTdn!g5i7Lvfg}r%`%@F zBi_F;99m8UUwF_!N~Qi`aEv=#FaJxSGEqn>^g2S-iTU#e5f5ppDLGt9TWOpeZ};du>&_HQ}_A(adIfotdSf zVy=s-RJsG)4(xqnZ@p)+11l8VD{3Ke1j{bE4rjPtT}Uz zxK|Zc@K?)TC|CSZtg5kA6;pFPJRRBZeD8%$NRfvtrzfv?Orl+Z5Oo<`DFZ%ruZ!HN zvfj!;Cpwx8?BN1MAx#cCZq2Z?DCMv&oLMS0U+I=bf%ADDVVB%aq@l3nW19LES?TV|FH6Cw}TxnM?H>W3 z?JFu6_$Z2G+m<9Z%0qbcqKH2`_RpFR(6R5vlCl`_7Yntn-`N5`5ZIb$gWrL?5ko=R z@%zy7b$wdb|6H93%f|Tq3W>`rNvt6k=6Uaiv(n|5daX&`5!qROIYCr{kl0(EcjcH~smvSf*f06zt$8302ze{gNd5t7^c{!$HJT6N(iybL*;i?6@4^zh^)l(;C6 z*tL3^;)v`b3`5?v`vnd8qkTVRT!+LqZf?@F|J=?=DT(3_zBbvs3$;Su=vZURnGF6> zBxpKyGMefJilswt>X)~H%;@e1a1=?FBz=cQ$0`XlLgUI2wzL26ej^H#e@7QiYkSo9 z9SKVfgICay%;Li4_f)C>6{Dp|6*`-14?V@YDS`39mB_NorO1lCy-FAMUjg|jbDFL0 z+DHU|CHX~XMc4(b|IAF?h@b@80~PPxk!3l;(69S8Vl933COeZ8f`&gUCn8U|Ime!6 zwWyM0vvO_`f>c665Hlfk`Jmr#IrS4P-bf-J;b-aPSn64(6_- z-ge`|`$}Qs$i=v%kOA}pI-!oUVM+Ih(VT8)WJcEp!U>voX(tfxnW1E!|LwYDq=1Df zMH};O;)f2cC^dhZT^INL^O-aqN1I5(xY(zvoS0Gf=3_}#Sq1071rrrhP}3F^UeTO@ zz?Jb~k$0`kGbcVM_bKXVG8 zFt8nFzS1J9q44@BSXXv9u|=6Iwz3Eh=F z0)E+d&BCQX_A#-(B?ae9vtyCWyh|Jj`E2Em%9~V}4^J0A*FO|e5_n+gf)b%@u*Jk> z>9eW0vPNpL?q*G7k&#D7rb`nM|7*;0tkm(nz(;Tdd}rpbC#vMbF>GOELDTJVi*Uh{ z+~7}&3R!t$B7t%WJIT9h7zvBEbN(57-E5+2#zWCE--l8qaSe2j zXIJZH#}>5d&+e0^Cm$E8#UUMNwzhTn1dgDS*9Afa3+luco9*baZa?bY25YO?CgyqS zh1rh3e*cLd8(%EMiOcLGR=ViHWs?eW{K6>CZ8kAFG&&d>t;HA-4!<%|p>kYYLoX2R zI;NiZmbJD>qUs}qtDKc@o$HJe+1cvR8FHDCb2!HvLhG`9JP}dvkg?)LWWBn`H>#4F z&4}T7bR8DJ;T*S%Quu2l6a(!alkVCdsENaqAY#56sL~S}5xw+1ByT%5lDRIIls`~7Lu-Y}BxxiZr-y1d-lKi(hPR~FsAG`{sdHJVotjA8xm zzcDE-=h&z2EG<8;@CQS7>w0gjNx{#<3l|>V<@CzgCcC1%W%>+h^r7h8J|G+RGv33DIxn6NQzur3tCbCJMC$4|L{B?xb zdAk_*Any0tfSmu{^L}sJ7kMCyC6#!F7lDWj{zc{{Ma{fZ)#sF%suiiD)%1?jlqiBu zW5#)tA>K8FejA=viyIG$6$`&Ha`loGTnNYMJRT6BT`la;`crlLA|=+dKwc=}7Ut=$ z(2?_|rS$X~7#YtmRz3$TB;WyvDnvL!I@E$qAF(rJ@f=ETGPH*ms#s&9CanYJ4T-Uw z2;V!qC{?%=6A8CgRxfTx?dy?WkW=6R;zj8kOV&-KdZ`lm~z16$W=WTN}`0-cs$4`OnZ2?sVO+@-5q^mi+okhR(hmtYq z%(vqo?!)_O?>2ZhK1M||emOJ5kL|Fc5{vZuWc6awelNCiRf+F8+Ir*Wf2wP9u)9b< zr0$7YM@Xpp^B2l2ctSC~p1B6mHx>&OM_L!&+!*oYEtaf>FqE1R7r@64bszi4rD@xp>_aVY@&JkWRjxX_BQ@YgN>BFD|e50eV7AO!I9LQk{* zvG6Z$++09ddJZNo^ld*LthG)74j>4GA=H}zprS+gFz-fk06a=S<{8%`A7DqZ8*4UDgcjAYBCL+4uF@d>4*ky z6(7LMojM{2rwicad38BHJ`jyl+uOy8iu3&kdo2$qG)^@tA^z82wS*8kJ2!U^Dj+`) zOt?{S$cbqLBINJ3`tf>RE59b2e@n*^KOJlB> z;`39sp)Am;JNTzH49qN0d@#4wd9bqlOD83ox4+&pL-8=(O37;{tu8ijGZJwp#43n4 z4kY#c3q>Hw+gr_2v`Gkw&R9BEDHuD=%+G9g+cthsK2TEYdzRw8SAU@y4!$3E86L@0 zAtqnXpkO^I1G#*ORpO4aUl1l$+9upnAhV+BcR1W!5v5VB#6WUKja#N968cL`Br8c; zeh~3@ZLo!?_)^|G)i8G?tt2>8%zy!z8>TJ38NTHEp5dUfylDv78bb(!USE(&xm*y1 zd;L&U2?w9;5mkeP{?-Shah)``1aa+6NkSytBik+FnY51kS?~xyvIJZF&N?!oEmicr$qF#7L-G0D}EQY4u7in z19O3BAH|%g@;izn!|Tx526>!bn*^F5HSa1l_n}_;j88~=c6MW3=>&~zbzW0@X5@4mc zFc1o=gG4wSUR>Ur-l_h?x#`CM)e^V8weTt~&qql zUq%4Kk@-H-Qick1%@CvvC&YH-jGIi_^3Uq7~JX;x{`y&r0<+CNSeEC%tlhQ zz%<%ct8-b=hrNt?HA;mP;UvSQO|^Mh)r-EATI6gLofW8m(uDf94Yh`zzexEH>Ki|u zX2`Z-h+%EPS!iyNqve(gz`-GZTVSefqbhMGsgjpoWx?!Ppnh?6vN35kopG#@+u+F%uQ&cIvW!o6he z#RnC>{3SaycbSi`hc1}RT*i4dL6SvgC;&h0Q2lU-yZ)FMCSJUFTUJyef^Jba&f zcF8UQlS<@ptogAGHNi8$5TJQ;#inojXu-j$EF)#4-#vbYzv^ZW8+{Hna=8 zyYv)fk0A9-t?xBCa(UR}B+3Nl|L5oX%h~1Q?Nyj~ zV_B{5MfKlF&!k!4t;cJQ9Dj;rh(!GEk*kj}Ue3)&`OkNcFKOq`rCB-KFg0#(recrgKl_(( zQNCIPyu#S_pCZqcSoH_IcuWiR=sm zrhb{JcZI+wn|Bk&Gqn^9QvucjK3~h()aV0!9G#G-6&&sHSd`TJA$5Vh6nBxab7!qm zP79Q8+oPSZoIJR@_dkL*omQvb1j7jk%FQFs5!v@hwjwk~%ELN>1J0{IyNLRkN$uG* zI&pIQ`YX5D!@LKqm+Kdqrd1NpJ=ET(81T$-JM1^`N_s1Yna==oMPgWmhslYQOD+MN zp&4Ma{L9M^R9q&?kp4ZoWt0PG24)aORD#QD_uoC^3%l~4v({5~o9HOsze5&wsZAH{ zF>`ai5~2#LL-VBbn~AcuBTMf7xI#-=g-=K(WxMgeiD4#Drv%QX&XU?@Md{Upp*hmCuFahRf;yB;8qFrP5qE{HWJ%d%^V;j!<6{4Z|xMg@bv?^{3JWww}=Ol zVv3?l^8?m27UN#NS*|O56^l!mG!kPAt#p!1?973$VP&Y9odXQ374)|9j&gYPj>Tmx zOT;}D2SXZtvID%Oh_~9fDtPH140J}yjRW72>CAA)e1rteZZ7RUP&HhKwE@cet)@vz z37V80n7KI=RqT?o-zc_Ps=BzGGbKKn(@Zl(urD1{zLOSf)F|em5tsaG=))1>1yg5l zt#pH4w}L(TD`fRPNlkN9K}zpug5*_-5mWO_Tv`ctM-YL#rs zOUgx5RbnKgM~ag4u(>@Gk8o8S-45c5Xn&I{J`I7OSq>xifs%X#Np^Yeg^Uvb-rlH7 zk8EpI&M2KTt{!Jj3)%G)h||G^K_dAi)qhVS4hz*;t8x2^Hd+-J<`tcIEar`D^o(`` zQVw+~WHTRk8Xv~o+~(ep0P{J<+~KG5ZuZj8^8jd&E`#D*Jjfh?6EP$8M=Gc z$FK-!5o?MR;vh+b1~QJeP<|Dnhnea6>#c6+b!uJNJ$J$R|1@L&r+t8M^YXq{@XjCX z(L_bjI904Z+IZMf@$&MZacVj{dr)!zS9z}}LuDw+B`C-*2bATK1@Z_8a!Jeazt-D4 z(m**7A1??bBfupsz{f8o2;v1v^Y91(Wn_UMAwDT785tlyKfjEOfSfqh|7$|$|JR1` ze;2*_npW1Y?T(#~6%{ux9~!6PM@uU&DnqV+W~r>waGVhGi6*6BbG-0#_YZOO*95+& z9iMT1Pgkk1e9(g`nuUc9*6C#sf-ynZjs~CH=2Y9?_~(4SJI_jWzJ<`xKv*_$!iNH7 zd(3|q9}xrcu#q;f;S#VB)xL%ieGL_K0g2K{($Il;3ME+zLBf`j49(Q&b=1gi)Ne2H z-k{~7MCL&dl=3i!bym9aHF3CR1u>2(ktWj3%}2f;@{;Y4sNEdB=t|OSgZO79*=Ipw ze3G<$Al`aO)_RbLha{s12zV*Uc?pv6>PCm>LXqaepyevxbmmi@h{GV12pf@V^H!lh zvvV-owjZ1e8NQ0EQcPa9Fw|oCyw+H(bJFEFR;nVJwUD9X?bpa(a>3{5KtW*kF2#&k zSKH*{5o5*o;tR0D#HR&yZ-=^FhFk5R2+1g|yQb6!L`%8F~ gUH3n+Lg4OU?&jg;_Nu!e50IN5jh6Zsp5EQ{tlEjuNG*{_38o0#Jp8FNaBy_c6T_o;a@jAA2=LtU6;pxc zAtA`4QhVB*m(Mx~c-tmZtKl=J96$ZwXcn8w+clpmEV}Rdp?_q}wdCX=R+DbZH%>8K z^VZ(}naLz1)iFb3BY&QT7X_HKv1v$7RLx?fl}@iSUPT_RrLy&ee^t1OJnvOAWoNza z_CrOVM?0ZVKaa<2DyC0Uiu+E0PD5>Ee=@5E;pf2_7)nMnH(5hVCtAh_fzI&tYzH1{ z%9oehZaJvS<2W?i_hx)JTjhmw`PM;gKq)pu(>|;MHiu63S~D9@NPir4b^j-LoDK2H zo62rYU;EFTMgJKW%ga}d!#~loH_)1xZ}BOFoj)p|_iUq4oedTDPk)#8ihE%J#j&0$ zPWBhvCT2^P_*aY+JOhX|%S3TVN*>%)G1T8TFZ_T#?e>)i-OXEmDa`5d7?E63jYbIB zLG{HTeJEH7ea&DmbXSm)AGuwAUMm{oAbS3`cE&Q3f z{aJ^R^dN@Klf}y2&tDQHpYq$hkSfLZXDq1PlnPnyY!qdX?Q)yv$>8{v@C80g3axa3 zi1&dBrBB)f(RI(Dq+t2+Ec(J(sA@2_Ze^0@rWf!$*hN0yz>eOI5xvmRdVSL>iFb&= zNB2;%^oG*h=n#D$-TMrKnDW-?xc%&ItpzSZ-nlU4@v2s!;Vl}A_OlV!S!o1i3?=UPRBCA*#r{Uq<_+9X(F(tmD z9o+EIp7N%&@vOKNP^p>mE$e40?;dv7$5|^is`rb-?~EzrH9gsvtK0$+$yD{8miBJ_ zNN+r^1)cM{l|)FM=~Vi z1(Me)115X)Sd|K^DjWQ;$qm)oWeqEbpV?REF2kYUP!JMj%f4K}s=f)dvx-9%6hoGC zMVEVjvvP~tNDzp^A9gm=Ybe45hBO@#C3}eI814ab^<#8}3C9VW*}?L|D8l!4?UvS< z$$R$KS46n6HUggLxrPCs5T-VA(GX~Y1ECld9Mq1zI5FoWo3WCe%mic1*dU|JIgf{NjkM2i)AE%kg`E`MQ69wu4LVa5bc4`gVf z2lILo9B}&ra_)a8scX@cVB5j@GH_X%=)})oj*vpgLYc@=iC~bhEOn>_GV?@&RxOAP zQ5CdQVsHef)wn!U%mfvFux%L5>B>=0(TP?`aF3OiI**gnz_GHYXOeI71BS9^fW<#_!!cw_VA<^pY+V7=C`S zH-eIPksLUEdrZu4wL!(kW9j>fc^Hmd9FCaAPtKYc<3CWiWAWzM{B3aCBN;5hO0}zc&PB^Ow?PtMBa>mu0 zIu(XlBIe(w-PXpUijs(a^)-qI=5Eqs#KNlyDwO&D*CI<{n zN8d3G^u#i^8$9@hq$z}WZ<~xz{_=^+cbcZoUmd(+zS9j-Uj?#&>*JIaJ>CO!%$uWjO5@W)Lx?ro7(r;FkN;X?Jn!Ti20_}VrQ$ndjZ&x(W zhX;{8@OlxXKONlS5U6a5Zs(9pEf*7M_*ir^?GfmEF6R(w)SL1{ER*?5KqFG0Hux^V z$beFcK4hqhSMQP?4tl9>%Myb2qJ!!a4gb8UeT6N`0%qv~;soP9jpU=cwL*@kZ9XkT z?Ry=Ip0zVCa=8hSfIhD1nCY?K%TI=gKpH(PTho1%jDa(=SyN9tZu@7cHPOS$toNVkVbKmyJ+g4ZeROO&#hy zi&02dz9SJN5sBvANis8b?jGAGTd*Faa$Spu^_X#6;`!yhrpf^(f`zb8E9h1ZjSLfxq3-O%;k?Pfa@try1Y7mCiEv^q9 zAmUM}+^Fvd<%D@TWpj|+d0O-iJFJ{^90llnnceM_O3Y)@_@;J5zfpz3kw&F$6YP1a z9Fpf^__o90;6^9};Cy zB!OE$PQ<%^6(}rNXT$5d+A@w{DoQDSQQMQnhHINx-H{_N5hrd&VG;Z$W2Wrti$K;l{_j2|}cvake8Bsld<7MRT)q7rjO&?iwT9b1UpNMj|lDDpZADtf&{Uql% zOPww`Yfq-&Xp0sP__Q);gi-goWh>6DoU_ozX-)V#8ZexBerWfdNAwOy~5_uZ@@1WJ_gG#{Q9b zeY=kp(=n$SPuf|R8&m9=`?Hpf!*(mwpu5^x;d=rlHI&K(qgvXY#;n+SM9C_hb4+au z&Ks#XoSBM-6{&eSD(;yL-7{}G-A#`k5j)?$x01fJH>Wq`j$^0zd1WNO$46D zoBGZqEUx$8gkro|N1TzN^Q$$>i77GDIS3yAk+GkVTKybQ+L!spW&t~}1Gy22Dj;JTEU-p}%$4jkm~_);lC&_xJocG1!4 zh?(IxeH{H-+{I3ti!tBO(k~GEmM@k%BChA!9j$u)poJ^3hZQ@@91p_Wj+M6Nt8h^> z{Y33s#?;#JaL7R8r3a$?sB{Egy`nKqf>W5?s9a~1g&N-pUsXJYSXvrf5LabSX{qFI zR1;j9gkS_`+}KbcjOM%>%BZh}S;iqIYNONlBB*wv{h@1ob-0Fz4SomTkkGbIQ|pJH zox*E%)9b7ArT7%oEKJ8^Diyo=3_psN;#|SXwrKUrWJR=7z5yeoQ+rdJZ9pFx6sP0V z$l^00K+OcMh^Sq#u37!2X}Sv`b*T&LMC5+KlT$KD)|#)CBMT>iIzy^%a6?u96q7D6o`IH1kf(EwnasnZX7T-q9fA#UaH+j5iOtloIkM`k5sG*aN z;Gam-o+TD#J_|Z=1d8(QyHNwtL*CV@FG=n$Aq+kW7iRXq-J~_AedY2gTsMF`Zj&it ze{AnIcUhb`v_QLsKGhRrj(MrE=1WwP<;B}uK6=~itO`Q|64X@HrK9z;$5MVc(>f`7 z6@6CRX#|T$`{b&WARwr;dwuW3H-6!)&SC}SDl1+59v;%b6GPHT4ZBGLDxt@GJTBBQ zyV@qoIC|IXa=W77zxuF1(qwgY*%>l?)G`wVXv^p!kq_sD^7Pa=zRND8@j5@Kj|io_ zi)T)CyU=a^g({6N-7@(Jn?V%po9&nx)#;xT70eLas`A5ZWG#*}9L|`x!p8mW-YLsm*p~pXOP@sD1^7h7|`P+JPR1q`%u?a7W9WFgsg}qk{tWpe^C$P|Xa@h;FR*Yk@q*w!F z?L*W^`^@Xm9T>n0Aq|pvCbKI>iSn=*(z}Zzs8&7$#!be)tunXJy`HR~6dtouqMD^* z0G#0b1W-iW0wjgUs>I#Hgx|1RgqjwHy2`6bFaOg>o#wOD*Oik0n~0VPf)+I;@}NN^ zFb(056!mt`bEYzDKsPpIq<|LqMG<8ckW|pKL{kcka;VlR5Zr>wReDYx(LBXotnImt zywgrIbMkDC7U&^IBiNH?=4HB1Ql57R6MWka+mkN=zVrP`ch3&5-Q|0og;Ig|9~xAc zVPyQhwQ`o&s}obT8Eu&(ag+iJU+LaPjRx1|sA;eU$Wc`6Xg8wCWDouHC7{sem_4bYm1lz5`#jvwNi0vliW z8CBWvUxJM|KMLc%F-y4<^V_t+-LP#5l#CFiO z1{}tBc?M3xFz!;fzm?DYUwjSsFzq)OHTVbAUpLQO7uOY6w2Qa(fcd8q4F!D~7U2VX zz-Sf&NIGg01tdkWXbPlExjo&weWeR$7*9iClO>bG!mZ@VxvnGXgH=hCpzEj>&V0c!l%Llyi2gSrVY(DEzPr7wRPqodD_^M4a7O9a!G%la zg-arsI99Q>OLhyMISxHBx`6!4Q3DQIZ<@T&KMhE0GM*q$D%zw?-{WZy3g&02B3J*& z!6YoQ-d5*jw#4G@2kUE+*5s25X~o=OT%5Ahh-fL${AO|>Z(g!IRVe{o-Ear^^2sV? zn5&YA;{U@AryqRAwH`jXE&c6Z`YC=4Wt3JNIJ+cE0s?j79TCgE%ADU=z={`AnIe+} z`e*426=>n>1evatHA|x zQ~F%^{%6&jT-TgCe2Rn8~?ORZ>_Qr;JYMSVv@57N=p~!$>`Xmwp%YB2AH-wC!m)6V3VysT<=d2B#@`bXOuWMb?1iX=Bot+3;)3*5@lPt?JQW($N!T;(Qv3KO>cC+bu;9RvY1MNvPNx}WO&B=Gzg-c#_t^c zz%LLTVR}Nj=@Y_eK2>P!Nb2(KOSW0Jgp2C`o}Iz~W4;nLFL znV;C55|+CmMOvg9=G*;xG6NOe(&xjkH6df6HPVpUW{vJIbZ>(?OQDva&hy) zl8kU?U`frvPQo4XRnKFOIv zlgB7W8uHv>wjV9t#b=bqXrUsxz&qy8Xt3fOu`#DNL&z!PGiidXG;D}d|Bmm8DFxQb zOvYrnX%3=jzWIpw@EUKe*C!r?`x@dyL!dfvdBLAt;E!X6zHJ#=@;e*uDv(+lYwp;r z=|HNI*}kKcmZeVn1cn?=oq z-u#li_$>IjDeH~UHNMQ36*r`FeIGUy00$CrSAwiL)oCYb_VOi*B; z8dsjuZVG&E#?DiuyCZ`WPu_iK+S&>(=ZfuGU-?64QLw##U?9Ss^TCxs5kT!Ty@m~}p-nAL|<1{ewu-JdJ z$#u*^NfFd(A`)m~FIO1{jyzsTO!FDOHDA;TkwgpoE<%}c&x%39l>>&VeAvL@5if}l zC3d<)kD)IwX}cO6Kg-E|o8Tt8*rtB)XLBOkGM2OrBDjTA{%%HC#E>Sw_#%au4RcjS zG8}v(5TWR@H^%nf#KO%VG23H8z#f}2)a%F3AhnJ70I3)!$M9&-wgHI>0(o@w&8>Fp z$B5PYo|eJ0XSLc@BTaUwkbiCJm|2?rJJwJIM}*}p$By9dFVk4Xz|lz0=J9E;#n`Dr z*Nl427RG(~{w0Igpo`rxt)jpAQ56Yac#-a#*vUe!uaQ8!mLjUP*)efSe{0*m^4&yU zEFBX&g(EiP9t=RWcz3(N648741lR4zgk}bbO=m+)*5VZ84JIz=yZyw*B~qE#I@kB^ zT@9}#PWsA~9MrpD+f_XV)JKU~TzSKs5f9-J6^CbcUK0^j&G7D&E51<_Ywf36%qb;D zr%!d{#b2wOeaqt#jOj7GIQD_kk!(T|cqWE1Fbe zz<66XEZ7#kXFeTY|FGF~G!QhF51TjqS|l7sDa9vj z4vP|ZAh%+^K#AuApyk0)-uDH3{hF8E2+gUv{LvP7GzJKt%e`YFeJ8=7pBT z%Z;lQ3b)D71X(%^Q8_xIAZOIY`nR#bYvNe2uZ`q3i**}rn9<@;(C!<|hX8KvHO=|1 z373FIQpZed{lKaw@)|oA@5R2mGY2PDpT(ZOCTxcq=;aRqox3{0`|O7>{^%CzOG#_T zjM}p@u2t4#-r3kab||^BLSt;# z=PX$^B5nO|?7qS7T%wl4OfzEh^@)#Ik$!mjOj2aJMQXNhM4k#++RrYJAFkN6@3*Z@ zEn%(gLo?%@)x7jDUMrNpF?c*Mb<%sUhhF$zNUeOBa>!ePZt`Zdl`quI?H}>Oe5%Ms zC4BiVn7t!tcRsxTsC0L=7uhXaAszvYbm7`WPU;Y(D(bzTr1KLw%`1!+W`hA^Y`3J7E9-~>S{e_c6 zkZ9G?LLm{nun2Xc8?@CnZas=9U5>!MB=tpWY4b9`fx7nSGjLOC=G&8 zcljh+H}af!2TB2-D#Htu^pdjz#0C*BMA2;nYjhD_QK}KG$6z!Q`0zYn*k%hp43#_- zM}U_aNUZ_j(o{BawWSu|tIs4S2f*_P!hSHO;Rx{m3k21hF=Zpe@xn|X_%I^QFdPAa zf8pTz3Qi96zxYNA0qj)pZ*al?je~*p!9rB1@Vq>*0;x0{F!#Seo_Zx|0$g}rUYIE) z9S8icw7`7zSXyd$es8?41-R?48i0RSo_dDn)_E!)HBmdpsN*_&?sI9g=YHV4nKp&gXx&{-$03(wz+t zFdi$K*Y}t;DUHLSx|GSntsxBvj=dg zPz!+n`EyJJ<&v{;ado2x0l@$xR+YN5W&#KlNx%_EH zlX`p(AUhCo_!5QbRJrZfYT_zM7_@U=yX7Qqxndh*^b>=GbNg9Kyyhe$O(;=V2<}ds zQ;;cvku|;y&HxK;D5eoJOB-!&5-KSJ-gIt(I#mT!4Vj+@5Lz+M42CRH6L>EL_=B388C{$J7X)1t`}HfeX}-)zYc4LAF662wtR@K*T-jP!UWoqDzb&Nq74x zYZ~aJL{_K>`rjS)9o-?b_Dy(uI*lRM2~@Ya3A#`b?A=YN6SzZat}e8LykI$i7jBhD z!rM*yKBO8Au#AigJr0lrhY?*fH~gJ&ZfCr_D4GNraex|4tQ@t>fP`S*v<@PIG%h7e zPP(&`hRn6J6YZz8pn)M)WV*aiRvPMgH7L?Vlp4R{?7ISTD4Nn%iK5g1uQJB>p8%3* z4D;vfnT_YvWetqAnCj6&;y->ux>32vM{7}u#NXyWYtbd$KkPq=_HSqjevMN-6z@|b z(m2nKZKQVGtTcw;!q1X8pUI-(CedT9rHnp0I3v-+*i??nB%d^X8HiPtkrtZB_e0bC zH-9FTd^1;PJu0aqPYw@WWVsL=mV%^6=>jZRk_y#qZ9wN3OA+j5=NAj3(Bu!XLv`9G zQN!8klMxTu_36bD6Qo&48F2fqF+-oI<7sNggEi~MdC!(bTsy~uKemoveRI4TTLw+8 zoV?k?Vc?4D{_$g!G5MoPx$3cR8ZVS@f+!6{4U4bs5<%IHjYlepMZ+~`?-Hy*s}=Sd zbQOeqrbVt+SLb5fg{OJ@he|Zg>kCy#humQfik5N5l9=ZTg2Rr<28SAo@CYsQJHOG` zB@~tL!0N=-gOJFefV-|6F(+5*dw_MYJp*A#;dd1KJ4vd6CZghKI{^E=b2xPI>6ayz z*)nozaFyF8d`bl6y;$R7@2^JWL(^q=;iw~%Wk2)!@I-se*=|OCW~8<2nmgxl%AtmF zczin(1P_p{!DgnpyJ!5HA0MWknk}i?8+AV*PUsW^N(sWdTY3(sq|WlwMV(BRCCFH7 zei~cV4G>9si=nCI8erI_p5;T+g=0QV7~5RL-I0EfK`=984jSZ?oF>F7uA1L=pqgGW zk?EDJ0S*8)(3L4k$cG+(Jw@zc(JdicBVg9kQAPOtdP>{FGSfpTMOtW^N?h8!@`Jeg zl@-E{t(9V_Vb*D zAyg<`$=TvXoXD5QKE-jQ-$t~vlC7fv#bDtr>Zz6{*S%uw^20II!HDA_H1Gx5dBG1Jq!i52{89H*gE!pEuNQaVKadrBk54&@SX*hy>Z_%;d2_WJU%7M zbzeKW*}=U9d!2&5PZ3enYp;Iwc-fk}*OqxrUVWtj-A&5sBZsdd4_0++*X#AA2$Pd7 zvJa+sldC>#;pMiNl_yDAO=l zcU5*}4cIc2|NZWQx1!>vMns-@xb5iLTq$T^oz`4PiDOYEKcvgqL z)#201ZupMj&hEL}qV1ok_KnzRkA5TYs^DS$g2&?fDhr1^9PUmWm{M$?-Z|Uk!PwGN zop%3@OBSQCOdjpiy22t4sP@G zT-knM1<~#_U#Q5^A&g((fmgD~W6RQ1eb17z43-($<}K>V_dfSJs+KnU^h=~w(USQM z<58ovd7e({3~4J&<55+u?6dL`WAX!_^!Sv4JCvTorcK18P++a{U}MIN=&6^n=z_Mf zOurgRYExD$WK>$A_ygtrXoi%My!~csw2)LV1t$jQZYq?hLNrog z*Rcmf#1L|u-wDQXIA0E0@Wlhp+nXhIFLHd99j0_;IkV#&p~FD2US9)3d(IAoTrpG& zgIvEp5&06U8Qo#3E^RKZv9>w|*p=`@6_nhwVEg{}Y!sbK?#5(O7&tNOJ;eeNbQ0=b zaGi2Q@cwr*Ct>~3(664>tfMWz1(t_)gQf<;lgo_tGXbVWq;~}DyedpD-6ftm>+(pUuiO93>pRx(*K8l>t|YGSeS=U;s3(1OeIavE(Zsc%{OmpY z`RHx~iU4W|-ope~IGF#J&;eM$I44k`+@QZg)zS15Ktu$j~t82*o%)6uZ7{44Bjye+7?xdi}R3J&HL zp49rlf8J8hq~W-r4AV`D!6pRZ7p|t!?RURS7k-&39JdQcY~(c~t{4~?ATn`v(PUs@ z83jb($`VN8NRBghvpJoUUW-(Z#_zZJ_EL%ACVnIwCX65IknT2fv^`Y{GM5j8$RltS zNF$p|5t&P4?MPAXNW&3G;SxxrB}sjaa#V$+2g~i};;sRqMddNETxNGO;5bq%aR)s? zhy=rZ4xlU-`BN^|A2n>uDOBYt42~&){S+45L4e9Zki$Ws(Lpfvb?+ODo`jLzP>%LX z;sxAo#zRmz#9_fORO=M4DopE?u1XF<*;XZ|McHH+TPkATLi)k$qns(wGRmXKb{~u_2}#AST3S#lwXjIxv)4AxnrDM~WXyNzc1I-VYy9>5l$)1-U zfJfw`w8z`O^XV>GC#i0obl#+4`jZGr0C>o7Lyx8b-(H?qD)TC{dCSWa_ITRY9u|MT zK+OYDS*wu)&0ed~(zIYc`kLW!XZ)K}^aA)vWvq0-x3D2^Z@i#hQ{@Yf<^=Nuk>Q`C ztU_U(7MRQe2Cl!Mj7Vme-#C3DC-{HR0Rkmw1=X@whrepSR;lF+;l`16=@g7okci($ zi+SP;9tkmmNZ-=u6aU8MrJPb$pdg->#|R@BU&#u9vY5NoQ{17($cd2g^>0tnqQifO zO6;iRkj8k_3B!wuh?UW^5e97wOW&5-*?J)RNE7v{O?;IZ#qWIzlz_)TVTf=T1AJuH zC7Jkrr7?b4K)|Gib`phoB)x$TRtP0DB~`Q2gRnlbXUcXZ4H{om)&J9Xs=}kZ-aI&* z(v4)#8|;r6lzBryZp|;kY@%|f-Yh?jZq5^Lu=IpiPg8N_bRJn=(%LhN`O_W9itnh! z3NslCQ#5@iTjmmubkUn$uBD^S4&*UK6c2=Qev3@l2E$cZ5e{OtuVk+KO)vcrN7x{$ z=sgT47S$_e_K8+j9~r+sBli{Y$+X6`Q)kp5kR0}uPU6w*X?>P{!mL)j_Sd`x;=XN0p!z*j*D?G+mGiPKf7Pa7Oz#*Nd3JZd+7uWm!%#EO+S{a za>ZI^pRd;#AfNPi-Q>#Itz&DEl%v#G8MN$8F+j{obikoi&(`Ff2WO4}szHtEz_X`w zoDx8mn?JkwSk)*el5_d=Bkh?Ohlbui)Ft$Ja;H=%2CO;ajbd&Ee4bx;9;h^e2`i@= zRF9%L6caNNt7if4yK1zDbK*J1S~LH(esGq4Pgl5CVaDJLEbT|$Q_*SH0CIcF~$ zZ6&FV2%}g#H6DXBlne0%%=o0|*ztWBd(lv3xJ?7&B~8Mk`M(u6!O|kCBS1XXr!c0< z90LpW5f^wKdnXV9V0_N_7w_NUCX=y@v>q`MHqc+>l0lNfJTZi;);B~JAMeMK6QPJzMHGfB<>1N%q?|H)7^bF4>-QIfJYDP=(>_{Qt zaAnTO0^2%`4yQpGr5VE*K@+387O8}~M&v^Y#2hV&cR~RJ@|#IB-I;PRtgvh>d}>m7 z7FJUWX?!Olab)^~MsRGqOW<&V>?zdO)Hb{lv4r@NQ;A35U?&0&hpZ@qg+&0i+*z<_n z+U-}RrATWqJCAEBnI~X6@Y`7F($s{2nNN*)ndL+TP)dv1M4^36t~4l=o`M=guRz1e zRxgUY!49Jdi=B+rK+DmKLCR9zjR0k_%tEcrVUGQZC-iDZtfsTkV}}h*&6B}YbXV=h zbt@CXW-h8)baDD(LNS7dIDv;>UKrp$e2CAW< zK1A^^V1$5WqLb@TmcL_jL^)9wyb~W+PugyazBN}6mO$nf10Ma8h&Zbp<(58ugqyKR zJ(y6Sz`1u6^gGV8{Z=y}p4aiEPpYQLFLmGl9ztT$+gQUG zng_-`dUe5v={G>3@n>94lOH`IK>2+j*Aw;?^5+1V&w85(CUOt5e(ic~Z?&=MiLxET zK$pqJ%8nnaLxvu$04JU&0M~aSFEa2=)ACNA#b5J7m*&@@Se(rvPdfM<0TRfg7rh17J5!Xqg}>}{@t&T@=zW%BN%yh5)W7IcZn z1wr5THp0D=(2o116YcO5W?2{L5Y-fx7Ah2xisqLhv3S9`!LLFJ^1mz=7eD}D#kVxX z&^c&t5fTYR+f4&e*@%sk?|xa?>Vs1ORMXiVOpMr&ayP}*nU7kd@MjYv2kML}XuZ|se5%`-3o`SU&!0~LBs5$K zLteog$ULFUmtK0KylKsldF9VFaLZj8GWe-RNMVSx8oKyfY{?l$6#jBJcScJo!4sAi z99D)LoDwEM+9Otd&$nNMu=tv6tODHsBo%nvTGYspsPp}P!6`n>HorH?$B9`pDqM)I zACCx@XGn+4sF7veYuMM1IB-Y-aP;$&psTj|IW)PE+oe9L_kK5n<^3Em^UExz)>|UQ z;#S;e&xh7%&L%WeGfG4`?FM}(*y-#ZoFn+bk*EOtR!c@O6owVYi_&n}4}MOCR4Joq zeoDxQ8>|35yWSf{+z4JXw!S|9I7#|vU!&u2?>2>Fx}V;eA|kIRTPuA)+aH6nM}n^Z9&m1;1vWr@E_9+=@?%@E#a!~)C{AuRrL=h(CqE8fH}hBYLNVsj+N3MZt5F&C8W-+dLc*o& z!xy)lah?Ry{_AH*3xnDRWKg&^;85Yuso=*A$?Km<`}R0c(k{TE0f9279f{+QXeyeb zdzapcQ_PgKlixluaKe9#GBx_UA>-dnQ*jckEmANvqM;eP*+3sR$>o1i53*$n$r$KF zfo5a0kHFSuqiL%s^1v5j0`HeG&w47Q{=E=2iHN4C>@liBL0p>$1ZM_Zf^CuD*Y{)< zGj8&-cVQ3)kxye-PvVo*;H5u2ZJ=zLjg1%EQ@No<4%jOYDxSS5P?*G4PE_4+)i4$ESH;&}9YdLA#UIS(%(IcZ~?nzLlubz>S)#mlGXfgVg#x%lxa9N4!*|j7pewM;O!= zw%)5)v8kZu8HM2Ucx*TL@c#swKHcdQ=N+-Z(PqH`T!Z}F2${R}N3>18%{+hI>`sxjPPyigOATW1mqUQUQZH zSOoyOG}5vub%=sp-C8zLaI%v(bia|(zJ`exT4MjGNW3`+ESlrzEt)PzESqO6F0o?W zq2~J5oIL#G`bE{DaCI|ZWo7HGY7_fMP1o3C#(XVq;b=aAW(bjHZ*sm@`KDdb59bE3 zxeHztgQdd0hkxTt8k!7(L!dr+$a0`hwU`qC^G(@hVRt5^$zUP_8Z#JckJ>bO8Lj33 z23{>n7zuBAmhC`WX?cY5*W$M{>{I?s;Re)!2M~*MbAF0-SkWGeEPW-p{b68{vH)-B z{QqO+_ff7GyFC@W;W`wu`lK~pjr;>ax+LAj~yQe(l40UK| zvTimcgiT1180w_%fV&CpEH^*j6RJ#vd=kVD$3!422P=JqGylEd@72Rsx8Z6Ulm|cu z>U~2OZ@@H?G*`(j0k>$^16JdDL)9g;e*1arupbR^1l38VNDXUBryN_a$elygDFGM6 zPjzA!kG)FI!>bjUeeJE`5ERC)pQQW(jq-DnoM-Uv;%iI|K+z_${a-)NhIkGc*?WCb zS>o$?_c+RBE*Bn68xuI$ee`X&ZfoB%b5z*jtW}3h#VF5I-$ge>mk$BaCOEf_I_fJ+ z6w|G_qso%zXlT#ALp`?MlJ1ueuZe65$frIf%WKgo{(u z6}}!mxd{gy!1L_37zX|YO8hV1I}ld?<9guvW!e;y5$Mz8)m$iFeFBqu%zOBRJyj>E z*hz|7K2dDXPddY8uvD9!%ULM$Eialt|;9`-!^QDJ~>9A)1gMTD)ow0)i$ zBUet2xp&-co}u7O*By+q#TtypLmqv8hW{V}>ma}e2=T~C$(!UL;|6d4(pmHK$#a%< zvIH^1O2)p7UX^ti`}s7wBoVKoM3wrfakyM)w+Q?5%Lh5dwZ#=e+0}C-l9R2Ixl>_;Z7cUGK>si=$8f@$#`ZsAbz*9wY*F4LPTcxzW-RFP{?aP!0yU8&O zU}JSL_MOvHCBH_bW_*vzjI77@p@Q*_Q0AU-SVyPwV$GK}d1@Bk!0l#K%zAr;g78Tn zsliHTrW>}Na-=3xMy4>bKbIBm)}=~(zf!BD99e`Vm&sy@UD8)43tc{_pytf8C>a*ULGP@eAVMO=8#3 zHa2&Lvz>lB*D6tT=($kC$8COog1Ag-Ym=gs)I`Ss(M}b@k5TrVkr;#yXdw^*F{=8l zbt!$VMpH~Iv7pqsd?Y2m3(c1}0CZPy96NF-lSDk`7A2r}0V_T6(@>a;d#0_^SynZx z$mT*W{y7;(JJi>XK$`MaE9vHP$bG-E-0c$HL(PC`ng$==%D+akt)6lDi`a?{b#wE< zzFcs{wJ%d|{TB7nvxRJRQTK4>no47d>0IFYbu9bpk)VhAtz?bVeH`I$fZ%Fj^U6VN zdb^1+lCV4S44-M+S8&kXMAw@v=v%m%-hA&0W_$t7$Y{7J;57%XT_7ZgQ=}v!WR_Zo z+pQmcAMAm*$;J~JU|G}-0fy4}kCqJ{r3U5X%R(+}JVnuE*x@K-+d&9Ldom#Cz3-!A zLdjs{%X{%W)UO(C)D<3psLHIVvdW@xI~I&;ovGCAwY+FvH#LG8fmZmn9m9o<_WMMA zhOn9-9(v9_UoloHu_BB!8?US-o?jU;*-s)W+|!L5tg%^fQRx;g$)5eAH!zFu(Ynwx z+m<(=A-MYxzG1h1@=DRUr}SBb?{ydQw3n0}@iXH5U4J}zSQ-FY%FPbuXYJiB?jmPS z_J8`<*~kCASIy!U$!eVc48LROSG%8`YVctuCH$PJa59?7x5q-FzcJ@rb8yDRvRiGi zfQ5(6oJ82EO3=h_S1-=&{qUM38a%3)_8NeKA_M7L&_aRwy{k6v9(MfO@)|A~F!)b{; zw(_4NG*I>#3FCVW_p3Ixu#FdqAhwO_qfF$DU{${2G^?<}eFFug{lP>$93C9hWJ6~k zCqH^+L?#=rh-B!7g~KCL(Lqm_u6uL_@-x^F*Gb&h-Nri<;JM>`v*J%l9M0q-2Ce3Kd)xY_W^7H)_qKJOQ+wZ~ETAO7i?aG4_5orsS+bH-Dx;lkv34K- zGm0B&ZU4k~A?Z|nwhm2USqKTOnB*2_!6s)e)6vnUdx(W0thf`G#l`@me6=vi%z>u4 z@6vm1|LVUSX(zqBm4Ox^(-zW9s&kLC9B<=}Z?72I1D}6lWQ`aFI8}>JkbP)RM2Ms8 z?Et45y3(JHsT&uc1_scJtk0*4x(YX^Midpl*fv4V`Jo#|@J48a8t_}OH8fVq%ex9z zjS6Q4_8vO#`5jibUM5qm9NPi+eCs5)@)nI3#IK)TDmBjt>Ym-%*?%6)XDNzLE_-gn z3iV?mvlTaebr2A0>Q_s0bYGI5wHO_edICPkOrFS6x{O821%7jHycx@K_zg<7;%zu| zzfcKYt!-)Uc`^9;Vt!Y0V~d)`DZ-G8>5g1sYbIND(M~dDCzojOkkUeT=s@AN1%IH* z=%B0Ao&@Ic7&lp1i_6E#XO{XUVS6{GrQm3O`5UKVaXH0s=H$EJXM|KtSHYI~+6`pU zbv6ITMAuU)vHqaIO%@e8$sh6(eKc=ohdY`(a>RajNqk{ZEDp**$J5Gpi;!&FGzvWx z;AB{%=T*0!!qTerR^`u&5UPgAg$Lq7@*&Ub6y;t8S-XzKEqyoM^E8@M zwk%3hICVu4*~;7U$#RNY{pf3>F$Vj_-w9_@+youtrr`vaj;8Qtul!7sjIe*ZJIQ~F zNUO%15cdoCNFtqzOR)YEh9vGcPZ>016~*h8nU$@l*II<2^U`*DX-4rgd*Dz2_4_w2 z;agf8&(40@Q1{BQ$aYRT`LKR6q}ja=;mP*weS*2U8!Pi}GU4)aHeJ}RVIafhnZXc) ztbHb5RzbQq-!CNRm(DmO<9Z&HYc3WMFIqi&d{Vo zH)qHW^QeQ!RVt@wkLJOJAMiE!5I@D>tE8VNm5BC-$#SUzGc+d$3|`p3OI;8K^O$%zEzrk_gjP*>OIx)d zNI;v65#-bpkynPP74MxEE7QR#=gtjRM-n!lo(v6qXVWYdfNzfQH5zdA@i3|6VZK^Rs@aqUq7A%{k$^mbv@Kw};zfh_H0NU&siK z{EV7*{fe$jI)dCA=c+r+sX2Aj)Uiu8b!HBk1esS-7Wy*5*9&WZVe!s4{5f74tbAuK z|9UTt7M&r4P_6p2HD-HO;O9&VsQ(m)G{*)1JJf`NfTj#OdnG?0Nt*F%R2j(I+5(=s zNk0klT7B!`C0ug`zRJ2ZV~bL~M)&{AnsS)0S_!uAJ#e*F;vIH>>WGtv>jNLA0zTU^nF=oQ%I5+L5|kWrEkuB~QRtNyI7C z>DMa>(54?*qo8XL?@A|H7I!DuMsri90dIP;8vILZuaINzggV~mO_DyEorKu_q910C z5r@ssHizHl&$wuIM(k~{_n>@bBNdNkp*;yPvD?4kDOPBAfmIYz_35qu;)~7O!C2dv z|5tOz#2S^rLw)4pe?a?&pkQ$DSuUD>$MW1;unn&XG(RAJj5^QMc z#8l4J-_^0`_yvUw@1+J&UyQgQie-l!F8dp1o=!sDjfmZn#cS?eqBds_U*9pT2@?`M z;P6+Wo7+{XmzUf&;so@XKuj{L9MW`)a@?ZG={omq{^JTtLjm8X$`+eZ;CX(xQSiiL zc7+>ZRU}E0J3BRj2Cu*W>d{*q2AJVXJ(tX++x3l@>9Wx-wrG&XywmH0RwJETq2tk$ z3UtErED!@04832U5c^a|Z?K5rIBzQe5~|l>&rtMIg0CN<`0kM&;#H`xpM+UYn}WFl z!EO-a(%jFJ{C^Mw4Nx}pCxZ+6!_slAT84s6cvcD=j5j2iq(^!cN?V6o{1k?7T2UOz zeex1=H*jXtO7*Ao<1 z=<|XCAD>{VwbZnzZq2c5*ifo%$mMLg3$BN(l9zeW<4L6?_}YM<5C3rx(%X83?PgU& zVNG^0ip|!e;%%>SSI-E~Oil;f)Py3VX=!)o-i$Tmp26FE9A2Jnd4_9-$4usu86<6d z++9wVhTDkj!CX)KfzPhg!7=2o0sLn|j5a$@_tUPz>U-ZVGaAY0YuKv~s=f@3&ZG6$ zA831{Y-aD{e1@*jn_O|@!!BvxdTY(%Oi&2qbF_u?`+gMrG=8&FyHrH^7KIF)K` zhh}@8s)w~fY6bmU%ML))FShEB96R1Z?f-7_*wU@_D%ejdvPS*xa%aPu$*2Q=v%Gp5 zOl(P#xQ(}$p#|H7)}&MX2rZcELY9&@SQsg$jdI$=EfZy!bRvjiL)V#u1#C8PTqdzz zRSY2ZnZpnzSm`Z(Zy~yFPEYVqx6zHZ-}>EFR2cQ!w};fmT^P{zu3IKY@JL6iRVOkS zO7RLmLq{<&GI*!jT|_VEEL5L`6|E4jmMiCo@b{lsK+4|oS4v2Ij^P)ec9%*zLHXBZ zOwKF;=^Cz=@*6C_>3-A8%jA(DnOt*KdX7?uLwfsov5pc_jGbHOC2JT1h>+ef^4<+0 z7agAu`t#6>AOJ6gd3MBlhPNKKW8NJt9l4i?jvItwSQ;XF@JEj1yFZk>(03h7qTa|a zzW7x1v5kvmy0qO=Op?J>t{n8|mn<%ZezH?b;dDLcp65?+MNNWuU+$gZ|9q+(y%CaV zNmI^#OaW}{kRtT1Ys>pD9kJ&+xf$ed`Ki6I$vvZQjscM9Pig)_0}RYaxTxUlHpPo1 zL*W&~*uU{cQd$Y6err^wbePjY4|rp5DL0{qD*WZr>ZAlh(5oCM@atD#ol zy)#>vDitsMBkaTA&TDUA>*B!yZRWv%pt|q*j7fQT&!xbV3eG1CLB=g4B2Z$&pY4h# z?B;av1)zKK4v?RjF>09~tiMf&?!}q?{rCM6UJ&DWpk=SKB-frt7+acclHfzC7s8~pFYEaE)k(u zyRKfV+l7bl2clgdK-Ht;^}6tNWJx&Sx6lNZ2oOsYIxcDR+nfIfp7=ghU4O-5hJBZ` zx$uSW13Xd7-eb)L4^#l+sXyQQ*Balz`$_OJtIeBE&Ixi0Tw>KCeQ)$0Y2q0JRZeNW zQLA%4_Qq0TlAg=k0pf%Cb0`6PC|c|V zFQ~9ym2@jlXev(mKel8e8;BvsiIXwe60oQ41?z0~D$bz;Q%bIC)%faZ!^d2v)maB! zQxwRgaMWHTMi-D@<>QJ%LwmAVUTtnCTfmQ+$}L7y;>&mjdBf?9za?3Xz~Ae4Q6}Y* z@hmK!#mO$-SKN;#?*q>lyyYWb$Hv(mxemNe%!?he^JMm8VL~ZSLcq|XHlueX8~#UI zYGQJwu^?^<>4$1u^p>SCE?j=#lSy1`M@tGf-p8U#5LwOTi${xIYpR@`{ob*jERJ$l z`59xSyJFLhqZv`O@e|OQx-tW~%Ef{th+sEdGRb{{9R34}ERvrflV;crrK}(*2(3AG z!wD$y6XewcyCH!c0}6@{3@PGtgW}_a5OTSG;)B!*U_%PHmZ8BQ5F~&*?O)0PsT070 zF!2oj!<-E_Je|=00M|d^w|^;j1A<^AG!z*0uc82CT!iSKjJM%fWRLnE;Dbz?{Zj&i z8tBdEF#ZAXzgqkdUeAA8VD^S@o&#k60LMQqL5Nl=0Sg$+Ne&`+G_gSv6hvZ^H+Qgf zvm$5bV&_F-Q}=cbtH?~Jb z^2$2Xwsjcmil4A#I3jvzfj*ZB%rf$c@5(_deNT9Dek8)2zc z8#{Cc@}C!Wx{tGtD{Mx1)#SgHq|aq&)9M?=GT@|HD!PWv$kASIqGCY-f}kM6^2@?Y zOMnyW_JA4d&;)Av>X4d{1j}IdGghy$lTjl4cQRTU!eS#;>sJ{qPdF$@N*|)v4)(Ij zUcRPI32&)fQZ18^T*$QSGP{?p4VAgnK^kLZOB4ea%Xk1vlF<39UR-j#hVc~3-!LWYeVs?mz zh$+wa*SU73nqPXVe61m{c0Qs5Xg=+@xfr|-3<~bVyk{D*%fg9UeB%GQ<46}xjAS;q zNVxlF`_J|#54Va#>>JFpuNH}`Ig`jTrep)?z?KKI1Y;s&f*`hRoJ?PDj#jHWH4UY8 zf*+1*R1th1v%BLOYgDSAisF_AVcRifghidS66WkoA!U8Bbiw=aH2U5#P*L(yA>Ri?1Uq(XE5jzaS^JkhFwO>Bd61 z?aqQp$1PDX7ATwk{<%t4y3MZzvtlf>^@_Zw<)*+nu?m~3Vn>+E$< zXR(YPH|`0F+35DO&~hVVwpkmynFKALNy?06j<0yLeo48F`7$xPy%MKBfzHaHPaLCU z^lq%Z=Ww&gNV7{V3DlhGpm-ikWgdH{V=cLE_K4A9N#Cd0lw6B;fZfzA>><0fMU0k4 z*|B=Ou{^kWJAQ9gSz|?8cOlp^i0WSdPq?y$lDM{gX)|*JIW2og^j_i8W%8aPt!>t**|@CU-rFLy(RcO??bCQR94FNw%PE&} zmSrOy_!2If*j}R=7!5Xn{2_tL5J0se@<4CeYV6@cs@3#5P?;+*P+O%aYMYJMSSeTN zqdZHV%Q+L5aea}AUI|-xGD|Nl_2>{fH0bVNF)%2(*;^t9p4l^*xw8t5vzpp(!nd9I z0h8)?s(XRi>lK1AgWW&je(${LsYO4Ug?zd$2yr}b7zTHNzduQK1|)0lw>#5>0(y`w zHeh=`ztH0G_j#s5>L0I||H9$*gIQm%d@t6X%)m_DCZ>p3e_pTP8@34bmgr1En7Td# zN=uL6m+s!~<=Tw^`W|_U!q=L_uA|Q@2Wx-++^>XjFQ|LFyK)?IbD^}8J@=`2PId9> zEZ(gd{Vl5mZlZojv1DgfuAGnu#af-vlxCN(= z>#1+H67HRoYf28C@cG+c#@7(?J;RfMptxU83%@^<6{GoD`*l1+0-n8Z z1k)!*x8L0Op0Xw_Ag68gxKA4{6%(XU2Oo&~=EA-oina&5LuiUJcOTOqTZJFYe^U2e zG)_(yYnD)6AjGyp3cj}dj@1+x7|zXU9}kS{eox=nS`|NnZORl#8@`EsY_*uDi#!~B zFdqg3O!{R;C|#&{v#Ir3Q~sJ&?=nPzx-O6WIAPx{q^A+gH1}V6vc`(UK zuA9&n_ofdFM1J2{Hr`Owz5imY+Ao&ZP{^3CQi_hD==tDw#*>ocLX(eXNo)Z#|MeD$ zy~>BdW~T_AF1YT8H+303ltRQ^lCtFR)Er(8LXO046076Ik&cZWvn7AKv3%nBQH}{< zM?K#=TgP6628raiDURfz9o$AtQI~$Goi8jIi4EHFJf)$GSd&EIGtpNbvq*-|JY{Te z(!dVQ)57WeRXAg7OF2k;*u2E9(6SZ$Tczlm93I)U_8>V9jm%c9wF%>qs=y4hioz#p z)0%D5Jfmsr2a&z;IR*52xtQ}CGlmhMgWgRf@b@Cmhk(`XxD`sK)tp|947{o}S$-tn zwA)s$lZ25I*fa(#3D44@1o3?)WRZ+`hjLkC~ae!O^i%B zB7?1n{T2JZvP}W|-WG{TUxiowf56aF95#3Rb~QVWqcPu|Y^Qt4zP(8URT#rFySnqj zNK}Kh)ozviZM84&7bX2eB*LQSK_n6gVUQN_4n7?zHdFOo3l7GBso+2{)K-LZ4jv6oVQOHCFQZ>}i%c&M@C3_2$v|c#J+M1K`-9M(Whmlgj;7 zH8O+xnWXuvdKxb)N%vQelEl^Y&es&?Et0P|xf+x*^4sW}A0fh277lw_j{JYj`^BGI zVWW0cJ|;)k-UA95oX;crwMYM^@1w{>}4u!$ae{Jk&ChVvcVH=nJi*eYSINzOk zYg|3EH|fT6Teb+xmIY2!0%sDD&SffG@j6%JvaxOG+=CnE%6C-c%OT5VaOKD=?n{l_-4mqFZx>Mjbfr1b@&7Pi z01W2(KM+XHfBaF^(b0_@{I5_IiA`35Tvw16#0Lh8v4glkoFFL)NiZh}#LdMc1p={4 zNpbLUg4o5lB{{jpq_{yK2@X+iF>!7wUMUH2F+L7%2|kcGhcNm7zX`Vg%Qhf&c{mtg zF!w)`9L&tU$aO*F|8kJ|JP`X-%zgeW&HNp o{-g8Y>mO7ka|g5kVeydXTqMYGJ`xHCFE0-#5)F-{k`&Va0{jZ#jsO4v delta 13969 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�Z}K|L6UwLL&C>IpNQlI#%}Jk; zV10t#u2@%e14))#$bNS1yz(G31l;N5cU9=c5Ig>`dDi&V-4utW!<5a9pbdSX4;L4$ zWw(7$UK2li8gW*3ai1%0_Vd7#2GJ$G_5#3Y9sooO2P$^icFL5Qh3=#56tw}{NF}SL zzJsW<9dI;-wYR*C(kD@cm*u4*2W{W9{4+#*6tD#rRvB!+M!OE(ZKRD*jojt28rYu^ zhQGgfpm<}s=~n{1FbhM?h0gZs4!0BYQQcMh?gcUKVy}m8VLn5{GW_;xdKr^UBqukK{tIOp)OibT|_#%Knv*qU{46)c(@UkA)kCs z$f0BnUvr-9n*n=OmPri-=bL!k3Ri*WA$T?CUAlPeKf&IIZ)H0+ gE7bs-Z9ydJ{MLWkTe^Co02qnT0xKw>Z7|?}15H!&%>V!Z delta 18774 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 wt0;J(CTB_LeTaQeEBY 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 OnWX`js;aBM8y5h03;y2# diff --git a/assets/readme/examples/invoice-consulting-v2.pdf b/assets/readme/examples/invoice-consulting-v2.pdf index da323a24494818dcdba1c55c1c03f2ff38de3517..cd77c060c6397ebbb911db68ff93f1d11d2c9606 100644 GIT binary patch delta 7143 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 delta 6950 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 delta 12590 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 { - cell.spacing(0); - cell.padding((float) ((band - DASH_THICKNESS) / 2), 0f, 0f, 0f); + row.name("SectionHeadingRow_" + compact(title)); + row.spacing(0); + row.margin(DocumentInsets.zero()); + row.columns(DocumentRowColumn.fixed(DASH_WIDTH), + DocumentRowColumn.auto(), + DocumentRowColumn.weight(1.0)); + row.addSection(cell -> { + cell.spacing(0); + cell.padding((float) ((band - DASH_THICKNESS) / 2), 0f, 0f, 0f); + cell.addLine(line -> line + .name("HeadingDash_" + compact(title)) + .horizontal(DASH_WIDTH) + .thickness(DASH_THICKNESS) + .color(INK)); + }); + row.addSection(cell -> { + cell.spacing(0); + cell.padding(0f, 0f, 0f, (float) (titleAt - dashAt - DASH_WIDTH)); + cell.addParagraph(p -> p + .name("SectionTitle_" + compact(title)) + .text(caps) + .textStyle(headingStyle) + .lineSpacing(TIGHT_LEADING)); + }); + row.addSection(cell -> { + cell.spacing(0); + cell.padding((float) ((band - HAIRLINE_THICKNESS) / 2), 0f, 0f, (float) TAIL_GAP); + if (tail) { cell.addLine(line -> line - .name("HeadingDash_" + compact(title)) - .horizontal(DASH_WIDTH) - .thickness(DASH_THICKNESS) - .color(INK)); - }); - row.addSection(cell -> { - cell.spacing(0); - cell.padding(0f, 0f, 0f, (float) (titleAt - dashAt - DASH_WIDTH)); - cell.addParagraph(p -> p - .name("SectionTitle_" + compact(title)) - .text(caps) - .textStyle(headingStyle) - .lineSpacing(TIGHT_LEADING)); - }); - row.addSection(cell -> { - cell.spacing(0); - cell.padding((float) ((band - HAIRLINE_THICKNESS) / 2), 0f, 0f, (float) TAIL_GAP); - if (tail) { - cell.addLine(line -> line - .name("HeadingTail_" + compact(title)) - .fill() - .thickness(HAIRLINE_THICKNESS) - .color(RULE)); - } - }); - } + .name("HeadingTail_" + compact(title)) + .fill() + .thickness(HAIRLINE_THICKNESS) + .color(RULE)); + } + }); // The band stays a layer stack: a row may not nest directly inside the // body's column row, and the stack is also what hands the row a width From 5980d5eefbb26d0a0ff18495b99f202fb15beaff Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 09:42:13 +0100 Subject: [PATCH 8/9] fix(templates): track the Consulting qualifier, not the rules beside it The masthead qualifier is a composite - two em-dash rules with the brand qualifier between them - and the old implementation tracked only the word: the rules and their separating spaces were written plainly. Moving the whole string onto native tracking moved that boundary, spreading the rules away from the word they point at. It is now three runs, and only the middle one carries letter spacing. Measured on one render of all three constructions, so the only variable is where the tracking is applied: line width dash-to-word word-to-dash centre old fake 104.552 4.870 4.870 297.638 whole-run native 116.836 11.710 11.710 296.498 scoped 105.436 4.870 7.150 297.638 Scoped returns the left gap to the old value exactly and the centre to the old value exactly. The right gap keeps +2.280, which is one trailing tracking advance - 0.25 em of the qualifier's size - because tracking advances after the final glyph and spliced spaces did not. The word itself is 1.395 narrower than the fake, the difference between nine space glyphs and nine tracked advances. No baseline moves. Every committed preview gives this brand a logo, and the text lockup is drawn only when there is none, so nothing that ships renders this path - which is also why the layout snapshot never saw the change and why visual parity could not have caught it either. That gap is now covered: ConsultingInvoiceFixtures.logolessInvoice reaches the lockup, and the text-layer gate asserts the brand and its qualifier both read back as words. Co-Authored-By: Claude Opus 5 --- .../templates/TemplateTextLayerGateTest.java | 21 +++++++++++++++++++ .../presets/ConsultingInvoiceFixtures.java | 13 ++++++++++++ .../invoice/presets/ConsultingMasthead.java | 17 ++++++++++++--- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java index c6c570506..d985be95e 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java @@ -92,6 +92,27 @@ void theProfessionalSidebarSaysProfile() throws Exception { assertThat(spelledOutRuns(extracted)).isEmpty(); } + /** + * The brand qualifier is tracked; the rules that flank it are not. + * + *

Reached only when the brand carries no logo, which no committed + * preview does — so this is the one place the text lockup is drawn at all. + * The tracking belongs to the word: applying it to the whole run would + * spread the two rules away from the word they point at, which is a + * styling change rather than the text-layer fix, and centre alignment + * hides it from the layout snapshot.

+ */ + @Test + void onlyTheBrandQualifierIsTracked() throws Exception { + String extracted = extract(session -> + ConsultingInvoice.create().compose( + session, ConsultingInvoiceFixtures.logolessInvoice())); + + assertThat(extracted).contains("NORTHPOINT"); + assertThat(extracted).contains("CONSULTING"); + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + /** * The control. This preset never faked its tracking — it has carried * native spaced caps from the day it shipped — so it is the case that must diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java index a9a07edd6..686442f89 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceFixtures.java @@ -46,6 +46,19 @@ public static StructuredInvoiceDocumentSpec canonicalInvoice() { return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(5)).build()); } + /** + * The same invoice with no logo, which is the only way to reach the text + * lockup — the brand name over its qualifier, flanked by two rules. Every + * other fixture supplies a logo, so that branch of the masthead is drawn + * by no committed preview. + */ + public static StructuredInvoiceDocumentSpec logolessInvoice() { + return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(5)) + .brand(new InvoiceBrand(null, "NORTHPOINT", "CONSULTING", + "Strategy. Solutions. Results.")) + .build()); + } + /** Enough service lines to push the table onto a second page. */ static StructuredInvoiceDocumentSpec overflowInvoice() { return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(26)).build()); diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java index 7e7470cab..54cac28f1 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingMasthead.java @@ -115,9 +115,20 @@ private static void renderTextLockup(SectionBuilder section, InvoiceBrand brand) .lineSpacing(1.0) .margin(DocumentInsets.zero())) .addParagraph(paragraph -> paragraph - .text(brand.qualifier().isBlank() - ? "" : "— " + brand.qualifier() + " —") - .textStyle(BRAND_QUALIFIER.withLetterSpacing(HEADING_TRACKING)) + // Three runs, because only the word is tracked. The rules + // that flank it are punctuation set at the qualifier's own + // size; tracking them would spread the dashes off the word + // they point at. + .rich(rich -> { + if (brand.qualifier().isBlank()) { + return; + } + rich.style("— ", BRAND_QUALIFIER) + .style(brand.qualifier(), + BRAND_QUALIFIER.withLetterSpacing(HEADING_TRACKING)) + .style(" —", BRAND_QUALIFIER); + }) + .textStyle(BRAND_QUALIFIER) .align(TextAlign.CENTER) .margin(DocumentInsets.zero())) .addParagraph(paragraph -> paragraph From 577ed69037f63e3f589c94507388ad26a36f46cb Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 13 Sep 2026 10:33:56 +0100 Subject: [PATCH 9/9] test(templates): gate the semantic text layer of every shipped preset The first sweep fixed ten presets and concluded the rest were clean. That conclusion rested on the committed previews, and the previews do not cover the catalogue: seven shipped presets render into no preview at all - MerchantInvoice, MeteredInvoice, ObsidianInvoice, PlatformInvoice, SubscriptionInvoice, IndigoProposal and CobaltRota - so nothing had ever read their text layer. The catalogue is 58 presets across six families, taken from the source rather than from a count: every class declaring a public ID, cross-checked against every class exposing a create() returning a DocumentTemplate. Both lists agree exactly. Each family now has a gate that renders its presets through the project's own PDFBox and asserts the extracted text carries no run of three or more single letters separated by any Unicode space separator - hair and thin spaces included, because one preset spelled its headings with those and a plain-space class reads straight past them. - InvoiceTextLayerGateTest - 11 presets, across all three spec types the family uses. Its pixel gate renders only the two taking an InvoiceDocumentSpec, which is why nine went unlisted. - CoverLetterTextLayerGateTest - 15 presets, each asserting the sender's name survives extraction. - ProposalTextLayerGateTest - 4 presets. - TemplateTextLayerGateTest gains CobaltRota. Each gate also compares its own list against the preset package on disk, so a preset cannot be added without one. That check is the point: the defect was not that a gate was missing, it was that the gate that existed listed sixteen CV presets and no others. Result: no further defects. All 48 presets outside the original ten extract cleanly. Two helpers that looked like candidates - MerchantStyles.spaces and PlatformStyles.spaces - space two separate fields on a line rather than the letters of a word, and their presets extract clean. Co-Authored-By: Claude Opus 5 --- .../templates/TemplateTextLayerGateTest.java | 11 ++ .../presets/CoverLetterTextLayerGateTest.java | 122 +++++++++++++++ .../CoverLetterV2VisualParityTest.java | 2 +- .../presets/InvoiceTextLayerGateTest.java | 145 ++++++++++++++++++ .../presets/ProposalTextLayerGateTest.java | 109 +++++++++++++ .../presets/ProposalV2VisualParityTest.java | 2 +- .../rota/presets/CobaltRotaFixtures.java | 4 +- 7 files changed, 391 insertions(+), 4 deletions(-) create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterTextLayerGateTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceTextLayerGateTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalTextLayerGateTest.java diff --git a/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java index d985be95e..bf94b5a2e 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/TemplateTextLayerGateTest.java @@ -12,6 +12,8 @@ import com.demcha.compose.document.templates.invoice.presets.LumaStudioInvoiceFixtures; import com.demcha.compose.document.templates.receipt.presets.ModernReceipt; import com.demcha.compose.document.templates.receipt.presets.ReceiptFixtures; +import com.demcha.compose.document.templates.rota.presets.CobaltRota; +import com.demcha.compose.document.templates.rota.presets.CobaltRotaFixtures; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; @@ -113,6 +115,15 @@ void onlyTheBrandQualifierIsTracked() throws Exception { assertThat(spelledOutRuns(extracted)).isEmpty(); } + /** The rota family's only preset, which no committed preview renders. */ + @Test + void theRotaReadsBackAsWords() throws Exception { + String extracted = extract(session -> + CobaltRota.create().compose(session, CobaltRotaFixtures.canonicalRota())); + + assertThat(spelledOutRuns(extracted)).isEmpty(); + } + /** * The control. This preset never faked its tracking — it has carried * native spaced caps from the day it shipped — so it is the case that must diff --git a/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterTextLayerGateTest.java new file mode 100644 index 000000000..98b6489cf --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterTextLayerGateTest.java @@ -0,0 +1,122 @@ +package com.demcha.compose.document.templates.coverletter.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.coverletter.data.CoverLetterDocument; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Every shipped cover-letter preset says the words it draws. + * + *

A letter is read by a person and by an applicant tracking system, and the + * fields both look for — who wrote it, what they do — are exactly the ones a + * design is most tempted to letter-space.

+ */ +class CoverLetterTextLayerGateTest { + + /** Three or more single letters separated by any Unicode space separator. */ + private static final Pattern SPELLED_OUT = + Pattern.compile("(?> factory) + throws Exception { + String extracted = extract(factory.get()); + + assertThat(spelledOutRuns(extracted)) + .describedAs("%s spells something out letter by letter", slug) + .isEmpty(); + // The identity an ATS reads the letter by. + assertThat(extracted) + .describedAs("%s lost the sender's name from its text layer", slug) + .contains(CoverLetterV2VisualParityTest.canonicalLetter().identity().name().full()); + } + + /** No preset ships without appearing above. */ + @Test + void everyShippedPresetIsOnThisList() throws IOException { + Path dir = Path.of("..", "templates", "src", "main", "java", "com", "demcha", + "compose", "document", "templates", "coverletter", "presets"); + List shipped = new ArrayList<>(); + try (var files = Files.list(dir)) { + for (Path file : files.toList()) { + String name = file.getFileName().toString(); + if (name.endsWith(".java") + && Files.readString(file).contains("public static final String ID")) { + shipped.add(name.substring(0, name.length() - ".java".length())); + } + } + } + List covered = presets().map(a -> (String) a.get()[0]).toList(); + assertThat(shipped) + .describedAs("a shipped cover-letter preset is not rendered by this gate") + .allSatisfy(preset -> assertThat(covered).contains(preset)); + } + + private static Stream presets() { + return Stream.of( + letter("BlueBannerLetter", BlueBannerLetter::create), + letter("BoxedSectionsLetter", BoxedSectionsLetter::create), + letter("CenteredHeadlineLetter", CenteredHeadlineLetter::create), + letter("ClassicSerifLetter", ClassicSerifLetter::create), + letter("CompactMonoLetter", CompactMonoLetter::create), + letter("EditorialBlueLetter", EditorialBlueLetter::create), + letter("EngineeringResumeLetter", EngineeringResumeLetter::create), + letter("ExecutiveLetter", ExecutiveLetter::create), + letter("MintEditorialLetter", MintEditorialLetter::create), + letter("ModernProfessionalLetter", ModernProfessionalLetter::create), + letter("MonogramSidebarLetter", MonogramSidebarLetter::create), + letter("NordicCleanLetter", NordicCleanLetter::create), + letter("PanelLetter", PanelLetter::create), + letter("SidebarPortraitLetter", SidebarPortraitLetter::create), + letter("TimelineMinimalLetter", TimelineMinimalLetter::create)); + } + + private static Arguments letter(String slug, + Supplier> factory) { + return Arguments.of(slug, factory); + } + + private static List spelledOutRuns(String text) { + Matcher matcher = SPELLED_OUT.matcher(text); + List runs = new ArrayList<>(); + while (matcher.find()) { + runs.add(matcher.group()); + } + return runs; + } + + private static String extract(DocumentTemplate template) throws IOException { + byte[] pdf; + try (DocumentSession session = GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .create()) { + template.compose(session, CoverLetterV2VisualParityTest.canonicalLetter()); + pdf = session.toPdfBytes(); + } + try (PDDocument document = Loader.loadPDF(pdf)) { + return new PDFTextStripper().getText(document).replaceAll("\\s*\\R\\s*", " "); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java index 1623b60df..6f9dd181d 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2VisualParityTest.java @@ -129,7 +129,7 @@ private static Stream presets() { *

Kept inline (not pulled from the examples module) so the test * depends only on main + main-test code.

*/ - private static CoverLetterDocument canonicalLetter() { + static CoverLetterDocument canonicalLetter() { return CoverLetterDocument.builder() .identity(CvIdentity.builder() .name("Jordan", "Rivera") diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceTextLayerGateTest.java new file mode 100644 index 000000000..7bd4ecdef --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/InvoiceTextLayerGateTest.java @@ -0,0 +1,145 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Every shipped invoice preset says the words it draws. + * + *

Two of these were found writing their tracking as characters. The reason + * the other nine went unexamined for so long is worth stating: the family's + * pixel gate renders only the two presets that take an {@code + * InvoiceDocumentSpec}, and the rest carry their own per-preset tests, so no + * single list ever named all eleven. {@link #everyShippedPresetIsOnThisList} + * is that list, and it fails if a preset is added without one.

+ */ +class InvoiceTextLayerGateTest { + + /** Three or more single letters separated by any Unicode space separator. */ + private static final Pattern SPELLED_OUT = + Pattern.compile("(? render) throws Exception { + String extracted = extract(render.get()); + + assertThat(spelledOutRuns(extracted)) + .describedAs("%s spells something out letter by letter", slug) + .isEmpty(); + // The fields an invoice is read by, whoever is reading it. + assertThat(extracted) + .describedAs("%s lost its document title", slug) + .containsIgnoringCase("invoice"); + } + + /** + * No preset may be shipped without appearing above. The package is the + * catalogue; this compares it against the list the gate actually renders. + */ + @Test + void everyShippedPresetIsOnThisList() throws IOException { + Path dir = Path.of("..", "templates", "src", "main", "java", "com", "demcha", + "compose", "document", "templates", "invoice", "presets"); + List shipped = new ArrayList<>(); + try (var files = Files.list(dir)) { + for (Path file : files.toList()) { + String name = file.getFileName().toString(); + if (!name.endsWith(".java")) { + continue; + } + if (Files.readString(file).contains("public static final String ID")) { + shipped.add(name.substring(0, name.length() - ".java".length())); + } + } + } + List covered = presets().map(a -> (String) a.get()[0]).toList(); + + assertThat(shipped) + .describedAs("a shipped invoice preset is not rendered by this gate") + .allSatisfy(preset -> assertThat(covered).contains(preset)); + } + + private static Stream presets() { + return Stream.of( + preset("ModernInvoice", () -> + render(ModernInvoice.create(), InvoicePresetFixtures.canonicalInvoice())), + preset("ClassicInvoice", () -> + render(ClassicInvoice.create(), InvoicePresetFixtures.canonicalInvoice())), + preset("ConsultingInvoice", () -> + render(ConsultingInvoice.create(), ConsultingInvoiceFixtures.canonicalInvoice())), + preset("LumaStudioInvoice", () -> + render(LumaStudioInvoice.create(), LumaStudioInvoiceFixtures.canonicalInvoice())), + preset("MerchantInvoice", () -> + render(MerchantInvoice.create(), MerchantInvoiceFixtures.invoice())), + preset("MeteredInvoice", () -> + render(MeteredInvoice.create(), MeteredInvoiceFixtures.invoice())), + preset("ObsidianInvoice", () -> + render(ObsidianInvoice.create(), ObsidianInvoiceFixtures.invoice())), + preset("PaymentsInvoice", () -> + render(PaymentsInvoice.create(), PaymentsInvoiceFixtures.canonicalInvoice())), + preset("PlatformInvoice", () -> + render(PlatformInvoice.create(), PlatformInvoiceFixtures.invoice())), + preset("SubscriptionInvoice", () -> + render(SubscriptionInvoice.create(), SubscriptionInvoiceFixtures.invoice())), + preset("WorkspaceInvoice", () -> + render(WorkspaceInvoice.create(), WorkspaceInvoiceFixtures.canonicalInvoice()))); + } + + private static Arguments preset(String slug, Supplier render) { + return Arguments.of(slug, render); + } + + private static byte[] render(DocumentTemplate template, S spec) { + try (DocumentSession session = GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .create()) { + template.compose(session, spec); + return session.toPdfBytes(); + } catch (Exception exc) { + throw new IllegalStateException("render failed", exc); + } + } + + private static byte[] render(DocumentTemplate template, + com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData data) { + return render(template, StructuredInvoiceDocumentSpec.from(data)); + } + + private static List spelledOutRuns(String text) { + Matcher matcher = SPELLED_OUT.matcher(text); + List runs = new ArrayList<>(); + while (matcher.find()) { + runs.add(matcher.group()); + } + return runs; + } + + private static String extract(byte[] pdf) throws IOException { + try (PDDocument document = Loader.loadPDF(pdf)) { + return new PDFTextStripper().getText(document).replaceAll("\\s*\\R\\s*", " "); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalTextLayerGateTest.java b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalTextLayerGateTest.java new file mode 100644 index 000000000..5a5a03fa0 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalTextLayerGateTest.java @@ -0,0 +1,109 @@ +package com.demcha.compose.document.templates.proposal.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +/** Every shipped proposal preset says the words it draws. */ +class ProposalTextLayerGateTest { + + /** Three or more single letters separated by any Unicode space separator. */ + private static final Pattern SPELLED_OUT = + Pattern.compile("(? render) throws Exception { + String extracted = extract(render.get()); + + assertThat(spelledOutRuns(extracted)) + .describedAs("%s spells something out letter by letter", slug) + .isEmpty(); + assertThat(extracted) + .describedAs("%s lost its document title", slug) + .containsIgnoringCase("proposal"); + } + + /** No preset ships without appearing above. */ + @Test + void everyShippedPresetIsOnThisList() throws IOException { + List covered = presets().map(a -> (String) a.get()[0]).toList(); + assertThat(shippedPresets("proposal")) + .describedAs("a shipped proposal preset is not rendered by this gate") + .allSatisfy(preset -> assertThat(covered).contains(preset)); + } + + static List shippedPresets(String family) throws IOException { + Path dir = Path.of("..", "templates", "src", "main", "java", "com", "demcha", + "compose", "document", "templates", family, "presets"); + List shipped = new ArrayList<>(); + try (var files = Files.list(dir)) { + for (Path file : files.toList()) { + String name = file.getFileName().toString(); + if (name.endsWith(".java") + && Files.readString(file).contains("public static final String ID")) { + shipped.add(name.substring(0, name.length() - ".java".length())); + } + } + } + return shipped; + } + + private static Stream presets() { + return Stream.of( + Arguments.of("ModernProposal", (Supplier) () -> + render(ModernProposal.create(), ProposalV2VisualParityTest.canonicalProposal())), + Arguments.of("EditorialProposal", (Supplier) () -> + render(EditorialProposal.create(), EditorialProposalFixtures.canonicalProposal())), + Arguments.of("IndigoProposal", (Supplier) () -> + render(IndigoProposal.create(), IndigoProposalFixtures.canonicalProposal())), + Arguments.of("NorthlineProposal", (Supplier) () -> + render(NorthlineProposal.create(), NorthlineProposalFixtures.canonicalProposal()))); + } + + private static byte[] render(DocumentTemplate template, S spec) { + try (DocumentSession session = GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .create()) { + template.compose(session, spec); + return session.toPdfBytes(); + } catch (Exception exc) { + throw new IllegalStateException("render failed", exc); + } + } + + private static List spelledOutRuns(String text) { + Matcher matcher = SPELLED_OUT.matcher(text); + List runs = new ArrayList<>(); + while (matcher.find()) { + runs.add(matcher.group()); + } + return runs; + } + + private static String extract(byte[] pdf) throws IOException { + try (PDDocument document = Loader.loadPDF(pdf)) { + return new PDFTextStripper().getText(document).replaceAll("\\s*\\R\\s*", " "); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java index e00057cb5..6047671e0 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ProposalV2VisualParityTest.java @@ -78,7 +78,7 @@ private static Stream presets() { * emphasized total), the acceptance terms, and the footer. Kept inline * so the test depends only on main + main-test code. */ - private static ProposalDocumentSpec canonicalProposal() { + static ProposalDocumentSpec canonicalProposal() { return ProposalDocumentSpec.from(ProposalData.builder() .title("Proposal") .proposalNumber("GC-P-2026-014") diff --git a/qa/src/test/java/com/demcha/compose/document/templates/rota/presets/CobaltRotaFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/rota/presets/CobaltRotaFixtures.java index fcdf1f1f7..8d2c19a62 100644 --- a/qa/src/test/java/com/demcha/compose/document/templates/rota/presets/CobaltRotaFixtures.java +++ b/qa/src/test/java/com/demcha/compose/document/templates/rota/presets/CobaltRotaFixtures.java @@ -35,13 +35,13 @@ * invented. The shape is a real week's, because that is what the gates have to * measure against; the content is not anyone's.

*/ -final class CobaltRotaFixtures { +public final class CobaltRotaFixtures { private CobaltRotaFixtures() { } /** One week of a bar's rota. */ - static StructuredRotaDocumentSpec canonicalRota() { + public static StructuredRotaDocumentSpec canonicalRota() { return StructuredRotaDocumentSpec.from(StructuredRotaData.builder() // A short wordmark on purpose: the lockup is sized by a fixed // fraction of its column, so a long name wraps rather than