From 230e3c7077f17aa6cce8b274e1b6ca65ce3978f9 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sat, 1 Aug 2026 11:16:32 +0100 Subject: [PATCH 1/2] feat(examples): generate the catalogue one way, from an empty tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The runner only wrote. Rename an example's output or delete the example and its old document stayed in target/, published to the site and counted by the guards that read the tree, indistinguishable from a current one. Generation now clears the tree first, and it does so inside the runner — the release script and CI invoke that directly, so a clean step living anywhere else would have covered only the path that already remembered. The test helper stops keeping its own copy of the logic. ShowcaseSync removes the directories it replaces, not only the files, so a category that stops producing anything leaves nothing behind. Two examples were never wired in. One of them, the cover letter, backed a gallery link with a file no code produced; the other renders a preset through a hand-built theme. Both generate now and both have a showcase entry — the cover letter's registered directly, because the helper that builds letter entries points into the layered preset package and this one composes without a preset. Nine committed previews go. Seven were pre-2.0 renders of CV presets the runner already produces under their current names, so every gallery row linked the older snapshot of a preset that had a newer one beside it; those rows now follow the current render. The remaining two, an invoice and a proposal, were left behind by a rename with nothing linking them. --- CHANGELOG.md | 15 +++++++ assets/readme/examples/cover-letter.pdf | Bin 3453 -> 3387 bytes ...ssic-serif.pdf => cv-classic-serif-v2.pdf} | Bin 49229 -> 48826 bytes ...ompact-mono.pdf => cv-compact-mono-v2.pdf} | Bin 40754 -> 40250 bytes ...esume.pdf => cv-engineering-resume-v2.pdf} | Bin 33979 -> 33729 bytes .../examples/cv-modern-professional-v2.pdf | Bin 0 -> 4368 bytes .../examples/cv-modern-professional.pdf | Bin 4657 -> 0 bytes ...ordic-clean.pdf => cv-nordic-clean-v2.pdf} | Bin 42013 -> 41445 bytes .../{cv-panel.pdf => cv-panel-v2.pdf} | Bin 40778 -> 40383 bytes ...minimal.pdf => cv-timeline-minimal-v2.pdf} | Bin 37587 -> 37590 bytes assets/readme/examples/invoice.pdf | Bin 9964 -> 0 bytes assets/readme/examples/proposal.pdf | Bin 6014 -> 0 bytes examples/README.md | 18 ++++---- .../demcha/examples/GenerateAllExamples.java | 10 +++++ .../examples/support/ExampleOutputPaths.java | 39 ++++++++++++++++- .../examples/support/ShowcaseMetadata.java | 8 ++++ .../demcha/examples/support/ShowcaseSync.java | 16 +++++-- .../demcha/examples/GeneratedCatalogue.java | 41 ++++-------------- 18 files changed, 100 insertions(+), 47 deletions(-) rename assets/readme/examples/{cv-classic-serif.pdf => cv-classic-serif-v2.pdf} (87%) rename assets/readme/examples/{cv-compact-mono.pdf => cv-compact-mono-v2.pdf} (82%) rename assets/readme/examples/{cv-engineering-resume.pdf => cv-engineering-resume-v2.pdf} (80%) create mode 100644 assets/readme/examples/cv-modern-professional-v2.pdf delete mode 100644 assets/readme/examples/cv-modern-professional.pdf rename assets/readme/examples/{cv-nordic-clean.pdf => cv-nordic-clean-v2.pdf} (83%) rename assets/readme/examples/{cv-panel.pdf => cv-panel-v2.pdf} (80%) rename assets/readme/examples/{cv-timeline-minimal.pdf => cv-timeline-minimal-v2.pdf} (94%) delete mode 100644 assets/readme/examples/invoice.pdf delete mode 100644 assets/readme/examples/proposal.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index c495bec63..6682f247d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -127,6 +127,21 @@ follow semantic versioning; release dates are ISO 8601. ### Documentation +- **The example catalogue is built one way, and it starts empty.** The runner only ever + wrote, so a renamed or deleted example left its old document behind — published to the + site, counted by the guards that read the tree, and indistinguishable from a current + one. Generation now clears the output tree first, inside the runner itself, so the + release script, CI and the tests all get the same guarantee instead of the one path + that happened to remember. `ShowcaseSync` removes the directories as well as the files + it replaces, which makes the published tree a function of the catalogue rather than a + record of everything ever generated. +- **Nine committed previews are gone and two examples now run.** Seven were pre-2.0 + renders of CV presets whose current versions the runner already produced, so the + gallery linked the older snapshot of each; those links follow the current render and + the stale files are removed. Two more, an invoice and a proposal, were left by a rename + and nothing linked them at all. The cover-letter example and a custom-theme CV were + never wired into the runner, so one of them backed a link with a file no code produced + — both are generated now, and both have a showcase entry. - **The template-authoring guide describes the packages that exist.** It told a contributor to put a new family under `templates..v2` in exactly five sub-packages, one of them a per-family `theme/` — a layout 2.0 replaced. A family has diff --git a/assets/readme/examples/cover-letter.pdf b/assets/readme/examples/cover-letter.pdf index 3cf94167662c1b4d95912bc6b26c093a57769abd..bd5ed48a88b497cd99c45fa41436e53ce4c6ed23 100644 GIT binary patch delta 3074 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 diff --git a/assets/readme/examples/cv-classic-serif.pdf b/assets/readme/examples/cv-classic-serif-v2.pdf similarity index 87% rename from assets/readme/examples/cv-classic-serif.pdf rename to assets/readme/examples/cv-classic-serif-v2.pdf index c0ec3d9ffcbc3f4e71e559d1a9c8a02aa9b1cf00..67919255fe611d390b069a65b598c7b4478920c4 100644 GIT binary patch delta 5895 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 C-z?Su delta 6271 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 HJo^6tHf@o? diff --git a/assets/readme/examples/cv-engineering-resume.pdf b/assets/readme/examples/cv-engineering-resume-v2.pdf similarity index 80% rename from assets/readme/examples/cv-engineering-resume.pdf rename to assets/readme/examples/cv-engineering-resume-v2.pdf index 1b2312a6d7c057097aa7a55407e1c09db3890dda..1c14c11e844521dd5865ddeebfefb60898485b26 100644 GIT binary patch delta 6474 zcma)>RaDdg+wCaUE0f8Y0hL{;Z8U#eTyHh~oPfOPzAtjyCN_V$3O6Slif>Pi6 zUYze-owd&0UTd$l@Am#ZYdvkz7(E{`k}NPqghi1gft1K>4FcfA=*W?Nk;D|j!SRwU zqd&>Q!DW_o4BdJ1j)c491LbADn!^nO5dm`vHDrsUH~d>L19S+XAZ`AqhbZN^CWiVqy+pKyHd-yQ9oaU zxSkvbXdABK0hRG=b3$K6O(46tZw!qY!Z$mvVrH7vrli)ZbSiaRgB^O4_$tg)ULAE` z)Q=Oy=}%=d^Ae{03Ah^Ao64#wGb79mHWQyEd{!8bX`)w?;qCBe$4vY8hd)P2VOJ0% znVNW#Z; z`?}c_Cp>DQg(21L)uVjGL>XeC1jA5&8+1O zK-T#VCrDP*9#rp+`XIp59jPp3sQk?AFydl?pnUv#Two(X5;Nw{xso6<7mIMzGn4XO zvjfX%%FQIY+l~GO|L98LKz2NTP0aoCn{?%mThh>}9>tA>sb(U{d~3E7zpyt?)pvFN zvr@;>`#~p<%d3$`U7Ar@Rk8*lW$dJB03K&INjIoF(u^R4^IU!$v!sWnd-TYAr}Lcf z{8%Jd_B}%_4~?`V`c>PsHyfM9KLLYg#XL+>>Wprj*deLZ(&4hP4|&)(J-T6XE)mz; z8(_l7S`NZKrfZjOn|@P!9G~y4Q{Bc!Ye8XVb>@r&T@>G~g2%RR!z|k#Mz}_VfYyg* zKkp9`Xs5oN{H^*vt~+V6o!G}i=!shrm)6qiaa{5B@>s813ffP4l9JlK_Sdlc z+gHvL7v{R(SfLkUq|p(JBg^rn_f343>CbY#CCNBWeS8|cQmnc?x!lan7oD5~)&sGo zRt`FUiJx|2Bt2nBKM2gzVU%mm1Nk8)B>_;hRa38Y0c@gJfFQPsHQ}_^$Y-#SQ|yIN zp^~Qa^)|_R^V3Yi&(ON{UZ?f0O(HW>Ju$F^mjLGWg znDtY*Jz7_zH&kN&HPf;`YqUW&Wr>Xai8vi!#xX1ebe5>O#d`2E$^<(yxG7CZv4$O@ncpU=37eBf%_4K_XDqfcw@h!Eafk=hf@vn&A}j zy1YFNw&6=49?0`2Q!M+=DrUku?tFj3AAx+DO3+L?(60#Ddc$2#A{96NDy$lWS>Lwz z3WU4ci1wdx#ACRRwsjzY-}~#7*QHDJ$5diRia^ULy^|e<+AB6#ExrTGbXdIYBl(=? zbF;9d8w(5p#*jnbDD8Do@?kmGdy!T6U{5rCHM^_PRJz%1DOniNh&tx+w5+)|Q(CK3+M`hEN%vh=#AHo^dA}X0D!% zqnj(!SipX4#`)5NtY+7lZAOY`YQojtA8w%+a;iz2YTguA7$it}( zT38K5$%H$43AOLed^(?dTqMgm|HkFy@U1h710@aYZ+SN6g>7kGpW}5Q@dh?Cvq`pW z7c<2C8}4~4*noGzFPoL~kQLhd?*{m~E4)Y31RMOZ;hoQFuXpJT31=?q<_?(s<+T6w zG$P8i`___}W^_6{S+aL)b0GtK`CBci`w{6{q!r&Qpyje}ChySIicsfOJlZhQV6y2U zk_zD26zawCf<$5+hm<~~LU=T=IG3+@M&w)hyQ-K`O$z7d^%EfO1dvH5_J{cS*>I=R znC3skg~`N7XgJ_%;f0|z%yWBhiNaiyqH`7iOJTCTRZW)YbpANmVvwu)JW}9UL4rf1 zd1CYlqg+-RMVdo(yD4+YF?GGz{@>|N)hVFp%!)JN$Dl)$I`}<}REbn6o)O_6iI8sb zG-DmDDr)VLWXxii1>K(NowNeVTOE-v2|sPech0{bzFBU5bL|90vs<`wF|y&Jkm&v8 zZcdR-E;N&B7ml%^SEMhzv%<^C{)|#hS#x~fk8ElYW-*@pwHTGQ&2NrhK;1O1utz6(^R9mW1^1y zXlf3J=ZnoBb$pZ{APUwq_KM~rK8i}%Ol-jfM~YAG#3w#uzEy^~yG)!z`i~ID3|FR^ zl;xBS_HlpBd7jrC@;=GTjuVQ>KEQ`f$#S+V9%B{J4qq&2jQsO@+VfIEq6B5d4k~cBTj8ie zrELzjk?UI(9Ewoo<8f*f=EM={27#jMO`>eaqP!r^hX%G^`KU!9)L0Z?0B?+5%VwF} zGc?BU6@4t4B(pA%>Cjk&@%;JT`x}||*&Hc@3`FTM^_`2aDiu|@U}bSE7>*`GBk_AW zlaatHMiC3=&KeRHE?fGu8VJs2wk+S2r55fY-%To$-hQ265QUQDhwc?X{UkjlEK=yX(}-tY~gxg!tmMgP9E{=El(tat!Wl*YnA&7BvUflB$*BbLBXIfNGFG55?Gzvzd| z?c`;VJ;l3LhqV?5CG$~Q{nrqyO3MQKjUFrR2Hx%TNtlZG-j{002s*Y9nnQz26GaN5 z?^+3lGu~oV6*I%^s?6B73)=3C3w8Ch_Fk_)U3i+jB;>i*xC>aQo=L^E`cfVCPgNiB zR%yZ#Lh_*FJx>78=)Rn=6jD37@GsmSjPa#GO|XzTRT72T7tiXh<|t4@LWh%O5$tsk zcYaaiY~#w#mMMN2Jj^dXbgyK46myG6!?z|oVYx3u-STDpfmq3WhQ+o>$$mz4x{guF zZ^O75?Z64%-uz~>nj8;5 z3@E<%y>g`nf6JizY2B(^XW2g?+9wCQ{@*Q=dD#!_ajKV*xFt=aV2v_46F(Z|ORHfx zUwa-wncpX?&n)q2!rN^^mM42uO7L`vT*^p9pRek<3G0~&t40Yd0`yVYAWakl4>nE_ z%UqXyDguOy`n0C6QU~;erluJrc5j@*7Li6wI)eI~6`S|hkI+Jg!( z-`TioQ$j}bQ`{dCMa3p$tKJ$deb!u*Y;7>OI}(0IOJS>Pr=`r-fut;pU3RUdcG;GU zvTs6kF*?_?VA~1QV#iLPzDwG{@}u7W+#fgY8u}0a*xQXd%A|CWLG8t`<08aKo*^QQ zGg|Svw#S|^B6BFVGc#*&8+-Xb7lsFw;ewAx*1J*m!v|N|>rvZt-jlujiD~|}bb$q5 z@?)(RJQ3!!{-1A(zS{EnLv;mPq8iRO9N8kz+U}Zb=cb{DMTNz&4+UNpt8 zEWq#3*=cM7EqC}coRFF~uyO0>Zyil@vG9q{GiQo;+|`-6JSEmUg4Px>Jx)SoT?@Vlp7Cnc&q1)ct`#m=WVnq+(e`V`07=&7J?zL&f zQUy?Eu<<}ij&~lhuFIuR^|kAONZ1H&-xGQxQla3t=noA;SG=mF?+d=^bIF(?dUXs( z?DyOhh8GfyZ`v;YF8Kv4R~F5CeGgFIpbmU+JI*K;T52_=YY@5ytSpv-L_hyy7w3ZJcKg{r?ps*D$zYYv@-ptQ zH-q&IGQ1E@>t3DGU$HsgbpFa_9FmUyI6U8d03k}|5v$MIDiBpOae^* z6%D3jIriwH$cF$qz}c1THSr_Q9Z7gV(-}W*{$4S+ZpaK4Xr7yq@XjGY!Y4VO6Z_V;`cAmtpPJMujKiF>1kN`Xdo zLyr@x(fcAcnsiVlyj-xAD_4qV-NaP1AV7QSb1@g-T&nVhnr=rYJNB}y>kvD?{|dGI zxgcO(b@^ZI6U$3|MHuj^1&)J?kJ6GBmsd&V?^s4djtw;yr}2Dk_!F+H=vP+KEk$xN&ga~ zCNp{!9XD5oFu0dJ7y=S(cb8Xpmt}tVaHXn!(Q*?9tW|qlC2pjL8axl+Es>pyI0l!5QO-jm0*o|AAjRT$fvL-a5^rD(TG5&I|4=FQVwKso;_l$ziHKZ8vF zQmJ{fku={JL@!c$Iyt2NWYj4z^=o3ug#44SjqS<#!67T{L;KJI$BtMALwurrMD9Ub zGwy1`(e4kUxVEkj4&^O{vU%O6jp>N4FN9;j*je<09m5WlH#*pvH+`F|CwDoS2LqW?=VCkT@rXc#xp3OV7R&4`Gx4{R% ztwc>cr?}9LrHLe0L$=gI$yXy}+o%T>hJc*c;i8|(qiLe%N?zt%1Xqj9WeXoTq*axr zc-vKFbL|gib77FvGLZ zle2S5ToBG6T)#GMhr>!^B0m6=>nFfL(vMG=^0q?gR0KSbhP0AwbqS@UNO_AqYo5Vs zDQ*eemPGyNgW>5Hp&HxpF9aIs7S4~CmAlZ?(q4BX(iXBbplfO$76DzZ<4xWEBlITvv!LvW1sqlesTa%o9uxN zFxip%*Eby5-FI9;v6JWFXiahUmC zdSyoU>mBKU#l`}SC&IXzxCE$9yohZ5@kbCzPQs4X4xWtKu#Ym)Yvq7_R~Pz7VT{|$ zm*akB-4D)b&?@nyl)5%(<-KBfy`NQ^xO(>({LNi5&ek=_+ayuztOjjYzhp4?&o@&` z(F*h;m-N0Z1E@sCAI7Yqg8O(EV=p1!#!hNz3B0Ah?O&+N@@1vOFEc=D%5;%x;xT=F zq&;`~I(vRi?BsZsDYOVL2*PmaCkffNxr%hXuksjXL}#rb(^W8##J|kO#dJ?L|Y>CHc&2K^=4(W08+*omaiYxESxXn0JL?GeN5Z~%zi zB>7v;BGhOi`M^$tGurN-RLk9HYuN(=obpS?2_1ep721eudX_N7E|>jvp6exoJ8P7# z;beEvirY#F(AWp?K`_**?g!`?akE)?n!1&8tAiV=-GZo^n+aAXN(X`2J|un^4*&u2 zYq`35F$w->^R+LB!Ni+R_N4)rdWgsWRSP8(!ApUnuhJs9BCPCx> z{Yp@bsS);|y$IjT{P!+3%>iLy&dUAn;8}K`veQcUKvi}xiCpg;U+&HX8|#6swXzqk zg2lIKdar2&BPPCJ?+b2@42#I|zxuB_JzCRa2D>phoHLZZ;iK8`!|6yF(fzB&55W7XjULcXvpafHWxG-6&XD zZe6X*HS^5V2SezHL`bke6od*U<5MsKCMPabLy0b<(n!}KNM9{`Q5pL4JnDbLQQbe` z&&ogG;SR$@o~oZ*rI6rt2#ydiLaicSi)3DJtB!3ZPC0ziKV5@lcx=yz0?Iq8zEuV5 znru9q-&ZB~m_AQ6^}HVTP;=(Jw2h%U`(9#-quF`(0$q9*S9?t+m87OoeNWrK`tGk< zH;aTx1G$PrN!_r!Rl*{-GJ)_VR9gO0^z=2cH7A|&TeHvhd+!b_lIr{%xz*!aT*xvo z*Nu38&dleXiEq8Eo#Uo}hqe$ckpyYTEvsP-mr@>wx4Tb!CeVyu8hiMi2H@ihpPsO{ z;AJuY&Z=>QZi$NJ!@ZuiG0Iyc4PDvW(l$5w>rKm8ly#=ySNdL9X z6hrvd((6pMDRYM&Fk;FBd)sn5#d!*S`8THIL-pH6bP1F6C#YHL{M!a~?@wY?u9xj` zIlSKRxo5-pV1n48t;2kDmgeNJB@)vID>-d70Z%R?tHTcJ*Ilzg z3{UCMf>U(TW1blfw9zo2cV5%~>lWtNT$9B3nbcvFMjydCyH zD|}l?O84=lW`Yf9_|TCy{1HC@OkCs+`T^RRV8+s_UCJC2`eGlo?#g3?!*@;6l0E6{ zp@Lo}xnhqIevdc|PoiC%S6AAvOjCkA8DF`MyY5~^+HYj$5~2ZQt*sNtzh5K%z`uTm zA7kDC#G)ZOa}UB+??3S#&J8)KSqY>#w98;KHIsrqKB%#NoyGQ7@4kMK*Zqh6L>MqZ zQ;)l>aSE)M_`cqAA6jKw7v%i3;%d4|HVxemClC4COSPNP>w66+4|f1!^iwacvqTLb z!K%)(aN-nohCBdapB%1d_YWA^%E$BfW?QDEB1WT*KmK5~j>4tu5tTKGrE0(4Cz)`= zV!w?%kk0cwd-vgebJD2S=^@<{q%ES==VNi|irZR{m(h8lUnI&s{|kupMe~r{TH`D} z$&j!8;t1}a`<=&kvwYQ42nPyg^hTKDz8481t{ufum@6Gn0QAd+L=R9O+9~l)s*Fo# zE?Q6cN)X2f&fhhtjb z$|HfVdr1sbm`xdqBk}vhZ=8$`VQDfrwvbOluP0sH9y;)1-v zmIqj!ERypcgyOU{KGcBzHA=EyU!E)>(%i9Ac-xpqFm!u6 z`85LJkz`}j?bla2QR%MyqqeUPG;kFw(nGkjjfOyFa8SlQ$>Kt=PS<92GPZbeyWDRO z-;*;s$fTEk4N=7%eiKj9_VAHriHB|iJkcfcAe%sGX>TM$GF=tv&n{7cf-Xpf&OVy_ z@D|;+Y071Vdbu!*g|J)a@OeVi(})0co{OA;st0LpSU3Hyye^C-VJ< z^E)v9zWW~GnaOsF#^b2ph2hR9_rvH9_VI1_$fKHSPu1Sg-im$Yk&y23C$hA4qmbB$ zgM6Q_QMCQLBw+LhYwJi4=(6iXNMpen)Ah3UNn+&35JI67$7jof_5d@O9vKpn@|D}g zLNmMX0?ZAfll_(8j7IQ^u;26ed6hKfRWFk;Ym4d3v!UTd`#XEZ=KmY_q8j zcU@x{UMuX+Ek8h(bh;6=VI)!NcrH@gx0ll*XG-gpduW442u!|yd10Sw_)|(8257GR zibbnBw@F@}^8I-!T*j8?IY`qA^H@Z^F)40td^>T(A!y`H3o#$DC5J}TJI#L$K1VR{ z8#FC7NzXx}q2ww>8Bo&wd6ymZ)<;v{aSD0j_C}NF>DiRePYmWE5Tu=x{}@2yazkz| z7$M*Q9+J6ZJ1|N|5SlfE{wOX50T~i1(56o;QGiO3ag>%|z{NlYqImRojhNXRE~O>- zfrPcmfJ#yW+`^a-iybXBKI$D^PX&5rKgE8UF$~%@x3vm!M#Dc!v3|aDjvZjE{`cz^ z$sne?PZk*dx`h|k({=e8$>@52?L3>D{{`<>HbS$0OnSbpkIbH|>ocB2G~fsK*)OCj z+TGjbIm$sed-v17CiKCaapm=Y&KSh{g*k?q_VN`1SaFun(NwX1mp%rwl_9!^ulcoy zxXlY;$(3jXFH!+CPl(uDTJ7YdQ0lwV0-xgkcsEvP#kdc-1Jj7;60)!e{$0+`;MMV zK7H)vLl6g(?%I+cS@clAtZa$hzo&BP;iQQnVEHK%v@u>=z$>)fh?LrMeP>%Ueps2h zF`Cx1i%xpCl?nnEULRKDL%U{5=%pUjHhk87*Y??lcX5Q`x%H}JfZ?AB-!?)Qa7g7N zF!vQW@c8Oyi9Ay<+d5-z>jJk;F%>Ed#@?Zlr)Y)S=hSjShUZ{BMI-AtCt;YxWGIVF z<~-6~A>*R3maTsclLu)|va#|CTNQ^6m7eO?^PHG_Ivg?CmcO6hD+c8d-8z6?btKcz zO15T|#U-1mz}JWmz=fCe)G6W}V&E$w=8V61MzzeW7-~m#JF{+vv-sY74CW^GzIPlW z=L@Q-B1|g3g(|!4s?3WUWv4kM+=#Wx^bDKv2N}8`#9cs*3U&sR@5Dh$#$zh z+=kBXt+3{q;+vcsdhib&yyM`imM`4q5Fj(6KbSc)9U4S_InTS%|Zmw7|xqlg3gCdC9xMxi!Tn0{-6>e3LWYWa0<}eSN5-P>JH4Be9EKn94teUTnEl)a{es>i}ov3b;=U=+} z0;QRZ13n>X>O7J#->0zuVAGdO(UnJ?(|!U=`eyosorrL~Eaq~qZuUG;gvJ48xTl@k zw8^4sFJ+WJNg%Y8&9!~c6FmVG<5i!KeiefyvvjPrw+&LIF%0@Tf8K8gAEZd{pt-_5 zUdDZIgX6Pj?9*u|Kt|TmVBBYStoL{IB|%Zm0_?gqo#X8%$TU>LI{NFiaLKQx7=1g< z`Tf{Nxk95MQo);+Horxri-@X-a+)#5I10my_#5M3dX^) zz++XZua$E~&Q&-h3w3v*HL*U*4gP>PK+mTnHpeyPEVzscSB~wFY%l$9f3>=`R?Nsc z-#ezi_X;sgU9+WFz?L#QF7qmOa#lpqu`BM=XYXea5jyh)>GaplVlyHC9aXNel%Uld z<4_VzrSw==z28zTHR1}36tvzp^<5{>Skt>;n*B(>#VtcbEeMVMhOB~PHl6mT*%RY{ zIHWk>lt~1p;Y*OQ81y)y0njOIn~#>QJ~l^b_pe!DEYlorf3xEl3<}@G{J(uzX-M}P`r=|NVf~jo z_kjgd)zl;{=(;JIWkIR$apK<9?H-cXwerXi-WPCnLsIj`VmfH?3}8D~_8r`E4-wQ| z8~pA{pRBma9gS+5r%o~7S2`ZpRB0>eGAa$8qFJ&b6lQ-DyE}wYi;dZ7AhY#3kC?QE zw9yU-PgWRvC%NuyZY-Gu^k>`Ljg2JaqK6wm4tKEj9c*sa#V``|H#zj~@cE2kgx<^OuH;I@6UDGROBd zKZV#)Fx4h1JT8H^nK~@(U-bUwI%OS3l+5ca{`)g60Q}L9F)sVzyf*aS-@nlvh?2Q5wesOmdzo=>sz)IllU`8$F8=jxPjr|% zF_+k1;^6i&I5(Jlwle)sANM6#Whv+eGIX z4&eB1SR?<*o4pI=L{h!-X=6yDQyonYWKd&iX zSTD;H0HDSaw5f}1>0}=Y3p`pf%DdCFtZ;o|mWo^i=R@!7W7V z##VAk&L7{W;N$Itt@r*s%DuQFITL$1A3H2UHWXfypg&#y%aK$TJXV}exP3_t=Z;9o z{A~m?`z(tNHHz-mN`b#)&P+CyuLVZaH2=F~|XL zmD6^w=S0XO;_eNuZsS@zxsQXe$%vrL4j!6}5GV`Sxva_Ky}Ww@OPRS}FrbD0tDr25 z%wAPW4xL7ox1cWLwNvz@e0%E7OsyWk*e#PwFvu~PoV+?XJJrHui>d!$P#8*RT2Ug0 zx2lN$#Z8^jT!ugygS)UumdDo?zl&rvA|>X1MuI8E{w0=ge?%kv-KFP4q(MRKv_TROMF1tW)TFr=+yJHcz6Kg;r_^QH8PVS6%Q0cH9ZfOmA8mKy&wQgFBpT^I@!#wX zw~pTTYdUf{AoOkY+ikl*>HLV6J_IvaveW^PY2;tk#%$g3$_?Oc?d+k2Xqu)$-_RF0 zD5Sk>QY~$+i#ppLc`hHU)?Sn})lf873ZiW*dFg)A`~AG=G%h2uVC_`x(^7}&aNfCl zN)cOLePNyAnVBk|pejK7Cm3AsVWVnZ(&Bn<`8ml6iYq>p9MsX`^7i(C^Q9482LlH% z93*-!^SJO3UGXyziO2PtWO^5WESFq5FfedmoXnzd8@TuuXg)`2M9Q=6Dmu=7by~7e3p4SlI}f0LxINt+8S_7SD+WBa zdeU$&-=5ZH-0px)5s4V zWcj_wT(@`s$bGAL6zrs1_wm;qDG3L%o+s9g$_Bk4sT=BO09-L4^tD0T)nmum% zePAdX*YRc!(b1~lf=7%dcN(i}?&BW4C$}@Hj0fcS^{BG+APyl20oXLfeF1WWIW&40 zCX4;v+wfGNWL4o}AU3a$s;mkg4W#OGm`}=S$#K`!kAy3vQ(#iTr7o516jn8y4KDkZ zjA@m$E~k9{-K3;fGkP@6yBXiG==Qh_m4A_uAnj zY(~Qs49=Ic=U#=>LgthB|JbKhS0s7aRvWV(4H~l|5MhGwc`na5;)mNyQq#;nnNXEo zl3taBXf)A~{dy}$<_1Rn*tfdT1@t5ccEK#JF&ag-M!c-nH+a zYD3;BreIWiq&;%mBL;CM@C_F4%q;H)A14!6)>T}ZyWH5ic}ChN0=I(XgpuJ`=}ml{ zTD0TcsDeyKtvb1mRgBEFu`A2iAg>OxgVx=do#wY`QIdUb&!wX5zT$<6ZLm{{ zL(Zzc=UO*F065p@4cXl4HoaYndPW9yg{djEv>WbE}IsVAmFT$5lb z+tu%Kwvf4;5q<6}uW<9N$Y=hy^T`aMBme}1Tg%1869fkFfV42Um1IFiqSAs;URfb9 zAFqHQm`4iA2NjYLl9uBYk`>~Y7Z4DX;g=JTlH-%*;}zoL6X27F3d%`Ch4=+{1!QG; z0_OXs4ChKI)mNhMQ%D(R=NrZ^8 z?_`U}5|hvGyyrdV`_Auo&i9`4{`WlRxvuBj=f1B$uImQhLSrPMQV0NeZ{c_v00lun zZq`l!Wo3Z0vA;VGB#pv)VV&LV0n#QoPrRd>D@gh;wDc{kJq{0oox+U(s;U5-tL$96&HR8F_#-#?jde=LwR=IAgtVXq=6kE$%NG-pdn*bpZnWGOEnSJ?9Y| zk4Nrq;cn}L=e7bVV`F1gOM*)C&oYb!kLe8Ko~DY)gT!Ku4i8*z@f4-UWt25$r6thc zrm6S%z56|^nMKNt5xZIE!Ff6UxqnW&okyBt&DXY~n&u0(eH+eOtFl&+Awhw@-#Is0 z@l=@zn=U+2d{@*DNQD41t9dOSB|3d_TCOnlAUFHEp71u-T{?yx(4DYez8H;7I2&jb z-W+pdD{si3_u$3z+-CkT|1^bRn!N=E$Bd_puNNP%;L|B>5#paF<=GNiwJL_9iC*^T znFSMmjRTLBqOw`-Z@0}(MmPSnQyPzd-`*!Uk1W}YUpY}co+!WtMu=3RXL4$w$1iE8 zcN$T#X~Z)+70RJRov#zXMv$KVm_Vl?Ye2*!A;H~=>&)%7<2^!?Wp#y0)hAo;ik-AK zxyuQ;!#8;9Iew{R2j*K5rhGM8tn__04?X7wP}#UrMu?WcG~0vkt;&K*QEYaZ#Mm$A z0}9duu#6uj1+WW*X~>zEvNyM+=nlv|{hZ@?L>W8Sl^g6)PSREL7QI$_L0a~CXI6GP z_^T`PhZ}O*eSYHrvx>os(nV1Pvh<0|Z;*2Yt=$N*>7(kcI*AuqT6cuEeiEdd`ndQW zu@gMx`(F%~Fg!S+RjFUntr`#au^6Melyfc`58-!d$rgry`wwLllgQ;EZL=98PrQK5 z>OpSk4xLd4((4x6hjl~T#EZS)?Pshtgd@YX@$zTN{1ZtG^=)zE~V!&kx$E&kMGzoINpdZo_2%0}xdZhC}g z0gsVkP>Z0I$}CHhu`G26%~YbJe>|t@$`BZ-)FPv;pAxE2kmGFL*rXAOsp(`gpTms+ zvpFi9zEv_8gr^Y$wxx8ShPq5K_QTA%-GeOW63}c<9q9%H2!R=@YPxRzW%-&|>)rc_ zxN)`tv9Pnt%ltFSqUe*PuHbz)4v)LVS<;k@niFLXJ0VKc?9)Y?nm=N)oveZZd2cLB zwnuyUXwX^wC!V-6I3QTeYP4^}0-)X#6fSpe9bG|W4Qq>!!&ejU%J!{ z3TY|(zJX>y(kk2n1H++`cJTB)-af8}ai(MQ2?zD&tIeg9_9Vz)G-Td)dS8X#zWXHD zpMFMPH`&hjN^p3!0$r&|vDkMynPRPVhpn%E$A>DkD?p!j!q4uHnh!XFIr3w4#cvzv zYg$BnSi#I`v7hzGXedbO9N3|69R@{>w< z<|5b)7!ozyoTq!^jqHsU_DsM4W47Mu|H-CPm)5LM{+mNUuX(sY&O3 zdw*j1{>rc}tMEkToBN`#7g(B_>{?YYpsPKCPwHRe*WqQL)tGB#wJo7wGUD21&ntHx z@Djwf=Q0@63~rOvHr60!nts&4Vm!r1??#R}GiDzRoJSEYLL+ApbAOJBZ;~5v3Am0d@9vXvx2+)9Mm1l;G_x27IA^%cYF&ODIVd; z+g-kZcV5kf<0u+V1W)_aeUp3>Hc~g<9kY*oNwmZi%8~R6Tg6)f z>LY5BYLcC3p4RKhg)zAY#;FM*`%2|!)G@ip8iI(vmWMVLh~fyvD!yrK?M({X{&h`1Nu+2{rQeD>=Y?9N+T1qjyOY^ zxk!xizZiB&GO_r;qF@Q(G5An%Gl@m`)=LgE_VCE>6KO&rkTn5M1g`l7KvJ&&Q9PPK z)tVnShx22au7takUf({~eH0#MbI-E%)g5V5fTJSc(~uN!?oVkQ$_2^c@*!)}kDg|; zmp*GB_UDnA#(h!Mr9h+ni`AL!P1yjGKp82*F=}KU!*Srmlcc(X5#EYK)+rm zk;cmWn+)bcl)zOg(Y5#YdH3Ya5$2^M_7BPe#&2ROrZ;S|E4Z4D#Uw4Y4(c9Mt(Sfq zSiwGy5N4g=&h;Q*%la^-6K=a%H%KM&nFgPrs<_-t>xBc4<6zs(nH9cnjHhc0|qeuGm-h5{qua z5j9_se*K{i_^ygL`0Y75-{?_2wQ=499~~c>cnenCgK+f*1pSzp5^2 zphNzBbx9P~rh4q5oy!Vi^yIyRZP{LrjcYr47^5LWUbn*GD+}>;7806jk*K#(8(6@> zYUI0$UP@`B%8F$D_dW`bKp{!itn1bFDEgx1@E5y5WkKQEz`xAzzl`j^ZLs{`ZLkas z_8++5x5nMB?GW~+qic`O7QiSeg@wlE>RyICgL~~{vCFl3>v5x%)FVFg0$qS*1gF`K zGW^Sq-8y*n%EuUY+q%x^Gt*sKVFVQaxbU_+>_*eI>N$x3zF!_=Akt_s7iLtX8P^qT zhU(h4o_LdwkH=YhNH_#{Sxc=Yl$J>8PxXV4u?}^)o{|C>RwifZJ7B9x;(mShjWeqc-_h`=gapfjgAWJ#dU60xv>n-Q zPqZ|B`X6sKqL`;e_n?_A?|79L(5s5LBiq{7mf|}Vd}q5AGM=QFkaWyU%CTqHmCG!7 zI2rPc^3%RlCj1ii7Ag&Ue8}|6g>Q28W^XU=^Gh0a(8!pJX zb#!qy3W6DrI;7OFdL=m!=pTeTclh%75xiiA9REJ^qE7VG(xfRe2lirh(DFVF_pXjp z)!Qk#t4Qhif0#E6{`Y~)LQYfCzao@@wbN}c7l5=r2&(YUA~?-Qo_H@16b|{nsi@?3 zx9d2BotmUj&4}l!0iAPV1R8lUXK*X_g(PX+O(5?6fG0+Y`LKl%)qC8-i2GAp zT6DZO#jkU=y3hiiRy|OM(X+mZYxS_g&j_S*y3?j9%y2yGY@&N+*UB}jab{%ZDQ%2g zhinZmJ;vEyKcp4Y2eE_nsGoZl)An70y6rn3d_U>hG%ZzNm6e;ryVuY-@Pv+#Rb9qN zYj58`Rd4yNm{_q(!;IlwxS^o=)X@CZRsCXbgs5dwi4X`Tl6fTMG7dN#GL<(d>!Pym zrW)Ajrb@aWXUrd<*iX(jHL+IYb+8_O#0P6u+PrIB>;ZgnWnt$LQG!X~d=~2-aw>mj z*d;Wqhac-iv{WP(cHwKnOzmY9AF{-AXkPmeVZ^!&F*#pC!p2a%eFzWg&i)267nD3E z&7+#%+oY)l+thNwJE1Qkvud{&GUCjsT^p?K%sv9Xvl0Cb_<8GHw^)lU)WlpITp9f;c&WCW{b8iR`(m1E=EN*CCBAZYs%DY#K{PN>ge(jWlYv6yWaVLKBoYZjqcvqv@-UPF4337$AfQNy3D6mcFSG&JG}b+mV0+!DLShbhX9#fh-`Wms7}HkOlN~ zg#bN0{=fSHt}Z2Rb#>0O1Do4&A3$Xy1)oJq5(sT7-r9rqcfgr#Hyw(Vn!N*GT_UjX vLa~?+At78`{5}FwDVA2$b6fOA|Iksq7uM6u&-1iE83;rH00wIsU;zIEoOT7A literal 0 HcmV?d00001 diff --git a/assets/readme/examples/cv-modern-professional.pdf b/assets/readme/examples/cv-modern-professional.pdf deleted file mode 100644 index f75d5989e825946469151f01880f5a7f2e65bdff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4657 zcmbuDcQ71myT;XE5xpmQH+jh-#9F&pWLag2-lMLzYmq2fED_yH6214H=$$Chq6ABn zC5Rx2vWOs}clq+pnQ!Kt`QDjxX3l@l%zav_kvk3`VT#3jI=j08CI0S~(6_^3J%Nzl?S=pZ0)TbH z{4JCIZ*py{8_vrK2!X?80TL+ZM_yPwPy+SH&I_xGb#TXE|CV`r;jwnE%mCl)DeF1> zoGg35#|J;LC5f5O7cc4?8yg?OKh}XViBc(aZIyycV%rw4DOq^u8WAd@Xlc>r=m}{;C$S$CpGd@;<<=jhL)8k3P7-jcB;% z$Ecoynxqx!?p@f_dCxuOxD#tVcl1HFZa20QG#AxNv^o1&DMf0E@&5b*sIdh;xHT4; zG;_7%xSAt3rRlKyqvG^x$$D?NFsjgZYX0K;MqEJm?8U^_pik{h0lXF?fxjkxUAH?p zlR5KbRl3sc33ODspqAW}i)}!pjU>WwkCM<^X$UNFF@J0BX$5tF2cq}LIcQM?OXD9@> zhAGN4g_-_*el13kA9h^^R=iv+;?OG5mu|wvLpxZB%vn<%m062*=tE=V4LlT`t#FFb z-*Kuj;q7@sjMQy9$8X=Ja&e%+w~?#vZ!&M#&VF9B_;~UpuHvXp0jFx3Psul}Ah2Uk z1(7iClNtrk)+@5V9&J4N@fR0=e{$|ceyS$AUR!VEJ6CB)^srhCe@S0`=x2EmR4LuC zqZo%!(r3v6pFQJ0XW2*QNmrqnLM-E(l3|hS0kOhYTEDuW*SSRnFoF7zq5J)JBKSRG zEtHH98H6e0NI!_U9Y;sdCHEC<-}C$TXbqxD?cpMvC8aQnin4gwQpG>46jb~T8pS*u zAjwu`(XPR%95XMjRC)N2M2mQ*CO6%z4GOJ7A~n&X$=+z;5Wk4M#2DL(dLS0YRbG*f zB1}SukM-FH`CRs=lJi-c3sv{}T{SuSUTn#`@&2LfT+N%qoz0K%>}{x=EtWFioh!(4 zlcSLTkP%c=uy+2`=fQa>XHurN*?}I(DNs;~3bOU46t)|sKMO;d2Z6%VM+~OVJUhgD zegyoSQ+xl4*?%r7*KHzK;y(NH+)JAJxsRif%2iTZpxhVkr305=6GQHB09N*eQ)vhnQw9P*1=_!YMH>|f+_sYmI=LYPtq;}pyyZTvEcmc=QC6=! z(Mp`eQ=D*)_L%Hv>k+mykt{>>JlE^RwW)+gF&zX2Jlowp_Kjw)Ab=8+pQ&CR?O<*5 z(>?-c0&pv0R#oOvR>vt^F~rWRC-9 z@bUSL)yaK>Zx~+Tc&*@j{NRBcN#}IHRRpTNupOEqBk*(awkdBhVN=!4!}t06NNF*1 zlZB%By$AasTyOS_*gufOH6I}=y4`u^FQ`kk5P z%7DAv4(aP!g%?;3Qi{04OE|$}xFyRvf`^$!d4xTEYG*%vhQqx7Hj`tJ!RHAGwC+Z)L&Sx6TFUo{XyelTj51+W@g4IVjZ`|V%~yWS z3w&WkrOS!GL{%#6PEu(HSN)RQsGCU*jdOlXEdhytISxbCm02#Pw_j$tO}4<)^Rw0j zd>~Hi@dT5cV_q-I8g$6b_|?(<;*}pAwU1x3+~BjFNEHZUN}G|(Wplv#yvhM558vYB z!qX(pi=rUui7rrX+f7qv5IgN5+`tPEQ>huwSXEwz!Mvs&bhAHkb~zh2_*Bl{bBQr- zq^ApfG(%{OJ<`wE%VBHd5&SWlBkvu5;CFpr*YzA>bU=oOvrJs-x?Ui)k0<*T(Vgx| zqzerWA&Gnbd-aEragZ%XE&Cam=GDHfqL$fwQ0eEe$1Ifye?&{L>v)DfDR|Ag3^+RI znf5*r8e@70b*?OxTzR+p;T}|bPZ%k*Yy)7xv`pY%zZ8f`Dk6m zE}1twvtaT3ldH!gRDCAJ-iTjNS8`*~huw2sc$eIZ%+sZ-`#@uWnbjDxQUs5;R_zm_ zXtC|M#-m(`T?#IQ{pZE@hlm2@u?ptMwbP~wnG|}}o#_5L&0uQV4$NjvitbO_wtd5| zhs!2o3vT4Xp54%1m#Mt6N3L$IdKhn;Ogx^YjkC~cFTMSpYt}q4&N(=a*gMKilUoNF zCDIgQH6V+804q|7uK3HG((X5IRG&Uw!*nX;iU{_JYrmT^qmKoH|pd($V+|__i!_mmSsd_?jo*k(1|u z@<42!{?vv}5%H7dP0$RKD%q$ZmyVKy2z|)IiSZXcaheeQ=@&RrnNz}6|0TMG{q{*q zRuaPr_KPs~imBj!WGbG5SHPWh25-wp2B;qx8z!bQ|V2Lrt$63yREQ>CNh zKV~dhi`L7jkK{hS?UsNajjsf}PHkE1BYbx?Vaj7#7aoKdR5WoS#~!;XTGafK{}FvD z^Hm$EuEmi5qd3dAY3+K-O@u8i&qS+yO^^v?!?;=L(?wc4vb1Z&;I!TBQ=#W{pF7z= zX%v^WTC;O|{vWljj?A z*9}}8&lj}XC*tTFGQ14=J}&X6(iT4^LcZ6>`$qqIAMK=J$t%_ohD+etMk5=`b;1b8 zg=}=3Y$bMMGgxQ!wP+PArtk9c@Zg26bJa#fQ{FX|tWm){?J3$nTb7OQ5^H0i&OMvg zrNnSbNLP(-%)KV50-8#8Cu_3J{AeFaQ(qQ%AX&X!jI^v5qwJ+mN6<8UquNpY^T(hm z@N7lYb9pk=(_r(!Lc@6V^Bd0E)*<-}C$$X2f!Om7UZYWveukr%9cWTUB1b7kOq4si zJgkW5L#coi5!0-k=*pED_|i*=(>|l=3t8y=@MEAN3%7P zQ6x+^QqO2@>ML!4biWXEjW$0O_;5Z`u&j-KTN2+|hOvCBFle5a(7Ew)$!!}3{*n@$ zlPfP>a}sL4{bGxf;nqlLTz*j+%6}@zZb{N**&W?2FLgp8Ea7SHG$}r!Ld(5%_Zy6O zdcY{t{!XNL>fxTUj~P42?IoIwSL{`4f){|7iM9+C`ggaJiJ{$qgd0W}kSKbeE(>iD>b$nA}Z{a=*X^9gy(f7|~5vhe>70J8rX0HCn{lmCC9qqhv^ zY(IN&tWlIAP;%nLYT?}Wn%?Z)UFNnl^!z&=<`>u5v*Lo{qT-cGmGdFbVmQ?jvNO_l zp6=zk69qy3+5_1Q2C45PN3kB5x7$NkkJp6!})?JhYfN9EE)gOGB?lu^{VLYEm4 zkCVqcfln2O49&5xOV{hr8P#lA&6FcGL?|eTI1=H)NrEz(^}O5<7oE|B?(zhj&9h#x zx8e&EFD^NbJ-87n?MG}E?`F%YU8ZV~-=aFqw_Y_xb<42!ChRXgG&>%c^`kNuwG;XQ zTCE}xb<&@sxuUvL&$T(EH3`JApyIZ`tKmVnHsdODrppbrOzxafXkCILEkYNnC@H^o zlwMAe047?5n8cG^P8u<2^5_xR?W2aL(k@bM-iEgW+s?R^p z>7SKpw_1emZ_6iB$xB-Z(ld#ZnbfyCGUy)X1A#K})KYMbh5q0xNFg&;D~evvzFNtI-ar_~Nw;phFrc{IG>QcM57jH|0I-Wi|}!e<39T*Q@>kO%T& zsPQJ1R*d9^8VfV}Ntn99dH^F?;jn=EDh_vcpw!tq#M5w0&zNbT5%(IhY#|y_Zsr&b zV^}PAnx{x$9h`5hbJrv%IV>qeTphF2cTixyY5%(G&?tI~g)xZT%m4bR(lfrLgf*%p zrvYT>i#5K~d0yaMUp!_$k~~!H!l|%-h1_aGP&w~=W^-Tj)8c&0X!H~yXG)HPN=-{s zN<{pyAZ9pu=ozAT@LLFmkkfvnDNU)bVD=TIEt&YPV+b%VaSg%^UbR zahVeJ#ZlM(slcx-d>3^|5Yt)}t>Q_c+&4p#mb}*#aPidZNv-?xEHvKdNo6 z<{$kUIAt7y;K~048uULwlZFB$4Bg#-)APG#2#~n13ba&^R*`{9p=4Aca4;CA3Wlpm zOCym;I2aB?p`b_zSQ-Aiid06)s;EHVYDif)Qd$KpqarD*ih@hRpl}56|9^$`zxg*a z#5w{bjGX$@&K&#*e? zKk7q)M8zv4M5}S)zPZW$2Vi!&jo9s+yl=s59FAgUbvGT88&i4dOGX+d7_}8WZ)U8%5;D1+vaOk=tsced0D_sC~5LB}X(+=+X2RsvpHY z-Hpn=4ck=Fjo+49nHeoUYx&#*Umm^I8?d9sM~n&?DOM|qEMR+2G@5>Pd+FMI)A-kn z&szi;U!F=4Nj$n!wyk{~{|p2^b&QKuM4&f zjPaE&l_w6bbHWqFi}Z@xs-{D`Ro8bx2z;u+Q~Wr!Var>-nll~HEZ|dg`GVgbUNKT3 z{xdgMlNQc&eAP4uliv`tmr&I=*EaA0VNGPT^7 zKVg<7b%`(>DX(;#L$qGOKVa0DPw;Qpp!u={WgSIcTCK;u->||oa3nb4_8)tT9AE8t z6gy}n{ggk}Bk&CG1y0+JCeHuu{(@~WxV(n{w=kK}f_C_&hS&G{%9_}GT+sHY$uS&V z9@Lo3KGH&gp=zZpVWnI_{VnUR;<^gMlah1Xl&r26hDvg`6!M81<0`+gG~;tXO{;e9 zHwFsuSWrv06t6*8&n2JtC=*&9ky4e`yk)C0|BQ#i_k}EN4?v(yjqU}#5d~Z>S$Zgd z;nZqq$Z@XUKX@mx8U6PHMcVa#g6a;yq*3L~JOf~aH)y%j* zM=0Kn+Q>bpuX?_CYx~AD<%-ZF2*B?57BNRE1lFT_PVW;EXLHcyi7ujMq!}vg8xaDX zl}1|P+QmyXKu3j`5(**6#-a-SJd-Zeur--FSBLPtt-Pt?1?9JqmNoY8vmg#phS;TG zKu2HNz&soKYMB5sNx{&Xf%S?|UBq%VSe90XMuxHK_T)UGS7sf?kJc#T<3Htz8RSwa zxOha7HSKdVa{LeT8szOLotlF2has5F?bPEoOuqxCB+c+0C_VE4Y3@3LPudPh7aa z-Kxd$`{U`8ymgL}ea89Q9+6_@bn3u>6v{qy1f1rlo!&Kyyj6=EB)!xfWAAGh5fsI5 zZTs(^QNqc(=DeVj>7RV>FQIg~wH!|FeCL9yzy@)k7-me%;(aFLb>=@6uxx#w323%gW~-Pe{Wn5nWL~sj;RTn@!{4v z5afdUW;*l;pu{)sl(g4*fm2_wE( z&EegpT?~-LhB#GdcHbhTXMC_nwIQwgu5_vLZ2zo43iyn*S}ASBQ@E`>#Tx48t=cZ`E~<%Z%_D`&IO4wz_;HOA zmbcDYQx42po8;4Wx6-=y=LNroqE8=4Sv`7VRmyGOfYXOZHaZFIS4R=Tlp%M@*}VTU zu6;1B0eNL7XUg7YM!KM@{g87*3-~1!qJw&Y_AFKyO^AddGVa~C`5I}aH0L0lWWqfI z^7CSte9W&)h0^bi7bwEu(t{pAc_X=k_Gb^T04O!zjs95~0;dxnVo1BY`%*V}`cGpB z(+zC1Uv~|f_|GLWUv$V9y!aG?Si{@{k~YWv)up@0Aj6 z`!;u3?_UuZ*ee88*-^EaP*KtEoixjxl{4QVZE#@3GM7IxN3?#xln8;{N?u3yLWak- z2b2XjH1Dud?@ZGP;VvQNsD_FYBw=}c`CTFe_VD%I7j|}6hX37l56yFC#eAZCYT%Lm@*Hc|uyAa5XH*A5y3HjNj;n>>;EXHKF?7PL#97~I17NXbdDazgZ zNrJ6r=l-Prqx6cuqe9NaZS|;VUgo+_%CuJG_l7NSY*bP+O;Db%=5w3DHXcxSt!%2t2>ROT<;%~fgZ6KcCW_*7?!Y@*FW%gDez zrA7!m?*2{aLtojIZ7yg^31|Y_!Ktk4D^YV5T}>>77cqZUM6m_RkaN1u8s_YmujeYb z_5^|?kGg-@m;fFT(bY!Q+gt@$guP^a)_xg<@>t2jy+yjAl1^!4J1Om=wL@;Xf5u3j zS53D>>x+&d*yhpP3jIcl77ka3t4CX7tY4{fEM3$!;|vkh#ENz;$hTjUsiCHrb){Vd zv%v#hOva(qgoC47-VGy0Dt#A)8p?6(TY`UKa&;z{^MK{JG^k7VpIfjJ|1Hn#A#sdN zYfDnPo+4SW5FL*1BnjDM`e%*(o^tF$;n{%;r_KjzBXMmYV*lLiyD^1}C4>Da+SZr- zcUuaQ$}Gq9UR$I438Wt4^2>&%jIp0f`9rDoFl#g%RKMH#K=LI{VVqC?V7?9ac9rVL zXa9&14&bfVg9Gd}h~SKAFdSEbR_%7DtyUUw<9Lr3o{~n@+)pME#QRaaCU7bLXvfy- z+&@+^ES)Ssn3njzEF{!Ak~Q)dTWFk5S>a?x>BKY>LQq~%3M0y0dwmJ2h4SHLuXUCM z*DWM02AJH`$ zpMkxv$zzC}YQBykbqX?EaavUK=@7sc5jNsy4OX5JihpInl8D@3*BuwAm{Pu_XG_&S zVLeZfiLB?--zQ>Il$#$LoeI`;U}Pc^a+D2wwLx!aOm|n%u6uT zkX*OQ)<7{Ytgo*gKR-eCI-Gg^UV3rnlc4-ibk)1T+^Bux5XmQ|%fC9*jmgC0heLy?F}SIS{s#i%s)NjHDCU?AdD zK$%08wBG8QV>vtz(!nvWj8aKzt4>KL%)pa zi#gGxok6UeyxG^xZEchN;G7y6A-id&2V-O=LX}jMple(kR^}B{F#%VJFZ#$}zna%W zX5;SIbk4Agif34g;3VAIU{Cw`02#VGD2S;j4Dz)Yas-*PB-t3Qshg(Sh+#?XYkm*R zio@BFK?>U(eiNYu`h)-hp<}!M_N1z9IJizdWM56YeT#f#R4N+}r0v%=(mlJIpa_rc zEZ18kA^93guFaJtUiTarjZ!-hfjX07^|LVxj{j0KQIb9(a4b10)|r2m1B^q9xC_ZF z&O=CAyqq9$f{h%0f+{zy;Q}e#177IbM@r6TckCu{8#6zG_Rel1X*bZm-P*j0er8Hw z3+->)-%gcyjm{h@8)zTjgQL{zLsSwq#q{qalr$v7mX2tP$4Opwk1=Ro-p;C0bTMc8 zgmC^h`YSVM=4?7$!~BtUdBF1hR7e$(+2KbT+rOGzza1J4^&fY9_o0Y^+jPm4^p|7* z8(F1(GxjhZ_Vjf4?8n_xwR_)bnB^u^L7-Bz@xOw6?Rd%ByWm2dpIhn_M|S}h*z9LQ z+Hdb>Kh|C=4Dp)9iP)z2ER~TaFD+zC&+K~-kLAznoQug?4e|9x2LoCBo2~JbKY89x z*LP^6jnFt1{-Ed7^2`hU;ZGDQIL9WwmAK!m0)G<}ro+VVf0l*+yI(Gdjf(}>?TEOu zKGm(8=E|B+2pnYeGv0J4JFB?tK4jW%f7iiyL2R4%XBCZ#_R+~RNe!76P#zfZB3`}b zsuSPgVt)MR@pd_RV+jaW54EPY_UN&JR4}v_&k;e^lRW9LYfzQ7q8`sh75wxbOrG?)7`m zN`vCJtf|8mz6>Hlp}#7Sjtp~M9i5-nx8HQY%5{G#`K;_`lFGr@(Bs$b(?Q?(=TsXS zN`6fa%L;!0odF1c>U)8Bh5g+)yu?2JUBN3X8O@noobHdN+^)=D`4ToqNzhsaGK(iU zIzFq;dts&&*Da@Pml=b!m;g1?2^(X9ErMV!&%(gEM!L=tIDBf+-8sW?ZKioVbR1Ou zvxskzJWi6?bb!`Bneu3HELYV^1;*znu#29q!UI-Ke0! zyBgjW18%qVC|?l1X;*f-!?y0cty-)R!Ve?3=G~Y1ld{xQ! zpgj8OHzdt-{r6XGDr@-}H$9fDSv9x>u=CCxc9HiHw4bBD*dC+Os%*T$OEA^}yT3-{ zO>Aw~w`(7sTHg0gpnfcg>GH24jo(RWDtG%htIRdYftVk23d*3K zhi5C;e_3p%-NfVWdbrw>^#))5ft-*6)5x!HHX>eeC)sC71G=_OD=@rg)@z7l?bM3g zYxEm67I+d*ty_ccPUw~vb&>thLdx>}`dtEYX;}aMBN17X00Y60kN-|gWjF~;m%UQ8 z8=F&eiXO``C9>z9F0pn9iz!@39?TTdCml@|qRPWrpsHJemqVZu%~EMYAt7ro0@2W7zO9#mfc-Q-EeYf{(%f(F_@N--? zdE#f!ACjap#i%VQ>kFeF^tnl3UO?JlJ+KjfvB$mQTSx+{)QH`Q1kN@9YC+cRWXohY z6{zaei60u2x^Y20wW9BFi);xVm&J<^^|@*J{-IHDzB20|*$G0PTkzuD<(b0=gxjEU zWPKzc7VN-!{;rsQf%p6$-}z?XTK0RyAELETHiwlf8g)~F{O~*PtULE!Ve8tJnmv!y z+uPfPNMID>)uX#iF3yOLTwRhhriGnz?IaOSYz?N~#2< zBj#Sm@!Ajkxf!Y9R+)?2gLsyj@{UL47kC5!cwoLn&>B%$ys+H-oo&bz6+!Q0Ko0<6 z1^WDjMmVqNOz)j+5`|F{Rf0C;1}WV|jsBeU5^MkurXjK2WK^n%*ic2*r*%36GHvg{uoz_Ayp@9 zgdM6FI)44xxc_E#klj&5@!ii?^!zw_`*u9eH}K4Ug5|<`)N+0F0BhqgUK22tqgY4sXR&IkY*Qdy(d&k+bfbN_zkJ_ z_80zzh(d!Bwqp@mL7lHhb`F+fl=YnpU3{iaYy4-Q7O3UANv%)eV=ee&6zv<8*QGDD z8*J$(g3|hk*kgpOS{MR%%dtPqJDT}y5=5oLha@E*$;@c9GjU9H&$;$KtOWG9=9vO9 zi7~bX2`BdN*$Og9Et(8CGe*>P$0Lem zI{DN%U~a0c(W8t_u}ZS)FEny>WIr4G+4ROd`q)Yy@4H-W9@GEEL=wL?BD4N@!6y@6 zgQ@w};+SWeIk(BB?`n+MUv5%vk+!P zeqfJECsc(urgq+GGrA8KXQol$&?Gng(pJvN`#~Xjh%sEo$h%#ejl5wM@m1$Ox1Qgc zTq}Gu5GUPra^Ek}-z?bFzE7X>iSk>*2zVHxTr^T7h+o$P-JC^_Pc{gZILT^1>hkX! z`w}q*IHqQx`JMi4*aOB@v={d|r--Ua)5%Twy}`R8;@;E&$rAyMCFd?iY3DVfGuQXu zTl||h5AXV32gH9V*;vNZ%;zXn0<(Df&wR31=-#RzZL9PX$^l+G>w6(0dYJKhNy+)l zZCe$X{bQ@UQ!gCbf-|A|rMAeZOg(9Q+B6H7H@xjpnSUiqPqhSWyk1#5VUFn$#=w^3 zL{JdL5qOt5UGMAbQI)TpUm-lgua~+=_azXg{qy%^bWO*UnJc7KuJbVIBJ^=x!v>=ZF z6v8bj$;Br|_x~-(|IZ_dx_};)mn%uK00M{;cdJtUx?H{I{79eUeQCAQ^$SusArM5K z{dt`Cz#X3Fj60ypY6kRK?+GKhalgMKmMO(!qW7F*w^fvDnM&%wvjEq{Sg^g3XSDQ0 zaSMUtlBzroS$t?7`89<2=b--%_o07Dap=mrJ-MqEwHMQ1z!m+D#V0h4)4QsB8JD|F z_@b_x)(Y}=6CcMCZsF$cYH8~Dzj89O!*O#rb#?c4wY0+FfpBpN;xIAEs=#pm2Up`N AdH?_b delta 6862 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 diff --git a/assets/readme/examples/cv-panel.pdf b/assets/readme/examples/cv-panel-v2.pdf similarity index 80% rename from assets/readme/examples/cv-panel.pdf rename to assets/readme/examples/cv-panel-v2.pdf index 97dea47d06c35f5482de40783efafe68f34abd05..ce10bbe5ffe6946e904be02eb67b95abcde3bd75 100644 GIT binary patch delta 7438 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 delta 7844 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 diff --git a/assets/readme/examples/cv-timeline-minimal.pdf b/assets/readme/examples/cv-timeline-minimal-v2.pdf similarity index 94% rename from assets/readme/examples/cv-timeline-minimal.pdf rename to assets/readme/examples/cv-timeline-minimal-v2.pdf index 6443f0e501ff849e2651f5c169c0b350ca16ae1c..cc2b9dc94df9f240c677e2cf24052c1df8d6a351 100644 GIT binary patch delta 1905 zcma*h`9IT-1Hkc&Pi(8?7&Aw6=H6zunW4;>qO$_wx^YACK>Eub-Ze*LV|XstMGkpDTvv802~b%7oKj zRcx~ufre8-`kb2--uM2sit`S2?5B!ch0;HNsKf|YM;)Ph`CYy~b;XJS;g={U1(7mY zIRRR8CGy+J4O#9QW+?fiHnL?cjf09)`YV}yD%BJ{5X^=w-GvwEsyZ5e_k}P@2)eK# ziA$zl^@Am8n+Odu8JvRAg##HT^_h=CG18)9C?B59*T`rw=Sx!)4T3Cg{+;%$L|$&@ zq<3)DEj}VS80J{uVz!zfJ5`?#|H0SEz_)@EEmPc|Jbrk`cBk3Ajb6_X=F@{i)82J& z>kb{P-u;#(>sr$>D!(v%ea16&mWCHZZNlYWR8$mT5R710K$i+5a}|w&VwFx3EbK_d2@x7J9^i9 zFYBiD4q^81Bllh`+or_rv@CArH6L)=t-d{%GE?w&l0Z@X;i9*{V3UYikK|2dTM*lX?=uy!-9C;IX}wtjQaSJfEy_!RY{BdV)e!F+a*n?aCNp8A@=`9AC1 zUC~@N;@|bW;>w@qq0aua^OSPP^8L+ zF?bE^{Q%C`QsBH70}Z60Kxn8ExVB9W9BiM~{*v@Gf(*~$>#9$_#a?~JuGgwWM|^?> zWnAOzSs2EaroNJRU3oN}6#)hT`6cm=$qEuVnlIC(LaDvP@u$5rWFt3$^%(2m0XCWB z1Ch$H@vN=391IV1$Wa;h3(@-*$o?;Oh~XwrU*b8zX3EJQ)lE$bSl1O=lNTYt!-+WD(btZ49R!CJ3Dr~tC+RBq(pul z?%LnDezy{++%m10-kW^h)2{o8{o%9oX-k}I*Hz)i_shABJ^vX9OZTTQqWlH^xRFD* zBR9_A-rWp%0KU#0>ro;^m@q`u>w2V2l!Cp~(RJdVkeWlc^*^-5l3u()hmFbjyzqTt z*u+1McEYrio8KTp1?}XpqlH9|!ohp#-1D|0hq@ES_?TOyXfL`YS}z2b_zDyDZc24urOrbSqFp;6bL}pj@>ZSqb*&Z|(*8>NV+6(fUPrfMNIV l{Wq=_(MWy^n-0SGPf?Ae%n8ISr?psJ3JuZLwsp0G{1@-|YGeQa delta 1902 zcma*o`9IVN1HkcSQZePqHG^@FV{*+f<38tbB_T%`Myz$@NEoSnkxAIxi@|7IJ!C|N zrlnl1YqWCTXU^O!+E97+A9!A`=O1|g@cHF4RskNa0M{W?K)TsiQk(&I9i=Tv!a0Df zI_8bcevD`T-MU+N)9QH|T1 z%z=FII!_$_z}mkj6#yZY5s&U=a$y^N=U38at3zwf@(2(oXf>EEO&ducDxpfH&z)oX-5 z=1Gn3u75iEGD<6b;FMk%SbKsb)@LOAB!yGYM-cJVDNsiRfG4y%fLE{pk=uR9Y%VA^ z%l->~LYnq@py&~@`#LyjOgT(zpYkbGx0A}D78mBL86-lva+_A+DdydB{1}3U3-38i z7rnq{#k0b>!>9khy_hLM_;ck5$S8B(4n`6NkyK9#fW z1&vLE%-zW#>H1XMEb44#WTC|DSI-Cu$GAbkr1)v>*OW)(AWGTPJZri?gll@*tnQF^ z@SrBStFU6G+As3u_Rdbr#5_>%VyiT3GLf;=LxgWM|-R3N*dKI&1JD{LTl60pYP|5eSc8W9?#!Om@_={@%VXA2_a`UJ$-+?EcFHL zU=|qGShz7NI=s3Y4cPL*D**`6M42wnWK-&T))l`A=AqR)^LAD+LfK%VVAWY%h=O_>;2oA1+8 z8u4!f?oLu1IaY5@HW|n?)H%L{M}}(o_@3wDQjZ;{ucJkgA-x5!#PgPoIB<~s&}&O zq;haznZ>>+nc%fRUJs)z3x(X+d=D1Ep<7 z^(Qr3r-E1M9*9g?R95A2kCVmaglVqPkYaK6g~)9~5^m_W#SmX+MDCfvwzI?oFWUM3716-tA-)v8t!{ez zbi0G8rDQ4ia7&hW*2a1{e^uPZ`?6_Ml%!8p=nK5?dop=Nx#NQ&iI?mU<((oIcd631 z#y7<^Fz{s-oQCUC&q0FYRFk8x==lPZNL&Y|*;koc{3ypSM#7efzpCxp%@KI>xGKm} zI2>Lwsl3$VzMjq;Rsi$xmjs{2IUgJThTMMPLG{V{mZg&B0)6e1rVZ7i_|cbl_!Q>f zHjGE_u)i2G_h#1hJ|4Z5Pe6Sc{|3MC-MB(H+b$gsqGji#n*q;hz2ib@y@XT6m5C>j zoKDb6Tan+GU2SLC?45tAVpTahIRlQx|M+LF87X2t<${|SVqaH{Ocxz-v1x zd!wj$?d`J9Y!R@tsA06%SJqOX{cH2~QTeKviQVLqG$`urpN@nr|Kx7D4%_$E=Qqld zAc!)fA6XrJ;XwG*@a>RYm%LU#f-L2`aj5?1s(T4fzkq6Qx+u_pm%<8d=^FqWLpv`5 zzT!aNwnxYkF^kys0OCi#neyJfUW1PRYzefu%E&_7)<%#Ij!PEYZNRZmt@rr^3o#={w5fL1L1^fpi~tsd1~Xl~YIb=T66hy_Ik{e`5j=-9dE-PsZ1cA`c>-<=K>9wJ z=P8m?x#B*m7SDPa77N#9LuU5J*#OA$QI$(JC{qQ{glIT~hDOMsWHeQ~uv`tz@ErKZ3#bXA&1->UV4P@-Th8FkVwrQ_#Tq8q@U& z*yVmYO|&vmDq{iQdZt~#LmV1T$r(gyqQ}&iRl|GA;`oK_&0!)p>~U~G<3Up)wT3}6 zF;tA@jAtL+OK*5Wd#-1yVHX7nEah-qD31zos@o}Re2n4~72>CC=-g~A1 diff --git a/assets/readme/examples/invoice.pdf b/assets/readme/examples/invoice.pdf deleted file mode 100644 index cb52dbbab5feb0a180070095320375c70fa4833c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9964 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 diff --git a/assets/readme/examples/proposal.pdf b/assets/readme/examples/proposal.pdf deleted file mode 100644 index 6081db2c99fcc968a453ebcc18d86249c3badc6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6014 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 diff --git a/examples/README.md b/examples/README.md index 128c01f12..41f9e75b7 100644 --- a/examples/README.md +++ b/examples/README.md @@ -56,7 +56,7 @@ are with the canonical DSL, then jump to its detailed section below. | Example | What it shows | Preview · Source | |---|---|---| -| [CV — single template](#cv-single-template) | One CV via `ModernProfessional.create()` on a `CvDocument` | [PDF](../assets/readme/examples/cv-modern-professional.pdf) · [Source](src/main/java/com/demcha/examples/templates/cv/CvFileExample.java) | +| [CV — single template](#cv-single-template) | One CV via `ModernProfessional.create()` on a `CvDocument` | [PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) · [Source](src/main/java/com/demcha/examples/templates/cv/CvFileExample.java) | | [Invoice — cinematic V2](#invoice-cinematic-v2) | `ModernInvoice + BrandTheme.invoiceModern()` — the recommended invoice path | [PDF](../assets/readme/examples/invoice-cinematic.pdf) · [Source](src/main/java/com/demcha/examples/templates/invoice/InvoiceCinematicFileExample.java) | | [Cover Letter](#cover-letter) | One-page cover letter composed in the canonical DSL, section presets carrying the hierarchy | [PDF](../assets/readme/examples/cover-letter.pdf) · [Source](src/main/java/com/demcha/examples/templates/coverletter/CoverLetterFileExample.java) | | [Module-first Profile](#module-first-profile) | Authoring directly against `DocumentSession.module(...).paragraph(...)` — DSL-direct, no template | [PDF](../assets/readme/examples/module-first-profile.pdf) · [Source](src/main/java/com/demcha/examples/flagships/ModuleFirstFileExample.java) | @@ -205,7 +205,7 @@ One CV rendered through the layered template surface: The preset is one final class with `create()` / `create(BrandTheme)` factories — copy-and-tweak rather than fork-a-monolith. -[📄 View PDF](../assets/readme/examples/cv-modern-professional.pdf) · +[📄 View PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) · [📜 Full source](src/main/java/com/demcha/examples/templates/cv/CvFileExample.java) ### CV — template gallery @@ -218,13 +218,13 @@ preset for your own CV product. Each preset is a one-liner factory | Variant | PDF | |---|---| -| Modern professional | [PDF](../assets/readme/examples/cv-modern-professional.pdf) | -| Nordic clean | [PDF](../assets/readme/examples/cv-nordic-clean.pdf) | -| Classic serif | [PDF](../assets/readme/examples/cv-classic-serif.pdf) | -| Compact mono | [PDF](../assets/readme/examples/cv-compact-mono.pdf) | -| Timeline minimal | [PDF](../assets/readme/examples/cv-timeline-minimal.pdf) | -| Engineering resume | [PDF](../assets/readme/examples/cv-engineering-resume.pdf) | -| Panel | [PDF](../assets/readme/examples/cv-panel.pdf) | +| Modern professional | [PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) | +| Nordic clean | [PDF](../assets/readme/examples/cv-nordic-clean-v2.pdf) | +| Classic serif | [PDF](../assets/readme/examples/cv-classic-serif-v2.pdf) | +| Compact mono | [PDF](../assets/readme/examples/cv-compact-mono-v2.pdf) | +| Timeline minimal | [PDF](../assets/readme/examples/cv-timeline-minimal-v2.pdf) | +| Engineering resume | [PDF](../assets/readme/examples/cv-engineering-resume-v2.pdf) | +| Panel | [PDF](../assets/readme/examples/cv-panel-v2.pdf) | | Executive · BoxedSections · CenteredHeadline · BlueBanner · EditorialBlue · SidebarPortrait · MonogramSidebar · MintEditorial · MinimalUnderlined | run the gallery to render | [📜 Full source](src/main/java/com/demcha/examples/templates/cv/CvTemplateGalleryFileExample.java) diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index b31065cb1..d2276cc3c 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -43,6 +43,7 @@ import com.demcha.examples.features.title.BookTemplateExample; import com.demcha.examples.features.title.PoetryTitlePageExample; import com.demcha.examples.features.transforms.TransformsExample; +import com.demcha.examples.support.ExampleOutputPaths; import com.demcha.examples.flagships.BusinessReportExample; import com.demcha.examples.flagships.BusinessReportPptxExample; import com.demcha.examples.flagships.EngineDeckExample; @@ -58,6 +59,7 @@ import com.demcha.examples.flagships.MavenBannerPptxExample; import com.demcha.examples.flagships.ModuleFirstFileExample; import com.demcha.examples.flagships.TwinOutputExample; +import com.demcha.examples.templates.coverletter.CoverLetterFileExample; import com.demcha.examples.templates.coverletter.CvBlueBannerLetterV2Example; import com.demcha.examples.templates.coverletter.CvBoxedSectionsLetterV2Example; import com.demcha.examples.templates.coverletter.CvCenteredHeadlineLetterV2Example; @@ -82,6 +84,7 @@ import com.demcha.examples.templates.cv.v2.CvEngineeringResumeExample; import com.demcha.examples.templates.cv.v2.CvExecutiveExample; import com.demcha.examples.templates.cv.v2.CvMinimalUnderlinedExample; +import com.demcha.examples.templates.cv.v2.CvMintEditorialCustomExample; import com.demcha.examples.templates.cv.v2.CvMintEditorialExample; import com.demcha.examples.templates.cv.v2.CvModernV2Example; import com.demcha.examples.templates.cv.v2.CvMonogramSidebarExample; @@ -109,6 +112,11 @@ private GenerateAllExamples() { } public static void main(String[] args) throws Exception { + // The catalogue is a statement about the code, so it starts empty: an + // example renamed or deleted must not leave its old document behind for + // the showcase to publish and the guards to count. + ExampleOutputPaths.clean(); + // === Templates === // CV / Resume (v2 layered — 16 presets, one example per preset) System.out.println("Generated: " + CvBlueBannerExample.generate()); @@ -121,6 +129,8 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + CvExecutiveExample.generate()); System.out.println("Generated: " + CvMinimalUnderlinedExample.generate()); System.out.println("Generated: " + CvMintEditorialExample.generate()); + System.out.println("Generated: " + CvMintEditorialCustomExample.generate()); + System.out.println("Generated: " + CoverLetterFileExample.generate()); System.out.println("Generated: " + CvModernV2Example.generate()); System.out.println("Generated: " + CvMonogramSidebarExample.generate()); System.out.println("Generated: " + CvNordicCleanExample.generate()); diff --git a/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java b/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java index 4153e721f..c055ebe8d 100644 --- a/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java +++ b/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java @@ -1,15 +1,50 @@ package com.demcha.examples.support; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Comparator; +import java.util.stream.Stream; public final class ExampleOutputPaths { private ExampleOutputPaths() { } + /** The tree every example writes into. */ + public static Path root() { + return baseDirectory().resolve("target").resolve("generated-pdfs") + .toAbsolutePath().normalize(); + } + + /** + * Empties the output tree so what remains is exactly what this run produced. + * + *

