From 5306d3561d5327da0cfb09d714aa3e052dda3b52 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sun, 30 Aug 2026 22:05:52 +0100 Subject: [PATCH] feat(templates): add the ProfessionalSidebar layered CV preset --- CHANGELOG.md | 23 + .../examples/cv-professional-sidebar-v2.pdf | Bin 0 -> 53192 bytes docs/templates/v2-layered/using-templates.md | 7 + .../demcha/examples/GenerateAllExamples.java | 2 + .../ProfessionalSidebarSampleData.java | 125 + .../examples/support/ShowcaseMetadata.java | 1 + .../cv/v2/ProfessionalSidebarExample.java | 52 + .../presets/ProfessionalSidebarFixtures.java | 128 + ...ProfessionalSidebarLayoutSnapshotTest.java | 30 + .../presets/ProfessionalSidebarSmokeTest.java | 243 + .../ProfessionalSidebarVisualParityTest.java | 42 + .../cv-v2/professional_sidebar_layout.json | 4757 +++++++++++++++++ .../professional_sidebar-page-0.png | Bin 0 -> 81055 bytes .../cv/presets/ProfessionalSidebar.java | 220 + .../cv/presets/ProfessionalSidebarAside.java | 444 ++ .../cv/presets/ProfessionalSidebarIcons.java | 83 + .../cv/presets/ProfessionalSidebarMain.java | 244 + .../cv/presets/ProfessionalSidebarStyles.java | 209 + .../presets/ProfessionalSidebarWidgets.java | 159 + .../templates/cv/presets/package-info.java | 8 + .../cv/professional-sidebar/icons/email.png | Bin 0 -> 2131 bytes .../professional-sidebar/icons/linkedin.png | Bin 0 -> 2655 bytes .../professional-sidebar/icons/location.png | Bin 0 -> 3628 bytes .../cv/professional-sidebar/icons/phone.png | Bin 0 -> 3074 bytes .../cv/professional-sidebar/icons/website.png | Bin 0 -> 6351 bytes 25 files changed, 6777 insertions(+) create mode 100644 assets/readme/examples/cv-professional-sidebar-v2.pdf create mode 100644 examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java create mode 100644 examples/src/main/java/com/demcha/examples/templates/cv/v2/ProfessionalSidebarExample.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarFixtures.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarVisualParityTest.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json create mode 100644 qa/src/test/resources/visual-baselines/cv-v2-layered/professional_sidebar-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarAside.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarIcons.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarMain.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarWidgets.java create mode 100644 templates/src/main/resources/templates/cv/professional-sidebar/icons/email.png create mode 100644 templates/src/main/resources/templates/cv/professional-sidebar/icons/linkedin.png create mode 100644 templates/src/main/resources/templates/cv/professional-sidebar/icons/location.png create mode 100644 templates/src/main/resources/templates/cv/professional-sidebar/icons/phone.png create mode 100644 templates/src/main/resources/templates/cv/professional-sidebar/icons/website.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 111f047b5..66e4d4248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,29 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **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 + dot markers and five-dot language ratings, beside a white column of the tracked name, + the profile, the roles held with bulleted highlights, the projects and the references + note. Ships as `cv.presets.ProfessionalSidebar` on the existing `CvDocument` model — + no model change was needed — porting the rendered layout of the published standalone + `professional-sidebar-cv` template. The preset owns its page: a 491.6 x 737.28pt + sheet with no margin, the page fill and the pale sidebar painted as page backgrounds. The + sheet holds one page — its two columns are a single atomic row, so a CV longer than the + sheet raises `AtomicNodeTooLargeException` rather than flowing onto a second page or + silently dropping entries the way the capped sidebar presets do. The class documentation + says so, points at `TimelineMinimal` for a preset that splits its own columns, and + `docs/templates/v2-layered/using-templates.md` carries it beside the capped presets. + Sections reach their berth by title rather than by `Slot`, + because the columns are fixed; skills and languages are both `SkillsSection`s drawn + differently, and a level the document omits draws the name alone. The contact channels + come off `CvIdentity`, with `tel:` and `mailto:` targets built from the values and the + packaged marks chosen per channel. Guarded by a smoke test (including the identity-only + document, the unlevelled skill, the PDF link targets, the one-page limit and the fields + this design has no place for), an exact layout snapshot and a pixel-parity gate; the + examples showcase gains `cv-professional-sidebar-v2`. + - **A second structured proposal preset: `EditorialProposal`.** The same document the `NorthlineProposal` preset renders, in a different hand: an orange accent, section headings set in the display serif over short accent rules instead of in the body sans diff --git a/assets/readme/examples/cv-professional-sidebar-v2.pdf b/assets/readme/examples/cv-professional-sidebar-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2abddb69be76efbfe965fec33ae9f5f000a880d3 GIT binary patch literal 53192 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 literal 0 HcmV?d00001 diff --git a/docs/templates/v2-layered/using-templates.md b/docs/templates/v2-layered/using-templates.md index e260f3a37..9017f5517 100644 --- a/docs/templates/v2-layered/using-templates.md +++ b/docs/templates/v2-layered/using-templates.md @@ -234,6 +234,13 @@ 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. + If the document's length is the author's rather than the template's, pick a preset that paginates — `TimelineMinimal` splits its own columns and carries every entry it is given onto as many pages as it needs. diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 0032601a4..d9c144721 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.ProfessionalSidebarExample; import com.demcha.examples.templates.invoice.ClassicInvoiceV2Example; import com.demcha.examples.templates.invoice.ConsultingInvoiceV2Example; import com.demcha.examples.templates.invoice.InvoiceCinematicFileExample; @@ -145,6 +146,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: " + ProfessionalSidebarExample.generate()); // Cover letters (v2 layered — 15 paired letters, one per CV preset) System.out.println("Generated: " + CvBlueBannerLetterV2Example.generate()); diff --git a/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java b/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java new file mode 100644 index 000000000..39c18438e --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/ProfessionalSidebarSampleData.java @@ -0,0 +1,125 @@ +package com.demcha.examples.support; + +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.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +import com.demcha.compose.document.templates.cv.data.Slot; + +import java.util.List; + +/** + * Sample data for the Professional 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 + * sidebar's one-line rows are sized to it too: a degree, skill or language + * longer than the narrow column measures overflows the row it is anchored in + * rather than wrapping inside it.

