From 250b99fba58c9107e325dea681b9dd45776e5bcb Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 30 Aug 2026 22:44:23 +0100 Subject: [PATCH 1/2] feat(templates): add the NavySidebar CV preset and a portrait on CvIdentity --- CHANGELOG.md | 29 + assets/readme/examples/cv-navy-sidebar-v2.pdf | Bin 0 -> 33676 bytes docs/templates/v2-layered/using-templates.md | 12 +- .../demcha/examples/GenerateAllExamples.java | 2 + .../support/NavySidebarSampleData.java | 141 + .../examples/support/ShowcaseMetadata.java | 1 + .../templates/cv/v2/NavySidebarExample.java | 52 + .../resources/cv-portrait-placeholder.png | Bin 0 -> 2274 bytes .../cv/data/CvIdentityPortraitTest.java | 75 + .../cv/presets/NavySidebarFixtures.java | 166 ++ .../NavySidebarLayoutSnapshotTest.java | 29 + .../cv/presets/NavySidebarSmokeTest.java | 185 ++ .../presets/NavySidebarVisualParityTest.java | 41 + .../cv-v2/navy_sidebar_layout.json | 2627 +++++++++++++++++ .../cv-v2-layered/navy_sidebar-page-0.png | Bin 0 -> 128892 bytes .../templates/cv/data/CvIdentity.java | 49 +- .../templates/cv/presets/NavySidebar.java | 213 ++ .../cv/presets/NavySidebarAside.java | 295 ++ .../cv/presets/NavySidebarIcons.java | 85 + .../templates/cv/presets/NavySidebarMain.java | 276 ++ .../cv/presets/NavySidebarStyles.java | 192 ++ .../cv/presets/NavySidebarWidgets.java | 133 + .../templates/cv/presets/package-info.java | 12 +- .../cv/navy-sidebar/icons/briefcase.png | Bin 0 -> 941 bytes .../cv/navy-sidebar/icons/certificate.png | Bin 0 -> 1080 bytes .../templates/cv/navy-sidebar/icons/email.png | Bin 0 -> 1028 bytes .../cv/navy-sidebar/icons/linkedin.png | Bin 0 -> 969 bytes .../cv/navy-sidebar/icons/location.png | Bin 0 -> 1177 bytes .../templates/cv/navy-sidebar/icons/phone.png | Bin 0 -> 1081 bytes .../cv/navy-sidebar/icons/trophy.png | Bin 0 -> 1222 bytes 30 files changed, 4598 insertions(+), 17 deletions(-) create mode 100644 assets/readme/examples/cv-navy-sidebar-v2.pdf create mode 100644 examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java create mode 100644 examples/src/main/java/com/demcha/examples/templates/cv/v2/NavySidebarExample.java create mode 100644 examples/src/main/resources/cv-portrait-placeholder.png create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/data/CvIdentityPortraitTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarFixtures.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarVisualParityTest.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json create mode 100644 qa/src/test/resources/visual-baselines/cv-v2-layered/navy_sidebar-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarAside.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarIcons.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarMain.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarWidgets.java create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/briefcase.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/certificate.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/email.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/linkedin.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/location.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/phone.png create mode 100644 templates/src/main/resources/templates/cv/navy-sidebar/icons/trophy.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 66e4d4248..757b26c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ follow semantic versioning; release dates are ISO 8601. ### Public API +- **`CvIdentity` carries an optional portrait.** A CV design with a photograph in it + had nowhere to put one: the identity record held the name, the title, the contact + triple and the links, and a preset that wanted a face had to ship a silhouette of its + own. `CvIdentity` now carries `Optional portrait` — the image + itself, because a photograph is caller-supplied content rather than template chrome — + reachable through `CvIdentity.Builder.portrait(...)`. The four- and three-argument + constructors are kept explicitly, so existing calls compile and link unchanged; only a + record deconstruction pattern over `CvIdentity` sees the extra component. A document + carrying a portrait still renders through every preset in the family — the ones with + nowhere to draw it ignore it. + - **A structured invoice document model.** The invoice family's data layer knew one shape — an invoice as pre-formatted display strings, with one address block per party, line items whose quantity and money are already rendered, and a flat list of @@ -36,6 +47,24 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **A portrait CV preset: `NavySidebar`.** A one-page A4 CV in two columns on Lato — + a navy plate carrying a ringed portrait, the contact channels behind their marks, the + degrees, the skills and the languages, beside a white column of the name, the summary, + the roles held on a timeline rail with a filled marker at each one, and the + achievements and certifications behind badged headings. Ships as + `cv.presets.NavySidebar` on the existing `CvDocument` model, porting the rendered + layout of the published standalone `navy-sidebar-cv` template. Like its sibling it + owns its page and holds one: the two columns are a single atomic row, so a CV longer + than the sheet raises `AtomicNodeTooLargeException` rather than flowing or dropping + entries. Sections reach their berth by title rather than by `Slot`; languages are a + `RowsSection` because this design writes the proficiency out — "Native", "Advanced" — + which a levelled skill could not carry back. The photograph comes from the new + `CvIdentity.portrait()`; an identity without one draws the ring around an empty navy + disc. Guarded by a smoke test (including the missing portrait, the capitals this + design imposes, the one-page limit and the fields it has no place for), an exact + layout snapshot and a pixel-parity gate; the examples showcase gains + `cv-navy-sidebar-v2`. + - **The first CV preset that owns its page: `ProfessionalSidebar`.** A one-page CV in two columns on the Barlow Condensed / Lato pair — a navy monogram plate over a pale sidebar carrying the contact channels, meter-bar skills, an education rail with diff --git a/assets/readme/examples/cv-navy-sidebar-v2.pdf b/assets/readme/examples/cv-navy-sidebar-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..54d9856b3bc513396106df954e1ad0211c52f96f GIT binary patch literal 33676 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 F{|_EmcvAoX literal 0 HcmV?d00001 diff --git a/docs/templates/v2-layered/using-templates.md b/docs/templates/v2-layered/using-templates.md index 9017f5517..e040f106b 100644 --- a/docs/templates/v2-layered/using-templates.md +++ b/docs/templates/v2-layered/using-templates.md @@ -234,12 +234,12 @@ whole or the paginator raises `AtomicNodeTooLargeException`. Lifting a cap without teaching the preset to pick its own page boundaries turns a CV that silently lost an entry into one that fails to render. -`ProfessionalSidebar.create()` is the fourth composition for a fixed -amount of content and the one that caps nothing: it reproduces a -specific one-page sheet, so a CV longer than that sheet raises -`AtomicNodeTooLargeException` instead of losing an entry to a cap. Size -the document to it — roughly five or six roles with three or four -highlights each, alongside the sidebar blocks. +`ProfessionalSidebar.create()` and `NavySidebar.create()` are +compositions for a fixed amount of content that cap nothing: each +reproduces a specific one-page sheet, so a CV longer than that sheet +raises `AtomicNodeTooLargeException` instead of losing an entry to a +cap. Size the document to them — roughly five or six roles with three +or four highlights each, alongside the sidebar blocks. If the document's length is the author's rather than the template's, pick a preset that paginates — `TimelineMinimal` splits its own columns diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index d9c144721..706465084 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -96,6 +96,7 @@ import com.demcha.examples.templates.cv.v2.CvPanelExample; import com.demcha.examples.templates.cv.v2.CvSidebarPortraitExample; import com.demcha.examples.templates.cv.v2.CvTimelineMinimalExample; +import com.demcha.examples.templates.cv.v2.NavySidebarExample; import com.demcha.examples.templates.cv.v2.ProfessionalSidebarExample; import com.demcha.examples.templates.invoice.ClassicInvoiceV2Example; import com.demcha.examples.templates.invoice.ConsultingInvoiceV2Example; @@ -146,6 +147,7 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + CvPanelExample.generate()); System.out.println("Generated: " + CvSidebarPortraitExample.generate()); System.out.println("Generated: " + CvTimelineMinimalExample.generate()); + System.out.println("Generated: " + NavySidebarExample.generate()); System.out.println("Generated: " + ProfessionalSidebarExample.generate()); // Cover letters (v2 layered — 15 paired letters, one per CV preset) diff --git a/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java b/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java new file mode 100644 index 000000000..7472ce8cf --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java @@ -0,0 +1,141 @@ +package com.demcha.examples.support; + +import com.demcha.compose.document.image.DocumentImageData; +import com.demcha.compose.document.templates.core.identity.Contact; +import com.demcha.compose.document.templates.core.identity.Link; +import com.demcha.compose.document.templates.cv.data.CvDocument; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; +import com.demcha.compose.document.templates.cv.data.RowStyle; +import com.demcha.compose.document.templates.cv.data.RowsSection; +import com.demcha.compose.document.templates.cv.data.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +import com.demcha.compose.document.templates.cv.data.Slot; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.Objects; + +/** + * Sample data for the Navy Sidebar CV example. + * + *

Sized to the design: the preset draws a fixed one-page sheet, and a CV + * much longer than this one does not compose at all — the two columns are a + * single atomic row, so it raises {@code AtomicNodeTooLargeException}.

+ * + *

The portrait is a neutral silhouette rather than a photograph, because + * the example ships in the repository; a real CV passes the candidate's own + * image to {@code CvIdentity.Builder.portrait(...)} the same way.