The examples only write. Rename an example's output or delete the example and + * its old file stays behind, indistinguishable from a current one — the showcase + * then publishes a document nothing produces, and the guards that read the tree + * count it as evidence. Clearing first is what makes the tree a statement about the + * code rather than about the order in which commands were run.

+ * + * @return the emptied root + */ + public static Path clean() throws IOException { + Path root = root(); + if (Files.isDirectory(root)) { + try (Stream paths = Files.walk(root)) { + for (Path path : paths.sorted(Comparator.reverseOrder()).toList()) { + if (!path.equals(root)) { + Files.delete(path); + } + } + } + } + Files.createDirectories(root); + return root; + } + public static Path prepare(String fileName) throws Exception { - Path root = baseDirectory().resolve("target").resolve("generated-pdfs"); + Path root = root(); Files.createDirectories(root); return root.resolve(fileName).toAbsolutePath().normalize(); } @@ -26,7 +61,7 @@ public static Path prepare(String fileName) throws Exception { * @return absolute path under the categorised generated-pdfs tree */ public static Path prepare(String category, String fileName) throws Exception { - Path root = baseDirectory().resolve("target").resolve("generated-pdfs").resolve(category); + Path root = root().resolve(category); Files.createDirectories(root); return root.resolve(fileName).toAbsolutePath().normalize(); } 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 f67a35441..5e481dfde 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -59,8 +59,16 @@ record Entry(String title, String description, List tags, String codeUrl cv("cv-monogram-sidebar-v2", "CvMonogramSidebarExample", "Monogram Sidebar", "Sidebar with monogram badge, accent rule, and structured contact + skills column.", "sidebar", "monogram"); 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 theme)", "The Mint Editorial preset rendered through a hand-built BrandTheme, showing where a caller takes over the palette.", "editorial", "mint"); // ===== Templates / Cover Letter (v2 layered, paired 1:1 with CV) ===== + // Registered directly: letter() points at the layered preset examples under + // coverletter/v2, and this one sits a level up because it composes without a + // preset at all. + ENTRIES.put("cover-letter", entry("Cover Letter", + "One page composed straight in the canonical DSL — section presets carry the hierarchy, no template involved.", + withCategory("letter"), + EX_BASE + "/templates/coverletter/CoverLetterFileExample.java")); letter("cover-letter-modern-professional-v2", "CvModernProfessionalLetterV2Example", "Modern Professional letter", "Letter paired with the Modern Professional CV palette."); letter("cover-letter-nordic-clean-v2", "CvNordicCleanLetterV2Example", "Nordic Clean letter", "Letter paired with the Nordic Clean CV palette."); letter("cover-letter-classic-serif-v2", "CvClassicSerifLetterV2Example", "Classic Serif letter", "Letter with Times-style serif typography."); diff --git a/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java index a31ff462c..ad9b88879 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java @@ -196,14 +196,24 @@ private static void renderPreview(Path pdfPath, Path pngTarget) throws IOExcepti * {@code AccessDeniedException}. A missing tree is a no-op — the normal case on a * fresh checkout. */ + /** + * Empties a published subtree, directories included. + * + *

Deepest entry first, so a directory is empty by the time it is removed. A + * category or group that no longer produces anything should leave nothing behind + * — an empty folder is invisible to git but not to anyone reading the deployed + * site's tree, and it makes the published surface a record of what used to be + * generated rather than of what is. + */ private static void deletePublishedFiles(Path root) throws IOException { if (!Files.exists(root)) { return; } try (Stream walk = Files.walk(root)) { - List files = walk.filter(Files::isRegularFile).toList(); - for (Path file : files) { - Files.delete(file); + for (Path path : walk.sorted(Comparator.reverseOrder()).toList()) { + if (!path.equals(root)) { + Files.delete(path); + } } } } diff --git a/examples/src/test/java/com/demcha/examples/GeneratedCatalogue.java b/examples/src/test/java/com/demcha/examples/GeneratedCatalogue.java index 447715788..c56ed688b 100644 --- a/examples/src/test/java/com/demcha/examples/GeneratedCatalogue.java +++ b/examples/src/test/java/com/demcha/examples/GeneratedCatalogue.java @@ -1,10 +1,6 @@ package com.demcha.examples; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.Comparator; -import java.util.stream.Stream; /** * The generated example tree, produced once per JVM for whichever test asks first. @@ -13,13 +9,11 @@ * metadata that describes them — and running the whole catalogue twice would double the * cost of the examples job for nothing.

* - *

The tree is emptied before it is rebuilt. The runner only writes, so without that - * an artefact from an earlier build survives: delete an example and leave its showcase - * entry behind, run without {@code clean}, and the coverage guard matches the entry - * against yesterday's file and passes on a document the current code no longer writes. - * That is invisible to a negative test, because the negative test starts from a tree the - * runner just wrote. CI happens to be safe — it compiles clean first — which only means - * the local run is the lenient one, and the local run is where the guard is read.

+ *

The emptying belongs to {@link GenerateAllExamples} rather than to this class. The + * release script and CI run the runner directly, so a clean step that lived only here + * would leave those two paths behind — and the failure it prevents, a document surviving + * an example that no longer writes it, is exactly the kind that shows up in what gets + * published rather than in what gets tested.

* *

Public because the metadata guard sits in the {@code support} package, beside the * package-private register it reads. Test scope only — nothing here is published.

@@ -42,32 +36,13 @@ public static synchronized Path generateOnce() throws Exception { } /** - * Empties the tree and runs the whole catalogue into it. The path {@link #generateOnce} - * takes, exposed so the guard covering the emptying can drive it from a known state - * instead of depending on which test class happened to run first. + * Runs the catalogue, which empties the tree before writing it. Exposed so the guard + * covering the emptying can drive it from a known state instead of depending on + * which test class happened to run first. */ static synchronized Path regenerate() throws Exception { - clear(ROOT); - Files.createDirectories(ROOT); GenerateAllExamples.main(new String[0]); generated = true; return ROOT; } - - /** - * Deletes everything under {@code root}, deepest entry first so a directory is empty - * by the time it is removed. {@code root} itself stays. - */ - private static void clear(Path root) throws IOException { - if (!Files.isDirectory(root)) { - return; - } - try (Stream paths = Files.walk(root)) { - for (Path path : paths.sorted(Comparator.reverseOrder()).toList()) { - if (!path.equals(root)) { - Files.delete(path); - } - } - } - } } From f3449167be5eaca2907e01e24a2205e09b37986d Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Sat, 1 Aug 2026 21:02:54 +0100 Subject: [PATCH 2/2] fix(examples): refuse to publish a half-built catalogue, and survive Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clearing the tree before generation moved the risk somewhere else. A run that dies partway now leaves exactly what it managed to write, and the sync's only defence was "not empty" — so it would mirror the remains, delete every published document the run never reached, and rewrite the manifest to match. The site would come out internally consistent and quietly missing half its examples. It refuses now, against the register: that is the one list saying what the catalogue is meant to contain, and deleting an example still shrinks it legitimately because the entry goes with it. Removing the published directories failed on Windows with AccessDeniedException on web/showcase/pdf/templates/schedule — the exact failure the comment I replaced had recorded, and CI could not see it because CI is Linux. Files are still removed strictly; a directory the filesystem will not release is logged and left, because an empty folder nobody can reach through the manifest is not worth failing a publish for. The clean now names the file it could not delete and says a viewer is usually holding it, instead of surfacing a bare AccessDeniedException from a run that has produced nothing yet. The custom Mint Editorial card said the example builds a BrandTheme. It sets one Options field; BrandTheme is a different overload on the same preset, so the description pointed at the wrong one of two adjacent APIs. Two gallery rows linked a preview produced by one example and credited another as its source. --- examples/README.md | 8 +- .../examples/support/ExampleOutputPaths.java | 22 +++++- .../examples/support/ShowcaseMetadata.java | 2 +- .../demcha/examples/support/ShowcaseSync.java | 73 +++++++++++++++---- 4 files changed, 88 insertions(+), 17 deletions(-) diff --git a/examples/README.md b/examples/README.md index 41f9e75b7..94d3dde57 100644 --- a/examples/README.md +++ b/examples/README.md @@ -56,7 +56,7 @@ are with the canonical DSL, then jump to its detailed section below. | Example | What it shows | Preview · Source | |---|---|---| -| [CV — single template](#cv-single-template) | One CV via `ModernProfessional.create()` on a `CvDocument` | [PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) · [Source](src/main/java/com/demcha/examples/templates/cv/CvFileExample.java) | +| [CV — single template](#cv-single-template) | One CV via `ModernProfessional.create()` on a `CvDocument` | [PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) · [Source](src/main/java/com/demcha/examples/templates/cv/v2/CvModernV2Example.java) | | [Invoice — cinematic V2](#invoice-cinematic-v2) | `ModernInvoice + BrandTheme.invoiceModern()` — the recommended invoice path | [PDF](../assets/readme/examples/invoice-cinematic.pdf) · [Source](src/main/java/com/demcha/examples/templates/invoice/InvoiceCinematicFileExample.java) | | [Cover Letter](#cover-letter) | One-page cover letter composed in the canonical DSL, section presets carrying the hierarchy | [PDF](../assets/readme/examples/cover-letter.pdf) · [Source](src/main/java/com/demcha/examples/templates/coverletter/CoverLetterFileExample.java) | | [Module-first Profile](#module-first-profile) | Authoring directly against `DocumentSession.module(...).paragraph(...)` — DSL-direct, no template | [PDF](../assets/readme/examples/module-first-profile.pdf) · [Source](src/main/java/com/demcha/examples/flagships/ModuleFirstFileExample.java) | @@ -206,7 +206,7 @@ The preset is one final class with `create()` / `create(BrandTheme)` factories — copy-and-tweak rather than fork-a-monolith. [📄 View PDF](../assets/readme/examples/cv-modern-professional-v2.pdf) · -[📜 Full source](src/main/java/com/demcha/examples/templates/cv/CvFileExample.java) +[📜 Full source](src/main/java/com/demcha/examples/templates/cv/v2/CvModernV2Example.java) ### CV — template gallery @@ -227,6 +227,10 @@ preset for your own CV product. Each preset is a one-liner factory | Panel | [PDF](../assets/readme/examples/cv-panel-v2.pdf) | | Executive · BoxedSections · CenteredHeadline · BlueBanner · EditorialBlue · SidebarPortrait · MonogramSidebar · MintEditorial · MinimalUnderlined | run the gallery to render | +The previews above come from the per-preset examples under +[`templates/cv/v2/`](src/main/java/com/demcha/examples/templates/cv/v2), which the +catalogue runner generates. The gallery below renders every preset from one entry point +instead, and is not part of that run — use it to produce the whole set locally: [📜 Full source](src/main/java/com/demcha/examples/templates/cv/CvTemplateGalleryFileExample.java) ### Cover letter — template gallery diff --git a/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java b/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java index c055ebe8d..2d022c559 100644 --- a/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java +++ b/examples/src/main/java/com/demcha/examples/support/ExampleOutputPaths.java @@ -1,6 +1,7 @@ package com.demcha.examples.support; import java.io.IOException; +import java.nio.file.AccessDeniedException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -34,7 +35,7 @@ public static Path clean() throws IOException { try (Stream paths = Files.walk(root)) { for (Path path : paths.sorted(Comparator.reverseOrder()).toList()) { if (!path.equals(root)) { - Files.delete(path); + delete(path); } } } @@ -43,6 +44,25 @@ public static Path clean() throws IOException { return root; } + /** + * Deletes one entry, translating the failure a reader can actually act on. + * + *

