11package com .demcha .examples .support ;
22
33import com .demcha .compose .document .templates .blocks .BulletListBlock ;
4+ import com .demcha .compose .document .templates .blocks .EducationBlock ;
45import com .demcha .compose .document .templates .blocks .IndentedBlock ;
56import com .demcha .compose .document .templates .blocks .KeyValueBlock ;
67import com .demcha .compose .document .templates .blocks .MultiParagraphBlock ;
78import com .demcha .compose .document .templates .blocks .ParagraphBlock ;
9+ import com .demcha .compose .document .templates .blocks .WorkHistoryBlock ;
810import com .demcha .compose .document .templates .coverletter .spec .CoverLetterHeader ;
911import com .demcha .compose .document .templates .coverletter .spec .CoverLetterSpec ;
1012import com .demcha .compose .document .templates .cv .spec .CvHeader ;
@@ -286,16 +288,32 @@ public static CvSpec sampleCvSpecV2() {
286288 "**Distribution:** Maven Central, Sonatype OSSRH, GPG signing, "
287289 + "JitPack, semantic versioning discipline" ))))
288290 .module (CvModule .of ("Education & Certifications" ,
289- new MultiParagraphBlock (List .of (
290- "**MSc Computer Science** - University of Manchester | 2021. "
291- + "Distinction. Thesis: *Composable layout primitives for "
292- + "deterministic document rendering*." ,
293- "**BSc Software Engineering** - Imperial College London | 2019. "
294- + "First-class honours. Specialisation in compilers and "
295- + "static analysis." ,
296- "**Oracle Java Certification** - Professional track | 2023. "
297- + "Java 17 platform deep-dive: records, sealed types, "
298- + "pattern matching, virtual threads." ))))
291+ // Preferred: structured EducationBlock with
292+ // explicit (degree, institution, year, details)
293+ // fields. BoxedSections renders each item with
294+ // the same structured layout as Professional
295+ // Experience — degree bold left, year right,
296+ // institution italic on the next line, and
297+ // details as a full-width paragraph below.
298+ new EducationBlock (List .of (
299+ new EducationBlock .Item (
300+ "MSc Computer Science" ,
301+ "University of Manchester" ,
302+ "2021" ,
303+ "Distinction. Thesis: *Composable layout primitives "
304+ + "for deterministic document rendering*." ),
305+ new EducationBlock .Item (
306+ "BSc Software Engineering" ,
307+ "Imperial College London" ,
308+ "2019" ,
309+ "First-class honours. Specialisation in compilers and "
310+ + "static analysis." ),
311+ new EducationBlock .Item (
312+ "Oracle Java Certification" ,
313+ "Professional track" ,
314+ "2023" ,
315+ "Java 17 platform deep-dive: records, sealed types, "
316+ + "pattern matching, virtual threads." )))))
299317 .module (CvModule .of ("Projects" ,
300318 new BulletListBlock (List .of (
301319 "**GraphCompose (Java 21, PDFBox, Maven, JMH)** - "
@@ -316,23 +334,40 @@ public static CvSpec sampleCvSpecV2() {
316334 + "GraphCompose: cinematic covers, pull quotes, "
317335 + "multi-column flow, sidebar callouts." ))))
318336 .module (CvModule .of ("Professional Experience" ,
319- new MultiParagraphBlock (List .of (
320- "**Senior Platform Engineer**, Northwind Systems | "
321- + "*2024-Present* - Led the reusable document-generation "
322- + "platform serving billing, hiring, and reporting flows "
323- + "across **8 product teams**. Reduced template "
324- + "maintenance time by **70%** by retiring per-team "
325- + "PDF scripts in favour of one canonical engine." ,
326- "**Software Engineer**, BrightLeaf Labs | *2021-2024* - Built "
327- + "backend services and production document rendering "
328- + "pipelines processing **2M+ documents per month**. "
329- + "Drove the migration from iText to a custom layout "
330- + "engine, eliminating licensing risk and cutting "
331- + "p99 render latency from 1.4s to 380ms." ,
332- "**Backend Engineer**, Helix Print Co | *2019-2021* - "
333- + "Maintained a high-volume invoice-printing service "
334- + "(15M PDFs/year) and authored the compliance test "
335- + "harness that gated every template change." ))))
337+ // Preferred: structured WorkHistoryBlock with
338+ // explicit (title, organisation, date,
339+ // description) fields. BoxedSections renders
340+ // each item as a structured row (title bold
341+ // left, date right, organisation italic on the
342+ // next line, description full-width below)
343+ // without falling back to the legacy
344+ // pipe-separated string parser.
345+ new WorkHistoryBlock (List .of (
346+ new WorkHistoryBlock .Item (
347+ "Senior Platform Engineer" ,
348+ "Northwind Systems" ,
349+ "2024-Present" ,
350+ "Led the reusable document-generation platform serving "
351+ + "billing, hiring, and reporting flows across "
352+ + "**8 product teams**. Reduced template maintenance "
353+ + "time by **70%** by retiring per-team PDF scripts "
354+ + "in favour of one canonical engine." ),
355+ new WorkHistoryBlock .Item (
356+ "Software Engineer" ,
357+ "BrightLeaf Labs" ,
358+ "2021-2024" ,
359+ "Built backend services and production document rendering "
360+ + "pipelines processing **2M+ documents per month**. "
361+ + "Drove the migration from iText to a custom layout "
362+ + "engine, eliminating licensing risk and cutting "
363+ + "p99 render latency from 1.4s to 380ms." ),
364+ new WorkHistoryBlock .Item (
365+ "Backend Engineer" ,
366+ "Helix Print Co" ,
367+ "2019-2021" ,
368+ "Maintained a high-volume invoice-printing service "
369+ + "(15M PDFs/year) and authored the compliance test "
370+ + "harness that gated every template change." )))))
336371 .module (CvModule .of ("Additional Information" ,
337372 new KeyValueBlock (List .of (
338373 new KeyValueBlock .Entry ("Languages" ,
0 commit comments