+ */ +public final class NavySidebarSampleData { + + private static final String PORTRAIT = "/cv-portrait-placeholder.png"; + + private NavySidebarSampleData() { + } + + /** + * A marketing manager's one-page CV. + * + * @return the sample document + */ + public static CvDocument sample() { + return CvDocument.builder() + .identity(CvIdentity.builder() + .name("Priya", "Raghavan") + .jobTitle("Marketing Manager") + .contact(new Contact("+44 20 7946 0812", + "priya.raghavan@example.com", + "Bristol, United Kingdom")) + .link(new Link("linkedin.com/in/praghavan", + "https://linkedin.com/in/praghavan")) + .portrait(portrait()) + .build()) + .section(Slot.MAIN, new ParagraphSection("Summary", + "Marketing manager with eight years in B2B software, most of it" + + " running the demand side end to end: positioning, the" + + " campaigns that carry it, and the reporting that says" + + " whether it worked. Happiest with a small team and a" + + " short feedback loop.")) + .section(Slot.SIDEBAR, EntriesSection.builder("Education") + .entry("MSc Marketing Analytics", "University of Bristol", + "2015 - 2016", "Bristol, UK") + .entry("BA Business Management", "University of Leeds", + "2012 - 2015", "Leeds, UK") + .build()) + .section(Slot.SIDEBAR, SkillsSection.of("Skills", SkillGroup.of("Core", + "Positioning", + "Demand Generation", + "Marketing Analytics", + "SEO / SEM", + "Lifecycle Email", + "Content Strategy", + "HubSpot", + "Looker"))) + .section(Slot.SIDEBAR, RowsSection.builder("Languages", RowStyle.PLAIN) + .row("English", "Native") + .row("Tamil", "Native") + .row("German", "Intermediate") + .build()) + .section(Slot.MAIN, EntriesSection.builder("Experience") + .entry("Marketing Manager", + "Ardent Systems, Bristol, UK", + "Mar 2021 - Present", + String.join("\n", + "Rebuilt the demand programme around three named" + + " segments, lifting qualified pipeline 44% in" + + " the first year.", + "Runs a team of four across content, lifecycle and" + + " events, and the agency relationship behind" + + " paid search.", + "Replaced a weekly spreadsheet with a Looker model the" + + " sales team reads without asking for it.")) + .entry("Senior Marketing Executive", + "Halworth Digital, Bristol, UK", + "Sep 2018 - Feb 2021", + String.join("\n", + "Owned lifecycle email end to end, taking trial-to-paid" + + " conversion from 9% to 14%.", + "Launched the customer-story programme that still" + + " supplies the sales deck.", + "Ran competitor and win-loss research each quarter for" + + " the product team.")) + .entry("Marketing Executive", + "Kite & Compass, Leeds, UK", + "Oct 2016 - Aug 2018", + String.join("\n", + "Planned and ran campaigns across search, social and" + + " trade press for six retail clients.", + "Built the reporting pack the agency used for every" + + " monthly review.")) + .build()) + .section(Slot.MAIN, new ParagraphSection("Achievements", String.join("\n", + "Grew organic sessions 60% in a year by rebuilding the site around" + + " search intent rather than the org chart.", + "Cut cost per qualified lead by a third by retiring two channels and" + + " funding the one that worked.", + "Named marketer of the year at Ardent in 2024."))) + .section(Slot.MAIN, new ParagraphSection("Certifications", String.join("\n", + "Google Analytics Individual Qualification", + "HubSpot Content Marketing Certification", + "Professional Certificate in Marketing, CIM"))) + .build(); + } + + /** + * The packaged silhouette that stands in for a photograph. + * + * @return the portrait image data + */ + private static DocumentImageData portrait() { + try (InputStream in = Objects.requireNonNull( + NavySidebarSampleData.class.getResourceAsStream(PORTRAIT), + "cv-portrait-placeholder.png missing from examples/src/main/resources/")) { + return DocumentImageData.fromBytes(in.readAllBytes()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to read the sample portrait", e); + } + } +} diff --git a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java index b63c554c0..62fc7aafa 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -61,6 +61,7 @@ record Entry(String title, String description, List tags, String codeUrl cv("cv-mint-editorial-v2", "CvMintEditorialExample", "Mint Editorial", "Magazine-style editorial CV with mint accent palette and two-column body.", "editorial", "mint"); cv("cv-mint-editorial-v2-custom", "CvMintEditorialCustomExample", "Mint Editorial (custom band)", "The same preset with one colour changed through its Options — a kraft-paper masthead band, everything else left at the preset's defaults.", "editorial", "mint"); cv("cv-professional-sidebar-v2", "ProfessionalSidebarExample", "Professional Sidebar", "Navy monogram plate over a pale sidebar of contact marks, skill meters, an education rail and language ratings, beside a white column of profile, roles and projects.", "sidebar", "navy"); + cv("cv-navy-sidebar-v2", "NavySidebarExample", "Navy Sidebar", "Navy plate with a ringed portrait, contact marks, degrees, skills and languages, beside a white column of summary, badged sections and roles strung on a timeline rail.", "sidebar", "navy", "portrait"); // ===== Templates / Cover Letter (v2 layered, paired 1:1 with CV) ===== // Registered directly: letter() points at the layered preset examples under diff --git a/examples/src/main/java/com/demcha/examples/templates/cv/v2/NavySidebarExample.java b/examples/src/main/java/com/demcha/examples/templates/cv/v2/NavySidebarExample.java new file mode 100644 index 000000000..25a43f09e --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/cv/v2/NavySidebarExample.java @@ -0,0 +1,52 @@ +package com.demcha.examples.templates.cv.v2; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.cv.data.CvDocument; +import com.demcha.compose.document.templates.cv.presets.NavySidebar; +import com.demcha.examples.support.ExampleOutputPaths; +import com.demcha.examples.support.NavySidebarSampleData; + +import java.nio.file.Path; + +/** + * Renders the layered {@code cv.v2} Navy Sidebar preset against the + * marketing-manager sample. + * + *

Output: + * {@code examples/target/generated-pdfs/templates/cv/cv-navy-sidebar-v2.pdf}.

+ * + *

The preset owns its page — A4 with no margin, the navy plate painted as + * a page background — so the session starts unconfigured.

+ */ +public final class NavySidebarExample { + + private NavySidebarExample() { + } + + /** + * @return absolute path of the rendered PDF + * @throws Exception if rendering fails + */ + public static Path generate() throws Exception { + Path outputFile = ExampleOutputPaths.prepare( + "templates/cv", "cv-navy-sidebar-v2.pdf"); + CvDocument doc = NavySidebarSampleData.sample(); + DocumentTemplate template = NavySidebar.create(); + + try (DocumentSession document = GraphCompose.document(outputFile).create()) { + template.compose(document, doc); + document.buildPdf(); + } + return outputFile; + } + + /** + * @param args ignored + * @throws Exception if rendering fails + */ + public static void main(String[] args) throws Exception { + System.out.println("Generated: " + generate()); + } +} diff --git a/examples/src/main/resources/cv-portrait-placeholder.png b/examples/src/main/resources/cv-portrait-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..8c58ba4d80782c514213facb37a819fd8ededdc0 GIT binary patch literal 2274 zcmbtVeN0nV6hH6v^@9SX6~#_a3RPi>(4oPa5hz$is0#BV71!wl#-6NMx zQE1$vEJU2cO*aA+vXPQ?^C>7OL_jx36!j^nIESf55@dk8@3lR;uYYl_>2nmn(mnC zb&`Lv`(SLcf$3dm8xn8JdhY{6L_jhx@)qfR03nB%mBf$FR;uNucDfBn;al z1kXX`P~?aeL*4L9?ZT(mf>%%ug8t+7aweGdhD$eU&}?YY+DLv8za8k~so_l_s+O89 zGV&8B8TOM?P~RMx4|I0wLOFPa8Kfk7Co@d}1{9RJQ30B=ut*X_pMNtSm<2T~&TIaG zi3DUc-BN>6*FjQHF80T~J@ngh018@5JH}FA5xr{xx`DRvw&a5yQz^(0mhR+QAn)sj z13{pi(xIgQ2xjTgUI76*a1O5VjpG=i=UhqRcV?=i#&SC#hevgAbr0{nxZzH)tBZ6o z3c66ic>tjb6rX5+R_E@YG`0S2SD?@q#o2Gw|EZ#NwYcFjHa~Owe@HTImosZ6wUhoK z$HCnx-bWo9xLn-JdCIH%xQuyH-7lUQ<)d;v;|^*~rlQ7E*dvT6^IbRH-Dll7gzL+l zExRlA-1kS%N%!U5TZ=nl_{&*3IZ8$_p{MXw;s|A-)u|FVE3Nh5!aFwBbb)ealP2i$h&m;h&tof5Gs$T#B>T^rfKxTnXS|OdNz^xHBl|YLZ zZkblnhd<;=D~m6Lue$4|UlP8Y4=Ucgl6>&t=H8RTxmC^CX?1vrMN}X~gb&spFU|s+ z7{mTe=sBJ8lI3+uKPbnNy%U2aI~qP#WA(bMJe(hk)$2Oof}^Y>kjeEi&;ypPo8FM? z@4!{WCshIxwHJF?4-@o2mkRI9_Op@vjxL5s8|W(G4v(>sxFU}mPu2Uw$EsCAeC_v& z%Xb5N{-$n!vd+G?J4b#UG((^26<}=s?R4Cf!>BW~>8{E_lnk>y!B8dFGTpw`Qo)me z9kbz5V8B|6Sx$)k33DRz&<{*L<|ZMG7X8=x=fRXrm>qC%83cqe%g5nvVrB~2(^6DV*=zYD zMPOP*m=PFP@GLSmn41*nn8BejlahbpQv^6U|QH z2O!RH`XpM<3HhsD6vvAm2l!E@3Fl}qqoa-3waYbdkZ}&vGr~F~*68>nbSLx=3zTY1 z%!rV%U3t!&PYAOv@3tkw>f UO=fRhr~v#+oVQqC6;J2?4VxM_Bme*a literal 0 HcmV?d00001 diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/data/CvIdentityPortraitTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/data/CvIdentityPortraitTest.java new file mode 100644 index 000000000..4a275da64 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/data/CvIdentityPortraitTest.java @@ -0,0 +1,75 @@ +package com.demcha.compose.document.templates.cv.data; + +import com.demcha.compose.document.image.DocumentImageData; +import com.demcha.compose.document.templates.core.identity.Contact; +import com.demcha.compose.document.templates.core.identity.Link; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Pins the compatibility promise made when {@link CvIdentity} grew a + * portrait: the constructors that predate the component are still there and + * still mean what they meant, so a caller written against the four-argument + * form keeps compiling and linking. + */ +class CvIdentityPortraitTest { + + private static final Contact CONTACT = + new Contact("+44 20 7946 0000", "ada@example.com", "London, UK"); + + @Test + void theConstructorThatPredatesThePortraitLeavesItEmpty() { + CvIdentity identity = new CvIdentity( + CvName.of("Ada", "Lovelace"), "Analyst", CONTACT, + List.of(new Link("site", "https://example.com"))); + assertThat(identity.portrait()).isEmpty(); + assertThat(identity.jobTitle()).isEqualTo("Analyst"); + } + + @Test + void theConstructorThatPredatesTheJobTitleLeavesBothEmpty() { + CvIdentity identity = new CvIdentity( + CvName.of("Ada", "Lovelace"), CONTACT, List.of()); + assertThat(identity.portrait()).isEmpty(); + assertThat(identity.jobTitle()).isEmpty(); + } + + @Test + void aNullPortraitNormalizesToAbsent() { + CvIdentity identity = new CvIdentity( + CvName.of("Ada", "Lovelace"), "Analyst", CONTACT, List.of(), null); + assertThat(identity.portrait()).isEmpty(); + } + + @Test + void theBuilderCarriesThePortraitThrough() { + DocumentImageData image = DocumentImageData.fromBytes(onePixelPng()); + CvIdentity identity = CvIdentity.builder() + .name("Ada", "Lovelace") + .contact(CONTACT) + .portrait(image) + .build(); + assertThat(identity.portrait()).isEqualTo(Optional.of(image)); + } + + @Test + void theBuilderTreatsANullPortraitAsNone() { + CvIdentity identity = CvIdentity.builder() + .name("Ada", "Lovelace") + .contact(CONTACT) + .portrait(null) + .build(); + assertThat(identity.portrait()).isEmpty(); + } + + /** The smallest valid PNG: one opaque pixel. */ + private static byte[] onePixelPng() { + return java.util.Base64.getDecoder().decode( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmM" + + "IQAAAABJRU5ErkJggg=="); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarFixtures.java new file mode 100644 index 000000000..923ebec22 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarFixtures.java @@ -0,0 +1,166 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.image.DocumentImageData; +import com.demcha.compose.document.templates.core.identity.Contact; +import com.demcha.compose.document.templates.core.identity.Link; +import com.demcha.compose.document.templates.cv.data.CvDocument; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; +import com.demcha.compose.document.templates.cv.data.RowStyle; +import com.demcha.compose.document.templates.cv.data.RowsSection; +import com.demcha.compose.document.templates.cv.data.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +import com.demcha.compose.document.templates.cv.data.Slot; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UncheckedIOException; + +import javax.imageio.ImageIO; + +/** + * The canonical fixture for {@link NavySidebar} — the document the design was + * drawn around, and the one both gates measure. + * + *

One fixture feeds the layout snapshot and the pixel baseline, so a + * change that moves the sheet moves both together instead of leaving one + * gate measuring a document the other no longer renders.

+ * + *

The portrait is drawn here rather than committed: a photograph in the + * repository would be a licensed asset guarding a layout, and what the gates + * need is only that the disc has something in it. It is deterministic, so + * the pixel baseline is stable.

+ */ +public final class NavySidebarFixtures { + + private NavySidebarFixtures() { + } + + /** + * The canonical CV: a portrait, four contact channels, two degrees, eight + * skills, three languages, three roles, three achievements and three + * certifications — one page. + * + * @return the fixture document + */ + public static CvDocument canonicalCv() { + return CvDocument.builder() + .identity(CvIdentity.builder() + .name("Olivia", "Martinez") + .jobTitle("Marketing Manager") + .contact(new Contact("+1 (555) 123-4567", + "your.email@gmail.com", + "New York, NY, USA")) + .link(new Link("linkedin.com/in/yourname", + "https://linkedin.com/in/yourname")) + .portrait(portrait()) + .build()) + .section(Slot.MAIN, new ParagraphSection("SUMMARY", + "Results-driven marketing professional with 5+ years of experience" + + " developing and executing data-driven marketing strategies" + + " that drive brand growth, increase engagement, and deliver" + + " measurable results. Skilled in digital marketing, market" + + " research, and cross-functional collaboration.")) + .section(Slot.SIDEBAR, EntriesSection.builder("Education") + .entry("Master of Science in Marketing", "New York University", + "2020 - 2022", "New York, NY") + .entry("Bachelor of Business Administration", "University of California", + "2016 - 2020", "Los Angeles, CA") + .build()) + .section(Slot.SIDEBAR, SkillsSection.of("Skills", SkillGroup.of("Core", + "Digital Marketing", + "Data Analysis", + "Project Management", + "SEO / SEM", + "Microsoft Office Suite", + "Google Analytics", + "Social Media Strategy", + "Content Marketing"))) + .section(Slot.SIDEBAR, RowsSection.builder("Languages", RowStyle.PLAIN) + .row("English", "Native") + .row("Spanish", "Advanced") + .row("French", "Intermediate") + .build()) + .section(Slot.MAIN, EntriesSection.builder("Experience") + .entry("Marketing Manager", + "BrightWave Solutions, New York, NY", + "Jan 2022 - Present", + String.join("\n", + "Develop and implement integrated marketing campaigns" + + " that increased brand awareness by 35% and" + + " lead generation by 50%.", + "Manage a team of 4 marketing specialists and" + + " collaborate with sales, product, and design" + + " teams to align strategies.", + "Analyze campaign performance using Google Analytics" + + " and other tools to optimize ROI and" + + " reporting.")) + .entry("Marketing Specialist", + "BrightWave Solutions, New York, NY", + "Jun 2020 - Dec 2021", + String.join("\n", + "Executed digital marketing campaigns across SEO, PPC," + + " email, and social media channels.", + "Conducted market research and competitor analysis to" + + " identify opportunities and inform strategy.", + "Created engaging content for blogs, newsletters, and" + + " social media that increased engagement by" + + " 40%.")) + .entry("Marketing Intern", + "BrightWave Solutions, New York, NY", + "Jan 2020 - May 2020", + String.join("\n", + "Assisted in planning and executing marketing" + + " initiatives and events.", + "Supported content creation and social media" + + " management.", + "Analyzed data and prepared reports to support the" + + " marketing team.")) + .build()) + .section(Slot.MAIN, new ParagraphSection("Achievements", String.join("\n", + "Increased website traffic by 60% within one year through SEO and" + + " content strategy.", + "Launched a successful email marketing campaign with a 25% conversion" + + " rate.", + "Received \u201cEmployee of the Year\u201d award in 2023 for outstanding" + + " performance."))) + .section(Slot.MAIN, new ParagraphSection("Certifications", String.join("\n", + "Google Analytics Individual Qualification (GAIQ)", + "HubSpot Content Marketing Certification", + "Facebook Blueprint Certification"))) + .build(); + } + + /** + * A flat two-tone silhouette, drawn at fixture time. + * + * @return the portrait image data + */ + static DocumentImageData portrait() { + BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(new Color(222, 226, 231)); + g.fillRect(0, 0, 512, 512); + g.setColor(new Color(150, 160, 173)); + g.fillOval(171, 102, 169, 169); + g.fillOval(67, 307, 379, 379); + } finally { + g.dispose(); + } + ByteArrayOutputStream png = new ByteArrayOutputStream(); + try { + ImageIO.write(image, "png", png); + } catch (IOException e) { + throw new UncheckedIOException("Failed to draw the fixture portrait", e); + } + return DocumentImageData.fromBytes(png.toByteArray()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarLayoutSnapshotTest.java new file mode 100644 index 000000000..5af914f79 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarLayoutSnapshotTest.java @@ -0,0 +1,29 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.TemplateTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Exact layout snapshot gate for {@link NavySidebar} - freezes the resolved + * geometry of the canonical one-page CV, which is what catches a shift the + * pixel budget is too coarse to see. + * + *

Refresh with {@code -Dgraphcompose.updateSnapshots=true} after a + * deliberate layout change, and commit the JSON with the change.

+ */ +class NavySidebarLayoutSnapshotTest { + + @Test + void canonicalCvMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + NavySidebar.create().compose(session, NavySidebarFixtures.canonicalCv()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "navy_sidebar_layout", "cv-v2"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarSmokeTest.java new file mode 100644 index 000000000..58322a979 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarSmokeTest.java @@ -0,0 +1,185 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.exceptions.AtomicNodeTooLargeException; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.core.identity.Contact; +import com.demcha.compose.document.templates.core.identity.Link; +import com.demcha.compose.document.templates.cv.data.CvDocument; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.CvSkill; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; +import com.demcha.compose.document.templates.cv.data.RowStyle; +import com.demcha.compose.document.templates.cv.data.RowsSection; +import com.demcha.compose.document.templates.cv.data.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +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.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Smoke test for {@link NavySidebar} — proves the preset renders a + * {@link CvDocument} end-to-end with its packaged marks and the portrait + * from the identity, composes without one, and pins the limits the class + * documents: the sheet holds one page, and the fields this design has no + * place for are not drawn. + */ +class NavySidebarSmokeTest { + + private static byte[] render(CvDocument doc) throws Exception { + // The preset owns its page geometry, so the session starts unconfigured. + try (DocumentSession session = GraphCompose.document().create()) { + NavySidebar.create().compose(session, doc); + assertThat(session.roots()).isNotEmpty(); + byte[] pdfBytes = session.toPdfBytes(); + assertThat(pdfBytes).isNotEmpty(); + return pdfBytes; + } + } + + private static String textOf(byte[] pdfBytes) throws Exception { + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + return new PDFTextStripper().getText(document); + } + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = NavySidebar.create(); + assertThat(template.id()).isEqualTo(NavySidebar.ID); + assertThat(template.displayName()).isEqualTo(NavySidebar.DISPLAY_NAME); + } + + @Test + void canonicalRenderCarriesTheUntrackedText() throws Exception { + // The headings, the name and the role are set letter by letter to + // reach their tracking, so they arrive on the text layer spaced out. + // What is asserted here is the text drawn as written. + String text = textOf(render(NavySidebarFixtures.canonicalCv())); + assertThat(text) + .contains("your.email@gmail.com") + .contains("New York, NY, USA") + .contains("linkedin.com/in/yourname") + .contains("Results-driven marketing professional") + .contains("New York University") + .contains("Digital Marketing") + .contains("Native") + .contains("BrightWave Solutions, New York, NY") + .contains("Increased website traffic by 60%") + .contains("HubSpot Content Marketing Certification"); + } + + @Test + void rendersOneCanonicalPage() throws Exception { + try (PDDocument document = + Loader.loadPDF(render(NavySidebarFixtures.canonicalCv()))) { + assertThat(document.getNumberOfPages()).isEqualTo(1); + } + } + + @Test + void rendersWithoutAPortraitOrAJobTitle() throws Exception { + // No photograph: the ring is drawn around an empty navy disc rather + // than left as a hole in the column. And no role: that line is + // written letter by letter to reach its tracking, so a blank one + // reaches the engine as a paragraph holding no runs at all. + String text = textOf(render(CvDocument.builder() + .identity(CvIdentity.builder() + .name("Ada", "Lovelace") + .contact(new Contact("+44 20 7946 0000", "empty@example.com", + "London, UK")) + .build()) + .build())); + assertThat(text).contains("empty@example.com"); + } + + @Test + void degreesAndTitlesAreDrawnInCapitals() throws Exception { + // This design upper-cases for the author — the name, the role, each + // degree and every heading — so a document written in title case + // still reads as the sheet it is. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(EntriesSection.builder("Education") + .entry("Master of Science", "Some University", "2019", "Berlin") + .build()) + .build())); + assertThat(text).contains("MASTER OF SCIENCE").doesNotContain("Master of Science"); + } + + @Test + void drawsNothingTheDesignHasNoPlaceFor() throws Exception { + // A berth is filled once, and this sheet has nowhere to put a skill + // level, a group category or the summary's own title. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(new ParagraphSection("Summary title here", "The opening paragraph.")) + .section(SkillsSection.of("Skills", + new SkillGroup("Category name here", List.of(CvSkill.of("Java", 0.8))))) + .section(new ParagraphSection("Achievements", "Shipped a thing.")) + .section(new ParagraphSection("More achievements", "Second block here.")) + .build())); + assertThat(text) + .contains("The opening paragraph.") + .contains("Java") + .contains("Shipped a thing.") + .doesNotContain("Summary title here") + .doesNotContain("Category name here") + .doesNotContain("Second block here."); + } + + @Test + void writesTheProficiencyTheDocumentCarries() throws Exception { + // Languages are rows rather than levelled skills precisely so the + // words survive; the row style is not read. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(RowsSection.builder("Languages", RowStyle.BULLETED_STACKED) + .row("Portuguese", "Conversational") + .build()) + .build())); + assertThat(text).contains("Portuguese").contains("Conversational"); + } + + @Test + void refusesACvLongerThanTheSheet() { + // The sheet holds one page: the two columns are a single row, and a + // row is atomic. A CV past that raises rather than flowing. + EntriesSection.Builder experience = EntriesSection.builder("Experience"); + for (int i = 0; i < 14; i++) { + experience.entry("Role " + i, "Employer " + i + ", City", "2010 - 2011", + String.join("\n", + "Did a substantial thing that took a full line of text here.", + "Did a second substantial thing, also a full line of text.", + "And a third, so each role occupies real vertical space.")); + } + CvDocument doc = CvDocument.builder() + .identity(identity()) + .section(experience.build()) + .build(); + try (DocumentSession session = GraphCompose.document().create()) { + NavySidebar.create().compose(session, doc); + assertThatThrownBy(session::toPdfBytes) + .isInstanceOf(AtomicNodeTooLargeException.class) + .hasMessageContaining("PageGrid"); + } + } + + private static CvIdentity identity() { + return CvIdentity.builder() + .name("Ada", "Lovelace") + .jobTitle("Analyst") + .contact(new Contact("+44 20 7946 0000", "empty@example.com", "London, UK")) + .link(new Link("linkedin.com/in/ada", "https://linkedin.com/in/ada")) + .portrait(NavySidebarFixtures.portrait()) + .build(); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarVisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarVisualParityTest.java new file mode 100644 index 000000000..e5dc3d6e1 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NavySidebarVisualParityTest.java @@ -0,0 +1,41 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.testing.visual.PdfVisualRegression; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +/** + * Pixel-diff visual parity gate for {@link NavySidebar} - the canonical + * one-page CV against a checked-in baseline. + * + *

Re-blessing baselines - after a deliberate visual + * change, re-run with {@code -Dgraphcompose.visual.approve=true} and commit + * the updated PNG with the change. Baselines live under + * {@code src/test/resources/visual-baselines/cv-v2-layered/}.

+ */ +class NavySidebarVisualParityTest { + + private static final Path BASELINE_ROOT = Path.of( + "src", "test", "resources", "visual-baselines", "cv-v2-layered"); + + private static final long PIXEL_DIFF_BUDGET = 50_000L; + private static final int PER_PIXEL_TOLERANCE = 8; + + @Test + void rendersWithinPixelDiffBudget() throws Exception { + byte[] pdfBytes; + try (DocumentSession document = GraphCompose.document().create()) { + NavySidebar.create().compose(document, NavySidebarFixtures.canonicalCv()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("navy_sidebar", pdfBytes); + } +} 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 new file mode 100644 index 000000000..fe432c744 --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/navy_sidebar_layout.json @@ -0,0 +1,2627 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 595.276, + "innerHeight" : 841.89, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "NavySidebarCv[0]", + "entityName" : "NavySidebarCv", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : 1.125, + "placementX" : 0.0, + "placementY" : 1.125, + "placementWidth" : 595.276, + "placementHeight" : 840.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.276, + "contentHeight" : 840.765, + "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" : "NavySidebarCv[0]/PageGrid[0]", + "entityName" : "PageGrid", + "entityKind" : "RowNode", + "parentPath" : "NavySidebarCv[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 0.0, + "computedY" : 1.125, + "placementX" : 0.0, + "placementY" : 1.125, + "placementWidth" : 595.276, + "placementHeight" : 840.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.276, + "contentHeight" : 840.765, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "entityName" : "Sidebar", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 48.043, + "placementX" : 0.0, + "placementY" : 48.043, + "placementWidth" : 176.797, + "placementHeight" : 793.847, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.797, + "contentHeight" : 793.847, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 25.0, + "right" : 26.5, + "bottom" : 36.5, + "left" : 26.5 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]", + "entityName" : "Avatar", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 26.5, + "computedY" : 667.893, + "placementX" : 26.5, + "placementY" : 667.893, + "placementWidth" : 123.797, + "placementHeight" : 148.997, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 148.997, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 22.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]/AvatarRing[0]", + "entityName" : "AvatarRing", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 689.893, + "placementX" : 26.5, + "placementY" : 689.893, + "placementWidth" : 126.997, + "placementHeight" : 126.997, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 126.997, + "contentHeight" : 126.997, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]/AvatarRing[0]/AvatarCircle[0]", + "entityName" : "AvatarCircle", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]/AvatarRing[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 28.1, + "computedY" : 691.493, + "placementX" : 28.1, + "placementY" : 691.493, + "placementWidth" : 123.797, + "placementHeight" : 123.797, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 123.797, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]/AvatarRing[0]/AvatarCircle[0]/AvatarPhoto[0]", + "entityName" : "AvatarPhoto", + "entityKind" : "ImageNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Avatar[0]/AvatarRing[0]/AvatarCircle[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 28.1, + "computedY" : 691.493, + "placementX" : 28.1, + "placementY" : 691.493, + "placementWidth" : 123.797, + "placementHeight" : 123.797, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 123.797, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "entityName" : "Contact", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 26.5, + "computedY" : 550.093, + "placementX" : 26.5, + "placementY" : 550.093, + "placementWidth" : 123.797, + "placementHeight" : 117.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 117.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/SidebarHeading_Contact[0]", + "entityName" : "SidebarHeading_Contact", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 653.493, + "placementX" : 26.5, + "placementY" : 653.493, + "placementWidth" : 69.473, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 69.473, + "contentHeight" : 14.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/SidebarRule_Contact[1]", + "entityName" : "SidebarRule_Contact", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 645.493, + "placementX" : 26.5, + "placementY" : 645.493, + "placementWidth" : 123.797, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 1.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/Contact_phone[2]", + "entityName" : "Contact_phone", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 624.693, + "placementX" : 26.5, + "placementY" : 624.693, + "placementWidth" : 92.314, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 92.314, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/Contact_email[3]", + "entityName" : "Contact_email", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 603.393, + "placementX" : 26.5, + "placementY" : 603.393, + "placementWidth" : 105.31, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 105.31, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/Contact_location[4]", + "entityName" : "Contact_location", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 581.893, + "placementX" : 26.5, + "placementY" : 581.893, + "placementWidth" : 96.275, + "placementHeight" : 11.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 96.275, + "contentHeight" : 11.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]/Contact_linkedin[5]", + "entityName" : "Contact_linkedin", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Contact[1]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 560.593, + "placementX" : 26.5, + "placementY" : 560.593, + "placementWidth" : 122.217, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 122.217, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "entityName" : "Education", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 26.5, + "computedY" : 348.993, + "placementX" : 26.5, + "placementY" : 348.993, + "placementWidth" : 123.797, + "placementHeight" : 201.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 201.1, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/SidebarHeading_Education[0]", + "entityName" : "SidebarHeading_Education", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 517.693, + "placementX" : 26.5, + "placementY" : 517.693, + "placementWidth" : 86.807, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.807, + "contentHeight" : 14.4, + "margin" : { + "top" : 18.0, + "right" : 0.0, + "bottom" : 7.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/SidebarRule_Education[1]", + "entityName" : "SidebarRule_Education", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 509.693, + "placementX" : 26.5, + "placementY" : 509.693, + "placementWidth" : 123.797, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 1.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Degree_MasterofScienceinMarketing[2]", + "entityName" : "Degree_MasterofScienceinMarketing", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 476.743, + "placementX" : 26.5, + "placementY" : 476.743, + "placementWidth" : 101.421, + "placementHeight" : 22.95, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 101.421, + "contentHeight" : 22.95, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Institution_MasterofScienceinMarketing[3]", + "entityName" : "Institution_MasterofScienceinMarketing", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 461.943, + "placementX" : 26.5, + "placementY" : 461.943, + "placementWidth" : 82.287, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.287, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 1.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Campus_MasterofScienceinMarketing[4]", + "entityName" : "Campus_MasterofScienceinMarketing", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 449.643, + "placementX" : 26.5, + "placementY" : 449.643, + "placementWidth" : 56.412, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.412, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 1.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Years_MasterofScienceinMarketing[5]", + "entityName" : "Years_MasterofScienceinMarketing", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 437.343, + "placementX" : 26.5, + "placementY" : 437.343, + "placementWidth" : 49.716, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.716, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 13.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Degree_BachelorofBusinessAdministration[6]", + "entityName" : "Degree_BachelorofBusinessAdministration", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 401.393, + "placementX" : 26.5, + "placementY" : 401.393, + "placementWidth" : 106.965, + "placementHeight" : 22.95, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 106.965, + "contentHeight" : 22.95, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Institution_BachelorofBusinessAdministration[7]", + "entityName" : "Institution_BachelorofBusinessAdministration", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 386.593, + "placementX" : 26.5, + "placementY" : 386.593, + "placementWidth" : 91.242, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 91.242, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 1.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Campus_BachelorofBusinessAdministration[8]", + "entityName" : "Campus_BachelorofBusinessAdministration", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 8, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 374.293, + "placementX" : 26.5, + "placementY" : 374.293, + "placementWidth" : 63.702, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 63.702, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 1.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]/Years_BachelorofBusinessAdministration[9]", + "entityName" : "Years_BachelorofBusinessAdministration", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Education[2]", + "childIndex" : 9, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 361.993, + "placementX" : 26.5, + "placementY" : 361.993, + "placementWidth" : 49.716, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.716, + "contentHeight" : 10.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 13.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]", + "entityName" : "Skills", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 26.5, + "computedY" : 195.393, + "placementX" : 26.5, + "placementY" : 195.393, + "placementWidth" : 123.797, + "placementHeight" : 153.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 153.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]/SidebarHeading_Skills[0]", + "entityName" : "SidebarHeading_Skills", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 316.593, + "placementX" : 26.5, + "placementY" : 316.593, + "placementWidth" : 47.366, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.366, + "contentHeight" : 14.4, + "margin" : { + "top" : 18.0, + "right" : 0.0, + "bottom" : 7.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]/SidebarRule_Skills[1]", + "entityName" : "SidebarRule_Skills", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 308.593, + "placementX" : 26.5, + "placementY" : 308.593, + "placementWidth" : 123.797, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 1.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]/SkillsList[2]", + "entityName" : "SkillsList", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Skills[3]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 195.393, + "placementX" : 26.5, + "placementY" : 195.393, + "placementWidth" : 95.517, + "placementHeight" : 103.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.517, + "contentHeight" : 103.2, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "entityName" : "Languages", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 26.5, + "computedY" : 84.543, + "placementX" : 26.5, + "placementY" : 84.543, + "placementWidth" : 123.797, + "placementHeight" : 110.85, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 110.85, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/SidebarHeading_Languages[0]", + "entityName" : "SidebarHeading_Languages", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 162.993, + "placementX" : 26.5, + "placementY" : 162.993, + "placementWidth" : 87.863, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 87.863, + "contentHeight" : 14.4, + "margin" : { + "top" : 18.0, + "right" : 0.0, + "bottom" : 7.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/SidebarRule_Languages[1]", + "entityName" : "SidebarRule_Languages", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 148.993, + "placementX" : 26.5, + "placementY" : 148.993, + "placementWidth" : 123.797, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 1.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_English[2]", + "entityName" : "LanguageRow_English", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 120.843, + "placementX" : 26.5, + "placementY" : 120.843, + "placementWidth" : 123.797, + "placementHeight" : 12.15, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 12.15, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_English[2]/Language_English[0]", + "entityName" : "Language_English", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_English[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 26.5, + "computedY" : 121.518, + "placementX" : 26.5, + "placementY" : 121.518, + "placementWidth" : 35.115, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 35.115, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_English[2]/Proficiency_English[1]", + "entityName" : "Proficiency_English", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_English[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 77.257, + "computedY" : 121.518, + "placementX" : 77.257, + "placementY" : 121.518, + "placementWidth" : 38.268, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 38.268, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_Spanish[3]", + "entityName" : "LanguageRow_Spanish", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 102.693, + "placementX" : 26.5, + "placementY" : 102.693, + "placementWidth" : 123.797, + "placementHeight" : 12.15, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 12.15, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_Spanish[3]/Language_Spanish[0]", + "entityName" : "Language_Spanish", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_Spanish[3]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 26.5, + "computedY" : 103.368, + "placementX" : 26.5, + "placementY" : 103.368, + "placementWidth" : 37.518, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 37.518, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_Spanish[3]/Proficiency_Spanish[1]", + "entityName" : "Proficiency_Spanish", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_Spanish[3]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 77.257, + "computedY" : 103.368, + "placementX" : 77.257, + "placementY" : 103.368, + "placementWidth" : 51.498, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.498, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_French[4]", + "entityName" : "LanguageRow_French", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 26.5, + "computedY" : 84.543, + "placementX" : 26.5, + "placementY" : 84.543, + "placementWidth" : 123.797, + "placementHeight" : 12.15, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.797, + "contentHeight" : 12.15, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_French[4]/Language_French[0]", + "entityName" : "Language_French", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_French[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 26.5, + "computedY" : 85.218, + "placementX" : 26.5, + "placementY" : 85.218, + "placementWidth" : 34.476, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.476, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_French[4]/Proficiency_French[1]", + "entityName" : "Proficiency_French", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Sidebar[0]/Languages[4]/LanguageRow_French[4]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 77.257, + "computedY" : 85.218, + "placementX" : 77.257, + "placementY" : 85.218, + "placementWidth" : 62.748, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 62.748, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "entityName" : "Main", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 176.797, + "computedY" : 1.125, + "placementX" : 176.797, + "placementY" : 1.125, + "placementWidth" : 418.479, + "placementHeight" : 840.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 418.479, + "contentHeight" : 840.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 30.0, + "right" : 36.5, + "bottom" : 36.5, + "left" : 25.4 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "entityName" : "Identity", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 737.69, + "placementX" : 202.197, + "placementY" : 737.69, + "placementWidth" : 255.99, + "placementHeight" : 74.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.99, + "contentHeight" : 74.2, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/Name[0]", + "entityName" : "Name", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 775.89, + "placementX" : 202.197, + "placementY" : 775.89, + "placementWidth" : 255.99, + "placementHeight" : 36.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.99, + "contentHeight" : 36.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 6.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/Role[1]", + "entityName" : "Role", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 753.69, + "placementX" : 202.197, + "placementY" : 753.69, + "placementWidth" : 187.31, + "placementHeight" : 16.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 187.31, + "contentHeight" : 16.2, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 16.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Summary[1]", + "entityName" : "Summary", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 683.45, + "placementX" : 202.197, + "placementY" : 683.45, + "placementWidth" : 346.217, + "placementHeight" : 54.24, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 346.217, + "contentHeight" : 54.24, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Summary[1]/Summary[0]", + "entityName" : "Summary", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Summary[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 683.45, + "placementX" : 202.197, + "placementY" : 683.45, + "placementWidth" : 346.217, + "placementHeight" : 54.24, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 346.217, + "contentHeight" : 54.24, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/SectionRule[2]", + "entityName" : "SectionRule", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 666.45, + "placementX" : 202.197, + "placementY" : 666.45, + "placementWidth" : 356.579, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 1.0, + "margin" : { + "top" : 16.0, + "right" : 0.0, + "bottom" : 15.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]", + "entityName" : "Experience", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 258.175, + "placementX" : 202.197, + "placementY" : 258.175, + "placementWidth" : 356.579, + "placementHeight" : 393.275, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 393.275, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]", + "entityName" : "SectionHeader_Experience", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 628.85, + "placementX" : 202.197, + "placementY" : 628.85, + "placementWidth" : 356.579, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]/Badge_Experience[0]", + "entityName" : "Badge_Experience", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 202.197, + "computedY" : 628.85, + "placementX" : 202.197, + "placementY" : 628.85, + "placementWidth" : 22.6, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.6, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]/Badge_Experience[0]/BadgeGlyph_Experience[0]", + "entityName" : "BadgeGlyph_Experience", + "entityKind" : "ImageNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]/Badge_Experience[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 207.847, + "computedY" : 634.5, + "placementX" : 207.847, + "placementY" : 634.5, + "placementWidth" : 11.3, + "placementHeight" : 11.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.3, + "contentHeight" : 11.3, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]/SectionTitle_Experience[1]", + "entityName" : "SectionTitle_Experience", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/SectionHeader_Experience[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 632.95, + "placementX" : 232.097, + "placementY" : 632.95, + "placementWidth" : 89.402, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 89.402, + "contentHeight" : 14.4, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "entityName" : "ExperienceRail", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 213.097, + "computedY" : 327.937, + "placementX" : 213.097, + "placementY" : 327.937, + "placementWidth" : 345.679, + "placementHeight" : 285.55, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 285.55, + "margin" : { + "top" : 15.363, + "right" : 0.0, + "bottom" : 0.0, + "left" : 10.9 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]", + "entityName" : "EntryHead_MarketingManager", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 213.097, + "computedY" : 606.687, + "placementX" : 213.097, + "placementY" : 606.687, + "placementWidth" : 345.679, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]/Marker_MarketingManager[0]", + "entityName" : "Marker_MarketingManager", + "entityKind" : "EllipseNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 209.697, + "computedY" : 606.687, + "placementX" : 209.697, + "placementY" : 606.687, + "placementWidth" : 6.8, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 6.8, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]/JobTitle_MarketingManager[1]", + "entityName" : "JobTitle_MarketingManager", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 232.097, + "computedY" : 604.05, + "placementX" : 232.097, + "placementY" : 604.05, + "placementWidth" : 129.157, + "placementHeight" : 13.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 129.157, + "contentHeight" : 13.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]/JobDates_MarketingManager[2]", + "entityName" : "JobDates_MarketingManager", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingManager[0]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 213.097, + "computedY" : 605.362, + "placementX" : 213.097, + "placementY" : 605.362, + "placementWidth" : 345.679, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/Employer_MarketingManager[1]", + "entityName" : "Employer_MarketingManager", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 588.525, + "placementX" : 232.097, + "placementY" : 588.525, + "placementWidth" : 146.997, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 146.997, + "contentHeight" : 10.8, + "margin" : { + "top" : 7.363, + "right" : 0.0, + "bottom" : 7.0, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/Highlights_MarketingManager[2]", + "entityName" : "Highlights_MarketingManager", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 500.475, + "placementX" : 232.097, + "placementY" : 500.475, + "placementWidth" : 313.803, + "placementHeight" : 81.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 313.803, + "contentHeight" : 81.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 26.363, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]", + "entityName" : "EntryHead_MarketingSpecialist", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 3, + "depth" : 6, + "layer" : 6, + "computedX" : 213.097, + "computedY" : 467.312, + "placementX" : 213.097, + "placementY" : 467.312, + "placementWidth" : 345.679, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]/Marker_MarketingSpecialist[0]", + "entityName" : "Marker_MarketingSpecialist", + "entityKind" : "EllipseNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 209.697, + "computedY" : 467.312, + "placementX" : 209.697, + "placementY" : 467.312, + "placementWidth" : 6.8, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 6.8, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]/JobTitle_MarketingSpecialist[1]", + "entityName" : "JobTitle_MarketingSpecialist", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 232.097, + "computedY" : 464.675, + "placementX" : 232.097, + "placementY" : 464.675, + "placementWidth" : 132.756, + "placementHeight" : 13.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.756, + "contentHeight" : 13.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]/JobDates_MarketingSpecialist[2]", + "entityName" : "JobDates_MarketingSpecialist", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingSpecialist[3]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 213.097, + "computedY" : 465.987, + "placementX" : 213.097, + "placementY" : 465.987, + "placementWidth" : 345.679, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/Employer_MarketingSpecialist[4]", + "entityName" : "Employer_MarketingSpecialist", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 4, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 449.15, + "placementX" : 232.097, + "placementY" : 449.15, + "placementWidth" : 146.997, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 146.997, + "contentHeight" : 10.8, + "margin" : { + "top" : 7.363, + "right" : 0.0, + "bottom" : 7.0, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/Highlights_MarketingSpecialist[5]", + "entityName" : "Highlights_MarketingSpecialist", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 5, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 361.1, + "placementX" : 232.097, + "placementY" : 361.1, + "placementWidth" : 324.765, + "placementHeight" : 81.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 324.765, + "contentHeight" : 81.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 26.363, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]", + "entityName" : "EntryHead_MarketingIntern", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]", + "childIndex" : 6, + "depth" : 6, + "layer" : 6, + "computedX" : 213.097, + "computedY" : 327.937, + "placementX" : 213.097, + "placementY" : 327.937, + "placementWidth" : 345.679, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]/Marker_MarketingIntern[0]", + "entityName" : "Marker_MarketingIntern", + "entityKind" : "EllipseNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 209.697, + "computedY" : 327.937, + "placementX" : 209.697, + "placementY" : 327.937, + "placementWidth" : 6.8, + "placementHeight" : 6.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 6.8, + "contentHeight" : 6.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]/JobTitle_MarketingIntern[1]", + "entityName" : "JobTitle_MarketingIntern", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 232.097, + "computedY" : 325.3, + "placementX" : 232.097, + "placementY" : 325.3, + "placementWidth" : 113.137, + "placementHeight" : 13.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 113.137, + "contentHeight" : 13.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]/JobDates_MarketingIntern[2]", + "entityName" : "JobDates_MarketingIntern", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceRail[1]/EntryHead_MarketingIntern[6]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 213.097, + "computedY" : 326.612, + "placementX" : 213.097, + "placementY" : 326.612, + "placementWidth" : 345.679, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 345.679, + "contentHeight" : 10.8, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceTail[2]", + "entityName" : "ExperienceTail", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 213.097, + "computedY" : 258.175, + "placementX" : 213.097, + "placementY" : 258.175, + "placementWidth" : 293.005, + "placementHeight" : 69.762, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 293.005, + "contentHeight" : 69.762, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 10.9 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceTail[2]/Employer_MarketingIntern[0]", + "entityName" : "Employer_MarketingIntern", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceTail[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 309.775, + "placementX" : 232.097, + "placementY" : 309.775, + "placementWidth" : 146.997, + "placementHeight" : 10.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 146.997, + "contentHeight" : 10.8, + "margin" : { + "top" : 7.363, + "right" : 0.0, + "bottom" : 7.0, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceTail[2]/Highlights_MarketingIntern[1]", + "entityName" : "Highlights_MarketingIntern", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Experience[3]/ExperienceTail[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 258.175, + "placementX" : 232.097, + "placementY" : 258.175, + "placementWidth" : 274.005, + "placementHeight" : 44.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 274.005, + "contentHeight" : 44.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 19.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/SectionRule[4]", + "entityName" : "SectionRule", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 241.175, + "placementX" : 202.197, + "placementY" : 241.175, + "placementWidth" : 356.579, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 1.0, + "margin" : { + "top" : 16.0, + "right" : 0.0, + "bottom" : 11.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]", + "entityName" : "Achievements", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 141.825, + "placementX" : 202.197, + "placementY" : 141.825, + "placementWidth" : 356.579, + "placementHeight" : 88.35, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 88.35, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]", + "entityName" : "SectionHeader_Achievements", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 207.575, + "placementX" : 202.197, + "placementY" : 207.575, + "placementWidth" : 356.579, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]/Badge_Achievements[0]", + "entityName" : "Badge_Achievements", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 202.197, + "computedY" : 207.575, + "placementX" : 202.197, + "placementY" : 207.575, + "placementWidth" : 22.6, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.6, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]/Badge_Achievements[0]/BadgeGlyph_Achievements[0]", + "entityName" : "BadgeGlyph_Achievements", + "entityKind" : "ImageNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]/Badge_Achievements[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 207.847, + "computedY" : 213.225, + "placementX" : 207.847, + "placementY" : 213.225, + "placementWidth" : 11.3, + "placementHeight" : 11.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.3, + "contentHeight" : 11.3, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]/SectionTitle_Achievements[1]", + "entityName" : "SectionTitle_Achievements", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/SectionHeader_Achievements[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 211.675, + "placementX" : 232.097, + "placementY" : 211.675, + "placementWidth" : 114.332, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 114.332, + "contentHeight" : 14.4, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]/AchievementsList[1]", + "entityName" : "AchievementsList", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Achievements[5]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 232.097, + "computedY" : 141.825, + "placementX" : 232.097, + "placementY" : 141.825, + "placementWidth" : 315.126, + "placementHeight" : 54.75, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 315.126, + "contentHeight" : 54.75, + "margin" : { + "top" : 11.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 29.9 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/SectionRule[6]", + "entityName" : "SectionRule", + "entityKind" : "LineNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 6, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 124.825, + "placementX" : 202.197, + "placementY" : 124.825, + "placementWidth" : 356.579, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 1.0, + "margin" : { + "top" : 16.0, + "right" : 0.0, + "bottom" : 11.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]", + "entityName" : "Certifications", + "entityKind" : "SectionNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 7, + "depth" : 4, + "layer" : 4, + "computedX" : 202.197, + "computedY" : 37.625, + "placementX" : 202.197, + "placementY" : 37.625, + "placementWidth" : 356.579, + "placementHeight" : 76.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 76.2, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]", + "entityName" : "SectionHeader_Certifications", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 202.197, + "computedY" : 91.225, + "placementX" : 202.197, + "placementY" : 91.225, + "placementWidth" : 356.579, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 356.579, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]/Badge_Certifications[0]", + "entityName" : "Badge_Certifications", + "entityKind" : "ShapeContainerNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 202.197, + "computedY" : 91.225, + "placementX" : 202.197, + "placementY" : 91.225, + "placementWidth" : 22.6, + "placementHeight" : 22.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.6, + "contentHeight" : 22.6, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]/Badge_Certifications[0]/BadgeGlyph_Certifications[0]", + "entityName" : "BadgeGlyph_Certifications", + "entityKind" : "ImageNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]/Badge_Certifications[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 207.847, + "computedY" : 96.875, + "placementX" : 207.847, + "placementY" : 96.875, + "placementWidth" : 11.3, + "placementHeight" : 11.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.3, + "contentHeight" : 11.3, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]/SectionTitle_Certifications[1]", + "entityName" : "SectionTitle_Certifications", + "entityKind" : "ParagraphNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/SectionHeader_Certifications[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 232.097, + "computedY" : 95.325, + "placementX" : 232.097, + "placementY" : 95.325, + "placementWidth" : 122.041, + "placementHeight" : 14.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 122.041, + "contentHeight" : 14.4, + "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" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]/CertificationsList[1]", + "entityName" : "CertificationsList", + "entityKind" : "ListNode", + "parentPath" : "NavySidebarCv[0]/PageGrid[0]/Main[1]/Certifications[7]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 232.097, + "computedY" : 37.625, + "placementX" : 232.097, + "placementY" : 37.625, + "placementWidth" : 197.037, + "placementHeight" : 42.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 197.037, + "contentHeight" : 42.6, + "margin" : { + "top" : 11.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 29.9 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/visual-baselines/cv-v2-layered/navy_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/navy_sidebar-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..efef4bc2801a77459f646fb399da4868504a0640 GIT binary patch literal 128892 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
X#=NUC3d-41%JEGgDvBjepg{ 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 links) + Contact contact, List links, + Optional portrait) implements PartyIdentity { /** * Validates that {@code name} and {@code contact} are non-null, - * trims a null {@code jobTitle} to empty, and defensively copies - * {@code links} (null becomes an empty list). + * trims a null {@code jobTitle} to empty, defensively copies + * {@code links} (null becomes an empty list), and treats a null + * {@code portrait} as absent. */ public CvIdentity { Objects.requireNonNull(name, "name"); jobTitle = jobTitle == null ? "" : jobTitle.trim(); Objects.requireNonNull(contact, "contact"); links = links == null ? List.of() : List.copyOf(links); + portrait = portrait == null ? Optional.empty() : portrait; + } + + /** + * Backward-compatible constructor for callers that predate the + * optional portrait. The identity simply carries no photograph. + * + * @param name structured name with first / last required and an + * optional middle component + * @param jobTitle optional professional title; blank when absent + * @param contact phone / email / address — all three required + * @param links ordered list of optional outbound links; never null + */ + public CvIdentity(CvName name, String jobTitle, + Contact contact, List links) { + this(name, jobTitle, contact, links, Optional.empty()); } /** @@ -51,7 +73,7 @@ public record CvIdentity(CvName name, String jobTitle, * @param links ordered list of optional outbound links; never null */ public CvIdentity(CvName name, Contact contact, List links) { - this(name, "", contact, links); + this(name, "", contact, links, Optional.empty()); } /** @@ -91,6 +113,7 @@ public static final class Builder { private String jobTitle = ""; private Contact contact; private final List links = new ArrayList<>(); + private DocumentImageData portrait; private Builder() { } @@ -190,13 +213,29 @@ public Builder link(String label, String url) { return this; } + /** + * Sets the candidate's photograph. Only the presets with a place + * for one draw it; the rest ignore it, so a document carrying a + * portrait still renders through every preset in the family. + * + * @param value the image data; null leaves the identity without a + * photograph + * @return this builder for chaining + * @since 2.2.3 + */ + public Builder portrait(DocumentImageData value) { + this.portrait = value; + return this; + } + /** * Builds the immutable {@link CvIdentity}. * * @return the assembled identity block */ public CvIdentity build() { - return new CvIdentity(name, jobTitle, contact, links); + return new CvIdentity(name, jobTitle, contact, links, + Optional.ofNullable(portrait)); } } } diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java new file mode 100644 index 000000000..f068bfc1c --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java @@ -0,0 +1,213 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.api.PageBackgroundFill; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.cv.components.SectionLookup; +import com.demcha.compose.document.templates.cv.data.CvDocument; +import com.demcha.compose.document.templates.cv.data.CvSection; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; +import com.demcha.compose.document.templates.cv.data.RowsSection; +import com.demcha.compose.document.templates.cv.data.SkillsSection; + +import java.util.List; +import java.util.Objects; + +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_WEIGHT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAVY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.PAGE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_WEIGHT; + +/** + * Navy Sidebar — a one-page A4 CV in two columns: a navy plate carrying a + * ringed portrait, the contact channels, the degrees, the skills and the + * languages, beside a white column carrying the name, the summary, the roles + * held on a timeline rail, the achievements and the certifications. + * + *

The preset owns its page: it sets A4 with no margin and paints the navy + * plate as a page background, so the column reaches the foot of the sheet + * whatever the sidebar holds.

+ * + *

One page, and what happens past it

+ * + *

This sheet holds one page of content. The two columns are a single row, + * and a row is atomic — it cannot be split — so a CV longer than the sheet + * does not flow onto a second page: composing it raises + * {@code AtomicNodeTooLargeException}, naming the node and the height it + * needed. It draws no cap of its own, because a CV that quietly loses a job + * is worse than one that refuses to compose. {@link TimelineMinimal} is the + * preset in this package that splits its own columns across pages.

+ * + *

How a document reaches its berth

+ * + *

The columns are fixed, so the preset assigns each section a berth by + * title rather than reading {@link + * com.demcha.compose.document.templates.cv.data.Slot}: summary, experience, + * achievements and certifications to the main column; education, skills and + * languages to the sidebar. A section whose title matches no berth is not + * drawn, and a berth with no section takes its leading hairline with it.

+ * + *

Each berth wants a particular shape. The summary, the achievements and + * the certifications are {@link ParagraphSection}s, and the two lists are + * drawn one bullet per line of the body. Experience and education are + * {@link EntriesSection}s. Languages are a {@link RowsSection}, because this + * design writes the proficiency out — "Native", "Advanced" — which a + * levelled skill could not carry back; its {@code RowStyle} is not read, + * since the rows are drawn to this design rather than to a family style.

+ * + *

Three things are drawn in capitals whatever the document writes: the + * name, the role, and each degree. Headings are upper-cased too, and set + * with the tracking this design uses throughout.

+ * + *

Content this sheet has no place for is not drawn: the summary block's + * own title, since it is the one block with no heading; a skill's level, + * since there are no meters here; and a {@code SkillGroup}'s category. A + * berth is filled by the first section that names it, so a second section + * naming the same berth is not drawn either. An education entry uses all + * four of its fields — the degree, the institution, the body as the campus + * line, and the years.

+ * + *

The portrait

+ * + *

The photograph comes from {@code CvIdentity.portrait()}. An identity + * without one draws the ring around an empty navy disc rather than leaving a + * hole in the column.

+ * + *

The contact rows carry no link targets — the design draws the channels + * as text, and the port keeps that. The packaged set has one network mark, + * so every link the identity carries is drawn behind it whatever the network + * is; a document that lists more than one profile should say which is which + * in the label.

+ * + *

Fonts

+ * + *

The sheet is set in Lato. The templates artifact does not carry it — + * register it on the session, or the engine substitutes and the measured + * geometry here no longer matches the type sitting in it.

+ * + *

Usage:

+ *
{@code
+ * DocumentTemplate template = NavySidebar.create();
+ * template.compose(session, cv);
+ * }
+ */ +public final class NavySidebar { + + /** Stable identifier of this preset. */ + public static final String ID = "navy-sidebar"; + + /** Human-readable name of this preset. */ + public static final String DISPLAY_NAME = "Navy Sidebar"; + + /** + * The margin this preset expects: none. It sets the page margin itself, + * because the navy plate runs to the paper edge. + */ + public static final double RECOMMENDED_MARGIN = 0.0; + + private static final List SUMMARY_KEYS = + List.of("summary", "profile", "about"); + private static final List EXPERIENCE_KEYS = + List.of("experience", "employment", "work history", "career"); + private static final List ACHIEVEMENT_KEYS = + List.of("achievements", "achievement", "awards"); + private static final List CERTIFICATION_KEYS = + List.of("certifications", "certification", "licences", "licenses"); + private static final List EDUCATION_KEYS = + List.of("education", "qualifications"); + private static final List SKILL_KEYS = + List.of("skills", "expertise", "competencies"); + private static final List LANGUAGE_KEYS = + List.of("languages", "language"); + + private NavySidebar() { + } + + /** + * Creates the template. + * + * @return a template composing a {@link CvDocument} onto its own page + */ + public static DocumentTemplate create() { + return new Template(); + } + + private record Template() implements DocumentTemplate { + + @Override + public String id() { + return ID; + } + + @Override + public String displayName() { + return DISPLAY_NAME; + } + + @Override + public void compose(DocumentSession document, CvDocument doc) { + Objects.requireNonNull(document, "document"); + Objects.requireNonNull(doc, "doc"); + List sections = doc.sections(); + + document.pageSize(PAGE) + .margin(DocumentInsets.zero()) + // The plate is a page background rather than a section + // fill: a section is only as tall as what it holds, and + // the navy column has to reach the foot of the sheet + // whatever the sidebar carries. + .pageBackgrounds(List.of( + PageBackgroundFill.leftColumn(SIDEBAR_WEIGHT, NAVY))); + + EntriesSection education = berth(sections, EntriesSection.class, EDUCATION_KEYS); + SkillsSection skills = berth(sections, SkillsSection.class, SKILL_KEYS); + RowsSection languages = berth(sections, RowsSection.class, LANGUAGE_KEYS); + ParagraphSection summary = berth(sections, ParagraphSection.class, SUMMARY_KEYS); + EntriesSection experience = berth(sections, EntriesSection.class, EXPERIENCE_KEYS); + ParagraphSection achievements = + berth(sections, ParagraphSection.class, ACHIEVEMENT_KEYS); + ParagraphSection certifications = + berth(sections, ParagraphSection.class, CERTIFICATION_KEYS); + + document.pageFlow(page -> page + .name("NavySidebarCv") + .padding(DocumentInsets.zero()) + // spacing(0): every gap in this design is authored on the + // node that owns it, so a flow gap would add to all of + // them. + .spacing(0) + .addRow("PageGrid", row -> { + row.spacing(0); + row.weights(SIDEBAR_WEIGHT, MAIN_WEIGHT); + row.addSection("Sidebar", aside -> + NavySidebarAside.compose(aside, doc.identity(), + education, skills, languages)); + row.addSection("Main", main -> + NavySidebarMain.compose(main, doc.identity(), + summary, experience, achievements, certifications)); + })); + } + + /** + * The first section of the wanted shape whose title names this berth, + * or {@code null} when the document fills no such berth. + */ + private static T berth(List sections, + Class type, + List keys) { + for (CvSection section : sections) { + if (!type.isInstance(section)) { + continue; + } + for (String key : keys) { + if (SectionLookup.titleContains(section.title(), key)) { + return type.cast(section); + } + } + } + return null; + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarAside.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarAside.java new file mode 100644 index 000000000..face6f2b9 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarAside.java @@ -0,0 +1,295 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.EllipseBuilder; +import com.demcha.compose.document.dsl.ImageBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.image.DocumentImageData; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.InlineImageAlignment; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.templates.core.identity.Link; +import com.demcha.compose.document.templates.cv.components.SectionLookup; +import com.demcha.compose.document.templates.cv.data.CvEntry; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.CvRow; +import com.demcha.compose.document.templates.cv.data.CvSkill; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.RowsSection; +import com.demcha.compose.document.templates.cv.data.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.AVATAR_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.AVATAR_RING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.AVATAR_RING_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.AVATAR_TO_HEADING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BODY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BULLET_LEADING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.CONTACT_ROW_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.EDU_DEGREE_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.EDU_ENTRY_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.EDU_LINE_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.LANGUAGE_ROW_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.LANGUAGE_VALUE_X; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.LIST_BULLET_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAVY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.PAGE_MARGIN; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_BAND_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_INNER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_PAD_TOP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_PAD_X; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_STRONG; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_TEXT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SKILL_ITEM_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.sidebarBody; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarWidgets.sidebarHeading; + +/** + * The navy left column: the ringed portrait, the contact channels, the + * degrees, the skills and the languages. + */ +final class NavySidebarAside { + + /** + * The contact heading. It is not read from the document because the + * channels are not a section — they come off the identity, which carries + * no title of its own. + */ + static final String CONTACT_HEADING = "Contact"; + + private NavySidebarAside() { + } + + static void compose(SectionBuilder section, + CvIdentity identity, + EntriesSection education, + SkillsSection skills, + RowsSection languages) { + section.spacing(0) + .padding(new DocumentInsets( + SIDEBAR_PAD_TOP, SIDEBAR_PAD_X, PAGE_MARGIN, SIDEBAR_PAD_X)); + section.addSection("Avatar", inner -> { + inner.padding(new DocumentInsets(0, 0, AVATAR_TO_HEADING, 0)); + renderPortrait(inner, identity); + }); + section.addSection("Contact", inner -> renderContact(inner, identity)); + if (SectionLookup.hasContent(education)) { + section.addSection("Education", inner -> renderEducation(inner, education)); + } + if (SectionLookup.hasContent(skills)) { + section.addSection("Skills", inner -> renderSkills(inner, skills)); + } + if (SectionLookup.hasContent(languages)) { + section.addSection("Languages", inner -> renderLanguages(inner, languages)); + } + } + + // -- portrait -------------------------------------------------------- + + /** + * The photograph, clipped to a disc inside a pale ring. An identity + * carrying no portrait draws the ring around a navy disc, which is the + * same shape with nothing in it rather than a hole in the column. + */ + private static void renderPortrait(SectionBuilder section, CvIdentity identity) { + DocumentNode circle = identity.portrait() + .map(NavySidebarAside::clippedPhoto) + .orElseGet(NavySidebarAside::emptyDisc); + section.addContainer(ring -> ring + .name("AvatarRing") + .circle(AVATAR_DIAMETER + 2.0 * AVATAR_RING_WIDTH) + .fillColor(AVATAR_RING) + .center(circle)); + } + + private static DocumentNode clippedPhoto(DocumentImageData image) { + return new ShapeContainerBuilder() + .name("AvatarCircle") + .circle(AVATAR_DIAMETER) + .clipPolicy(ClipPolicy.CLIP_PATH) + .fillColor(NAVY) + // size(), not fitToBounds(): the disc clips, so the photo is + // drawn to fill it and whatever falls outside is cut away. + .center(new ImageBuilder() + .name("AvatarPhoto") + .source(image) + .size(AVATAR_DIAMETER, AVATAR_DIAMETER) + .build()) + .build(); + } + + /** + * The disc with no photograph in it. It is an ellipse rather than the + * same clipping container holding nothing, because a shape container + * with no layer is rejected — the clip needs something to cut. + */ + private static DocumentNode emptyDisc() { + return new EllipseBuilder() + .name("AvatarCircle") + .circle(AVATAR_DIAMETER) + .fillColor(NAVY) + .build(); + } + + // -- contact --------------------------------------------------------- + + /** + * The contact channels, in the order the design sets them: phone, email, + * address, then whatever links the identity carries. + * + *

The rows carry no link targets. The design draws them as text, and + * the promotion keeps that — a clickable channel would be a change to + * the sheet rather than a port of it.

+ */ + private static void renderContact(SectionBuilder section, CvIdentity identity) { + sidebarHeading(section, CONTACT_HEADING, true); + for (Channel channel : channels(identity)) { + renderChannel(section, channel); + } + } + + private static void renderChannel(SectionBuilder section, Channel channel) { + double size = NavySidebarIcons.size(channel.token()); + section.addParagraph(p -> p + .name("Contact_" + compact(channel.token())) + .textStyle(sidebarBody()) + .inlineImage(NavySidebarIcons.image(channel.token()), size, size, + InlineImageAlignment.CENTER, 0.0, null) + // The gap between the mark and the value is set as spaces + // rather than an indent: the row is one paragraph, so the + // mark and the text share a baseline and wrap together. + .inlineText(" " + channel.value(), sidebarBody()) + .margin(new DocumentInsets(0, 0, CONTACT_ROW_GAP, 0))); + } + + private static List channels(CvIdentity identity) { + List channels = new ArrayList<>(); + channels.add(new Channel(NavySidebarIcons.PHONE, identity.contact().phone())); + channels.add(new Channel(NavySidebarIcons.EMAIL, identity.contact().email())); + channels.add(new Channel(NavySidebarIcons.LOCATION, identity.contact().address())); + for (Link link : identity.links()) { + channels.add(new Channel(NavySidebarIcons.LINKEDIN, link.label())); + } + return channels; + } + + /** + * A contact row. The packaged set has one network mark, so every link + * takes it — this design ships no globe. + */ + private record Channel(String token, String value) { + } + + // -- education ------------------------------------------------------- + + /** + * Each degree as four lines: the qualification in capitals, the + * institution, where it was, and the years. + */ + private static void renderEducation(SectionBuilder section, EntriesSection education) { + sidebarHeading(section, education.title(), false); + for (CvEntry entry : education.entries()) { + section.addParagraph(p -> p + .name("Degree_" + compact(entry.title())) + .text(entry.title().toUpperCase(Locale.ROOT)) + .textStyle(style(BODY_SIZE, SIDEBAR_STRONG, DocumentTextDecoration.BOLD)) + .lineSpacing(BULLET_LEADING) + .margin(new DocumentInsets(0, 0, EDU_DEGREE_GAP, 0))); + line(section, "Institution_" + compact(entry.title()), entry.subtitle(), + EDU_LINE_GAP); + line(section, "Campus_" + compact(entry.title()), entry.body(), EDU_LINE_GAP); + line(section, "Years_" + compact(entry.title()), entry.date(), EDU_ENTRY_GAP); + } + } + + private static void line(SectionBuilder section, String name, String text, double gapBelow) { + section.addParagraph(p -> p + .name(name) + .text(text) + .textStyle(sidebarBody()) + .margin(new DocumentInsets(0, 0, gapBelow, 0))); + } + + // -- skills ---------------------------------------------------------- + + /** + * The skills as a plain bullet list. This design draws no meters, so a + * level the document carries is not read here. + */ + private static void renderSkills(SectionBuilder section, SkillsSection skills) { + sidebarHeading(section, skills.title(), false); + section.addList(list -> list + .name("SkillsList") + .bullet() + .items(names(skills)) + .textStyle(sidebarBody()) + .lineSpacing(BULLET_LEADING) + .itemSpacing(SKILL_ITEM_GAP) + .margin(DocumentInsets.zero())); + } + + /** + * The section's skills as one list of names. This design sets no group + * headings, so a document that groups its skills gets them in the order + * the groups were declared. + */ + private static List names(SkillsSection section) { + List out = new ArrayList<>(); + for (SkillGroup group : section.groups()) { + for (CvSkill skill : group.entries()) { + out.add(skill.name()); + } + } + return out; + } + + // -- languages ------------------------------------------------------- + + /** + * Language rows: a dotted label at the left, the proficiency anchored at + * a fixed offset behind a dash so the second column lines up whatever + * the names measure. + * + *

The rows are {@link CvRow}s rather than levelled skills because + * this design writes the proficiency out — "Native", "Advanced" — and a + * number could not carry those words back.

+ */ + private static void renderLanguages(SectionBuilder section, RowsSection languages) { + sidebarHeading(section, languages.title(), false); + // The row gap is section spacing rather than a margin on each band: + // the bands are shape containers, and a container's margin would sit + // inside the clip rather than between the rows. + section.spacing(LANGUAGE_ROW_GAP); + for (CvRow row : languages.rows()) { + DocumentNode label = new ParagraphBuilder() + .name("Language_" + compact(row.label())) + .textStyle(sidebarBody()) + .dot(LIST_BULLET_DIAMETER, SIDEBAR_TEXT) + .inlineText(" " + row.label(), sidebarBody()) + .margin(DocumentInsets.zero()) + .build(); + DocumentNode value = new ParagraphBuilder() + .name("Proficiency_" + compact(row.label())) + .text("– " + row.body()) + .textStyle(sidebarBody()) + .margin(DocumentInsets.zero()) + .build(); + section.addContainer(band -> band + .name("LanguageRow_" + compact(row.label())) + .rectangle(SIDEBAR_INNER_WIDTH, SIDEBAR_BAND_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(label) + .position(value, LANGUAGE_VALUE_X, 0, LayerAlign.CENTER_LEFT)); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarIcons.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarIcons.java new file mode 100644 index 000000000..eb0888509 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarIcons.java @@ -0,0 +1,85 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.image.DocumentImageData; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Classpath loader for the Navy Sidebar CV marks — the four contact glyphs + * in the sidebar and the three section badges in the main column. + * + *

They ship inside the templates artifact under + * {@code templates/cv/navy-sidebar/icons/} as PNG, each at the point size the + * design draws it at: a pin needs more height than an envelope to read as the + * same weight, and the badge glyphs are set larger than the contact ones + * because they sit inside a filled disc.

+ */ +final class NavySidebarIcons { + + static final String PHONE = "phone"; + static final String EMAIL = "email"; + static final String LOCATION = "location"; + static final String LINKEDIN = "linkedin"; + static final String BRIEFCASE = "briefcase"; + static final String TROPHY = "trophy"; + static final String CERTIFICATE = "certificate"; + + private static final String ICON_ROOT = "/templates/cv/navy-sidebar/icons/"; + + private static final Map SIZES = Map.of( + PHONE, 10.0, + EMAIL, 10.0, + LOCATION, 11.0, + LINKEDIN, 10.5, + BRIEFCASE, 11.3, + TROPHY, 11.3, + CERTIFICATE, 11.3); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private NavySidebarIcons() { + } + + /** + * The drawn size of one mark. + * + * @param token one of the constants on this class + * @return the size in points + * @throws IllegalArgumentException when the token names no packaged mark + */ + static double size(String token) { + Double size = SIZES.get(token); + if (size == null) { + throw new IllegalArgumentException("Unknown navy sidebar CV icon token: " + token); + } + return size; + } + + /** + * Reads one mark, caching the decoded image per token so a CV that + * repeats a channel reads the file once per JVM. + * + * @param token one of the constants on this class + * @return the image data + */ + static DocumentImageData image(String token) { + return CACHE.computeIfAbsent(token, NavySidebarIcons::read); + } + + private static DocumentImageData read(String token) { + String resourcePath = ICON_ROOT + token + ".png"; + try (InputStream input = NavySidebarIcons.class.getResourceAsStream(resourcePath)) { + if (input == null) { + throw new IllegalStateException("Missing navy sidebar CV icon: " + resourcePath); + } + return DocumentImageData.fromBytes(input.readAllBytes()); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to read navy sidebar CV icon: " + resourcePath, e); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarMain.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarMain.java new file mode 100644 index 000000000..2b266fbcd --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarMain.java @@ -0,0 +1,276 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.EllipseBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +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.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.templates.core.text.MarkdownInline; +import com.demcha.compose.document.templates.cv.components.SectionLookup; +import com.demcha.compose.document.templates.cv.data.CvEntry; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ACCENT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BODY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BODY_LEADING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BODY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BULLET_ITEM_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BULLET_LEADING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.DATE_OVERFLOW; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_EMPLOYER_TO_BULLETS; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_HEAD_BAND_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_TEXT_INSET; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_TITLE_TO_EMPLOYER; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ENTRY_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.HEADER_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.INK; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.JOB_TITLE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_PAD_TOP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_RULE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MARKER_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAME_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAME_TO_ROLE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAVY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.PAGE_MARGIN; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RAIL; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RAIL_MARGIN_LEFT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RAIL_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ROLE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.ROLE_TO_SUMMARY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RULE_GAP_ABOVE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RULE_GAP_BELOW; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SUMMARY_RULE_GAP_BELOW; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SUMMARY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.TITLE_OVERFLOW; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.TROUGH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.body; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.tracked; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarWidgets.indentedList; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarWidgets.sectionHeader; + +/** + * The white right column: the name and role, the summary, then the roles + * held on a timeline rail, the achievements and the certifications, each + * opened by a hairline and a badged heading. + */ +final class NavySidebarMain { + + private NavySidebarMain() { + } + + static void compose(SectionBuilder section, + CvIdentity identity, + ParagraphSection summary, + EntriesSection experience, + ParagraphSection achievements, + ParagraphSection certifications) { + section.spacing(0) + .padding(new DocumentInsets(MAIN_PAD_TOP, PAGE_MARGIN, PAGE_MARGIN, TROUGH)); + section.addSection("Identity", inner -> renderIdentity(inner, identity)); + if (SectionLookup.hasContent(summary)) { + section.addSection("Summary", inner -> renderSummary(inner, summary)); + } + if (SectionLookup.hasContent(experience)) { + rule(section, SUMMARY_RULE_GAP_BELOW); + section.addSection("Experience", inner -> renderExperience(inner, experience)); + } + if (SectionLookup.hasContent(achievements)) { + rule(section, RULE_GAP_BELOW); + section.addSection("Achievements", inner -> + renderBulletBlock(inner, NavySidebarIcons.TROPHY, achievements, + "AchievementsList")); + } + if (SectionLookup.hasContent(certifications)) { + rule(section, RULE_GAP_BELOW); + section.addSection("Certifications", inner -> + renderBulletBlock(inner, NavySidebarIcons.CERTIFICATE, certifications, + "CertificationsList")); + } + } + + /** + * The hairline that opens a block. It belongs to the block below it, so + * a block the document does not fill takes its rule with it instead of + * leaving one hanging. The gap below is authored per rule: the one that + * opens the experience block is set four points wider than the two that + * follow it. + * + * @param section the main column + * @param gapBelow the gap between the rule and the block it opens + */ + private static void rule(SectionBuilder section, double gapBelow) { + section.addLine(line -> line + .name("SectionRule") + .horizontal(MAIN_CONTENT_WIDTH) + .thickness(MAIN_RULE_THICKNESS) + .color(MAIN_RULE) + .margin(new DocumentInsets(RULE_GAP_ABOVE, 0, gapBelow, 0))); + } + + // -- identity -------------------------------------------------------- + + private static void renderIdentity(SectionBuilder section, CvIdentity identity) { + DocumentTextStyle nameStyle = style(NAME_SIZE, INK, DocumentTextDecoration.DEFAULT); + section.addParagraph(p -> p + .name("Name") + .text(identity.name().full().toUpperCase(Locale.ROOT)) + .textStyle(nameStyle) + .align(TextAlign.LEFT) + .margin(new DocumentInsets(0, 0, NAME_TO_ROLE, 0))); + + DocumentTextStyle roleStyle = style(ROLE_SIZE, ACCENT, DocumentTextDecoration.BOLD); + section.addParagraph(p -> { + p.name("Role"); + p.textStyle(roleStyle); + tracked(p, identity.jobTitle().toUpperCase(Locale.ROOT), roleStyle); + p.align(TextAlign.LEFT); + p.margin(new DocumentInsets(0, 0, ROLE_TO_SUMMARY, 0)); + }); + } + + // -- summary --------------------------------------------------------- + + /** + * The opening paragraph. It is the one block this design gives no + * heading, so the section's title is not drawn. + */ + private static void renderSummary(SectionBuilder section, ParagraphSection summary) { + section.addParagraph(p -> p + .name("Summary") + .text(summary.body()) + .textStyle(style(SUMMARY_SIZE, BODY, DocumentTextDecoration.DEFAULT)) + .lineSpacing(BODY_LEADING) + .margin(DocumentInsets.zero())); + } + + // -- experience ------------------------------------------------------ + + /** + * The roles held, strung on a vertical rail with a filled marker at each + * one. + * + *

The rail is the section's left accent, which runs the full height + * of what the section holds — so the last role's body is composed in a + * second section outside the rail, and the line stops at the last + * marker instead of running past it to the foot of the block.

+ */ + private static void renderExperience(SectionBuilder section, EntriesSection experience) { + sectionHeader(section, NavySidebarIcons.BRIEFCASE, experience.title()); + List entries = experience.entries(); + int last = entries.size() - 1; + section.addSection("ExperienceRail", rail -> { + rail.spacing(0); + // The rail starts where the first marker's band does, which is + // half a title's overhang below the heading. + rail.margin(new DocumentInsets( + HEADER_TO_BODY + TITLE_OVERFLOW, 0, 0, RAIL_MARGIN_LEFT)); + rail.accentLeft(RAIL, RAIL_WIDTH); + for (int i = 0; i < entries.size(); i++) { + renderEntryHead(rail, entries.get(i)); + if (i < last) { + renderEntryBody(rail, entries.get(i), ENTRY_GAP + TITLE_OVERFLOW); + } + } + }); + section.addSection("ExperienceTail", tail -> { + tail.spacing(0); + tail.margin(new DocumentInsets(0, 0, 0, RAIL_MARGIN_LEFT)); + renderEntryBody(tail, entries.get(last), 0); + }); + } + + /** + * The marker, the position in capitals and the dates, all on the + * marker's axis: the band is as tall as the marker, and the two pieces + * of type are pulled up by half their own overhang to centre on it. + */ + private static void renderEntryHead(SectionBuilder rail, CvEntry entry) { + DocumentNode marker = new EllipseBuilder() + .name("Marker_" + compact(entry.title())) + .circle(MARKER_DIAMETER) + .fillColor(NAVY) + .build(); + DocumentNode title = new ParagraphBuilder() + .name("JobTitle_" + compact(entry.title())) + .text(entry.title().toUpperCase(Locale.ROOT)) + .textStyle(style(JOB_TITLE_SIZE, INK, DocumentTextDecoration.BOLD)) + .margin(DocumentInsets.zero()) + .build(); + DocumentNode dates = new ParagraphBuilder() + .name("JobDates_" + compact(entry.title())) + .text(entry.date()) + .textStyle(body()) + .align(TextAlign.RIGHT) + .margin(DocumentInsets.zero()) + .build(); + rail.addContainer(head -> head + .name("EntryHead_" + compact(entry.title())) + .rectangle(ENTRY_WIDTH, ENTRY_HEAD_BAND_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(marker, -MARKER_DIAMETER / 2.0, 0, LayerAlign.CENTER_LEFT) + .position(title, ENTRY_TEXT_INSET, -TITLE_OVERFLOW, LayerAlign.CENTER_LEFT) + .position(dates, 0, -DATE_OVERFLOW, LayerAlign.CENTER_RIGHT)); + } + + /** The employer in accent, then one bullet per line of the entry body. */ + private static void renderEntryBody(SectionBuilder rail, CvEntry entry, double gapBelow) { + rail.addParagraph(p -> p + .name("Employer_" + compact(entry.title())) + .text(entry.subtitle()) + .textStyle(style(BODY_SIZE, ACCENT, DocumentTextDecoration.DEFAULT)) + .margin(new DocumentInsets( + ENTRY_TITLE_TO_EMPLOYER + TITLE_OVERFLOW, 0, + ENTRY_EMPLOYER_TO_BULLETS, ENTRY_TEXT_INSET))); + List highlights = lines(entry.body()); + if (!highlights.isEmpty()) { + rail.addList(list -> list + .name("Highlights_" + compact(entry.title())) + .bullet() + .items(highlights) + .textStyle(body()) + .lineSpacing(BULLET_LEADING) + .itemSpacing(BULLET_ITEM_GAP) + .margin(new DocumentInsets(0, 0, gapBelow, ENTRY_TEXT_INSET))); + } + } + + // -- closing blocks -------------------------------------------------- + + /** A badged heading over an indented bullet list, one bullet per line. */ + private static void renderBulletBlock(SectionBuilder section, String iconToken, + ParagraphSection block, String listName) { + sectionHeader(section, iconToken, block.title()); + indentedList(section, listName, lines(block.body())); + } + + /** + * One bullet per non-blank line — the family's way of carrying a list in + * a field the model types as a single string. + */ + private static List lines(String body) { + List out = new ArrayList<>(); + for (String line : body.split("\\R")) { + String clean = MarkdownInline.plainText(line).trim(); + if (!clean.isBlank()) { + out.add(clean); + } + } + return out; + } +} 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 new file mode 100644 index 000000000..0584c1372 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarStyles.java @@ -0,0 +1,192 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.api.DocumentPageSize; +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.DocumentTextStyle; +import com.demcha.compose.document.templates.core.text.TextStyles; +import com.demcha.compose.font.FontName; + +/** + * The measured geometry, palette and type scale of the Navy Sidebar CV. + * + *

The bands in this design are sized from the type they hold rather than + * chosen: an entry head is as tall as its marker, and the title and the dates + * set in it are taller than that, so each is pushed up by half the difference + * to sit on the marker's axis. Those overflows are computed here so the two + * ends of the band cannot drift apart.

+ */ +final class NavySidebarStyles { + + private NavySidebarStyles() { + } + + // -- page ------------------------------------------------------------ + + static final DocumentPageSize PAGE = DocumentPageSize.A4; + static final double PAGE_WIDTH = PAGE.width(); + + static final double SIDEBAR_WEIGHT = 0.297; + static final double MAIN_WEIGHT = 1.0 - SIDEBAR_WEIGHT; + + static final double SIDEBAR_PAD_X = 26.5; + static final double PAGE_MARGIN = 36.5; + + /** The gutter between the navy plate and the main column's text. */ + static final double TROUGH = 25.4; + + static final double SIDEBAR_WIDTH = PAGE_WIDTH * SIDEBAR_WEIGHT; + static final double MAIN_WIDTH = PAGE_WIDTH * MAIN_WEIGHT; + static final double SIDEBAR_INNER_WIDTH = SIDEBAR_WIDTH - 2.0 * SIDEBAR_PAD_X; + static final double MAIN_CONTENT_WIDTH = MAIN_WIDTH - TROUGH - PAGE_MARGIN; + + // -- ornaments ------------------------------------------------------- + + /** The portrait fills the sidebar's text column exactly. */ + static final double AVATAR_DIAMETER = SIDEBAR_INNER_WIDTH; + static final double AVATAR_RING_WIDTH = 1.6; + + static final double BADGE_DIAMETER = 22.6; + static final double BADGE_GAP = 7.3; + static final double SECTION_INDENT = BADGE_DIAMETER + BADGE_GAP; + + static final double MARKER_DIAMETER = 6.8; + static final double RAIL_WIDTH = 0.8; + static final double RAIL_X = BADGE_DIAMETER / 2.0; + static final double RAIL_MARGIN_LEFT = RAIL_X - RAIL_WIDTH / 2.0; + static final double ENTRY_TEXT_INSET = SECTION_INDENT - RAIL_MARGIN_LEFT; + static final double ENTRY_WIDTH = MAIN_CONTENT_WIDTH - RAIL_MARGIN_LEFT; + + static final double SIDEBAR_RULE_THICKNESS = 0.7; + static final double MAIN_RULE_THICKNESS = 0.7; + static final double LIST_BULLET_DIAMETER = 2.4; + + // -- type ------------------------------------------------------------ + + static final FontName HEADING_FONT = FontName.LATO; + static final FontName BODY_FONT = FontName.LATO; + + static final double BODY_SIZE = 9.0; + static final double SUMMARY_SIZE = 10.5; + static final double NAME_SIZE = 30.0; + static final double ROLE_SIZE = 13.5; + static final double HEADING_SIZE = 12.0; + static final double JOB_TITLE_SIZE = 11.5; + static final double BODY_LEADING = 1.28; + static final double BULLET_LEADING = 1.35; + + 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; + static final double JOB_TITLE_BAND_HEIGHT = JOB_TITLE_SIZE * BULLET_LEADING; + static final double ENTRY_HEAD_BAND_HEIGHT = MARKER_DIAMETER; + static final double DATE_BAND_HEIGHT = BODY_SIZE * BULLET_LEADING; + static final double SIDEBAR_BAND_HEIGHT = BODY_SIZE * BULLET_LEADING; + + /** How far the job title rises above the marker band it is set on. */ + static final double TITLE_OVERFLOW = + (JOB_TITLE_BAND_HEIGHT - ENTRY_HEAD_BAND_HEIGHT) / 2.0; + + /** The same, for the dates set at the other end of that band. */ + static final double DATE_OVERFLOW = + (DATE_BAND_HEIGHT - ENTRY_HEAD_BAND_HEIGHT) / 2.0; + + static final double LANGUAGE_LABEL_WEIGHT = 0.41; + static final double LANGUAGE_VALUE_X = SIDEBAR_INNER_WIDTH * LANGUAGE_LABEL_WEIGHT; + + // -- vertical rhythm ------------------------------------------------- + + static final double SIDEBAR_PAD_TOP = 25.0; + static final double AVATAR_TO_HEADING = 22.0; + static final double SIDEBAR_BLOCK_GAP = 18.0; + static final double HEADING_TO_RULE = 7.0; + static final double RULE_TO_BODY = 10.0; + static final double CONTACT_ROW_GAP = 10.5; + static final double EDU_DEGREE_GAP = 4.0; + static final double EDU_LINE_GAP = 1.5; + static final double EDU_ENTRY_GAP = 13.0; + static final double SKILL_ITEM_GAP = 2.4; + static final double LANGUAGE_ROW_GAP = 6.0; + + static final double MAIN_PAD_TOP = 30.0; + static final double NAME_TO_ROLE = 6.0; + static final double ROLE_TO_SUMMARY = 16.0; + static final double RULE_GAP_ABOVE = 16.0; + static final double RULE_GAP_BELOW = 11.0; + static final double SUMMARY_RULE_GAP_BELOW = 15.0; + static final double HEADER_TO_BODY = 11.0; + static final double ENTRY_TITLE_TO_EMPLOYER = 3.0; + static final double ENTRY_EMPLOYER_TO_BULLETS = 7.0; + static final double ENTRY_GAP = 22.0; + static final double BULLET_ITEM_GAP = 6.1; + static final double PLAIN_ITEM_GAP = 5.1; + + // -- palette --------------------------------------------------------- + + static final DocumentColor NAVY = DocumentColor.rgb(32, 44, 59); + static final DocumentColor INK = DocumentColor.rgb(30, 40, 51); + static final DocumentColor ACCENT = DocumentColor.rgb(43, 84, 149); + static final DocumentColor BODY = DocumentColor.rgb(83, 87, 92); + static final DocumentColor SIDEBAR_STRONG = DocumentColor.WHITE; + static final DocumentColor SIDEBAR_TEXT = DocumentColor.rgb(233, 235, 238); + static final DocumentColor SIDEBAR_RULE = DocumentColor.rgba(255, 255, 255, 115); + static final DocumentColor MAIN_RULE = DocumentColor.rgb(228, 230, 233); + static final DocumentColor RAIL = DocumentColor.rgb(110, 116, 123); + static final DocumentColor AVATAR_RING = DocumentColor.rgb(226, 228, 231); + + // -- styles ---------------------------------------------------------- + + static DocumentTextStyle body() { + return style(BODY_SIZE, BODY, DocumentTextDecoration.DEFAULT); + } + + static DocumentTextStyle sidebarBody() { + return style(BODY_SIZE, SIDEBAR_TEXT, DocumentTextDecoration.DEFAULT); + } + + /** + * Both faces are Lato, so the weight is what the decoration selects; the + * split is kept because the design names a heading face and a body face, + * and a document set in two families would want it back. + */ + static DocumentTextStyle style(double size, DocumentColor color, + DocumentTextDecoration decoration) { + boolean bold = decoration == DocumentTextDecoration.BOLD + || decoration == DocumentTextDecoration.BOLD_ITALIC; + return TextStyles.of(bold ? HEADING_FONT : BODY_FONT, size, decoration, 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. + * + * @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); + } + } + } + + /** 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/NavySidebarWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarWidgets.java new file mode 100644 index 000000000..aa0b78c5f --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebarWidgets.java @@ -0,0 +1,133 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.ImageBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +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.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; + +import java.util.List; +import java.util.Locale; + +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BADGE_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.BULLET_LEADING; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.HEADER_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.HEADING_BAND_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.HEADING_TO_RULE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.INK; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.MAIN_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.NAVY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.PLAIN_ITEM_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.RULE_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SECTION_INDENT; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_BLOCK_GAP; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_INNER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_RULE; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.SIDEBAR_STRONG; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.body; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.NavySidebarStyles.tracked; + +/** + * The two headings this design uses — tracked capitals over a hairline in + * the navy sidebar, tracked capitals beside a filled badge in the main + * column — and the indented bullet list the closing sections are set in. + */ +final class NavySidebarWidgets { + + private NavySidebarWidgets() { + } + + /** + * A sidebar heading: tracked white capitals over a translucent rule the + * width of the sidebar's text column. + * + * @param section the sidebar column + * @param title the heading text, drawn in capitals + * @param first true for the block directly under the portrait, which + * takes no gap above + */ + static void sidebarHeading(SectionBuilder section, String title, boolean first) { + DocumentTextStyle headingStyle = + style(HEADING_SIZE, SIDEBAR_STRONG, DocumentTextDecoration.BOLD); + section.addParagraph(p -> { + p.name("SidebarHeading_" + compact(title)); + p.textStyle(headingStyle); + tracked(p, title.toUpperCase(Locale.ROOT), headingStyle); + p.margin(new DocumentInsets(first ? 0 : SIDEBAR_BLOCK_GAP, 0, HEADING_TO_RULE, 0)); + }); + section.addLine(line -> line + .name("SidebarRule_" + compact(title)) + .horizontal(SIDEBAR_INNER_WIDTH) + .thickness(SIDEBAR_RULE_THICKNESS) + .color(SIDEBAR_RULE) + .margin(new DocumentInsets(0, 0, RULE_TO_BODY, 0))); + } + + /** + * A main-column heading: the section's mark inside a navy disc, with + * tracked capitals on the disc's axis. + * + *

It is a container rather than a row because the badge and the words + * are centred against each other; a row of sections would top-align + * them.

+ * + * @param section the main column + * @param iconToken the packaged mark for this section + * @param title the heading text, drawn in capitals + */ + static void sectionHeader(SectionBuilder section, String iconToken, String title) { + DocumentNode badge = new ShapeContainerBuilder() + .name("Badge_" + compact(title)) + .circle(BADGE_DIAMETER) + .clipPolicy(ClipPolicy.CLIP_PATH) + .fillColor(NAVY) + .center(new ImageBuilder() + .name("BadgeGlyph_" + compact(title)) + .source(NavySidebarIcons.image(iconToken)) + .size(NavySidebarIcons.size(iconToken), NavySidebarIcons.size(iconToken)) + .build()) + .build(); + + DocumentTextStyle headingStyle = style(HEADING_SIZE, INK, DocumentTextDecoration.BOLD); + ParagraphBuilder heading = new ParagraphBuilder() + .name("SectionTitle_" + compact(title)) + .textStyle(headingStyle); + tracked(heading, title.toUpperCase(Locale.ROOT), headingStyle); + DocumentNode headingNode = heading.margin(DocumentInsets.zero()).build(); + + section.addContainer(band -> band + .name("SectionHeader_" + compact(title)) + .rectangle(MAIN_CONTENT_WIDTH, HEADING_BAND_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(badge) + .position(headingNode, SECTION_INDENT, 0, LayerAlign.CENTER_LEFT)); + } + + /** + * A bullet list indented to clear the badge, so its text starts on the + * same axis as the heading beside it. + * + * @param section the main column + * @param name node name of the list + * @param items one bullet per element + */ + static void indentedList(SectionBuilder section, String name, List items) { + section.addList(list -> list + .name(name) + .bullet() + .items(items) + .textStyle(body()) + .lineSpacing(BULLET_LEADING) + .itemSpacing(PLAIN_ITEM_GAP) + .margin(new DocumentInsets(HEADER_TO_BODY, 0, 0, SECTION_INDENT))); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/package-info.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/package-info.java index 64a490a00..5b6771bc0 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/package-info.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/package-info.java @@ -21,11 +21,11 @@ * fed a different theme.

* *

The package holds a second shape as well. A preset that reproduces a - * specific drawn sheet — {@code ProfessionalSidebar} is the one here — takes - * no {@code BrandTheme} and calls no shared renderer: its geometry, palette - * and type scale are measured constants of its own, and it sets its own page. - * The data model is the same {@code CvDocument}; what differs is that the - * cosmetics cannot be swapped, because moving them would stop it being the - * sheet it reproduces.

+ * specific drawn sheet — {@code ProfessionalSidebar} and {@code NavySidebar} + * are the ones here — takes no {@code BrandTheme} and calls no shared + * renderer: its geometry, palette and type scale are measured constants of + * its own, and it sets its own page. The data model is the same + * {@code CvDocument}; what differs is that the cosmetics cannot be swapped, + * because moving them would stop it being the sheet it reproduces.

*/ package com.demcha.compose.document.templates.cv.presets; diff --git a/templates/src/main/resources/templates/cv/navy-sidebar/icons/briefcase.png b/templates/src/main/resources/templates/cv/navy-sidebar/icons/briefcase.png new file mode 100644 index 0000000000000000000000000000000000000000..98d131523db860cbb41477565c72cdd8dbc107da GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS3dtTpz6=aiYC!Q828LfC`4Fdh=ibF!!(sV}SCs&}5YKdz^NlIc#s#S7PDv)9@GB7gJHL%b%G6^xXv@$ifGBwsV zFt9Q(Xuq-bHHwDZ{FKbJO57U0wep4oHE6(XD9OxCEiOsSEx@g3;RKxy1_q`IPZ!6K zid%2*p3ORJAi$8g`pe(=NL!IcLEnwnx|W_jQ~qk{k&}H-=Su`-t!>}2FD$>|nh}Eq zbAvG|@jGrWqwy8j?Z)1ksb8!2|CKYk&lP9-Bkq~NCAI>&e?M*aREw>T)6QnmWX?F8 ze|z7n&F|ywlUZIeS@73SKmU7=?oB0+Qqc{MKlDE?XU(v_r1xAkd?}a1=cSwp*Z1x} zxr=KFr^EY1hJu$&Hwu5A-;le03AaOW?U8cE`kA%1^IjgwYtd$y!+1avmGG@rcoLjH zm-gY)tL?_qV29UH||7HWz0O)(iF%XMc>|;D4e1+eD5w zeKt$n4`P_)+~rS;AE0z`OHL1MgPK85VIA{E+Ti$1;}#K=l@ zfjkR_>Hlk8(;jm%q%#z-4L-tL=D-2}%dZnB-rT`-AeL`|OWm9}@18SR6|5RdDYX0bElmQ6hg`p+Nsue_hIDU zHH+0>K4h5n>dEw7)umFdh=ibF!!(sV}SCs&}5YKdz^NlIc#s#S7PDv)9@GB7gJHL%b%G6^xXv@$ifGBwsV zFt9Q(Xuq-bHHwDZ{FKbJO57U0wep4oHE6(XD9OxCEiOsSEx@g3;RKxy1_owkPZ!6K zid%2z9-Op9L4Y+e`Tzgva}T#z_hoNyx*?MCEK@J}!oD|7Ts`MbZ&G>qY58}CCHh
* + *

A channel is one paragraph, the mark and the value sharing a line, so a + * value wider than the sidebar's text column wraps under the mark and leaves + * it alone on the first line. The column is about 124pt, which at this type + * size is a little over twenty characters — long addresses want shortening + * rather than a wider column.

+ * *

Fonts

* *

The sheet is set in Lato. The templates artifact does not carry it — diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java index 2dcca81e6..15d297a22 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java @@ -82,6 +82,12 @@ * phone and email rows carry {@code tel:} and {@code mailto:} targets built * from the value.

* + *

A channel is one paragraph, the mark and the value sharing a line, so a + * value wider than the sidebar's text column wraps under the mark and leaves + * it alone on the first line. The column is about 107pt, which at this type + * size is a little over twenty characters — long addresses want shortening + * rather than a wider column.

+ * *

Fonts

* *

The sheet is set in Barlow Condensed and Lato. The templates artifact

>I$I*-ul1s&hHQZ`*+_T2v+f|yt}w zpKr&PZR3gn*)%7KQRjc*%9F>q7?z)mJ0Ph0>&mCY!MWwyXl}rCSY?j+2d;e)pM1~H z4c2CuvraUjHHt$?W+sQCgO_36G4)QRy}@XPBu;A#oaSoc#NqIo(dCdPgWq+o2d|U= zZUp-h-G=2&(gsD&r@0u^TNsqZngoy6xNtBokw;VJ$HC~9v!vJJnX(gy!ru=88Ztz= ze8cx>`|>iW>i)lzBN)pj9P)p;kn6%{xqFsL8+h#(vHQ!+*APpHoOZdfr{Y|){J#bB z7gpTyW6bRPkiApqz?$RR(|Go)tbW8bp_tFo{+dDXkFAgOg%V7&**Md9_iqUbw`cCr zIk@KG^#EhmCui>;_B1H|VR}Aur`dtp!%u{jrqt|PJiAc+PsXD6$K!rah|@jbb>-a6 ze{EOV3Yhu; literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/navy-sidebar/icons/email.png b/templates/src/main/resources/templates/cv/navy-sidebar/icons/email.png new file mode 100644 index 0000000000000000000000000000000000000000..29bf4216f53716312238b63234f2fad021587cad GIT binary patch literal 1028 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo3dtTpz6=aiY77hwEes65fIOlW6o%eKc z45_&FcFygh!wNjC3orlwpZZJatVRf*ICo#cxqW7Nj@>F7f}aO@DOuEAVE$32!N9}X zu#mw(grSY;KmdaT7lSin0*c_Db1@+m{I^w}&uL#T*{RBW|9D479;4NdFA0ku-_u^` z-M|uWXFV}9-cfeG9H%c(f~Q8_DomI24r}8}p#xX#-OlaY?O!KyAohH1lwpaceXsrAdE%{{ z0%OQh)e^IcwN>lmo|Otz&z@uYp!@YEpE`H5E34!F|2`687f7o$U*+l?jJVTQpU=JN0(JYrdD~)ZSiA37;PwCV%8!(?azfTGDm(Oogce# z_sMNH<}peg&#}n5n(b6$czUsCJ=4vUXb0m3%htVC*1n@u^q@6>DQK3y_pB99k14ru zZkmyM>Ef)M?gGgLk|*0HhwW9%Vatf}{nZjx@A`sg#m=ltnsdb~9%?XZ#!g%Mm`Pto z-J#<{!2RZA)+Hrn4_cLHeVB|lC156xXNwzR|F8R>5)&6)`AR!Ipr^*SO_hTuKK9Lt zN#WwFLW9w@a4Y~O#nQ4`{HGFI34F_t_fZI@#nVVW%l9*e7ThGD?IvorQOjA5v z978H@y`6iz=&%A0>%zz#aSRR8`w?;#;}fz3YaLG`VO9mTHfD`3EQqT z2=6$>dSUD35;vbyu>x+pIcp+wWiI9WDHF@{ph4wa5#PXL?i} zy5u=~b>H2~|4QwT*lay*mQXS?;qU&iBYK>9n-{EX-6U_fe*2jVJ4H5Fo!=AOWX%{g z`Oj{Z9YPvKva2Jesx|lr!Br7a{%p-}}HdHamna zd~ex(Z$rhdFUxAaCYPx?9Ln@oh~=6Pr{@p#P2Vc!{#hctu)hDsyCQePy}|#M6qQZ2=8{e{aAxw0j;v9NuG{x-%hTG7 zu)G(KRXKR%6E`tD5mY9C!+v{8S;i= W;Vj92C31mjn!(f6&t;ucLK6VUm2x`( literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/navy-sidebar/icons/location.png b/templates/src/main/resources/templates/cv/navy-sidebar/icons/location.png new file mode 100644 index 0000000000000000000000000000000000000000..0d58db247709a635a34ad569e40be47d0cd7144c GIT binary patch literal 1177 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo3dtTpz6=aiY77hwEes65fILW9w@a4Y~O#nQ4`{HGFI34F_t_fZI@#nVVW%l9*e7ThGD?IvorQ%qgBO zjv*Dd-p;*U)NCN&{M7IN|LHHCj~nwfvK-1<%6l#Oa>K=s>(*Q3MvD2o{IXc@z+F?u z4rKIowcY_qUH0E+)^1&<_d3w@dEtS;!}sl$7z$W3R4<#a`+VN>JcAsD9Lf9tzpPAO zzwbTMA*KTv|3WXv-+BCU7oWfq2BV()JDy*zouZJ!aP3)o^@e@RxtdrU%3wq?bI1QB@2R{mG=tFSj2eZ-8sXfHDa%tcs74qZ<}~$xjUnAlO{ui zY1$mC8%C{`TQ};QJ|v+UtgNtVk9+Ui`R+{#+v6V=J6^P%zxMT;t4B(o7@iW4Wxdw@ zDSdg*@8_~EZhZT-qV!+9a*m(5UjD!NBI}bZ9*hEWui0__ei3r;Rc9Mh$E&|CPw)J@ zd%`iagg^frYiBB_!lvVfZjFoIFc_p8$fUc!VYuTf+zHiQ}}iyN?LELn#@kA(vr2)6KhV!3hMN_<>Y!7 z`kO~DV(9R5w*HcKyzH!RMj`I^YM4X8geE53f%u`kQIc^ORU$(2P zem^N~zv;}Mlj5$e^_n`B@4!PFw&$CcyE;rgW>Ni5)HpyBWM$eHsTvqLG*zL{bAj+z@RoA0}bL%ul&ZG#?bI1SPQn=7M%ON zIERs8{_;g!E0>>^VknSvQvKY>#Nf8KIpE>aJzKpP3M`EKmI^U6d|$aD>eWjvW`-N> z0at4dJemIGT-N*a4XbAIi?A}-ykE5OlW6vv|5V zhE&{oJLhK6YXt$9_UNDg_U08ukb{IfyfQhBB?`%KsauE#&q8Ux>l# zT}v4%e4QpT#MZ2?dinj6Mq{%9lKw{S0*j9~8O0yW)nuuN;}Pe4u{YpTMMP2;OT{v; zhVPA+Cus^jh|Ji^@cP}Y#P9k_lT{oZ=PJzeYcTI({W7boN|t?<@P)+*=c?odGv73= z;eKYwdbx*D?t9(DU#&A#Y|bd z6vh4@{-D=!^!{Zl4sp>5NBp_@nul0N!DsGUR2c9&**bdu9(qMb3qG#tk4403DvvG9eobk z-euXKeQI$wlg7iDnqi0LsfxsFFKV0REmL8cW2?frliTF)oarh&o(@XtoX4M6sXp}j z@ZyOh%aPj#oIBsX`1*7Ace%M=CfV;hzVgg!kyln%YC>{8q?3{m?xSerTys-|ah|Gxq*a66O%loV;NBPVd89N5vWY8Qr~}Kli`gtMhMC z@_~s0o!iT+f1b_$$5jwIVdlzxC58S@9ErEL`HGt-Z@sl=hLb@klgZM@PPg>_t~s=Y z$z|Vem5JZ~TED)+B$S?6(cPhWyuo-<%i|jY^PSDt&r%gyV7V;utBcNLhF(ACJ^CN_ zz4)!YVM)UgX%`(`g^wyu_GZ%S1t#ne5|qDud*SR~$5*qcd~vYd-4o7rK_*yG{&sF~ z@vn<(YFGQ+k2+~HbMoIh?|GBvaCYlA>6Ql7i54Bz`MOo)Q{ql%!Te@yi58fW|1d?* XmG~)@9B~?$hZsCv{an^LB{Ts5-R7u^ literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/navy-sidebar/icons/trophy.png b/templates/src/main/resources/templates/cv/navy-sidebar/icons/trophy.png new file mode 100644 index 0000000000000000000000000000000000000000..80e7964ffd5a586e89791926113d24b1897d2766 GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS3dtTpz6=aiYC!Q828LfC`4Fdh=ibF!!(sV}SCs&}5YKdz^NlIc#s#S7PDv)9@GB7gJHL%b%G6^xXv@$ifGBwsV zFt9Q(Xuq-bHHwDZ{FKbJO57U0wep4oHE6(XD9OxCEiOsSEx@g3;RKxy1_tJdo-U3d z6}R5by>dgW`=0 zk0KZfbs8+h9Avl^`d9^yGj$|09{G9w*RekVCk>WPdB%JE?}A?C7`BS6hCAEyXBi)u zd*$(@pj&KNQ*#2?>+WB_>A(@d?{coPdT#N#H$rck`>)CF(0riIoU>l=a+>ywgZ&I5 z3Q4@25>4`qS`J6@IU^kT>R2`~2(A}0NNv0n_T_1T*!+jhu= zcLT#jMv=!|m!97?a`0wc{%wO6IYX@BZ@cuA7oDNyYzZ|PiS4 zU`8tEh84~CXRmBu%5mOkIh&WLr%t9);RiM1cx*ImAp!SMZP_oqwOyS^8F*<8F> z{N-V$5Z)rL87FRDz4_A0;n%}A-!&>rT;tbEeLww)f3UJ11YBdSG?r zUcCm9KO75qHl(ZaPx#HGejqEDG3%B70ZxI9eJr3D5?#<1%5+5azI6g?!o7;3qi(&+ z8$=bFf|-^*aA(kC?q4yzz2oIn-4D^$kt`iQbRCcU(am^&>!8pd4kJdTd*WU5raip; zaYmE8qlUx76-gCaGCw`p`0tP3wgdTZ(?l0M3;tQ*(sAwl2DZOT`L#I$iofq|5pDW+ zY5r9fi$&o*SD9*AN@Ne*>4zmg)Tlal3Fw7WhqS|4rwbqW&Sdp_a~H$>Z=5b)?o0i9 zy?J%Vh870@HzG;*e-^XsW$=G5nsWDdIm=hA1uXwh>Lxywcsk?F|I;4Y4zhnF)f4yn z&W&X9VoYP-zoChxglPfG{sVf9a~W7$9w={HDz3%&O}y4)LmHzNBUeYdOw#PA1%eDe z->kp&<5Cz~28+S>1jZu^g&8W>x#ry#EMc0Fy>P!|%DIO;h-`!A^7?5juHCe;wb=;F O& Date: Sun, 30 Aug 2026 22:55:02 +0100 Subject: [PATCH 2/2] fix(examples): keep every sidebar contact channel on one line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sample addresses in both sidebar CV examples were wider than the sidebar's text column, so the row wrapped and left the mark alone on its first line. A channel is one paragraph by design — the mark and the value share a line — so the fix is a value that fits, and both preset classes now say how much room there is. --- assets/readme/examples/cv-navy-sidebar-v2.pdf | Bin 33676 -> 33670 bytes .../examples/cv-professional-sidebar-v2.pdf | Bin 53192 -> 53213 bytes .../support/NavySidebarSampleData.java | 2 +- .../ProfessionalSidebarSampleData.java | 2 +- .../templates/cv/presets/NavySidebar.java | 6 ++++++ .../cv/presets/ProfessionalSidebar.java | 6 ++++++ 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/assets/readme/examples/cv-navy-sidebar-v2.pdf b/assets/readme/examples/cv-navy-sidebar-v2.pdf index 54d9856b3bc513396106df954e1ad0211c52f96f..1ba8f2fcddeffaad539905b79dd61176eadf3de2 100644 GIT binary patch delta 4574 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 delta 4578 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 H%VGT&?@#+( delta 7800 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 W@Bh8j-cdYkVL=>LRz)o(oc{%#iPg^l diff --git a/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java b/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java index 7472ce8cf..712d5dcdf 100644 --- a/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java +++ b/examples/src/main/java/com/demcha/examples/support/NavySidebarSampleData.java @@ -47,7 +47,7 @@ public static CvDocument sample() { .name("Priya", "Raghavan") .jobTitle("Marketing Manager") .contact(new Contact("+44 20 7946 0812", - "priya.raghavan@example.com", + "priya.r@example.com", "Bristol, United Kingdom")) .link(new Link("linkedin.com/in/praghavan", "https://linkedin.com/in/praghavan")) diff --git a/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java b/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java index 39c18438e..75b1de94b 100644 --- a/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java +++ b/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java @@ -42,7 +42,7 @@ public static CvDocument sample() { .name("MARTA", "LINDQVIST") .jobTitle("SENIOR BACKEND ENGINEER") .contact(new Contact("+46 8 123 456 78", - "marta.lindqvist@example.com", + "marta.l@example.com", "Stockholm, Sweden")) .link(new Link("linkedin.com/in/mlindqvist", "https://linkedin.com/in/mlindqvist")) diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java index f068bfc1c..de980283a 100644 --- a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/NavySidebar.java @@ -81,6 +81,12 @@ * is; a document that lists more than one profile should say which is which * in the label.