A document held open in a viewer is the way this fails on Windows, and it is + * common enough that the runbook lists it. The raw {@code AccessDeniedException} + * arrives with a path and nothing else, at the very start of a run that has produced + * nothing yet, which reads like the generator is broken rather than like a window + * needs closing.

+ */ + private static void delete(Path path) throws IOException { + try { + Files.delete(path); + } catch (AccessDeniedException blocked) { + throw new IOException("Cannot clear " + path + " before regenerating the examples." + + " Something is holding the file open — a PDF viewer is the usual answer on" + + " Windows. Close it and run again.", blocked); + } + } + public static Path prepare(String fileName) throws Exception { Path root = root(); Files.createDirectories(root); 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 5e481dfde..452312841 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -59,7 +59,7 @@ record Entry(String title, String description, List tags, String codeUrl cv("cv-monogram-sidebar-v2", "CvMonogramSidebarExample", "Monogram Sidebar", "Sidebar with monogram badge, accent rule, and structured contact + skills column.", "sidebar", "monogram"); 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 theme)", "The Mint Editorial preset rendered through a hand-built BrandTheme, showing where a caller takes over the palette.", "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"); // ===== 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/support/ShowcaseSync.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java index ad9b88879..60e541103 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseSync.java @@ -16,7 +16,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -89,6 +92,7 @@ public static void main(String[] args) throws Exception { + ". Run GenerateAllExamples first — refusing to clear the published" + " showcase and write an empty manifest."); } + requireCompleteCatalogue(pdfs, generatedPdfs); // The copy below replaces files but never removes them, so an example that was // renamed or deleted kept its artifact published on GitHub Pages indefinitely — @@ -189,21 +193,54 @@ private static void renderPreview(Path pdfPath, Path pngTarget) throws IOExcepti } /** - * Removes every published file under a subtree, leaving the directories in place. - * Only files matter: git tracks no empty directory, and the copy below recreates - * whatever it needs. Deleting the directories too is what makes this fragile on - * Windows, where a just-closed handle can still fail the parent's removal with - * {@code AccessDeniedException}. A missing tree is a no-op — the normal case on a - * fresh checkout. + * Refuses to publish a catalogue that is missing documents the register describes. + * + *

"Not empty" stopped being enough the moment generation began by clearing the + * tree. A run that dies partway now leaves exactly the documents written before the + * throw, and that passes an emptiness check — so the sync would mirror the remains, + * delete every published file the run never got to, and rewrite the manifest to + * match. The site ends up internally consistent and quietly missing half its + * examples, which is worse than an obvious failure.

+ * + *

The register is the yardstick because it is the one list that says what the + * catalogue is meant to contain. Deleting an example legitimately shrinks the + * catalogue, and that stays possible — the entry goes with it, which the coverage + * guard requires anyway.

*/ + private static void requireCompleteCatalogue(List pdfs, Path generatedPdfs) { + Set produced = pdfs.stream() + .map(pdf -> pdf.getFileName().toString()) + .map(name -> name.substring(0, name.length() - ".pdf".length())) + .collect(Collectors.toCollection(TreeSet::new)); + + Set missing = new TreeSet<>(ShowcaseMetadata.registeredEntries().keySet()); + missing.removeAll(produced); + if (!missing.isEmpty()) { + throw new IllegalStateException( + "The generated catalogue is missing " + missing.size() + " document(s) the" + + " showcase register describes: " + missing + ". Generation starts by" + + " emptying " + generatedPdfs + ", so a run that failed partway leaves" + + " exactly what it managed to write. Re-run GenerateAllExamples and let it" + + " finish — publishing now would delete the missing documents from the site" + + " and rewrite the manifest without them. If an example was removed on" + + " purpose, remove its register entry too."); + } + } + /** - * Empties a published subtree, directories included. + * Empties a published subtree. A missing tree is a no-op — the normal case on a + * fresh checkout. * - *

Deepest entry first, so a directory is empty by the time it is removed. A - * category or group that no longer produces anything should leave nothing behind - * — an empty folder is invisible to git but not to anyone reading the deployed - * site's tree, and it makes the published surface a record of what used to be - * generated rather than of what is. + *

Every file goes, and a failure there stops the sync: a published file that + * survives is a document the site still serves and the manifest no longer lists.

+ * + *

Directories are removed too, deepest first, but only where the filesystem + * allows. On Windows a just-closed handle can still fail the parent's removal with + * {@code AccessDeniedException} — observed here on + * {@code web/showcase/pdf/templates/schedule} — and an empty folder left behind is + * a cosmetic blemish on the deployed tree, invisible to git and to every reader who + * arrives through the manifest. Failing the whole publish over one would trade a + * real problem for a tidiness preference.

*/ private static void deletePublishedFiles(Path root) throws IOException { if (!Files.exists(root)) { @@ -211,7 +248,17 @@ private static void deletePublishedFiles(Path root) throws IOException { } try (Stream walk = Files.walk(root)) { for (Path path : walk.sorted(Comparator.reverseOrder()).toList()) { - if (!path.equals(root)) { + if (path.equals(root)) { + continue; + } + if (Files.isDirectory(path)) { + try { + Files.delete(path); + } catch (IOException locked) { + System.out.println("Left in place (the filesystem would not remove it): " + + path + " — " + locked.getClass().getSimpleName()); + } + } else { Files.delete(path); } }