+ */ +public final class ProfessionalSidebarSampleData { + + /** The en dash the design sets between dates. */ + private static final String DASH = "–"; + + private ProfessionalSidebarSampleData() { + } + + /** + * A backend engineer's one-page CV. + * + * @return the sample document + */ + public static CvDocument sample() { + return CvDocument.builder() + .identity(CvIdentity.builder() + .name("MARTA", "LINDQVIST") + .jobTitle("SENIOR BACKEND ENGINEER") + .contact(new Contact("+46 8 123 456 78", + "marta.lindqvist@example.com", + "Stockholm, Sweden")) + .link(new Link("linkedin.com/in/mlindqvist", + "https://linkedin.com/in/mlindqvist")) + .link(new Link("martalindqvist.dev", + "https://martalindqvist.dev")) + .build()) + .section(Slot.MAIN, new ParagraphSection("PROFILE", + "Backend engineer with nine years on payment and identity systems," + + " most of it owning services end to end: API design, the data" + + " model underneath, and the on-call rota that follows." + + " Comfortable in a team that ships small and often, and the" + + " one who writes the runbook nobody asked for.")) + .section(Slot.SIDEBAR, SkillsSection.of("SKILLS", + new SkillGroup("Core", List.of( + CvSkill.of("Java", 0.9), + CvSkill.of("Kotlin", 0.72), + CvSkill.of("Spring Boot", 0.86), + CvSkill.of("PostgreSQL", 0.8), + CvSkill.of("Kafka", 0.68), + CvSkill.of("Kubernetes", 0.62), + CvSkill.of("Terraform", 0.55), + CvSkill.of("Observability", 0.74), + CvSkill.of("Threat Modelling", 0.6), + CvSkill.of("Mentoring", 0.78))))) + .section(Slot.SIDEBAR, EntriesSection.builder("EDUCATION") + .entry("MSc COMPUTER SCIENCE", "KTH Royal Institute", + "2014 " + DASH + " 2016", "") + .entry("BSc SOFTWARE DESIGN", "Uppsala University", + "2011 " + DASH + " 2014", "") + .build()) + .section(Slot.SIDEBAR, SkillsSection.of("LANGUAGES", + new SkillGroup("Spoken", List.of( + CvSkill.of("Swedish", 1.0), + CvSkill.of("English", 1.0), + CvSkill.of("German", 0.6))))) + .section(Slot.MAIN, EntriesSection.builder("EXPERIENCE") + .entry("SENIOR BACKEND ENGINEER", + "Nordkassa | Stockholm, SE", + "2021 " + DASH + " Present", + String.join("\n", + "Led the split of the settlement monolith into four" + + " services with no customer-visible downtime.", + "Cut p99 authorisation latency from 780ms to 210ms by" + + " reworking the ledger write path.", + "Introduced contract tests between payments and risk," + + " ending a class of release-day rollbacks.", + "Mentors three engineers; runs the internal design" + + " review.")) + .entry("BACKEND ENGINEER", + "Vinge Identity | Gothenburg, SE", + "2018 " + DASH + " 2021", + String.join("\n", + "Built the OAuth2 and OIDC provider now serving eleven" + + " internal products.", + "Moved session storage to Redis with a migration that" + + " ran live for six weeks.", + "Wrote the audit pipeline the compliance team still" + + " reports from.")) + .entry("SOFTWARE ENGINEER", + "Almgren Data | Uppsala, SE", + "2016 " + DASH + " 2018", + String.join("\n", + "Delivered ingest and reporting services for retail" + + " forecasting customers.", + "Replaced nightly batch reconciliation with a streaming" + + " job on Kafka.")) + .build()) + .section(Slot.MAIN, EntriesSection.builder("PROJECTS") + .entry("LEDGERKIT", "", "2024", + "Open-source double-entry ledger for JVM services, with a" + + " property-based test suite over the posting rules.") + .entry("ONCALL DIGEST", "", "2022", + "Weekly incident summariser that reads alert history and drafts" + + " the retrospective agenda.") + .build()) + .section(Slot.MAIN, new ParagraphSection("REFERENCES", + "Available on request.")) + .build(); + } +} 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 d12d6b205..b63c554c0 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -60,6 +60,7 @@ record Entry(String title, String description, List tags, String codeUrl cv("cv-minimal-underlined-v2", "CvMinimalUnderlinedExample", "Minimal Underlined", "Single-column layout with underlined section titles and tight whitespace — minimalist reference shape.", "minimal"); 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"); // ===== 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/ProfessionalSidebarExample.java b/examples/src/main/java/com/demcha/examples/templates/cv/v2/ProfessionalSidebarExample.java new file mode 100644 index 000000000..570a3fc4e --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/cv/v2/ProfessionalSidebarExample.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.ProfessionalSidebar; +import com.demcha.examples.support.ExampleOutputPaths; +import com.demcha.examples.support.ProfessionalSidebarSampleData; + +import java.nio.file.Path; + +/** + * Renders the layered {@code cv.v2} Professional Sidebar preset against the + * backend-engineer sample. + * + *

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

+ * + *

The preset owns its page geometry — a 491.6 x 737.28pt sheet with no + * margin — so the session starts unconfigured.

+ */ +public final class ProfessionalSidebarExample { + + private ProfessionalSidebarExample() { + } + + /** + * @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-professional-sidebar-v2.pdf"); + CvDocument doc = ProfessionalSidebarSampleData.sample(); + DocumentTemplate template = ProfessionalSidebar.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/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarFixtures.java new file mode 100644 index 000000000..7d6fef3cb --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarFixtures.java @@ -0,0 +1,128 @@ +package com.demcha.compose.document.templates.cv.presets; + +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.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +import com.demcha.compose.document.templates.cv.data.Slot; + +import java.util.List; + +/** + * The canonical fixture for {@link ProfessionalSidebar} — 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.

+ */ +public final class ProfessionalSidebarFixtures { + + /** The en dash the design sets between dates. */ + private static final String DASH = "–"; + + private ProfessionalSidebarFixtures() { + } + + /** + * The canonical CV: five contact channels, ten levelled skills, two + * degrees, three languages, three roles, two projects and a references + * note — one page. + * + * @return the fixture document + */ + public static CvDocument canonicalCv() { + return CvDocument.builder() + .identity(CvIdentity.builder() + .name("YOUR", "NAME") + .jobTitle("YOUR PROFESSIONAL TITLE") + .contact(new Contact("+1 234 567 8900", + "your.email@example.com", + "City, State, Country")) + .link(new Link("linkedin.com/in/username", + "https://linkedin.com/in/username")) + .link(new Link("www.yourwebsite.com", + "https://www.yourwebsite.com")) + .build()) + .section(Slot.MAIN, new ParagraphSection("PROFILE", + "Java backend engineer experienced in building secure Spring Boot" + + " services, REST APIs and data-driven products. Delivers clean" + + " architecture, reliable integrations and well-tested" + + " persistence layers with PostgreSQL, JPA and Flyway." + + " Comfortable owning features from API design through" + + " Docker-based delivery and production support.")) + .section(Slot.SIDEBAR, SkillsSection.of("SKILLS", new SkillGroup("Core", List.of( + CvSkill.of("Java", 0.72), + CvSkill.of("Spring Boot", 0.7), + CvSkill.of("SQL / Databases", 0.7), + CvSkill.of("RESTful APIs", 0.6), + CvSkill.of("Microservices", 0.72), + CvSkill.of("Git / GitHub", 0.72), + CvSkill.of("Docker", 0.56), + CvSkill.of("Testing (JUnit)", 0.76), + CvSkill.of("Problem Solving", 0.72), + CvSkill.of("Communication", 0.7))))) + .section(Slot.SIDEBAR, EntriesSection.builder("EDUCATION") + .entry("DEGREE NAME", "University Name", "2016 " + DASH + " 2020", "") + .entry("DEGREE NAME", "University Name", "2012 " + DASH + " 2016", "") + .build()) + .section(Slot.SIDEBAR, SkillsSection.of("LANGUAGES", + new SkillGroup("Spoken", List.of( + CvSkill.of("English", 1.0), + CvSkill.of("Ukrainian", 0.8), + CvSkill.of("Russian", 0.6))))) + .section(Slot.MAIN, EntriesSection.builder("EXPERIENCE") + .entry("JAVA BACKEND DEVELOPER", + "Product Studio | London, UK", + "2023 " + DASH + " Present", + String.join("\n", + "Built secure Spring Boot REST APIs for customer" + + " workflows.", + "Added JWT authentication, validation and role-based" + + " access.", + "Tuned JPA queries and PostgreSQL indexes for faster" + + " responses.", + "Added JUnit tests and Docker environments for reliable" + + " releases.")) + .entry("SOFTWARE DEVELOPER", + "Digital Solutions Ltd | Manchester, UK", + "2021 " + DASH + " 2023", + String.join("\n", + "Integrated internal services with third-party REST" + + " APIs.", + "Delivered Flyway migrations and improved data" + + " consistency.", + "Introduced structured logging and production" + + " diagnostics.", + "Worked with frontend engineers on clear API contracts.")) + .entry("JUNIOR JAVA DEVELOPER", + "TechWorks | Remote", + "2019 " + DASH + " 2021", + String.join("\n", + "Developed Java services and reusable backend" + + " components.", + "Fixed defects across REST, persistence and security" + + " layers.", + "Wrote JUnit tests and supported continuous integration.", + "Documented endpoints and operational runbooks.")) + .build()) + .section(Slot.MAIN, EntriesSection.builder("PROJECTS") + .entry("CVREWRITER", "", "2026", + "AI-powered resume tailoring platform with Spring Boot, JWT" + + " authentication, PDF generation and application" + + " tracking.") + .entry("GRAPHCOMPOSE", "", "2025", + "Declarative Java and Kotlin document layout engine with" + + " semantic components, pagination and multi-format" + + " rendering.") + .build()) + .section(Slot.MAIN, new ParagraphSection("REFERENCES", + "Available upon request.")) + .build(); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarLayoutSnapshotTest.java new file mode 100644 index 000000000..01737a10b --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarLayoutSnapshotTest.java @@ -0,0 +1,30 @@ +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 ProfessionalSidebar} — 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 ProfessionalSidebarLayoutSnapshotTest { + + @Test + void canonicalCvMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + ProfessionalSidebar.create().compose( + session, ProfessionalSidebarFixtures.canonicalCv()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "professional_sidebar_layout", "cv-v2"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarSmokeTest.java new file mode 100644 index 000000000..f9e7d6d12 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarSmokeTest.java @@ -0,0 +1,243 @@ +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.SkillGroup; +import com.demcha.compose.document.templates.cv.data.SkillsSection; +import com.demcha.compose.document.templates.cv.data.Slot; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Smoke test for {@link ProfessionalSidebar} — proves the preset renders a + * {@link CvDocument} end-to-end with its packaged marks, reaches its + * channels as PDF links, degrades through its guards on a document that + * fills none of the berths, and draws a name without a level rather than an + * empty meter. + * + *

It also pins the two limits the class documents, because both are things + * a caller finds out the hard way otherwise: the sheet holds one page and + * raises past it, and three fields this design has no place for are not + * drawn.

+ */ +class ProfessionalSidebarSmokeTest { + + 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()) { + ProfessionalSidebar.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); + } + } + + private static List linkUris(byte[] pdfBytes) throws Exception { + List uris = new ArrayList<>(); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + for (PDPage page : document.getPages()) { + for (PDAnnotation annotation : page.getAnnotations()) { + if (annotation instanceof PDAnnotationLink link + && link.getAction() instanceof PDActionURI action) { + uris.add(action.getURI()); + } + } + } + } + return uris; + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = ProfessionalSidebar.create(); + assertThat(template.id()).isEqualTo(ProfessionalSidebar.ID); + assertThat(template.displayName()).isEqualTo(ProfessionalSidebar.DISPLAY_NAME); + } + + @Test + void canonicalRenderCarriesTheUntrackedText() throws Exception { + // The headings and the name 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(ProfessionalSidebarFixtures.canonicalCv())); + assertThat(text) + .contains("your.email@example.com") + .contains("City, State, Country") + .contains("Java backend engineer") + .contains("DEGREE NAME") + .contains("University Name") + .contains("Docker") + .contains("English") + .contains("Product Studio") + .contains("Built secure Spring Boot REST APIs for customer workflows.") + .contains("Available upon request."); + } + + @Test + void channelsReachThePdfAsLinks() throws Exception { + // The dial and mail targets are built from the values, so nothing in + // the document carries them and nothing but the PDF can show them. + assertThat(linkUris(render(ProfessionalSidebarFixtures.canonicalCv()))) + .contains("tel:+12345678900", + "mailto:your.email@example.com", + "https://linkedin.com/in/username", + "https://www.yourwebsite.com"); + } + + @Test + void rendersOneCanonicalPage() throws Exception { + try (PDDocument document = + Loader.loadPDF(render(ProfessionalSidebarFixtures.canonicalCv()))) { + assertThat(document.getNumberOfPages()).isEqualTo(1); + } + } + + @Test + void rendersIdentityOnly() throws Exception { + // Every berth empty: the plate, the initials and the three channels + // the identity always carries, and no hairline left hanging under a + // section that was never drawn. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .build())); + assertThat(text).contains("empty@example.com"); + } + + @Test + void rendersWithoutAJobTitle() throws Exception { + // The role line is written letter by letter to reach its tracking, so + // an identity with no job title 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 drawsAnUnlevelledSkillAsItsNameAlone() throws Exception { + // A meter needs a level; without one the row is the name, not an + // empty track that reads as a zero score. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(Slot.SIDEBAR, SkillsSection.of("SKILLS", + SkillGroup.of("Core", "Java", "Kotlin"))) + .section(Slot.SIDEBAR, SkillsSection.of("LANGUAGES", + new SkillGroup("Spoken", List.of(CvSkill.of("English"))))) + .build())); + assertThat(text).contains("Java").contains("Kotlin").contains("English"); + } + + @Test + void placesSectionsByTitleWhateverSlotTheDocumentNames() throws Exception { + // The columns are fixed, so a document that leaves everything in the + // main slot still gets its education in the sidebar. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(Slot.MAIN, EntriesSection.builder("EDUCATION") + .entry("BSc Computing", "University Name", "2016", "") + .build()) + .build())); + assertThat(text).contains("BSc Computing").contains("University Name"); + } + + @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 — pinned + // here because the alternative the sibling presets take is to cap + // each block and drop the rest without saying so. + EntriesSection.Builder experience = EntriesSection.builder("EXPERIENCE"); + for (int i = 0; i < 12; 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()) { + ProfessionalSidebar.create().compose(session, doc); + assertThatThrownBy(session::toPdfBytes) + .isInstanceOf(AtomicNodeTooLargeException.class) + .hasMessageContaining("PageGrid"); + } + } + + @Test + void drawsNothingTheDesignHasNoPlaceFor() throws Exception { + // A berth is filled once, and three fields have nowhere to go on this + // sheet. A caller who puts content there gets none of it drawn, which + // is why the class says so. + String text = textOf(render(CvDocument.builder() + .identity(identity()) + .section(EntriesSection.builder("PROJECTS") + .entry("LEDGERKIT", "Client name here", "2024", "A ledger.") + .build()) + .section(EntriesSection.builder("EDUCATION") + .entry("BSc", "University Name", "2016", "Thesis title here") + .build()) + .section(SkillsSection.of("SKILLS", + SkillGroup.of("Category name here", "Java"))) + .section(EntriesSection.builder("EXPERIENCE") + .entry("FIRST ROLE", "Employer", "2020", "Did a thing.") + .build()) + .section(EntriesSection.builder("MORE EXPERIENCE") + .entry("SECOND ROLE", "Employer", "2021", "Did another thing.") + .build()) + .build())); + assertThat(text) + .contains("LEDGERKIT") + .contains("University Name") + .contains("Java") + .contains("FIRST ROLE") + .doesNotContain("Client name here") + .doesNotContain("Thesis title here") + .doesNotContain("Category name here") + .doesNotContain("SECOND ROLE"); + } + + 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")) + .build(); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarVisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarVisualParityTest.java new file mode 100644 index 000000000..5596d0d78 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarVisualParityTest.java @@ -0,0 +1,42 @@ +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 ProfessionalSidebar} — 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 ProfessionalSidebarVisualParityTest { + + 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()) { + ProfessionalSidebar.create().compose( + document, ProfessionalSidebarFixtures.canonicalCv()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("professional_sidebar", pdfBytes); + } +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json new file mode 100644 index 000000000..f8569aa6f --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/professional_sidebar_layout.json @@ -0,0 +1,4757 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 491.6, + "pageHeight" : 737.28, + "innerWidth" : 491.6, + "innerHeight" : 737.28, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "ProfessionalSidebarCv[0]", + "entityName" : "ProfessionalSidebarCv", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : 12.73, + "placementX" : 0.0, + "placementY" : 12.73, + "placementWidth" : 491.6, + "placementHeight" : 724.55, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 491.6, + "contentHeight" : 724.55, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]", + "entityName" : "PageGrid", + "entityKind" : "RowNode", + "parentPath" : "ProfessionalSidebarCv[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 0.0, + "computedY" : 12.73, + "placementX" : 0.0, + "placementY" : 12.73, + "placementWidth" : 491.6, + "placementHeight" : 724.55, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 491.6, + "contentHeight" : 724.55, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]", + "entityName" : "Sidebar", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 24.204, + "placementX" : 0.0, + "placementY" : 24.204, + "placementWidth" : 143.056, + "placementHeight" : 713.076, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 143.056, + "contentHeight" : 713.076, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/MonogramPlate[0]", + "entityName" : "MonogramPlate", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 0.0, + "computedY" : 638.484, + "placementX" : 0.0, + "placementY" : 638.484, + "placementWidth" : 143.056, + "placementHeight" : 98.796, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 143.056, + "contentHeight" : 98.796, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/MonogramPlate[0]/MonogramRing[0]", + "entityName" : "MonogramRing", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/MonogramPlate[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 43.928, + "computedY" : 660.282, + "placementX" : 43.928, + "placementY" : 660.282, + "placementWidth" : 55.2, + "placementHeight" : 55.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 55.2, + "contentHeight" : 55.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/MonogramPlate[0]/MonogramRing[0]/MonogramInitials[0]", + "entityName" : "MonogramInitials", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/MonogramPlate[0]/MonogramRing[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 43.928, + "computedY" : 678.282, + "placementX" : 43.928, + "placementY" : 678.282, + "placementWidth" : 55.2, + "placementHeight" : 19.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 55.2, + "contentHeight" : 19.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "entityName" : "SidebarBody", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 0.0, + "computedY" : 24.204, + "placementX" : 0.0, + "placementY" : 24.204, + "placementWidth" : 143.056, + "placementHeight" : 614.28, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 143.056, + "contentHeight" : 614.28, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 22.0, + "right" : 17.8, + "bottom" : 0.0, + "left" : 17.8 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "entityName" : "Contact", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 491.434, + "placementX" : 17.8, + "placementY" : 491.434, + "placementWidth" : 98.484, + "placementHeight" : 125.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 98.484, + "contentHeight" : 125.05, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/SidebarHeading_CONTACT[0]", + "entityName" : "SidebarHeading_CONTACT", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 606.284, + "placementX" : 17.8, + "placementY" : 606.284, + "placementWidth" : 47.723, + "placementHeight" : 10.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.723, + "contentHeight" : 10.2, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/SidebarHeadingRule_CONTACT[1]", + "entityName" : "SidebarHeadingRule_CONTACT", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 601.234, + "placementX" : 17.8, + "placementY" : 601.234, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/Contact_phone[2]", + "entityName" : "Contact_phone", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 576.434, + "placementX" : 17.8, + "placementY" : 576.434, + "placementWidth" : 70.939, + "placementHeight" : 8.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 70.939, + "contentHeight" : 8.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.8, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/Contact_email[3]", + "entityName" : "Contact_email", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 3, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 555.434, + "placementX" : 17.8, + "placementY" : 555.434, + "placementWidth" : 95.827, + "placementHeight" : 9.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.827, + "contentHeight" : 9.2, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.8, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/Contact_location[4]", + "entityName" : "Contact_location", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 4, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 534.034, + "placementX" : 17.8, + "placementY" : 534.034, + "placementWidth" : 78.108, + "placementHeight" : 9.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 78.108, + "contentHeight" : 9.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.8, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/Contact_linkedin[5]", + "entityName" : "Contact_linkedin", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 5, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 512.834, + "placementX" : 17.8, + "placementY" : 512.834, + "placementWidth" : 98.484, + "placementHeight" : 9.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 98.484, + "contentHeight" : 9.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.8, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]/Contact_website[6]", + "entityName" : "Contact_website", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Contact[0]", + "childIndex" : 6, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 491.434, + "placementX" : 17.8, + "placementY" : 491.434, + "placementWidth" : 88.843, + "placementHeight" : 9.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 88.843, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/SidebarDivider[1]", + "entityName" : "SidebarDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 466.434, + "placementX" : 17.8, + "placementY" : 466.434, + "placementWidth" : 107.456, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 1.0, + "margin" : { + "top" : 24.0, + "right" : 0.0, + "bottom" : 18.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]", + "entityName" : "Skills", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 250.984, + "placementX" : 17.8, + "placementY" : 250.984, + "placementWidth" : 107.456, + "placementHeight" : 197.45, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 197.45, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SidebarHeading_SKILLS[0]", + "entityName" : "SidebarHeading_SKILLS", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 438.234, + "placementX" : 17.8, + "placementY" : 438.234, + "placementWidth" : 32.312, + "placementHeight" : 10.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.312, + "contentHeight" : 10.2, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SidebarHeadingRule_SKILLS[1]", + "entityName" : "SidebarHeadingRule_SKILLS", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 433.184, + "placementX" : 17.8, + "placementY" : 433.184, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 13.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "entityName" : "SkillRows", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 250.984, + "placementX" : 17.8, + "placementY" : 250.984, + "placementWidth" : 107.456, + "placementHeight" : 168.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 168.7, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]", + "entityName" : "SkillRow_Java", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 411.184, + "placementX" : 17.8, + "placementY" : 411.184, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]/Skill_Java[0]", + "entityName" : "Skill_Java", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 411.164, + "placementX" : 17.8, + "placementY" : 411.164, + "placementWidth" : 13.724, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 13.724, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 414.034, + "placementX" : 77.975, + "placementY" : 414.034, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Java[0]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 414.034, + "placementX" : 77.975, + "placementY" : 414.034, + "placementWidth" : 34.042, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.042, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]", + "entityName" : "SkillRow_SpringBoot", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 393.384, + "placementX" : 17.8, + "placementY" : 393.384, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]/Skill_SpringBoot[0]", + "entityName" : "Skill_SpringBoot", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 393.364, + "placementX" : 17.8, + "placementY" : 393.364, + "placementWidth" : 36.792, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 36.792, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 396.234, + "placementX" : 77.975, + "placementY" : 396.234, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SpringBoot[1]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 396.234, + "placementX" : 77.975, + "placementY" : 396.234, + "placementWidth" : 33.096, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.096, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]", + "entityName" : "SkillRow_SQLDatabases", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 375.584, + "placementX" : 17.8, + "placementY" : 375.584, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]/Skill_SQLDatabases[0]", + "entityName" : "Skill_SQLDatabases", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 375.564, + "placementX" : 17.8, + "placementY" : 375.564, + "placementWidth" : 52.448, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 52.448, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 378.434, + "placementX" : 77.975, + "placementY" : 378.434, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_SQLDatabases[2]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 378.434, + "placementX" : 77.975, + "placementY" : 378.434, + "placementWidth" : 33.096, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.096, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]", + "entityName" : "SkillRow_RESTfulAPIs", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 3, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 357.784, + "placementX" : 17.8, + "placementY" : 357.784, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]/Skill_RESTfulAPIs[0]", + "entityName" : "Skill_RESTfulAPIs", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 357.764, + "placementX" : 17.8, + "placementY" : 357.764, + "placementWidth" : 40.69, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 40.69, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 360.634, + "placementX" : 77.975, + "placementY" : 360.634, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_RESTfulAPIs[3]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 360.634, + "placementX" : 77.975, + "placementY" : 360.634, + "placementWidth" : 28.368, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 28.368, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]", + "entityName" : "SkillRow_Microservices", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 4, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 339.984, + "placementX" : 17.8, + "placementY" : 339.984, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]/Skill_Microservices[0]", + "entityName" : "Skill_Microservices", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 339.964, + "placementX" : 17.8, + "placementY" : 339.964, + "placementWidth" : 43.296, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 43.296, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 342.834, + "placementX" : 77.975, + "placementY" : 342.834, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Microservices[4]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 342.834, + "placementX" : 77.975, + "placementY" : 342.834, + "placementWidth" : 34.042, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.042, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]", + "entityName" : "SkillRow_GitGitHub", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 5, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 322.184, + "placementX" : 17.8, + "placementY" : 322.184, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]/Skill_GitGitHub[0]", + "entityName" : "Skill_GitGitHub", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 322.164, + "placementX" : 17.8, + "placementY" : 322.164, + "placementWidth" : 39.093, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 39.093, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 325.034, + "placementX" : 77.975, + "placementY" : 325.034, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_GitGitHub[5]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 325.034, + "placementX" : 77.975, + "placementY" : 325.034, + "placementWidth" : 34.042, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.042, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]", + "entityName" : "SkillRow_Docker", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 6, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 304.384, + "placementX" : 17.8, + "placementY" : 304.384, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]/Skill_Docker[0]", + "entityName" : "Skill_Docker", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 304.364, + "placementX" : 17.8, + "placementY" : 304.364, + "placementWidth" : 22.763, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.763, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 307.234, + "placementX" : 77.975, + "placementY" : 307.234, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Docker[6]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 307.234, + "placementX" : 77.975, + "placementY" : 307.234, + "placementWidth" : 26.477, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 26.477, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]", + "entityName" : "SkillRow_TestingJUnit", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 7, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 286.584, + "placementX" : 17.8, + "placementY" : 286.584, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]/Skill_TestingJUnit[0]", + "entityName" : "Skill_TestingJUnit", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 286.564, + "placementX" : 17.8, + "placementY" : 286.564, + "placementWidth" : 44.979, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 44.979, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 289.434, + "placementX" : 77.975, + "placementY" : 289.434, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_TestingJUnit[7]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 289.434, + "placementX" : 77.975, + "placementY" : 289.434, + "placementWidth" : 35.933, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 35.933, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]", + "entityName" : "SkillRow_ProblemSolving", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 8, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 268.784, + "placementX" : 17.8, + "placementY" : 268.784, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]/Skill_ProblemSolving[0]", + "entityName" : "Skill_ProblemSolving", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 268.764, + "placementX" : 17.8, + "placementY" : 268.764, + "placementWidth" : 50.517, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.517, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 271.634, + "placementX" : 77.975, + "placementY" : 271.634, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_ProblemSolving[8]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 271.634, + "placementX" : 77.975, + "placementY" : 271.634, + "placementWidth" : 34.042, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.042, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]", + "entityName" : "SkillRow_Communication", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]", + "childIndex" : 9, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 250.984, + "placementX" : 17.8, + "placementY" : 250.984, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]/Skill_Communication[0]", + "entityName" : "Skill_Communication", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 250.964, + "placementX" : 17.8, + "placementY" : 250.964, + "placementWidth" : 49.246, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.246, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]/SkillMeter[1]", + "entityName" : "SkillMeter", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 77.975, + "computedY" : 253.834, + "placementX" : 77.975, + "placementY" : 253.834, + "placementWidth" : 47.28, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.28, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]/SkillMeter[1]/SkillMeterFill[0]", + "entityName" : "SkillMeterFill", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Skills[2]/SkillRows[2]/SkillRow_Communication[9]/SkillMeter[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 77.975, + "computedY" : 253.834, + "placementX" : 77.975, + "placementY" : 253.834, + "placementWidth" : 33.096, + "placementHeight" : 2.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.096, + "contentHeight" : 2.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/SidebarDivider[3]", + "entityName" : "SidebarDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 234.984, + "placementX" : 17.8, + "placementY" : 234.984, + "placementWidth" : 107.456, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 1.0, + "margin" : { + "top" : 15.0, + "right" : 0.0, + "bottom" : 18.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]", + "entityName" : "Education", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 118.054, + "placementX" : 17.8, + "placementY" : 118.054, + "placementWidth" : 107.456, + "placementHeight" : 98.93, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 98.93, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/SidebarHeading_EDUCATION[0]", + "entityName" : "SidebarHeading_EDUCATION", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 206.784, + "placementX" : 17.8, + "placementY" : 206.784, + "placementWidth" : 59.505, + "placementHeight" : 10.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 59.505, + "contentHeight" : 10.2, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/SidebarHeadingRule_EDUCATION[1]", + "entityName" : "SidebarHeadingRule_EDUCATION", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 201.734, + "placementX" : 17.8, + "placementY" : 201.734, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "entityName" : "EducationRail", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 20.6, + "computedY" : 118.054, + "placementX" : 20.6, + "placementY" : 118.054, + "placementWidth" : 104.656, + "placementHeight" : 73.68, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 104.656, + "contentHeight" : 73.68, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 2.8 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]", + "entityName" : "EducationHead_0", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 20.6, + "computedY" : 182.434, + "placementX" : 20.6, + "placementY" : 182.434, + "placementWidth" : 104.656, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 104.656, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]/EducationRailMaskAboveFirstMarker[0]", + "entityName" : "EducationRailMaskAboveFirstMarker", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 20.1, + "computedY" : 189.234, + "placementX" : 20.1, + "placementY" : 189.234, + "placementWidth" : 1.55, + "placementHeight" : 2.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.55, + "contentHeight" : 2.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]/EducationRailFromFirstMarker[1]", + "entityName" : "EducationRailFromFirstMarker", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 20.6, + "computedY" : 182.434, + "placementX" : 20.6, + "placementY" : 182.434, + "placementWidth" : 0.55, + "placementHeight" : 2.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.55, + "contentHeight" : 2.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]/EducationMarker_0[2]", + "entityName" : "EducationMarker_0", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]", + "childIndex" : 2, + "depth" : 8, + "layer" : 8, + "computedX" : 18.45, + "computedY" : 184.934, + "placementX" : 18.45, + "placementY" : 184.934, + "placementWidth" : 4.3, + "placementHeight" : 4.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 4.3, + "contentHeight" : 4.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]/EducationDegree_0[3]", + "entityName" : "EducationDegree_0", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_0[0]", + "childIndex" : 3, + "depth" : 8, + "layer" : 8, + "computedX" : 33.6, + "computedY" : 182.704, + "placementX" : 33.6, + "placementY" : 182.704, + "placementWidth" : 51.713, + "placementHeight" : 8.76, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.713, + "contentHeight" : 8.76, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationInstitution_0[1]", + "entityName" : "EducationInstitution_0", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 33.6, + "computedY" : 171.414, + "placementX" : 33.6, + "placementY" : 171.414, + "placementWidth" : 49.21, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.21, + "contentHeight" : 8.52, + "margin" : { + "top" : 2.5, + "right" : 0.0, + "bottom" : 2.5, + "left" : 13.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationDates_0[2]", + "entityName" : "EducationDates_0", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 33.6, + "computedY" : 160.394, + "placementX" : 33.6, + "placementY" : 160.394, + "placementWidth" : 40.697, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 40.697, + "contentHeight" : 8.52, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.0, + "left" : 13.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_1[3]", + "entityName" : "EducationHead_1", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 3, + "depth" : 7, + "layer" : 7, + "computedX" : 20.6, + "computedY" : 140.094, + "placementX" : 20.6, + "placementY" : 140.094, + "placementWidth" : 104.656, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 104.656, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_1[3]/EducationMarker_1[0]", + "entityName" : "EducationMarker_1", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_1[3]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 18.45, + "computedY" : 142.594, + "placementX" : 18.45, + "placementY" : 142.594, + "placementWidth" : 4.3, + "placementHeight" : 4.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 4.3, + "contentHeight" : 4.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_1[3]/EducationDegree_1[1]", + "entityName" : "EducationDegree_1", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationHead_1[3]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 33.6, + "computedY" : 140.364, + "placementX" : 33.6, + "placementY" : 140.364, + "placementWidth" : 51.713, + "placementHeight" : 8.76, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.713, + "contentHeight" : 8.76, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationInstitution_1[4]", + "entityName" : "EducationInstitution_1", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 4, + "depth" : 7, + "layer" : 7, + "computedX" : 33.6, + "computedY" : 129.074, + "placementX" : 33.6, + "placementY" : 129.074, + "placementWidth" : 49.21, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.21, + "contentHeight" : 8.52, + "margin" : { + "top" : 2.5, + "right" : 0.0, + "bottom" : 2.5, + "left" : 13.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]/EducationDates_1[5]", + "entityName" : "EducationDates_1", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Education[4]/EducationRail[2]", + "childIndex" : 5, + "depth" : 7, + "layer" : 7, + "computedX" : 33.6, + "computedY" : 118.054, + "placementX" : 33.6, + "placementY" : 118.054, + "placementWidth" : 40.697, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 40.697, + "contentHeight" : 8.52, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/SidebarDivider[5]", + "entityName" : "SidebarDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 109.054, + "placementX" : 17.8, + "placementY" : 109.054, + "placementWidth" : 107.456, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 1.0, + "margin" : { + "top" : 8.0, + "right" : 0.0, + "bottom" : 16.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]", + "entityName" : "Languages", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 17.8, + "computedY" : 24.204, + "placementX" : 17.8, + "placementY" : 24.204, + "placementWidth" : 107.456, + "placementHeight" : 68.85, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 68.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/SidebarHeading_LANGUAGES[0]", + "entityName" : "SidebarHeading_LANGUAGES", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 82.854, + "placementX" : 17.8, + "placementY" : 82.854, + "placementWidth" : 60.253, + "placementHeight" : 10.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 60.253, + "contentHeight" : 10.2, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/SidebarHeadingRule_LANGUAGES[1]", + "entityName" : "SidebarHeadingRule_LANGUAGES", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 77.804, + "placementX" : 17.8, + "placementY" : 77.804, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 13.5, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]", + "entityName" : "LanguageRows", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 17.8, + "computedY" : 24.204, + "placementX" : 17.8, + "placementY" : 24.204, + "placementWidth" : 107.456, + "placementHeight" : 40.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 40.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]", + "entityName" : "LanguageRow_English", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 55.804, + "placementX" : 17.8, + "placementY" : 55.804, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/Language_English[0]", + "entityName" : "Language_English", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 55.784, + "placementX" : 17.8, + "placementY" : 55.784, + "placementWidth" : 22.173, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 22.173, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "entityName" : "LanguageRating", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 70.453, + "computedY" : 57.554, + "placementX" : 70.453, + "placementY" : 57.554, + "placementWidth" : 45.4, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 45.4, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]/LanguageDot_0[0]", + "entityName" : "LanguageDot_0", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 70.453, + "computedY" : 57.554, + "placementX" : 70.453, + "placementY" : 57.554, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]/LanguageDot_1[1]", + "entityName" : "LanguageDot_1", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "childIndex" : 1, + "depth" : 9, + "layer" : 9, + "computedX" : 80.553, + "computedY" : 57.554, + "placementX" : 80.553, + "placementY" : 57.554, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]/LanguageDot_2[2]", + "entityName" : "LanguageDot_2", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "childIndex" : 2, + "depth" : 9, + "layer" : 9, + "computedX" : 90.653, + "computedY" : 57.554, + "placementX" : 90.653, + "placementY" : 57.554, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]/LanguageDot_3[3]", + "entityName" : "LanguageDot_3", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "childIndex" : 3, + "depth" : 9, + "layer" : 9, + "computedX" : 100.753, + "computedY" : 57.554, + "placementX" : 100.753, + "placementY" : 57.554, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]/LanguageDot_4[4]", + "entityName" : "LanguageDot_4", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_English[0]/LanguageRating[1]", + "childIndex" : 4, + "depth" : 9, + "layer" : 9, + "computedX" : 110.853, + "computedY" : 57.554, + "placementX" : 110.853, + "placementY" : 57.554, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]", + "entityName" : "LanguageRow_Ukrainian", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 40.004, + "placementX" : 17.8, + "placementY" : 40.004, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/Language_Ukrainian[0]", + "entityName" : "Language_Ukrainian", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 39.984, + "placementX" : 17.8, + "placementY" : 39.984, + "placementWidth" : 29.806, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.806, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "entityName" : "LanguageRating", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 70.453, + "computedY" : 41.754, + "placementX" : 70.453, + "placementY" : 41.754, + "placementWidth" : 45.4, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 45.4, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]/LanguageDot_0[0]", + "entityName" : "LanguageDot_0", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 70.453, + "computedY" : 41.754, + "placementX" : 70.453, + "placementY" : 41.754, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]/LanguageDot_1[1]", + "entityName" : "LanguageDot_1", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "childIndex" : 1, + "depth" : 9, + "layer" : 9, + "computedX" : 80.553, + "computedY" : 41.754, + "placementX" : 80.553, + "placementY" : 41.754, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]/LanguageDot_2[2]", + "entityName" : "LanguageDot_2", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "childIndex" : 2, + "depth" : 9, + "layer" : 9, + "computedX" : 90.653, + "computedY" : 41.754, + "placementX" : 90.653, + "placementY" : 41.754, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]/LanguageDot_3[3]", + "entityName" : "LanguageDot_3", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "childIndex" : 3, + "depth" : 9, + "layer" : 9, + "computedX" : 100.753, + "computedY" : 41.754, + "placementX" : 100.753, + "placementY" : 41.754, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]/LanguageDot_4[4]", + "entityName" : "LanguageDot_4", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Ukrainian[1]/LanguageRating[1]", + "childIndex" : 4, + "depth" : 9, + "layer" : 9, + "computedX" : 110.853, + "computedY" : 41.754, + "placementX" : 110.853, + "placementY" : 41.754, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]", + "entityName" : "LanguageRow_Russian", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]", + "childIndex" : 2, + "depth" : 7, + "layer" : 7, + "computedX" : 17.8, + "computedY" : 24.204, + "placementX" : 17.8, + "placementY" : 24.204, + "placementWidth" : 107.456, + "placementHeight" : 8.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.456, + "contentHeight" : 8.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/Language_Russian[0]", + "entityName" : "Language_Russian", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 17.8, + "computedY" : 24.184, + "placementX" : 17.8, + "placementY" : 24.184, + "placementWidth" : 23.757, + "placementHeight" : 8.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.757, + "contentHeight" : 8.52, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "entityName" : "LanguageRating", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 70.453, + "computedY" : 25.954, + "placementX" : 70.453, + "placementY" : 25.954, + "placementWidth" : 45.4, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 45.4, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]/LanguageDot_0[0]", + "entityName" : "LanguageDot_0", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 70.453, + "computedY" : 25.954, + "placementX" : 70.453, + "placementY" : 25.954, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]/LanguageDot_1[1]", + "entityName" : "LanguageDot_1", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "childIndex" : 1, + "depth" : 9, + "layer" : 9, + "computedX" : 80.553, + "computedY" : 25.954, + "placementX" : 80.553, + "placementY" : 25.954, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]/LanguageDot_2[2]", + "entityName" : "LanguageDot_2", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "childIndex" : 2, + "depth" : 9, + "layer" : 9, + "computedX" : 90.653, + "computedY" : 25.954, + "placementX" : 90.653, + "placementY" : 25.954, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]/LanguageDot_3[3]", + "entityName" : "LanguageDot_3", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "childIndex" : 3, + "depth" : 9, + "layer" : 9, + "computedX" : 100.753, + "computedY" : 25.954, + "placementX" : 100.753, + "placementY" : 25.954, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]/LanguageDot_4[4]", + "entityName" : "LanguageDot_4", + "entityKind" : "EllipseNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Sidebar[0]/SidebarBody[1]/Languages[6]/LanguageRows[2]/LanguageRow_Russian[2]/LanguageRating[1]", + "childIndex" : 4, + "depth" : 9, + "layer" : 9, + "computedX" : 110.853, + "computedY" : 25.954, + "placementX" : 110.853, + "placementY" : 25.954, + "placementWidth" : 5.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 5.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "entityName" : "Main", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 143.056, + "computedY" : 12.73, + "placementX" : 143.056, + "placementY" : 12.73, + "placementWidth" : 348.544, + "placementHeight" : 724.55, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 348.544, + "contentHeight" : 724.55, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 21.9, + "right" : 20.0, + "bottom" : 0.0, + "left" : 27.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "entityName" : "Identity", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 170.056, + "computedY" : 617.19, + "placementX" : 170.056, + "placementY" : 617.19, + "placementWidth" : 301.544, + "placementHeight" : 98.19, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 98.19, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/DisplayName[0]", + "entityName" : "DisplayName", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 671.34, + "placementX" : 170.056, + "placementY" : 671.34, + "placementWidth" : 176.476, + "placementHeight" : 44.04, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.476, + "contentHeight" : 44.04, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 6.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/ProfessionalTitle[1]", + "entityName" : "ProfessionalTitle", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 653.64, + "placementX" : 170.056, + "placementY" : 653.64, + "placementWidth" : 163.438, + "placementHeight" : 11.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 163.438, + "contentHeight" : 11.4, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 14.9, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/IdentityRule[2]", + "entityName" : "IdentityRule", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 637.69, + "placementX" : 170.056, + "placementY" : 637.69, + "placementWidth" : 301.544, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 1.05, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/IdentityRule[2]/IdentityAccentSegment[0]", + "entityName" : "IdentityAccentSegment", + "entityKind" : "ShapeNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/IdentityRule[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 637.69, + "placementX" : 170.056, + "placementY" : 637.69, + "placementWidth" : 27.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 27.0, + "contentHeight" : 1.05, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]/SpacerNode[3]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Identity[0]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 617.19, + "placementX" : 170.056, + "placementY" : 617.19, + "placementWidth" : 0.0, + "placementHeight" : 20.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 20.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]", + "entityName" : "Profile", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 170.056, + "computedY" : 525.58, + "placementX" : 170.056, + "placementY" : 525.58, + "placementWidth" : 287.543, + "placementHeight" : 91.61, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 287.543, + "contentHeight" : 91.61, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]/MainHeading_PROFILE[0]", + "entityName" : "MainHeading_PROFILE", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 606.75, + "placementX" : 170.056, + "placementY" : 606.75, + "placementWidth" : 42.147, + "placementHeight" : 10.44, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 42.147, + "contentHeight" : 10.44, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]/MainHeadingRule_PROFILE[1]", + "entityName" : "MainHeadingRule_PROFILE", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 601.7, + "placementX" : 170.056, + "placementY" : 601.7, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 14.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]/ProfileText[2]", + "entityName" : "ProfileText", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 550.08, + "placementX" : 170.056, + "placementY" : 550.08, + "placementWidth" : 287.543, + "placementHeight" : 37.62, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 287.543, + "contentHeight" : 37.62, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]/SpacerNode[3]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Profile[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 525.58, + "placementX" : 170.056, + "placementY" : 525.58, + "placementWidth" : 0.0, + "placementHeight" : 24.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 24.5, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "entityName" : "Experience", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 170.056, + "computedY" : 165.63, + "placementX" : 170.056, + "placementY" : 165.63, + "placementWidth" : 301.544, + "placementHeight" : 359.95, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 359.95, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/MainHeading_EXPERIENCE[0]", + "entityName" : "MainHeading_EXPERIENCE", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 515.14, + "placementX" : 170.056, + "placementY" : 515.14, + "placementWidth" : 62.533, + "placementHeight" : 10.44, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 62.533, + "contentHeight" : 10.44, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/MainHeadingRule_EXPERIENCE[1]", + "entityName" : "MainHeadingRule_EXPERIENCE", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 510.09, + "placementX" : 170.056, + "placementY" : 510.09, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 18.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_0[2]", + "entityName" : "ExperienceHead_0", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 482.49, + "placementX" : 170.056, + "placementY" : 482.49, + "placementWidth" : 301.544, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_0[2]/ExperienceHead_0Title[0]", + "entityName" : "ExperienceHead_0Title", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_0[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 482.64, + "placementX" : 170.056, + "placementY" : 482.64, + "placementWidth" : 101.858, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 101.858, + "contentHeight" : 9.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_0[2]/ExperienceHead_0Dates[1]", + "entityName" : "ExperienceHead_0Dates", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_0[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 482.82, + "placementX" : 170.056, + "placementY" : 482.82, + "placementWidth" : 301.544, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 8.64, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceMeta_0[3]", + "entityName" : "ExperienceMeta_0", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 471.85, + "placementX" : 170.056, + "placementY" : 471.85, + "placementWidth" : 91.62, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 91.62, + "contentHeight" : 8.64, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 14.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHighlights_0[4]", + "entityName" : "ExperienceHighlights_0", + "entityKind" : "ListNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 409.07, + "placementX" : 170.056, + "placementY" : 409.07, + "placementWidth" : 208.058, + "placementHeight" : 48.48, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 208.058, + "contentHeight" : 48.48, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/MainDivider[5]", + "entityName" : "MainDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 394.07, + "placementX" : 170.056, + "placementY" : 394.07, + "placementWidth" : 301.544, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 1.0, + "margin" : { + "top" : 14.0, + "right" : 0.0, + "bottom" : 13.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_1[6]", + "entityName" : "ExperienceHead_1", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 371.77, + "placementX" : 170.056, + "placementY" : 371.77, + "placementWidth" : 301.544, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_1[6]/ExperienceHead_1Title[0]", + "entityName" : "ExperienceHead_1Title", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_1[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 371.92, + "placementX" : 170.056, + "placementY" : 371.92, + "placementWidth" : 86.258, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.258, + "contentHeight" : 9.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_1[6]/ExperienceHead_1Dates[1]", + "entityName" : "ExperienceHead_1Dates", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_1[6]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 372.1, + "placementX" : 170.056, + "placementY" : 372.1, + "placementWidth" : 301.544, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 8.64, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceMeta_1[7]", + "entityName" : "ExperienceMeta_1", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 361.13, + "placementX" : 170.056, + "placementY" : 361.13, + "placementWidth" : 120.643, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 120.643, + "contentHeight" : 8.64, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 14.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHighlights_1[8]", + "entityName" : "ExperienceHighlights_1", + "entityKind" : "ListNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 8, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 298.35, + "placementX" : 170.056, + "placementY" : 298.35, + "placementWidth" : 194.696, + "placementHeight" : 48.48, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 194.696, + "contentHeight" : 48.48, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/MainDivider[9]", + "entityName" : "MainDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 9, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 283.35, + "placementX" : 170.056, + "placementY" : 283.35, + "placementWidth" : 301.544, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 1.0, + "margin" : { + "top" : 14.0, + "right" : 0.0, + "bottom" : 13.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_2[10]", + "entityName" : "ExperienceHead_2", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 10, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 261.05, + "placementX" : 170.056, + "placementY" : 261.05, + "placementWidth" : 301.544, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_2[10]/ExperienceHead_2Title[0]", + "entityName" : "ExperienceHead_2Title", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_2[10]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 261.2, + "placementX" : 170.056, + "placementY" : 261.2, + "placementWidth" : 93.48, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 93.48, + "contentHeight" : 9.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_2[10]/ExperienceHead_2Dates[1]", + "entityName" : "ExperienceHead_2Dates", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHead_2[10]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 261.38, + "placementX" : 170.056, + "placementY" : 261.38, + "placementWidth" : 301.544, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 8.64, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceMeta_2[11]", + "entityName" : "ExperienceMeta_2", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 11, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 250.41, + "placementX" : 170.056, + "placementY" : 250.41, + "placementWidth" : 68.875, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 68.875, + "contentHeight" : 8.64, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 14.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/ExperienceHighlights_2[12]", + "entityName" : "ExperienceHighlights_2", + "entityKind" : "ListNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 12, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 187.63, + "placementX" : 170.056, + "placementY" : 187.63, + "placementWidth" : 193.731, + "placementHeight" : 48.48, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 193.731, + "contentHeight" : 48.48, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]/SpacerNode[13]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Experience[2]", + "childIndex" : 13, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 165.63, + "placementX" : 170.056, + "placementY" : 165.63, + "placementWidth" : 0.0, + "placementHeight" : 22.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 22.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "entityName" : "Projects", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 170.056, + "computedY" : 45.1, + "placementX" : 170.056, + "placementY" : 45.1, + "placementWidth" : 301.544, + "placementHeight" : 120.53, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 120.53, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/MainHeading_PROJECTS[0]", + "entityName" : "MainHeading_PROJECTS", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 155.19, + "placementX" : 170.056, + "placementY" : 155.19, + "placementWidth" : 50.795, + "placementHeight" : 10.44, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.795, + "contentHeight" : 10.44, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/MainHeadingRule_PROJECTS[1]", + "entityName" : "MainHeadingRule_PROJECTS", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 150.14, + "placementX" : 170.056, + "placementY" : 150.14, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 8.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_0[2]", + "entityName" : "ProjectHead_0", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 132.84, + "placementX" : 170.056, + "placementY" : 132.84, + "placementWidth" : 301.544, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_0[2]/ProjectHead_0Title[0]", + "entityName" : "ProjectHead_0Title", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_0[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 132.99, + "placementX" : 170.056, + "placementY" : 132.99, + "placementWidth" : 47.88, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.88, + "contentHeight" : 9.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_0[2]/ProjectHead_0Dates[1]", + "entityName" : "ProjectHead_0Dates", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_0[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 133.17, + "placementX" : 170.056, + "placementY" : 133.17, + "placementWidth" : 301.544, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 8.64, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/SpacerNode[3]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 127.84, + "placementX" : 170.056, + "placementY" : 127.84, + "placementWidth" : 0.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectDescription_0[4]", + "entityName" : "ProjectDescription_0", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 109.62, + "placementX" : 170.056, + "placementY" : 109.62, + "placementWidth" : 289.197, + "placementHeight" : 18.22, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 289.197, + "contentHeight" : 18.22, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/MainDivider[5]", + "entityName" : "MainDivider", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 102.62, + "placementX" : 170.056, + "placementY" : 102.62, + "placementWidth" : 301.544, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 1.0, + "margin" : { + "top" : 6.0, + "right" : 0.0, + "bottom" : 7.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_1[6]", + "entityName" : "ProjectHead_1", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 86.32, + "placementX" : 170.056, + "placementY" : 86.32, + "placementWidth" : 301.544, + "placementHeight" : 9.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 9.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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_1[6]/ProjectHead_1Title[0]", + "entityName" : "ProjectHead_1Title", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_1[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 86.47, + "placementX" : 170.056, + "placementY" : 86.47, + "placementWidth" : 63.15, + "placementHeight" : 9.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 63.15, + "contentHeight" : 9.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_1[6]/ProjectHead_1Dates[1]", + "entityName" : "ProjectHead_1Dates", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectHead_1[6]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 170.056, + "computedY" : 86.65, + "placementX" : 170.056, + "placementY" : 86.65, + "placementWidth" : 301.544, + "placementHeight" : 8.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 301.544, + "contentHeight" : 8.64, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/SpacerNode[7]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 81.32, + "placementX" : 170.056, + "placementY" : 81.32, + "placementWidth" : 0.0, + "placementHeight" : 5.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 5.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/ProjectDescription_1[8]", + "entityName" : "ProjectDescription_1", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 8, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 63.1, + "placementX" : 170.056, + "placementY" : 63.1, + "placementWidth" : 296.901, + "placementHeight" : 18.22, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 296.901, + "contentHeight" : 18.22, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]/SpacerNode[9]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/Projects[3]", + "childIndex" : 9, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 45.1, + "placementX" : 170.056, + "placementY" : 45.1, + "placementWidth" : 0.0, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 18.0, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]", + "entityName" : "References", + "entityKind" : "SectionNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 170.056, + "computedY" : 12.73, + "placementX" : 170.056, + "placementY" : 12.73, + "placementWidth" : 76.287, + "placementHeight" : 32.37, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 76.287, + "contentHeight" : 32.37, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]/MainHeading_REFERENCES[0]", + "entityName" : "MainHeading_REFERENCES", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 34.66, + "placementX" : 170.056, + "placementY" : 34.66, + "placementWidth" : 64.021, + "placementHeight" : 10.44, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 64.021, + "contentHeight" : 10.44, + "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" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]/MainHeadingRule_REFERENCES[1]", + "entityName" : "MainHeadingRule_REFERENCES", + "entityKind" : "LineNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 29.61, + "placementX" : 170.056, + "placementY" : 29.61, + "placementWidth" : 19.0, + "placementHeight" : 1.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.0, + "contentHeight" : 1.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 8.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]/ReferencesNote[2]", + "entityName" : "ReferencesNote", + "entityKind" : "ParagraphNode", + "parentPath" : "ProfessionalSidebarCv[0]/PageGrid[0]/Main[1]/References[4]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 170.056, + "computedY" : 12.73, + "placementX" : 170.056, + "placementY" : 12.73, + "placementWidth" : 76.287, + "placementHeight" : 8.88, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 76.287, + "contentHeight" : 8.88, + "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 + } + } ] +} diff --git a/qa/src/test/resources/visual-baselines/cv-v2-layered/professional_sidebar-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/professional_sidebar-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4d701359eca7e7f9c8085a4a1475c2eeb0e480 GIT binary patch literal 81055 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 literal 0 HcmV?d00001 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 new file mode 100644 index 000000000..2dcca81e6 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebar.java @@ -0,0 +1,220 @@ +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.SkillsSection; + +import java.util.List; +import java.util.Objects; + +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_WEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PAGE_BACKGROUND; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PAGE_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PAGE_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_BACKGROUND; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_WEIGHT; + +/** + * Professional Sidebar — a one-page CV in two columns: a pale sidebar under + * a navy monogram plate carrying the contact channels, the skill meters, the + * education rail and the language ratings, and a white main column carrying + * the name, the profile, the roles held, the projects and the references + * note. + * + *

The preset owns its page: a 491.6 x 737.28pt sheet with no margin, the + * page fill and the pale sidebar painted as page backgrounds 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. Feed it a CV of about the length the design was drawn around: five + * or six roles with three or four highlights each, alongside the sidebar + * blocks.

+ * + *

The preset draws no cap of its own, which is the deliberate half of + * that: its siblings {@link MonogramSidebar}, {@link SidebarPortrait} and + * {@link MintEditorial} cap each block and silently drop what does not fit, + * and 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}: profile, experience, + * projects and references to the main column; skills, education 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.

+ * + *

A berth is filled by the first section that names it, so a second + * section naming the same berth is not drawn. Neither is anything the design + * has no place for: a project's {@code subtitle}, an education entry's + * {@code body}, and a {@code SkillGroup}'s {@code category} — this sheet + * heads its projects with a title and dates, its degrees with an institution + * and dates, and sets its skills as one ungrouped list.

+ * + *

Both the skills and the languages are {@link SkillsSection}s — the same + * shape, drawn differently: a skill's level fills a bar, a language's fills + * the nearest whole number of five dots. A level the document omits draws + * the name alone.

+ * + *

The sidebar's rows are one line each: a skill name, a language name and + * an education degree are anchored inside a fixed-height band, so text + * longer than the narrow column measures overflows the band instead of + * wrapping inside it. That is the design — the sheet is drawn around short + * labels — and it is the one length constraint a document has to respect.

+ * + *

The contact channels come off the identity rather than a section: the + * phone, the email and the address take the packaged marks, and each link + * takes the network mark when it names one and the globe otherwise. The + * phone and email rows carry {@code tel:} and {@code mailto:} targets built + * from the value.

+ * + *

Fonts

+ * + *

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

+ * + *

Usage:

+ *
{@code
+ * DocumentTemplate template = ProfessionalSidebar.create();
+ * template.compose(session, cv);
+ * }
+ */ +public final class ProfessionalSidebar { + + /** Stable identifier of this preset. */ + public static final String ID = "professional-sidebar"; + + /** Human-readable name of this preset. */ + public static final String DISPLAY_NAME = "Professional Sidebar"; + + /** + * The margin this preset expects: none. It sets the page margin itself, + * because both columns run to the paper edge. + */ + public static final double RECOMMENDED_MARGIN = 0.0; + + private static final List PROFILE_KEYS = + List.of("profile", "summary", "about"); + private static final List EXPERIENCE_KEYS = + List.of("experience", "employment", "work history", "career"); + private static final List PROJECT_KEYS = + List.of("projects", "project", "portfolio"); + private static final List REFERENCES_KEYS = + List.of("references", "reference"); + private static final List SKILL_KEYS = + List.of("skills", "expertise", "competencies"); + private static final List EDUCATION_KEYS = + List.of("education", "qualifications", "certifications"); + private static final List LANGUAGE_KEYS = + List.of("languages", "language"); + + private ProfessionalSidebar() { + } + + /** + * 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_WIDTH, PAGE_HEIGHT) + .margin(DocumentInsets.zero()) + // The sidebar fill is a page background rather than a + // section fill: a section is only as tall as what it + // holds, and the pale column has to reach the foot of + // the sheet whatever the sidebar carries. + .pageBackgrounds(List.of( + PageBackgroundFill.fullPage(PAGE_BACKGROUND), + PageBackgroundFill.leftColumn(SIDEBAR_WEIGHT, + SIDEBAR_BACKGROUND))); + + SkillsSection skills = berth(sections, SkillsSection.class, SKILL_KEYS); + EntriesSection education = berth(sections, EntriesSection.class, EDUCATION_KEYS); + // A title can name both berths — "Skills and Languages" does — + // and one section cannot fill two, so the second berth stays + // empty rather than drawing the same list twice in two hands. + SkillsSection named = berth(sections, SkillsSection.class, LANGUAGE_KEYS); + SkillsSection languages = named == skills ? null : named; + ParagraphSection profile = berth(sections, ParagraphSection.class, PROFILE_KEYS); + EntriesSection experience = berth(sections, EntriesSection.class, EXPERIENCE_KEYS); + EntriesSection projects = berth(sections, EntriesSection.class, PROJECT_KEYS); + ParagraphSection references = + berth(sections, ParagraphSection.class, REFERENCES_KEYS); + + document.pageFlow(page -> page + .name("ProfessionalSidebarCv") + .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 -> + ProfessionalSidebarAside.compose(aside, doc.identity(), + skills, education, languages)); + row.addSection("Main", main -> + ProfessionalSidebarMain.compose(main, doc.identity(), + profile, experience, projects, references)); + })); + } + + /** + * 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/ProfessionalSidebarAside.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarAside.java new file mode 100644 index 000000000..a22ae816d --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarAside.java @@ -0,0 +1,444 @@ +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.dsl.ShapeBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.image.DocumentImageData; +import com.demcha.compose.document.node.DocumentLinkOptions; +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.node.TextAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +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.CvSkill; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +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.ProfessionalSidebarStyles.ACCENT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.CONTACT_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.CONTACT_ROW_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.CONTACT_TO_SKILLS_ABOVE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.CONTACT_TO_SKILLS_BELOW; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_DEGREE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_ENTRY_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_LINE_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_MARKER_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_RAIL_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_RAIL_X; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_TEXT_X; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_TO_LANGUAGES_ABOVE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EDUCATION_TO_LANGUAGES_BELOW; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_HEAD_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.HEADER_PLATE_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_DOTS; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_DOT_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_DOT_PITCH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_RATING_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_RATING_X; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_ROW_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.LANGUAGE_ROW_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MONOGRAM_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MONOGRAM_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MONOGRAM_STROKE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MONOGRAM_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.RATING_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.RULE_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_BACKGROUND; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_BODY_TOP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_INNER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_PAD_X; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILLS_TO_EDUCATION_ABOVE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILLS_TO_EDUCATION_BELOW; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILL_ROW_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILL_ROW_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILL_TRACK_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SKILL_TRACK_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PLATE_BACKGROUND; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.STANDARD_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.body; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.clamp01; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.tracked; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.paragraph; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.sidebarDivider; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.sidebarHeading; + +/** + * The pale left column: the navy monogram plate, the contact channels, the + * skill meters, the education rail and the language ratings. + * + *

The column has four berths in a fixed order, each with its own measured + * gap to the one above. A berth with nothing to draw takes its leading + * hairline with it, so a CV that carries no languages does not end on a rule + * with empty space under it.

+ */ +final class ProfessionalSidebarAside { + + /** + * 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 ProfessionalSidebarAside() { + } + + static void compose(SectionBuilder section, + CvIdentity identity, + SkillsSection skills, + EntriesSection education, + SkillsSection languages) { + section.spacing(0); + section.add(monogramPlate(identity)); + section.addSection("SidebarBody", body -> { + body.spacing(0); + body.padding(new DocumentInsets(SIDEBAR_BODY_TOP, SIDEBAR_PAD_X, 0, SIDEBAR_PAD_X)); + body.addSection("Contact", contact -> renderContact(contact, identity)); + if (SectionLookup.hasContent(skills)) { + sidebarDivider(body, CONTACT_TO_SKILLS_ABOVE, CONTACT_TO_SKILLS_BELOW); + body.addSection("Skills", host -> renderSkills(host, skills)); + } + if (SectionLookup.hasContent(education)) { + sidebarDivider(body, SKILLS_TO_EDUCATION_ABOVE, SKILLS_TO_EDUCATION_BELOW); + body.addSection("Education", host -> renderEducation(host, education)); + } + if (SectionLookup.hasContent(languages)) { + sidebarDivider(body, EDUCATION_TO_LANGUAGES_ABOVE, EDUCATION_TO_LANGUAGES_BELOW); + body.addSection("Languages", host -> renderLanguages(host, languages)); + } + }); + } + + // -- monogram -------------------------------------------------------- + + /** + * The navy plate that caps the column, with the initials set inside a + * hairline ring. + * + *

The plate is drawn rather than painted as a page background because + * it is the first thing in the flow: the sidebar content stacks under it, + * and a background would not push anything down.

+ */ + private static DocumentNode monogramPlate(CvIdentity identity) { + DocumentTextStyle initialsStyle = style(BODY_FONT, MONOGRAM_SIZE, + DocumentColor.WHITE, DocumentTextDecoration.DEFAULT); + ParagraphBuilder initials = new ParagraphBuilder() + .name("MonogramInitials") + .textStyle(initialsStyle) + .align(TextAlign.CENTER); + tracked(initials, initials(identity), initialsStyle, MONOGRAM_TRACKING_EM); + + DocumentNode ring = new ShapeContainerBuilder() + .name("MonogramRing") + .circle(MONOGRAM_DIAMETER) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .stroke(DocumentStroke.of(DocumentColor.WHITE, MONOGRAM_STROKE)) + .center(initials.margin(DocumentInsets.zero()).build()) + .build(); + + return new ShapeContainerBuilder() + .name("MonogramPlate") + .rectangle(SIDEBAR_WIDTH, HEADER_PLATE_HEIGHT) + .fillColor(PLATE_BACKGROUND) + .center(ring) + .build(); + } + + /** First letter of the given name, first letter of the family name. */ + private static String initials(CvIdentity identity) { + String first = initial(identity.name().first()); + String last = initial(identity.name().last()); + return (first + last).toUpperCase(Locale.ROOT); + } + + private static String initial(String value) { + return value == null || value.isBlank() ? "" : value.trim().substring(0, 1); + } + + // -- contact --------------------------------------------------------- + + /** + * The contact channels, in the order the design sets them: phone, email, + * address, then whatever links the identity carries. + * + *

The phone and email rows link to {@code tel:} and {@code mailto:} + * targets built from the value, so the channels are dialable and + * writable from the PDF without the document carrying the URI twice.

+ */ + private static void renderContact(SectionBuilder section, CvIdentity identity) { + sidebarHeading(section, CONTACT_HEADING, CONTACT_HEADING_TO_BODY); + List channels = channels(identity); + for (int i = 0; i < channels.size(); i++) { + Channel channel = channels.get(i); + double gapBelow = i + 1 < channels.size() ? CONTACT_ROW_GAP : 0; + renderChannel(section, channel, gapBelow); + } + } + + private static void renderChannel(SectionBuilder section, Channel channel, + double gapBelow) { + DocumentImageData icon = ProfessionalSidebarIcons.image(channel.token()); + double size = ProfessionalSidebarIcons.size(channel.token()); + DocumentLinkOptions link = channel.href() == null + ? null + : new DocumentLinkOptions(channel.href()); + ParagraphBuilder row = new ParagraphBuilder() + .name("Contact_" + compact(channel.token())) + .textStyle(body()) + .inlineImage(icon, size, size, InlineImageAlignment.CENTER, 0, link); + // 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. + if (link == null) { + row.inlineText(" " + channel.value(), body()); + } else { + row.inlineText(" " + channel.value(), body(), link); + } + section.add(row.margin(new DocumentInsets(0, 0, gapBelow, 0)).build()); + } + + private static List channels(CvIdentity identity) { + List channels = new ArrayList<>(); + String phone = identity.contact().phone(); + channels.add(new Channel(ProfessionalSidebarIcons.PHONE, phone, telUri(phone))); + String email = identity.contact().email(); + channels.add(new Channel(ProfessionalSidebarIcons.EMAIL, email, "mailto:" + email)); + channels.add(new Channel(ProfessionalSidebarIcons.LOCATION, + identity.contact().address(), null)); + for (Link link : identity.links()) { + channels.add(new Channel(linkToken(link), link.label(), link.url())); + } + return channels; + } + + /** + * The dial target for a phone number: its digits, keeping a leading + * {@code +} so an international number stays international. + */ + private static String telUri(String phone) { + String digits = phone.replaceAll("[^0-9]", ""); + return digits.isEmpty() + ? null + : "tel:" + (phone.trim().startsWith("+") ? "+" : "") + digits; + } + + /** + * The mark for a link. The packaged set names one network; everything + * else is a site, which is what the globe stands for. + */ + private static String linkToken(Link link) { + String haystack = SectionLookup.normalize(link.label() + " " + link.url()); + return haystack.contains("linkedin") + ? ProfessionalSidebarIcons.LINKEDIN + : ProfessionalSidebarIcons.WEBSITE; + } + + private record Channel(String token, String value, String href) { + } + + // -- skills ---------------------------------------------------------- + + /** + * Skill rows: the name at the left of a fixed-height band, the meter at + * the right. A skill the document leaves unlevelled draws its name alone + * rather than an empty track. + */ + private static void renderSkills(SectionBuilder section, SkillsSection skills) { + sidebarHeading(section, skills.title(), STANDARD_HEADING_TO_BODY); + section.addSection("SkillRows", rows -> { + rows.spacing(SKILL_ROW_GAP); + for (CvSkill skill : flatten(skills)) { + DocumentNode label = paragraph("Skill_" + compact(skill.name()), + skill.name(), body(), TextAlign.LEFT); + rows.addContainer(row -> { + row.name("SkillRow_" + compact(skill.name())) + .rectangle(SIDEBAR_INNER_WIDTH, SKILL_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(label); + if (skill.level().isPresent()) { + row.centerRight(skillMeter(skill.level().getAsDouble())); + } + }); + } + }); + } + + private static DocumentNode skillMeter(double level) { + DocumentNode fill = new ShapeBuilder() + .name("SkillMeterFill") + .size(SKILL_TRACK_WIDTH * clamp01(level), SKILL_TRACK_HEIGHT) + .fillColor(PLATE_BACKGROUND) + .build(); + return new ShapeContainerBuilder() + .name("SkillMeter") + .rectangle(SKILL_TRACK_WIDTH, SKILL_TRACK_HEIGHT) + .fillColor(RULE_MUTED) + .centerLeft(fill) + .build(); + } + + // -- education ------------------------------------------------------- + + /** + * The education rail: a hairline down the left of the block with a dot + * on each entry's first line. + * + *

The rail is the section's left accent, which runs the full height of + * the block. The first entry masks the stretch above its dot and redraws + * it below, so the rail begins at the first marker instead of at the top + * of the block.

+ */ + private static void renderEducation(SectionBuilder section, EntriesSection education) { + sidebarHeading(section, education.title(), EDUCATION_HEADING_TO_BODY); + section.addSection("EducationRail", rail -> { + rail.spacing(0); + rail.margin(new DocumentInsets(0, 0, 0, EDUCATION_RAIL_X)); + rail.accentLeft(RULE_MUTED, EDUCATION_RAIL_WIDTH); + List entries = education.entries(); + for (int i = 0; i < entries.size(); i++) { + int index = i; + CvEntry entry = entries.get(i); + renderEducationHead(rail, entry, index); + rail.addParagraph(p -> p + .name("EducationInstitution_" + index) + .text(entry.subtitle()) + .textStyle(style(BODY_FONT, BODY_SIZE, TEXT_MUTED, + DocumentTextDecoration.ITALIC)) + .margin(new DocumentInsets( + EDUCATION_LINE_GAP, 0, EDUCATION_LINE_GAP, EDUCATION_TEXT_X))); + double entryGap = i + 1 < entries.size() ? EDUCATION_ENTRY_GAP : 0; + rail.addParagraph(p -> p + .name("EducationDates_" + index) + .text(entry.date()) + .textStyle(body()) + .margin(new DocumentInsets(0, 0, entryGap, EDUCATION_TEXT_X))); + } + }); + } + + private static void renderEducationHead(SectionBuilder rail, CvEntry entry, int index) { + DocumentNode marker = new EllipseBuilder() + .name("EducationMarker_" + index) + .circle(EDUCATION_MARKER_DIAMETER) + .fillColor(ACCENT_PRIMARY) + .build(); + DocumentNode degree = paragraph("EducationDegree_" + index, entry.title(), + style(BODY_FONT, EDUCATION_DEGREE_SIZE, TEXT_PRIMARY, + DocumentTextDecoration.BOLD), + TextAlign.LEFT); + rail.addContainer(head -> { + head.name("EducationHead_" + index) + .rectangle(SIDEBAR_INNER_WIDTH - EDUCATION_RAIL_X, ENTRY_HEAD_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE); + if (index == 0) { + double halfBand = (ENTRY_HEAD_HEIGHT - EDUCATION_MARKER_DIAMETER) / 2.0; + DocumentNode maskAboveFirstMarker = new ShapeBuilder() + .name("EducationRailMaskAboveFirstMarker") + // One point wider than the rail, and pulled half a + // point left, so the mask covers the rail's own edge + // instead of leaving a hairline of it showing. + .size(EDUCATION_RAIL_WIDTH + 1.0, halfBand) + .fillColor(SIDEBAR_BACKGROUND) + .build(); + DocumentNode railFromFirstMarker = new ShapeBuilder() + .name("EducationRailFromFirstMarker") + .size(EDUCATION_RAIL_WIDTH, halfBand) + .fillColor(RULE_MUTED) + .build(); + head.fillColor(SIDEBAR_BACKGROUND) + .position(maskAboveFirstMarker, -0.5, 0, LayerAlign.TOP_LEFT) + .position(railFromFirstMarker, 0, + (ENTRY_HEAD_HEIGHT + EDUCATION_MARKER_DIAMETER) / 2.0, + LayerAlign.TOP_LEFT); + } + head.position(marker, -EDUCATION_MARKER_DIAMETER / 2.0, 0, LayerAlign.CENTER_LEFT) + .position(degree, EDUCATION_TEXT_X, 0, LayerAlign.CENTER_LEFT); + }); + } + + // -- languages ------------------------------------------------------- + + /** + * Language rows: the name at the left, a five-dot rating anchored at a + * fixed offset so the ratings line up whatever the names measure. A + * language the document leaves unlevelled draws its name alone. + */ + private static void renderLanguages(SectionBuilder section, SkillsSection languages) { + sidebarHeading(section, languages.title(), STANDARD_HEADING_TO_BODY); + section.addSection("LanguageRows", rows -> { + rows.spacing(LANGUAGE_ROW_GAP); + for (CvSkill language : flatten(languages)) { + DocumentNode label = paragraph("Language_" + compact(language.name()), + language.name(), body(), TextAlign.LEFT); + rows.addContainer(row -> { + row.name("LanguageRow_" + compact(language.name())) + .rectangle(SIDEBAR_INNER_WIDTH, LANGUAGE_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(label); + if (language.level().isPresent()) { + row.position(ratingDots(language.level().getAsDouble()), + LANGUAGE_RATING_X, 0, LayerAlign.CENTER_LEFT); + } + }); + } + }); + } + + /** + * The rating: five dots, of which the level fills the nearest whole + * number — the model carries a fraction, and this design counts. + */ + private static DocumentNode ratingDots(double level) { + long filled = Math.round(clamp01(level) * LANGUAGE_DOTS); + ShapeContainerBuilder rating = new ShapeContainerBuilder() + .name("LanguageRating") + .rectangle(LANGUAGE_RATING_WIDTH, LANGUAGE_DOT_DIAMETER) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE); + for (int i = 0; i < LANGUAGE_DOTS; i++) { + DocumentNode dot = new EllipseBuilder() + .name("LanguageDot_" + i) + .circle(LANGUAGE_DOT_DIAMETER) + .fillColor(i < filled ? PLATE_BACKGROUND : RATING_MUTED) + .build(); + rating.position(dot, i * LANGUAGE_DOT_PITCH, 0, LayerAlign.CENTER_LEFT); + } + return rating.build(); + } + + /** + * The section's skills as one list. 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 flatten(SkillsSection section) { + List out = new ArrayList<>(); + for (SkillGroup group : section.groups()) { + out.addAll(group.entries()); + } + return out; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarIcons.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarIcons.java new file mode 100644 index 000000000..0e35fa334 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarIcons.java @@ -0,0 +1,83 @@ +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 Professional Sidebar CV contact marks. + * + *

They ship inside the templates artifact under + * {@code templates/cv/professional-sidebar/icons/} as PNG, at the point size + * the design draws each one at — the marks are not one size, because a round + * pin and a wide envelope need different heights to read as the same + * weight.

+ */ +final class ProfessionalSidebarIcons { + + static final String PHONE = "phone"; + static final String EMAIL = "email"; + static final String LOCATION = "location"; + static final String LINKEDIN = "linkedin"; + static final String WEBSITE = "website"; + + private static final String ICON_ROOT = "/templates/cv/professional-sidebar/icons/"; + + private static final Map SIZES = Map.of( + PHONE, 8.8, + EMAIL, 9.2, + LOCATION, 9.6, + LINKEDIN, 9.4, + WEBSITE, 9.6); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private ProfessionalSidebarIcons() { + } + + /** + * 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 professional 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, ProfessionalSidebarIcons::read); + } + + private static DocumentImageData read(String token) { + String resourcePath = ICON_ROOT + token + ".png"; + try (InputStream input = + ProfessionalSidebarIcons.class.getResourceAsStream(resourcePath)) { + if (input == null) { + throw new IllegalStateException( + "Missing professional sidebar CV icon: " + resourcePath); + } + return DocumentImageData.fromBytes(input.readAllBytes()); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to read professional sidebar CV icon: " + resourcePath, e); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarMain.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarMain.java new file mode 100644 index 000000000..7b9e17e66 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarMain.java @@ -0,0 +1,244 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.TextAlign; +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 static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ACCENT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_LEADING; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.DISPLAY_FONT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.DIVIDER_TO_ENTRY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.DIVIDER_TO_PROJECT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_HEAD_TO_META; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_META_TO_HIGHLIGHTS; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_TO_DIVIDER; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EXPERIENCE_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.EXPERIENCE_TO_PROJECTS; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.HIGHLIGHT_ITEM_GAP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.IDENTITY_ACCENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.IDENTITY_TO_PROFILE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_PAD_LEFT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_PAD_RIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_PAD_TOP; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.NAME_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.NAME_TO_ROLE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.NAME_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROFESSIONAL_TITLE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROFILE_TO_EXPERIENCE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROJECTS_TO_REFERENCES; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROJECT_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROJECT_HEAD_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.PROJECT_TO_DIVIDER; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.REFERENCES_HEADING_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.REFERENCES_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ROLE_TO_RULE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ROLE_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.RULE_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SECTION_ACCENT_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.body; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.metaItalic; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.tracked; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.mainDivider; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.mainHeading; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.spacer; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarWidgets.titleDateBand; + +/** + * The white right column: the name and role over the identity rule, then the + * profile, the roles held, the projects and the references note. + */ +final class ProfessionalSidebarMain { + + private ProfessionalSidebarMain() { + } + + static void compose(SectionBuilder section, + CvIdentity identity, + ParagraphSection profile, + EntriesSection experience, + EntriesSection projects, + ParagraphSection references) { + section.spacing(0); + section.padding(new DocumentInsets(MAIN_PAD_TOP, MAIN_PAD_RIGHT, 0, MAIN_PAD_LEFT)); + section.addSection("Identity", host -> renderIdentity(host, identity)); + if (SectionLookup.hasContent(profile)) { + section.addSection("Profile", host -> renderProfile(host, profile)); + } + if (SectionLookup.hasContent(experience)) { + section.addSection("Experience", host -> renderExperience(host, experience)); + } + if (SectionLookup.hasContent(projects)) { + section.addSection("Projects", host -> renderProjects(host, projects)); + } + if (SectionLookup.hasContent(references)) { + section.addSection("References", host -> renderReferences(host, references)); + } + } + + // -- identity -------------------------------------------------------- + + /** + * The name in tracked condensed capitals, the role under it, and the + * rule that closes the block: a full-width hairline whose first stretch + * is the accent. + */ + private static void renderIdentity(SectionBuilder section, CvIdentity identity) { + DocumentTextStyle nameStyle = style(DISPLAY_FONT, NAME_SIZE, TEXT_PRIMARY, + DocumentTextDecoration.BOLD); + ParagraphBuilder name = new ParagraphBuilder() + .name("DisplayName") + .textStyle(nameStyle) + .align(TextAlign.LEFT); + tracked(name, identity.name().full(), nameStyle, NAME_TRACKING_EM); + section.add(name.margin(new DocumentInsets(0, 0, NAME_TO_ROLE, 0)).build()); + + DocumentTextStyle roleStyle = style(BODY_FONT, PROFESSIONAL_TITLE_SIZE, TEXT_MUTED, + DocumentTextDecoration.DEFAULT); + ParagraphBuilder role = new ParagraphBuilder() + .name("ProfessionalTitle") + .textStyle(roleStyle) + .align(TextAlign.LEFT); + tracked(role, identity.jobTitle(), roleStyle, ROLE_TRACKING_EM); + section.add(role.margin(new DocumentInsets(0, 0, ROLE_TO_RULE, 0)).build()); + + section.add(identityRule()); + spacer(section, IDENTITY_TO_PROFILE); + } + + private static DocumentNode identityRule() { + DocumentNode accent = new ShapeBuilder() + .name("IdentityAccentSegment") + .size(IDENTITY_ACCENT_WIDTH, SECTION_ACCENT_HEIGHT) + .fillColor(ACCENT_PRIMARY) + .build(); + return new ShapeContainerBuilder() + .name("IdentityRule") + .rectangle(MAIN_CONTENT_WIDTH, SECTION_ACCENT_HEIGHT) + .fillColor(RULE_MUTED) + .centerLeft(accent) + .build(); + } + + // -- profile --------------------------------------------------------- + + private static void renderProfile(SectionBuilder section, ParagraphSection profile) { + mainHeading(section, profile.title(), MAIN_HEADING_TO_BODY); + section.addParagraph(p -> p + .name("ProfileText") + .text(profile.body()) + .textStyle(body()) + .lineSpacing(BODY_LEADING) + .margin(DocumentInsets.zero())); + spacer(section, PROFILE_TO_EXPERIENCE); + } + + // -- experience ------------------------------------------------------ + + /** + * The roles held, each a title-and-dates band over the employer line and + * a bulleted list of what the role delivered, separated by hairlines. + */ + private static void renderExperience(SectionBuilder section, EntriesSection experience) { + mainHeading(section, experience.title(), EXPERIENCE_HEADING_TO_BODY); + List entries = experience.entries(); + for (int i = 0; i < entries.size(); i++) { + renderRole(section, entries.get(i), i); + if (i + 1 < entries.size()) { + mainDivider(section, ENTRY_TO_DIVIDER, DIVIDER_TO_ENTRY); + } + } + spacer(section, EXPERIENCE_TO_PROJECTS); + } + + private static void renderRole(SectionBuilder section, CvEntry entry, int index) { + titleDateBand(section, "ExperienceHead_" + index, entry.title(), entry.date()); + section.addParagraph(p -> p + .name("ExperienceMeta_" + index) + .text(entry.subtitle()) + .textStyle(metaItalic()) + .margin(new DocumentInsets( + ENTRY_HEAD_TO_META, 0, ENTRY_META_TO_HIGHLIGHTS, 0))); + List highlights = lines(entry.body()); + if (!highlights.isEmpty()) { + section.addList(list -> list + .name("ExperienceHighlights_" + index) + .items(highlights) + .bullet() + .textStyle(body()) + .lineSpacing(BODY_LEADING) + .itemSpacing(HIGHLIGHT_ITEM_GAP) + .margin(DocumentInsets.zero())); + } + } + + // -- projects -------------------------------------------------------- + + private static void renderProjects(SectionBuilder section, EntriesSection projects) { + mainHeading(section, projects.title(), PROJECT_HEADING_TO_BODY); + List entries = projects.entries(); + for (int i = 0; i < entries.size(); i++) { + int index = i; + CvEntry project = entries.get(i); + titleDateBand(section, "ProjectHead_" + index, project.title(), project.date()); + spacer(section, PROJECT_HEAD_TO_BODY); + section.addParagraph(p -> p + .name("ProjectDescription_" + index) + .text(project.body()) + .textStyle(body()) + .lineSpacing(BODY_LEADING) + .margin(DocumentInsets.zero())); + if (i + 1 < entries.size()) { + mainDivider(section, PROJECT_TO_DIVIDER, DIVIDER_TO_PROJECT); + } + } + spacer(section, PROJECTS_TO_REFERENCES); + } + + // -- references ------------------------------------------------------ + + private static void renderReferences(SectionBuilder section, ParagraphSection references) { + mainHeading(section, references.title(), REFERENCES_HEADING_TO_BODY); + section.addParagraph(p -> p + .name("ReferencesNote") + .text(references.body()) + .textStyle(style(BODY_FONT, REFERENCES_SIZE, TEXT_MUTED, + DocumentTextDecoration.DEFAULT)) + .margin(DocumentInsets.zero())); + } + + /** + * One bullet per non-blank line of an entry body — 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/ProfessionalSidebarStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java new file mode 100644 index 000000000..aef9d29ba --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarStyles.java @@ -0,0 +1,209 @@ +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 Professional Sidebar + * CV. + * + *

Every value here is read off the design rather than derived, which is + * why so many carry two decimals: the preset reproduces a specific sheet, + * and rounding them to tidier numbers moves type off its baseline.

+ */ +final class ProfessionalSidebarStyles { + + private ProfessionalSidebarStyles() { + } + + // -- page ------------------------------------------------------------ + + /** + * The page: 1024 x 1536 pixels at 150 dpi, which is the frame the design + * was drawn in rather than a paper size. + */ + static final DocumentPageSize PAGE = DocumentPageSize.of(491.60, 737.28); + + static final double PAGE_WIDTH = PAGE.width(); + static final double PAGE_HEIGHT = PAGE.height(); + + static final double SIDEBAR_WEIGHT = 0.291; + static final double MAIN_WEIGHT = 1.0 - SIDEBAR_WEIGHT; + + static final double SIDEBAR_WIDTH = PAGE_WIDTH * SIDEBAR_WEIGHT; + static final double MAIN_WIDTH = PAGE_WIDTH * MAIN_WEIGHT; + + /** The navy plate behind the monogram, as a fraction of page height. */ + static final double HEADER_PLATE_RATIO = 0.134; + static final double HEADER_PLATE_HEIGHT = PAGE_HEIGHT * HEADER_PLATE_RATIO; + + static final double SIDEBAR_PAD_X = 17.8; + static final double SIDEBAR_INNER_WIDTH = SIDEBAR_WIDTH - 2.0 * SIDEBAR_PAD_X; + + static final double MAIN_PAD_LEFT = 27.0; + static final double MAIN_PAD_RIGHT = 20.0; + static final double MAIN_CONTENT_WIDTH = MAIN_WIDTH - MAIN_PAD_LEFT - MAIN_PAD_RIGHT; + + // -- ornaments ------------------------------------------------------- + + static final double MONOGRAM_DIAMETER = 55.2; + static final double MONOGRAM_STROKE = 0.8; + static final double MONOGRAM_SIZE = 16.0; + static final double MONOGRAM_TRACKING_EM = 0.24; + + static final double SECTION_ACCENT_WIDTH = 19.0; + static final double SECTION_ACCENT_HEIGHT = 1.05; + static final double IDENTITY_ACCENT_WIDTH = 27.0; + + static final double RULE_THICKNESS = 0.55; + + static final double SKILL_TRACK_WIDTH = SIDEBAR_INNER_WIDTH * 0.44; + static final double SKILL_TRACK_HEIGHT = 2.8; + static final double SKILL_ROW_HEIGHT = 8.5; + + static final double EDUCATION_RAIL_X = 2.8; + static final double EDUCATION_TEXT_X = 13.0; + static final double EDUCATION_MARKER_DIAMETER = 4.3; + static final double EDUCATION_RAIL_WIDTH = 0.55; + static final double EDUCATION_DEGREE_SIZE = 7.3; + + static final int LANGUAGE_DOTS = 5; + static final double LANGUAGE_RATING_X = SIDEBAR_INNER_WIDTH * 0.49; + static final double LANGUAGE_DOT_DIAMETER = 5.0; + static final double LANGUAGE_DOT_GAP = 5.1; + static final double LANGUAGE_DOT_PITCH = LANGUAGE_DOT_DIAMETER + LANGUAGE_DOT_GAP; + static final double LANGUAGE_RATING_WIDTH = + LANGUAGE_DOTS * LANGUAGE_DOT_DIAMETER + (LANGUAGE_DOTS - 1) * LANGUAGE_DOT_GAP; + static final double LANGUAGE_ROW_HEIGHT = 8.5; + + static final double ENTRY_HEAD_HEIGHT = 9.3; + + // -- type ------------------------------------------------------------ + + static final FontName DISPLAY_FONT = FontName.BARLOW_CONDENSED; + static final FontName BODY_FONT = FontName.LATO; + + static final double BODY_SIZE = 7.1; + static final double SIDEBAR_HEADING_SIZE = 8.5; + static final double MAIN_HEADING_SIZE = 8.7; + static final double NAME_SIZE = 36.7; + static final double PROFESSIONAL_TITLE_SIZE = 9.5; + static final double ENTRY_TITLE_SIZE = 7.5; + static final double META_SIZE = 7.2; + static final double REFERENCES_SIZE = 7.4; + static final double BODY_LEADING = 1.18; + + static final double NAME_TRACKING_EM = 0.114; + static final double HEADING_TRACKING_EM = 0.14; + static final double ROLE_TRACKING_EM = 0.18; + + /** + * The advance of a space in the body face, as a fraction of type size. + * {@link #tracked} sizes its spacer runs against this to hit a tracking + * measured in ems. + */ + static final double SPACE_ADVANCE_EM = 0.25; + + // -- vertical rhythm ------------------------------------------------- + + static final double SIDEBAR_BODY_TOP = 22.0; + static final double SIDEBAR_HEADING_TO_RULE = 4.0; + static final double CONTACT_HEADING_TO_BODY = 16.0; + static final double STANDARD_HEADING_TO_BODY = 13.5; + static final double CONTACT_ROW_GAP = 11.8; + static final double SKILL_ROW_GAP = 9.3; + static final double EDUCATION_HEADING_TO_BODY = 10.0; + static final double EDUCATION_LINE_GAP = 2.5; + static final double EDUCATION_ENTRY_GAP = 11.0; + static final double LANGUAGE_ROW_GAP = 7.3; + + static final double CONTACT_TO_SKILLS_ABOVE = 24.0; + static final double CONTACT_TO_SKILLS_BELOW = 18.0; + static final double SKILLS_TO_EDUCATION_ABOVE = 15.0; + static final double SKILLS_TO_EDUCATION_BELOW = 18.0; + static final double EDUCATION_TO_LANGUAGES_ABOVE = 8.0; + static final double EDUCATION_TO_LANGUAGES_BELOW = 16.0; + + static final double MAIN_PAD_TOP = 21.9; + static final double NAME_TO_ROLE = 6.3; + static final double ROLE_TO_RULE = 14.9; + static final double IDENTITY_TO_PROFILE = 20.5; + static final double MAIN_HEADING_TO_RULE = 4.0; + static final double MAIN_HEADING_TO_BODY = 14.0; + static final double EXPERIENCE_HEADING_TO_BODY = 18.3; + static final double PROJECT_HEADING_TO_BODY = 8.0; + static final double REFERENCES_HEADING_TO_BODY = 8.0; + static final double PROFILE_TO_EXPERIENCE = 24.5; + static final double ENTRY_HEAD_TO_META = 2.0; + static final double ENTRY_META_TO_HIGHLIGHTS = 14.3; + static final double HIGHLIGHT_ITEM_GAP = 4.8; + static final double ENTRY_TO_DIVIDER = 14.0; + static final double DIVIDER_TO_ENTRY = 13.0; + static final double EXPERIENCE_TO_PROJECTS = 22.0; + static final double PROJECT_HEAD_TO_BODY = 5.0; + static final double PROJECT_TO_DIVIDER = 6.0; + static final double DIVIDER_TO_PROJECT = 7.0; + static final double PROJECTS_TO_REFERENCES = 18.0; + + // -- palette --------------------------------------------------------- + + static final DocumentColor PAGE_BACKGROUND = DocumentColor.WHITE; + static final DocumentColor SIDEBAR_BACKGROUND = DocumentColor.rgb(247, 248, 250); + static final DocumentColor PLATE_BACKGROUND = DocumentColor.rgb(11, 39, 77); + static final DocumentColor TEXT_PRIMARY = DocumentColor.rgb(7, 17, 30); + static final DocumentColor TEXT_MUTED = DocumentColor.rgb(47, 74, 115); + static final DocumentColor ACCENT_PRIMARY = DocumentColor.rgb(11, 103, 200); + static final DocumentColor RULE_MUTED = DocumentColor.rgb(209, 211, 214); + static final DocumentColor RATING_MUTED = DocumentColor.rgb(194, 196, 199); + + // -- styles ---------------------------------------------------------- + + static DocumentTextStyle body() { + return style(BODY_FONT, BODY_SIZE, TEXT_PRIMARY, DocumentTextDecoration.DEFAULT); + } + + static DocumentTextStyle metaItalic() { + return style(BODY_FONT, META_SIZE, TEXT_MUTED, DocumentTextDecoration.ITALIC); + } + + static DocumentTextStyle style(FontName font, double size, DocumentColor color, + DocumentTextDecoration decoration) { + return TextStyles.of(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 {@code trackingEm} of the surrounding size. + * + * @param paragraph the paragraph being built + * @param text the text to space out + * @param style the style of the letters + * @param trackingEm the gap between letters, in ems of {@code style} + */ + static void tracked(ParagraphBuilder paragraph, String text, + DocumentTextStyle style, double trackingEm) { + DocumentTextStyle spacer = style.withSize(trackingEm * style.size() / SPACE_ADVANCE_EM); + for (int i = 0; i < text.length(); i++) { + paragraph.inlineText(String.valueOf(text.charAt(i)), style); + if (i + 1 < text.length()) { + paragraph.inlineText(" ", spacer); + } + } + } + + /** 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]", ""); + } + + static double clamp01(double value) { + return Math.max(0.0, Math.min(1.0, value)); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarWidgets.java new file mode 100644 index 000000000..7588b1ec5 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/ProfessionalSidebarWidgets.java @@ -0,0 +1,159 @@ +package com.demcha.compose.document.templates.cv.presets; + +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.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 static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ACCENT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.BODY_LEADING; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_HEAD_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.ENTRY_TITLE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.HEADING_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.MAIN_HEADING_TO_RULE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.META_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.RULE_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SECTION_ACCENT_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SECTION_ACCENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_HEADING_TO_RULE; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.SIDEBAR_INNER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_MUTED; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.TEXT_PRIMARY; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.style; +import static com.demcha.compose.document.templates.cv.presets.ProfessionalSidebarStyles.tracked; + +/** + * The parts both columns of the Professional Sidebar CV are built from: the + * heading over its short accent rule, the hairline that separates entries, + * and the band that sets an entry title against its dates. + */ +final class ProfessionalSidebarWidgets { + + private ProfessionalSidebarWidgets() { + } + + /** + * A sidebar heading: tracked capitals over a short accent rule. + * + *

The heading is drawn as authored — the design sets these in + * capitals, and the preset does not upper-case for the author, so a + * document that titles a section in sentence case gets sentence case.

+ * + * @param section the sidebar column + * @param title the heading text + * @param bodyGap the gap between the rule and the section body + */ + static void sidebarHeading(SectionBuilder section, String title, double bodyGap) { + heading(section, "Sidebar", title, SIDEBAR_HEADING_SIZE, + SIDEBAR_HEADING_TO_RULE, bodyGap); + } + + /** + * A main-column heading, a fraction larger than its sidebar counterpart + * and otherwise identical. + * + * @param section the main column + * @param title the heading text + * @param bodyGap the gap between the rule and the section body + */ + static void mainHeading(SectionBuilder section, String title, double bodyGap) { + heading(section, "Main", title, MAIN_HEADING_SIZE, + MAIN_HEADING_TO_RULE, bodyGap); + } + + private static void heading(SectionBuilder section, String column, String title, + double size, double ruleGap, double bodyGap) { + DocumentTextStyle headingStyle = + style(BODY_FONT, size, TEXT_PRIMARY, DocumentTextDecoration.BOLD); + ParagraphBuilder heading = new ParagraphBuilder() + .name(column + "Heading_" + compact(title)) + .textStyle(headingStyle); + tracked(heading, title, headingStyle, HEADING_TRACKING_EM); + section.add(heading.margin(new DocumentInsets(0, 0, ruleGap, 0)).build()); + section.addLine(line -> line + .name(column + "HeadingRule_" + compact(title)) + .horizontal(SECTION_ACCENT_WIDTH) + .thickness(SECTION_ACCENT_HEIGHT) + .color(ACCENT_PRIMARY) + .margin(new DocumentInsets(0, 0, bodyGap, 0))); + } + + /** The hairline between two sidebar sections. */ + static void sidebarDivider(SectionBuilder section, double gapAbove, double gapBelow) { + divider(section, "SidebarDivider", SIDEBAR_INNER_WIDTH, gapAbove, gapBelow); + } + + /** The hairline between two main-column entries. */ + static void mainDivider(SectionBuilder section, double gapAbove, double gapBelow) { + divider(section, "MainDivider", MAIN_CONTENT_WIDTH, gapAbove, gapBelow); + } + + private static void divider(SectionBuilder section, String name, double width, + double gapAbove, double gapBelow) { + section.addLine(line -> line + .name(name) + .horizontal(width) + .thickness(RULE_THICKNESS) + .color(RULE_MUTED) + .margin(new DocumentInsets(gapAbove, 0, gapBelow, 0))); + } + + /** + * An entry head: the title at the left of a fixed-height band with its + * dates set flush right on the same optical line. + * + *

It is a container rather than a two-column row because the two ends + * are centred against each other vertically, which a row of sections + * cannot do — a section is as tall as its content and starts at the top + * of its column.

+ * + * @param section the host column + * @param name the node name of the band + * @param title the entry title + * @param dates the entry dates, drawn flush right + */ + static void titleDateBand(SectionBuilder section, String name, + String title, String dates) { + DocumentNode titleNode = paragraph(name + "Title", title, + style(BODY_FONT, ENTRY_TITLE_SIZE, TEXT_PRIMARY, + DocumentTextDecoration.BOLD), + TextAlign.LEFT); + DocumentNode dateNode = paragraph(name + "Dates", dates, + style(BODY_FONT, META_SIZE, TEXT_MUTED, + DocumentTextDecoration.DEFAULT), + TextAlign.RIGHT); + section.addContainer(band -> band + .name(name) + .rectangle(MAIN_CONTENT_WIDTH, ENTRY_HEAD_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(titleNode) + .centerRight(dateNode)); + } + + /** A standalone paragraph node, for anchoring inside a container. */ + static DocumentNode paragraph(String name, String text, + DocumentTextStyle style, TextAlign align) { + return new ParagraphBuilder() + .name(name) + .text(text) + .textStyle(style) + .align(align) + .lineSpacing(BODY_LEADING) + .margin(DocumentInsets.zero()) + .build(); + } + + static void spacer(SectionBuilder section, double height) { + section.addSpacer(spacer -> spacer.height(height)); + } +} 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 40321b1ae..64a490a00 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 @@ -19,5 +19,13 @@ * a new sealed subtype in {@code cv/data} plus a renderer in * {@code cv/components}; a new preset is this file copied and * 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.

*/ package com.demcha.compose.document.templates.cv.presets; diff --git a/templates/src/main/resources/templates/cv/professional-sidebar/icons/email.png b/templates/src/main/resources/templates/cv/professional-sidebar/icons/email.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fc73ca2796a78db6540a5406051024d8b9efd2 GIT binary patch literal 2131 zcma)7dpOf=AO9s}3e9P$D{nj&J)Gi=YV_mB5_-uJqm_j>N@`re=W{(SGx^}Vm}AD{1Kcf6yV>~>iI z0OXvVa0C#8euj)RxPL03?gv4Wx4N{k>+}u_s@^f2up<>^$QKzLq3Kc%9nWZo@lp_eVB|O?9}9 z3$9W#^W?mVII0M*2y=yVx>Gvy6=M(UMdxBxO1F84hn!|TS0<|@B+1a1GHWokOMCI@LJvw+vzHWdAD0`_&nd{~Fl=wkI8=9T8s_}8^&FbNFKic&FVRRO6WuOyouD@gG^3r}BUDOTU#9eQu` zZ%NczO{yJ!NZYe{Uodi6uH!vVBS<_>+9ID#lc-cS@wRT?YKyZit6^t2Ztq>{nYiUk z2vGIuYttS3l)jNg5(JFQO-n07Ua=EW__CTkebQn5EmlZKtCppjZ0GxZ@Uho9XY!0o z=2Jrq@(6Gd7Qt(dqPy$QSu`a{QCgE2eF_>IZwH=P&>L{f3~bz4$?r)Rov@P1$Y3{= z21SLoWv!_N`DUgVK4&*jg&O?j@r7wKe91bZ@sJ<%xV5N%0ul-DzL?x(b9LgQa}wF!AKJ*Gbncu@ zcT4t~?H%c2+>}4t%-?B0E|Xuh?uOUCXn2t{ShJaVVv6Hh(^8uWZ})~FR}fa+1a06+ zbVLJ^o5}MYF{o{bTNrB9S>r#`-P2Xnpoo*~i}mGDAcMEiZ+nQ?GWPz;Z0ADSwva2C zJxYP$^w_6f?B??soE7{_W;Sm(^j!{2b}{CcTDk5uqK=ngKB=;Ng8>XE%Oil7rS}?E zT7mInF+U}Y`j!kX(K~LQ*3MD#PMX9QHKGZDJ1R77%p-LWdnHbMp88T<8xc?Y@ZrYd z+I`25g2BdVjpodf)OtHy1{X=q%de|^m_|O+|Aggse$Q7}VII(@Vy`9sI_;KxKDsxJ z?b9JF*&&-wepS%sOr#MqTf2OIx9hTI3~`*Rzxm~a47Zxs8&xRD`9gC|=39AS$GWKr z`oHkqTx|8>X5(f07R+710%yE`woqN-=VbX?W^h53s@gr*shmE=+ZgwsP@WGQ& zp_fhthJ7JUg@L_tN&0$Pc5%saN6{NPUN5*E!R*>Wj(xYdg#A&>&yFi78R~uhpkmFa zho!6?1r`_`SXN5Dutqi|N9I+l6e`RFW6?@#H<+p0I1dWA)}5l~jx&}C$U9mkP4so3 zi&b~Ta`x`E-c+J##e=Lg%4sZm-R)$UO4J<_6UFZS?X2XAW42k8R8#r~ExzMR$u_4D zCqV#L^2uG+{^0cvF0ddolYV+voxX@J`fm6jLuOPYJXpPZLZRQs-y$A~)#9hCZZN7! z`yo)=5=Lttk}}!c&!oyY7%Q=oLsbBcRLZUtdd}SmJ93Ax9IO;x1|av1HKpj(7}ag3R{rNYwSAI)kW5|1HNL!aE8p66h&3l&k5>N z24xlZ+`W9ff~ssKWIStY%DDI5F1=_VOM^ZK$x}rfQ#x)v-eh0KE=X%Cn}66Uaq+_q z%b_~;f>9O43Ect5XF7oayxDWRldcL>=+`Ii-BlmOVTX%uT@Zy8Fo<@Kg-vF2L!825 zc)NgV5)GRdm5DRw621eEg~J}w%q_P*4VxGEHCwp*y?Snbg?h7!8BfjX?4(l!&4>I~ zAwO+Tlybl7e9MHpx_)_Lh?HDxI9L4b5s{v=xO^n~n9srXmufBOaer70lQgKhd9$K; plRN~1s*tZ&DgVFo<*yA}vVom*7TmzCgn-i(aCX4snD#*z{{$Mu&OrbG literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/professional-sidebar/icons/linkedin.png b/templates/src/main/resources/templates/cv/professional-sidebar/icons/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..710983a5f0e524b3e4c6cab64303685b12a0d645 GIT binary patch literal 2655 zcmaJ@2{7C17XKrNts<=oT5GMPLMT^pC6X)lEoy6twU$~FRPChpT8av#v=kRrYN=X- zl-gRQm)c^hmRf78rS#>!H}huRo4N0sIp6Pm=ge=uZ_b?gekak?SeJ`kfE@q;EZH8%o)yOID9MFM~$dMIic00Q9v@C^?D>SO@m^UH5G)1W6< zoD6i)bfm9Cot8*Cu=!za2z12%%eK5w@97RJQO^j&`VGv_CLwhRRhUT+Nf0sCL>EV* ztGaW5D;)qOxYAX5xSG6@3J(68Izm+)@!MrMTpbSA;qTVf6sy4q%6@NFRO<};_ghY7lfMP#xM4EbP$3a9YfxFIg2can|Br= zD;OnnJ)tnfbEw_A;ld~PYZi|@N^5(xPRl(c8w*y@*TU6C^Hy-T)W=dAENUlZOds^* zf=k-Xhsv`(kT*!-03*l125o0mc-6d;VZX~>VWO>&{~%s7r{yc*o#v09?~=*YMSyTnPjKqSsbXLOLKCNfC#=%0}=mfCT2kAU1zZ{hXMUy5%CdhVk z+P1drabXcewb0?kjo2(GimH1nAE4K)yrMDH-SBSL59pP>lrBcr#_(E}!q8GEVS6V% z-vuKA=^C>0$-nK{>6$_euWzqGd2PEFe2!?GR&U1rQBm}uY zipm-f(lyt}>=5*_-~QYe`B$YxRo~aWM@)%-7&1e6?oNlRO?<47ndvLNzT0#ReTg_v zU>Hn^)m{B?cit0cvdewNekoR0u*cr}M#Ypx-@e=&S_o_$Ac^Wos&uY)at zj>fNmdcLOr*|Q@_SDt{8q@A3}t!KXNyot=;e>owMMB4To&f@YJq360SbyA{*Cp<(R zZM5k*)U6zj(1;+Iuka}cJI4iVhm=77peeNev+giP8zc%M^UrM96JNK^{|M`{-bI)R zUkfg-1m@o1c*O|pG&S;}6TEpmDwkeOe*8mNs8q|U8JJRIg`fF@ijyf$U6)RRsWO#h z1xsoh8M{0-|7@FaTqDgMP=_#uU*ns|^}qwMI^xUUcRSbDdut+<^T(nxUXwZSZZ0KL zwTFjg8M!`%aH=8bAnxSgB(bA=sV#gK$0sB4*!mQvW${}1f=mG=7D7rp{VO`tNIqRj zVZ!bhFJqxm>uTJV16gYO^vB@Sq+S9LAr(hAgv%JOVQpHUZ{ zqSg-jzt&baL+g}AHVg`#40@_kl;xzuU|v=VUvpknb^HGMl%UfqFu%R~%fV>mY`37J z(6I__wm8jfr=albSQTZyFp|%%eM>I<#+TU~Hq>xe$l>l$s=Qj0FJHd_A4)$$gb5wT zksx8NG*)e&>d<-^cuqm?d_fyTjUQKG+(p|7|yB^Le+W|^XtRxbq9{Wj`1RM_u)i+$57v{n@iVMC; zdxuo^#RTu%>0`uY@h-lP^ooY)4{jo^Fi*EG&7Z`lF5b~W(3{)z8A(%u-@xGfT=w&Z zpVQxXYpk=%(VuSX?c&}*wf5ezHm6L!DFAN0ig%c36W-e_xS0F{piqY4G_OOcD-K@0 z+#PLP3f@&;+^3R9Fgxja4^nu3xesotR!`D@9a?1hnZ2_2C~%Az)mkk-0beV>l z+ZXPPw>rJJ7bx66gv!&zkc z|4<)Hyp{8)QZ5Dg%y?OJdaBkdsb|NhFX&o{Z`+D&Z zHqdN>aN9|2rg4#z+a)QRjGRn1F~t?liVF6eGGS560zVl`$7rVe@sSt)>dFEuzF#IO2!nrHT@rbKXN0r6yDBS3kSnlKf2b$?P0_JJ5%=tuUf13Zv5KIjRjFeW}9M>F&P>VcNpQeF+>yec@yYviG{@mtX z(n}0hX#rN*l3~7`?hDfCj+kj)Loj1_um<;MkUok$c%?wMKa`cD|8DO1cPk7=GQ@>t Vn!tH)-=|MnfF8yeU5&!W`~x2CudV<9 literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/professional-sidebar/icons/location.png b/templates/src/main/resources/templates/cv/professional-sidebar/icons/location.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdaf6f53448bf5372b0b20f5555733861383c8c GIT binary patch literal 3628 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 literal 0 HcmV?d00001 diff --git a/templates/src/main/resources/templates/cv/professional-sidebar/icons/website.png b/templates/src/main/resources/templates/cv/professional-sidebar/icons/website.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a24b64d1cb70349c16c23d3c86849cdc2f14be GIT binary patch literal 6351 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 literal 0 HcmV?d00001