From aed73a6ee5accf8bce723d5f58ab2a5ed772c3f3 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Mon, 31 Aug 2026 14:47:06 +0100 Subject: [PATCH] feat(templates): add the Teal Pulse clinical CV preset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A one-page clinical sheet in five bands: a heart crossed by a flat pulse beside a letter-spaced name; a contact strip divided by short rules; a two-column body carrying the competencies as dotted lines beside the summary and the roles under badged headings; a three-column closing band for the degree, the certifications and the facts; and a tracked line under a rule that ends in a small heart. It ports a published standalone template onto the existing CvDocument with no model change. Six berths reach their sections by title, including a tagline berth whose body is drawn and whose title is not. The preset sets its own page: the design was drawn on a raster whose proportion is not A4's and every length is a share of that grid, so a caller's page size and margin are overwritten. Both vertical rules are the left border of the column to their right, so they are the grid rather than lines beside it, and the main headings are laid over their own rule with the paper knocked out behind every letter — a row cannot nest in a row cell, and the rule's visible length still has to follow the words. Past one page it behaves unlike the other ported CV presets: the bands are stacked in the page flow, so a longer CV carries the closing band onto a second page rather than losing anything, while the body row is atomic and a body taller than a page raises AtomicNodeTooLargeException. A link is drawn as its own label with the address behind it, the one deliberate departure from the ported sheet: six of 121 nodes shift sideways and 7,724 of 1,987,720 pixels change, with nothing moving vertically. Guarded by a smoke test, an exact layout snapshot and a pixel-parity gate; the examples showcase gains `cv-teal-pulse-v2`. --- CHANGELOG.md | 30 + assets/readme/examples/cv-teal-pulse-v2.pdf | Bin 0 -> 41604 bytes .../demcha/examples/GenerateAllExamples.java | 2 + .../examples/support/ShowcaseMetadata.java | 1 + .../examples/support/TealPulseSampleData.java | 167 + .../templates/cv/v2/TealPulseExample.java | 51 + .../cv/presets/TealPulseFixtures.java | 166 + .../presets/TealPulseLayoutSnapshotTest.java | 32 + .../cv/presets/TealPulseSmokeTest.java | 265 ++ .../cv/presets/TealPulseVisualParityTest.java | 41 + .../cv-v2/teal_pulse_layout.json | 3647 +++++++++++++++++ .../cv-v2-layered/teal_pulse-page-0.png | Bin 0 -> 113663 bytes .../templates/cv/presets/TealPulse.java | 220 + .../templates/cv/presets/TealPulseBody.java | 239 ++ .../cv/presets/TealPulseClosing.java | 235 ++ .../templates/cv/presets/TealPulseIcons.java | 105 + .../cv/presets/TealPulseMasthead.java | 264 ++ .../templates/cv/presets/TealPulseStyles.java | 313 ++ .../cv/presets/TealPulseWidgets.java | 234 ++ .../cv/teal-pulse/icons/additional.svg | 1 + .../cv/teal-pulse/icons/brand-heart.svg | 1 + .../cv/teal-pulse/icons/brand-pulse.svg | 1 + .../cv/teal-pulse/icons/certifications.svg | 1 + .../cv/teal-pulse/icons/education.svg | 1 + .../templates/cv/teal-pulse/icons/email.svg | 1 + .../cv/teal-pulse/icons/experience.svg | 1 + .../templates/cv/teal-pulse/icons/heart.svg | 1 + .../cv/teal-pulse/icons/linkedin.svg | 1 + .../cv/teal-pulse/icons/location.svg | 1 + .../templates/cv/teal-pulse/icons/phone.svg | 1 + .../templates/cv/teal-pulse/icons/summary.svg | 1 + 31 files changed, 6024 insertions(+) create mode 100644 assets/readme/examples/cv-teal-pulse-v2.pdf create mode 100644 examples/src/main/java/com/demcha/examples/support/TealPulseSampleData.java create mode 100644 examples/src/main/java/com/demcha/examples/templates/cv/v2/TealPulseExample.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseFixtures.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseVisualParityTest.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json create mode 100644 qa/src/test/resources/visual-baselines/cv-v2-layered/teal_pulse-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulse.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseBody.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseClosing.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseIcons.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseMasthead.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseStyles.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/additional.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/brand-heart.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/brand-pulse.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/certifications.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/education.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/email.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/experience.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/heart.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/linkedin.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/location.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/phone.svg create mode 100644 templates/src/main/resources/templates/cv/teal-pulse/icons/summary.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index cef198cb3..f2e77d060 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,36 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **A clinical CV preset in five bands: `TealPulse`.** A one-page sheet whose mark is a + heart crossed by a flat pulse, beside a letter-spaced name over a contact strip + divided by short rules; then a two-column body carrying the competencies as dotted + lines beside the summary and the roles under badged headings; then a three-column + closing band for the degree, the certifications and the facts; and a tracked line + under a rule that ends in a small heart. Ships as `cv.presets.TealPulse` on the + existing `CvDocument` model with **no model change at all**, porting the rendered + layout of a published standalone template. **It sets its own page**, unlike every CV + preset before it: the design was drawn on a raster whose proportion is not A4's and + every length is a share of that grid, so a caller's page size and margin are + overwritten rather than followed. Six berths reach their sections by title, including + a tagline berth whose body is drawn and whose title is not — the title is how a + document names the berth. Both vertical rules are the left border of the column to + their right rather than lines placed beside them, so they are the grid: change a + weight and the rules follow. The main headings are laid over their own rule with the + paper knocked out behind every letter, because a row cannot nest in a row cell and the + rule's visible length still has to follow the words. **What happens past one page is + not what the other ported CV presets do:** the bands are stacked in the page flow, so + a CV with more roles than the design holds carries the closing band onto a second page + rather than losing anything, while the body row itself is atomic and a body taller + than a page raises `AtomicNodeTooLargeException`. As on `TerracottaRail`, a link is + drawn as its own label with the address behind it, which is the one deliberate + departure from the ported sheet — writing the URL out makes the strip's gaps depend on + how long a profile is called — measured at six of 121 nodes shifting sideways and + 7 724 of 1 987 720 pixels, with nothing moving vertically. Guarded by a smoke test + (including the empty document, the page override, the tagline's title staying off the + sheet, the link targets, a linked role and degree, the run onto a second page and the + refusal of a body taller than one), an exact layout snapshot and a pixel-parity gate; + the examples showcase gains `cv-teal-pulse-v2`. + - **An architect's two-column CV preset: `TerracottaRail`.** A one-page A4 sheet whose narrow column carries a serif monogram over a terracotta rule, the contact channels behind their marks, two bulleted lists and a block of closing facts, beside a wide diff --git a/assets/readme/examples/cv-teal-pulse-v2.pdf b/assets/readme/examples/cv-teal-pulse-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..73b531b291e77dde23269cd0801d7918a6466c34 GIT binary patch literal 41604 zcma&Ob97}}vpyW#M#r{o+qUg=Y}>YNqhs5))v-HCC;4*jdGEcy`@TKKcm9}T?6KFb zS+kycs%GuAYE2S(VNn_eT2?5Mr^DYnPz?C=_;!YtP~6;5bjt4bCirwh22KXnc4km? zswR%#E$nRZ>HhjPoxFjW$#;Club(SI@$y2M*c$&O#`6D&OPko5Iho@#FfcMOLD7j? zSUZ_G;?s#*8#tK=n;6*{oBSpB-O16!zy=n|Eo;mBy%KjM`M7db{|U|*f;i4!#%-j7 z_zwQ6{5n>gRb7#pp4zz4K^+3QQ#>;c=L*MYB*jE1>%*87&SKy!9n&p_M zL-<0>fN|JG3SdSUMa6w?G~fn-jVCK?(=dv!`c_QXU{=XdQ7I~cVXAImUEK_p^r~z1 z*->*7jjVwSeU*!WaHoUfo$vIn;P`x;N>beX22mbdAy**g%0Oy5q*)T{c9pz z5Me@lvQ~5c4RK~DLU|7C48jL<#nAe4!lS+IeP9;7_Oor|%#V=t0abE&Y}*O!%(jlO z`^m8N?Q`b>8>blF@Wll@*dQ4jrv!4m%jRI>VwA&5QGw8c6vOVpX?_q+eGCku93WPm zru|nKK&z9S!{suP$ z_*MY!fJm5#CZG$l@UzvA*xSyTxHYc}!Dlf()Q79W%lm#LQ}3W>Scm&_O2qXx^MuXO zo-xAy<4QE=6V&(PQgo=V_i2_W12T|ddkce}1h`(UcLUoT^_f&fTs)R^<`OoXSu%XD zPrMKI_=2V#Z}TDy8d~XljxGGDCMXV8Mw^6rbo*G}4slA3w+|62sWQr9aadeH^zrYP z&#sr!RC^kSx|5mDwwuH>^$d(u49UD)L@0c|7v(au89pB054$s$QN{VoSh;KOq!TLk|j(Y~3NBNAlsjG_c!zdK=!axn81%k|aq!88oo;TMEL4Y62 z#0gXJu2L66h2P-V($Kg|7s_zc26j8M$UtZ~SYqqc1~Cj4)RhgY$A0qL{R3I`;nzdg z!gIn4FYo)WhugC&VmZC6oUHAv?fq*zyq7ag+k2)ax8$0s+TRGjw$7f(d|&UJ-Vhsq zyDtWpZIDR~qi`y*V<2u5oc2=&hz!cl9#QNH?1z>IU_j@$276#ekk3F6*gyu-cYrX~ z=__aGgmnvO5mMrQuJd&y2|DGB3fK|IEO%fx`D-Gdk_vT#hHWxq1UWTZ1PYFz=%ojt z0nMV6NCHWzb((-K=_7Nw!p=n@DL^P-3wxuggn=+zie|(!PNQLU0A_*)kwhQ6PY47v z!}W8=dIue9kQ0UyaeW_VT85wvBw`Z~naQLqCb()zg*s!@pj-_L^{>M#60eG-3@Jug zV-_3_DzY{Pcs9g+5jviun#_rn+kZHGx7+?aez+~v%d%x4>*n_M^te0y)IZ+b|5^Fm z14w(#r^ZY}s;Y=JbqpoM^<9Jr6Mj^|D}$OLfwKs+q-WcJLa+e+rj~u3g*X6l_QMaO zGy41{nJMHmV4 zJA#X~`D}+&8nlA!Wsp2?Jh4B!5i*n-5_uV@9Pgz&0J3ZwBJ@1P5d9{Ofk&E1y@f;{ z?dJ3#ToC<06cewstC_NbVg<#!m4X3i*}V_FTwOpD(KyB}a347dwH;<145-{0eNc@7 zWQY;7QqdjdmX5;VsVHfCu?oehLqpiDZN@$&}43A8C^sbnx%h__KdFCzU zDEP3#`4{mE40ZoyMo_dSIwYi$;1U+x>185)aUjw~5grdK=)id+snxT#J3@CCUW54< zQWOIa2`=9XH~}%44PjPdD;UZ_dp{vJ%0s3gW`_5dB)W_?q|0Aqoke_+m9%<&*J*=@ zQnJdq+Y<&D4IX6H=kyrs4j8JU5lWL7Kc(v{OIB5SlrAh;NPJW)#^^@@w*ZrYInhG$ zgZk3UwV*=w44xc92vnVz2QV`V2pK~+z=Ab2*Ch?#XD6j5fUp(%_>s>;{ntD~=F#By zMI^AJE`0Q{-rct02kydjcj%jrcda>1?;j<>mD{)&vT?MMT@LZ>q(Vym_#2 z?b7saDz=e(ZT_|$(*i%Val*Ck^T_Y`YXW%g{StWWxe*-e+SN<*TB3`-I1ZX%H7~u& zy!0|AP~8U+0c-s^0f~SSUvtf38y|@uOyFGJUw7dfHS7)g<3!p|=(FLqjg<=6a(rte#DiFJmeyRiG zqKnI}(`6cbRNGL&Wo(A4)d4LTnVU}^K>2lm0@B4fW+CXq5iI1z=^;I!CXwD0`hHn; z#Dfy4j-e~ojJphS7oN0>GMC;YN75czji6)=8re_zmxgph8T?#~xK0MkLk^bbI#k05 zlS@kYbj{F}oUbeJR&dG};Aw${^LgvfJr+r?$`FXb_H+!^6vFnu-Z^}HLvrbYZhq;= z@MU9dw4>*4tF1lkj<2UT#D{|%2INp|#M`k%H$V?2>-1I(3RVjitJPRb8hpF-SG7#? zu^RER7ig=HqMBY3uNW{_TS%(1^xf5rfH{7EEUCYc)j!qzK>E>C=p$tQ=#}R~p#hz* zV-!CC_aG>z|GISO&7)^THTbC2ThS^QEzqu3qbK9DR5tn$`4JE4@NOD(-r7_FW2}fH z+VQG#STN*obpbE?`RZ1qXcBkS^G!vfLS_NA0%qo_T2#PCvL%uxLC;M=a=o$)RXs5GdrW!T1g9ZUsV6CwtCT&ACyD3T2Yg+rleU^b zUxs2JX>iG^kN*pGq&*7)yk|8D9diwDQAr$BX{qzu3G$kOw_nRsmg~6C33P=ZB71F_ z)d*@ffR*Ea)5P*@O>5B$b1CJUIeq5>j^@sfY3*CafMU%Vj8$#IDB|0gV7Feg2*q7u8*KG&#~6Dq`W`*o$F zh(q&Bf6Pf=2}rUoZV{{fYxE8nJn34$Ur8t5O6BEz$au!|)jie+9wp>a9-2BMTKJ`N zQL8*C7crQf$Cu8=$S7-M<$M;fhu$U;)XZ$uIMTvsUM?&b;yq!(X)}F8$Jma^cM?*_ z>9Wu6uPycqmNpj98>v3iuD&_HAFogFKx~ol6qT~w2zl7<_@)(<&5DI8Hxk2kb?wjP z6+CjhcY-tBo&mu?@_BpMCwL$}3`=^f&@Rc(0@F*_sezfzcer4RnB8Qkua(&Pbd5+S z4-zv+jH~XF2i%3T3t0efO07l|Sz<#|E|BlamyHwk3sOG3ii&d0YO$0ABy2wmSXWW8 zfF;{H*a@5|B*H+fPABKU!UZ^|xN0*PlElU}Q%5OB@T4?O`2^phuQTWrr<0z3ZcCxe z=5sIj7U~e2G$f!1&|L&6Pn(2>$&T@}OWJjqufHQJJCo)KffVKm4Y5jhf)+jl;v}n+ zj4h?$N);4?yG0oeIqo>Qio7ErkQ&%BMjT>_##rrO7IvJITTP716t^8_QWK$#Wt?4g zfKA!hVJ9gC<3PYyJ=Ku

LQjDSe`L$#lMnbCq5^>9S1#M%NllgMZR4z;>hi1mP+S zJmpbDX#jB}jk78-?OPWU`h_(9%ABaQj(sD)Ygu_jxI#ua zWMH^Ld>(DsaaWDGD6TXWR^h1(k=1&BbzW90t@`Ua+*6W1ZFq^|4}Af2kb4<9dK^;; z`iyZx=d|!$&UJ_qXj`;BxFO{}ddbjL=};XcnQv7ornEul<^x*jo3w+M6$S<6Nl$B& z*FOR@7@_;*t6hsS7ESf3$WN-EuMqZJhUoj0|0N1L^zF>MRTScDiOgS1L~t!Di3m|x zH)E=&N+W3`#)vH==vrQdx!_#4Uj}WBwC^xX)2A#pvNj!~6&8B@fUq}%et;TxKM&vv zYSUqnW=@{x&3tkHd&ME!x{8hN-2totX91ZaZ9)tx^ilH!tW0-#X8Adh7$#XFnreL^ z^|&c-Yj7?od33?FEvz2prvu)rQX>HW=dY5M^VmwQ+FE`h@^>v#|TpCA$<3= zxJ}j1Ohmc@*yT=rn=3ALWS>&o!3vzcnw*mf`eo*RcUvy{D{~=@v~4;;8>j;yN)$Lo zOj0fcSd^n!ayxrMS^^w)I`*Lmt(75PFn?K_`v|gNkOERzrk*7^g@vdshTZ4XH$}La zpGJuxdWMjR=}zAWKv(1u>`vGkz}o5jUs?-6zEkuXCBcoR{H2y~DfDMLu(km9^p9N^ zL|Zi&Wa(n3s442TVDov=q7){As=vJ3CKR@zG9au(aoL!@^YmXz55P@SvfPtUn-HbZ zH>vw^BFX~{lHlso;W}K|G|elBGC4L_l5UqlpCKGNEYr*>i@jOzeZ=T_zBu8OfrnGJ z9Puwwpzh%gErORv%_FiVx|<8}(3Ho_Ose{`B;7BAO6hI%pqsYRb@SY!Ejlfy&lkzuo$4+gDcYV%<2bm*U(aV{wK1Y@QsF6+}v1wn2tSxIm%HefC}*Kd|VzyEEVa8K4egKDB%njHD%?&0M{cHsY*9)m>=ZWxLXTwcZlQmk6kzdTQyi@nPMluDW^1&K6Q`V z@tNZnsDF#X$-x2Y*Jh{bvP34cj({&Y{WB}BRi*x7h%^OG{D~`iserjaC)vqwyZGt2*SZ!?H|WTEbU>)i8x z8ctSxVm!BCQ^ia`B-DqJ){7Snurz>$?V~(6v>78lVgsZ(v3WLnz1TBnrNEE}l}S;H zlR7?P52Dm1T{LW=Yi1|9>>c<-U(`Ktuv#id< zI$kt*54PPfYkLmQ&H~y=a|5gLp|BXM;IiDv-aO49uTN@7h`!{M-dTV;w9>Ok=gbDd ze9yuSaV7esVUD`Eke7zaKrQG>1u5Q0oE03|4`$MI6+z|($p$FT%d*(|)wURhOz8Kq zq0!`(?q8=-Vqdp*guG%GAbISRrciMd-jC<#WOul{-CmJ#1~MtVxj$r9x?Nv0&?onI z@aSfq-G!^|QpMtnmeFJJ(qrazVUnJPi<({L?+1 zpw2X5kQvUY**70#Vd@!ws!s6dYo z?hb2Yn_PIx_~k{(O0nO;I`FEpm&)QfbU@77@O_dno9ilFEWnNKn@dOY)g(SPfR4Echd)_TOH^bW9eL5Ld7QW==mf3H8qsM0=%jcLLQ?ti+GhdjUqd3 zg-7Kf-BP9tlZvK_Qyb1}-883d88FBU*MWKq?pix`a#0^UjWCO6Pcg1E48(GXdSORP`fCbW&&yndP#92w^!TmpJmt5w z&@YwO;vL??4vzpUE;JR62-{W3smzHgcz+00aV;*DH))0a%t>~Mc9XPGWolwcVp&dw?#C5 zN%>QG>#{lfT*WooUNTvgsg5P7aaqh2(y=3eGuah5#N$ziDoeY13C*6J`DcetZI6T^S ztdDnystX2bYDdk$U%6=c^%PgYR!zQ?@tS-?qhXTj{woFLXSMVGkV@K6SuCI4u;N;& zy#E4g|HuCYYxWB)NewNk9PNcAI2%x#wDZE^R-RKu%wt6abvnFw9cPSV6_3ka)!C3{ z-XCId8>oxri(KO_Db)9pU8d$%(Hrzy~VJy5Ms>$TzoOi)yO@Zvvw(dr|Zu1Hh8TwYUp}GL}-oxBwz-D2d z?9nzui_*jv)@_nz?Z0#^|7Ey|HU#+EQFhDsE{|GNS=w%^p}GLp{J6Ln%0e->_!U_y{l%Y02i(%)Fy+Pzujb_ouT=7N4t^#oNm-wVK;WCzEpaOTy;5G z698+bV;_srS{WK%qRl(%i1u6Y66?4|b5PIfYx|D9iaSu zpf1>DX^NM^+aegi`C%|*b#%v|%2dw~84X)f?a=s)sj4uojaS`uDZn+}hJw8^Ay%b= z6C%O>AYtth`+wX~PuSx4g0X?QmPVsO3dcD4{AE!{D{ltZ1{^J_gGD-}8oV1{=?GPF zU3eeHE58?0)z_}RB<4D1-(j0(J$__VRWfj={<};k%YFM?pD6RI#ERlt9DrIIKLXC- zHpVrz0QPaEjL?|w3Sq5!oSWakZ7K|tvJmR>irb>rz=g&)NwRH`tok2z4h|~O;?*lU z{{?X0>dS^w<^RTVl7MV#Y<+fo^jhZFIswqL!xQNMsY8#UEX0AQdZLqRDt;uMKinKH3k1oi6jS$i2_|-!>OP2(*5BN zG7db@J1evQ!-+4^?T#*=X5OvYE2kTm*NQ@((EMl2Ufwf!B?r3XpFUh~c{`z{t);PY zxmmm#UKL&nra4c0HNIx{#CNB@lbkOMKiZ^rV!aY5LvtrXZk?+99AVE&?*Yfk zzcHbUZ)kFGqJmEhsbz8T$Tg2QPtC~kS;vcga%1BdA`lEr+?o{yteRc6Zhpu4P=9@i z!7ECBSmMSr*Mt<!oK*44vAyPXFFVM8~D9A>q3@Bsk*?hJ#9;b@^1LWd9ed9qw-?$8*-Qi&48`c zFvku#zde%)$qU)bb_9|NT|;+&SGvT$SveD$c4Z>+;^d1qX2|cB-pMV--J$+{yKz{3 z<`iCAnn;>rQzplE-S};Q0rmW(5fTmgRK|6#FsDab+FnKO``8J5RE#07&3rPq$!b0D z!mItL@J$$v_Dw}LL{62zEONE!@uR-bK_=6@bl`l|x(ms0-KGr_G6ZW}#FxXMABh(9k+t_^vvDKZcjqj99_-8anZ(BJ*PhWx;wL> zUZ2m&YLgKb^0OW>!+hHzqz$LhB{^EqZp>~c2G*Mqx8|cREQGN~ZLGC87y29v*rQ=P zxaB!FxoIdC9qOX4PQ+a1{)qMEL`~^kZa7SSJ`he1IWX(=GOztS7!;G#KTBcgiz@W@mm$#CmPEYsJ=|ALwM>w$B=TZ+lya zpi(yUmE|gMmOR?g;TNxPBrWeez|THpm0UsXl65THu6Go&iyp2K&XbueT1mD zQ_M!moji$i(lx#xUKigjrUWhPBkFQX@wywT5Q1D0LMTEpU#;YEL_^qAdBlz0*o?S96LCl#~Xm!^;%*+6*_&=45C7;n~Jl73^v zh%X($R&vciK>?oXde2Suk`H>zNkk>c1E) z^L9J9NynvYy?OSV)BT4?i6_f?&j)^} zJ$lSczWpA*6XnNkE~r~2UZ&qylqlk89!zIM+o@WefSEJ1Sr+Ra87+ zS)VrBs1W1hXKyp23Ly0Tug6h>JS*2L>J-AAF|ItRIL8)W-4+*eDr0%+sLS+$2(tU9izvRrlQ=GQCZhjz)uMl0u5S16nb*D`opkfz*)p4?Zj9oV2;$QiPOrLA*QX`&j$?bBS< znCl#mZ?8!OiDb#8t_{qSi0^B{?S6F>Hsz*hFD>7}aM#lS-CM)V3P)#wh01o#Z)kZg zDfDqX35N4F&#Z=t3~eHRN8~`7Sk5c);}~By;n&*zT!m8SARpw+T3&c-#?2ybkW`q% zopPg&JJ9O_{{5nHU?RRwRCqsJGS756JsSmXQjOBPv5rtBdLRbVL+Qw=+4t^t!d?=$ z7eaovB@4YZcg~8=zYOhN(>n&zU;E1ex+$PdXXDoGl@m8mUmuI8tV1051QuFd{I28N zPt-wnEm7#h3WbAxHZ=E+vnL2EG{@-2(+}D$)Lo$k?-x)r(Vw?xJvNqVd~-i!Z^^Jd zeSD2NdaSLV*M?nsHde1%)jFp^N9cX<`4vTexk|^*!)j`!_sdIj;wj6+Oih#Fh_lF; zMqC8kvz|z&Y48mS#_YtbD5A`Fx37L0FWq6Y-{%|g zIQOx)lkd!fPzJFsD_ed^@ zi=eUkMk5uk43T*1(qahtONbi0L}Q(tM^F&y1xegLJC-7v5`{w*9V;XSHC%xj8vQ)8 z+TJ>;+2p81{^E9uPa!a!nxt#1#Ub6Q2SX6gZ0;hG;Gqiz^V=NN`HW5=6iAh9F zpRT9+uTLcq1nP$|8 z%1>5`K~GMPY&o#k^_c!n3Y4PEbx{lN4NT%d6DHXKtb@sTV9VZt^qs{cy}8nU7H{lh z-Sf|76*sG_o2ec1<{0pWw;9yzs@Auw90eFAF|^?#_yfsTZ_MF~^)!0?E1DrTLT^<^ zuW1zp4)W@S7Bnv~(=0jlCV!-yGBBdRz1228eHD+};AZMdh(h)HO*TC{!*4Jm7sXX}ELD5z7Q(6797SoT-HUZ)UXWzt5oNSGF0;CahqNO zQdmVUQ((U$=i&RWhp;w&%~agVme9H#tbSPo7$ChPs{j^Eb#foP*eseYJ0>)Yr``SQ zTco8US-+(!IE1vllb-?)RklehwQP@eMtr0(q>H|VZoo5I;hetRs0g7Elq!1_k3zKO ztW#ox5~<{ElCa?hf&lcGn{tQn>Okntyiy~u;V#$E%a_w&Tw=x6->|Dz9z>D(O1m@S zz7=?la`f=|o~`XJe4zDToI%h~EPNlQsMYIUhv?hlk|?RoTsZlrlSr(FBEk5p{#GZ! zxDWwH1ABuwz0l-dO|y)SqW$WFPz{oSht5EPQDxSUB5%DvpuccV0!(Iosy?HPv8kvj z%5V#$#{1r8_p3D0(QYe8;qq$C)~|prnSU{IG^X@e&ghmKH__%d)=-6d)dlhHUxq0kRabn60-uMGd9({W zmc4<1h!iJRFLbXb3&X>lhSSr%qON3w8Uify@~ds?Bj z*r0oQc2uvee_pTcsJ^^g8g)Fw9lKKDX}JQnjN6^t4xfCMyFhPyqx;F2wLtgg6g}aZ zE}E22nO=5qBgM6d=5tfm)2#|!u=5m9=F7v1e#UHXXXUW?GC(^l1R`Q?#JNPsodQbu zaPs=pcQ=U8p#_CkkCf)7n62r&9@+GvPncn4Kj)UXK9+y3-AAnV2%#XKCT+Q*P}u;^ zc6{nlZv*S_PR!7;aE~k16CLErBtuM8_~FIS370Ma+w%PwjLnxsbf#m<$6!7z<*y*6 zbg~xxVDk)c8ZypFF|2j3AKFL{zyp4B^zt_tuSrFwp>z1H63o{a`aCYH*Vq{L7}qo> z6>?weqV+n?QG(qCA85tNV~)B1YbCh!az)pm&Ov^>7#4cfL7Wa$LrP9Ct4Iw!6hEK< z;p^E>Jv)e}DE%pDG48Tug)7>_E1S114<+2ogCU@a227NAG_0ZAVgG3I=|tqAGLQ*uUC=|L*MlpT^+-x3TzNoxzN3EdQV{SSNnVau6RO_}Uwat`%Jhsl%cb0Z2y* zAN@Vw0uO&q0s#xvi1zM@h3OKFGHmjMgE42!_-#=W+5HJE>nHx*oH~xagOz+Qcv_T6 z@a}rqFC_-<#ZAu?64zE5#N*|d7!}l+?S&(xfnoUAby)j>hLt=546fUO(hJ3{>TTaX z7}mS2C6*QXhKKp@*Lts*ZXw-9m5IHBmub@E0z)Im{?H95i?NPaXggF8UD+Y2kw||+_pd(e|8Cp< zA9U&e5xO&$LG%d2*X|J?QNiOUqgR*1IUO%E)oyA-CSZbRR_Zb8Tj0L z8!$@zJg%P`7rMKOGM^jBYjR@G9D)qO6)V;l7NFeor9?|iECO#722X*_Sp+s7aAW&B8H>he3)Nbu@w|AxLzH_m-pcT zQ%VvZa&CsmqQ;yeiW*#V0n#ZIGZw)r2-@cm9+RK&^>z_!@%go|1NNTdrU^DmcT&Bd z`UY{Ir7u!P=tioJTm{K1tZs&=D0xp7Ko;P15g{U@+2^#6#qNqx43^avr>K2Ufap-|S=LPZde3991;8^!P`ap-lUqQ$v%Nk@V@K6pVIz5nz_PQ z9(m*bY*sr*%W3>^9LUoccV@=s>!dcp6yeDOV=&Ohtt*6JlaJGb*LZ|P0CaLz+P8gN z)7t$VeWJy^&9d7YUTvxh`@?fu*}rY!g^NGLuXMDNR2@Jt34qy;BoAcs>l2VQAb})s zH()n#3P^CC3Q9AevL99*Xcd4_J`cX5=p1{eFk^TO^E5>~Q^YU_31>usgKW4UQg9RC zCa@q3427d6YMGgQnIDe=3>2z8VT3?F&{zQm%DlP=gT2H+BY6p-xiO^_(0P=^m^fB1 z-Eh>4l)p9E*Z)?dLHe0`77zNt%X$*dv}G;|s8mHAxodRYz#7cmMv z_cqw3ja!QWIkIN5=m(_bmqs+)uG>Y4^I7Pa`6k}@* z0HxY4yZhHKzYj(PfahMFbgm{}!&(05MTXw42I4xU+R3gQemORsWQ)o}$8Bghgz`An z^{|=J;sS!FZ>>%4pr=0H4!(if{-p_PFAyL0^NbX<(Sob4x*Lc}&{a}5Ym)-g{PCJE zl5t$;b%*}~2p-WOoSr~DK^USCO2>(q904kqNCGK zE@e=HWqiVJ{I37*9`35XWUPDqqJpFYT|$IhIX@jEsrdU}U!WD-6P6cdX^wd#u7L$3 zWZol1pa*G$#1X?OeVg`%U@x;N#I>5;s&dBm^9(KA3E?$&t13yKOzFP{hsSJP`IDFa z@ahUP8}mQ$Qqo4m0X#i)VgX9Wzz4!>IJ%yLd92U=39r-KPKc*958sOvURqq|`38knR8bcz5tZV@ ztwZMTM}%o$ty=e6DxOZ6+de(kE&Dq@^;=9Xyf^zjI$xI&W4!BwUn_dvX>MabGh9C= z6-#obe$8p~(2-v~&XR=scyyNFI}*h1#Lj&WNAUMp&%bZ2xA3;^A8K??ugR$0Sx{lZ z`|+8>bcEo_=?gxJa)Y9=41$VZgyaV{3nbag*6YeIB@fZipiI>ZB@b*1h_ef24f)L5)gB-$-4&30MPg%ee?<58UQ|g53wT7uU`hpw-(hn@$K}>ER%FVi#~s z@l8gs3IO#{SL5|(!(>j6(tus@K5^$*(t^FQH;kv;&hXovzmlxQD0251wYG|Z%a2I#mMXreXD z1%CqYNI zk+jP=&x%}My6%|n`(YUdF_30-U|yt0%;&sK#_zZ6$wO(~rb?VyDM*cy*tC z@uk9q0SnxtqHWs-Kx+p#{sYErf2g3?|49M$Ul@atg3SXk0Yf9jqDnR*<|pDr&-jbc zkYx=G^}?FnBN#vf-2_PR(vQUw(*lr!N-#o$1Yrb8EHi!4;Rcit_!58;NCANR7r^PC zR`!R)#PE+ucNrrFC-~(Eysl?mzOLstJUAl_@<{khi2AWaZl-Xe5qx6t?kE%sZAN2} z?-}r5&Ri_YnN3;YHuo{g=zJcE-ZH=^F6O+3)SPqND$!{i*T)RV z=!#M@R5M#Zw^hZg)_hN{$DVL0FMJe=8^&i>&CGk;k^1`3PJ^2!1vt{(?GcY8wj>kFIo1W9}SFYE9U;t?5U_seJL_6@RJY}7d@rVFk>|TWNlwEo$ zAP7GxO5l|8?1Anfa!IvWxjB7?ozV}1KJm3#9Dlk2>08n5X$4h^A)Cn#*i}W`Fz#i? zN%`tiv4aC$rh^B|gXkw$Ath=HW~XY1bf_6qb;ju&f0|yIFkU=Q)~3TupBel%$>!75 zI~i>|L(mIn{|H(U2=W4GB_4MfqV)vzr@0e*1hyhm1Ba89$>s`Oc{~Ne-nA$IWEd|W z(x?-p7!@8qb4pUDZZKByDxvy;n)|c%akRn4$e#RSj<=O_ad?HdrPM2*bNbWP*2?PL zD!-D;X^&9q7h%VHsHOc=rLCS)>=e$!Tj1;caqspl7iUF1Ugik4Jb=C{Iouin$7x#( z=JcA&2h$sz9F1sdp&QYUdNk9pOn$5C24~R$jjrq))9m}h!~kcgWO-B7U!R)9hO%~( z&_iy~D4?S40o1d42GZoqx-31*2~o?tEM3swA6O=r)W&j0^5P@q+dlyH4s3oz(g8Yh z$)Q%7`<%9qOP(77m^%tGoZ`;mZ~;d3&87n+}&Z=SISW4<_Xlxt!nKC6UR* z#mZQQ3o703O5D3Kw)3L2zA`w~6)z6&mLe}~c_)eY*?@X?TD0#6)G8EBA$s5f{vKplzC+J7{&0<;^eI`R z012EtHN~auoG8OK;b*# z-BOQu%(#{*%CeK&u^d7=FuSOo41P{1_uq5<*ME`z`N}L5k=NC8$KP&N%wP zPgscG4^aefD56(D&KLj{RkyBn!h^2Ee!acpevIbSFQG<$ zN21MdC@2?!Hc0vvh_+E<_f!_yct8_Ccb_DQTDu*`y>QKT(1Zn>Y)PxWT^)vQIK+s7 zH4~=pp2C?RSrN11)&JLP*nxM7AB%oTT><$a77Qb(*0n<_MZ;vr&Gw`IjcDtSfZ<_r zVr9Jj!n0nF_aaxxULBwS9LNxFm`7COH#$6<10VMK>x`#br$De?mQ=3F5H8Ayq z2y2q%I~OdTP^xzdC~Kw&jv{L1rP?l1f^dm85&N|FZra5K!PQLHR2Jr3bK36g&n%)- zeS0N0!u0I8xM}Ntc1Qa)`ehT>I2ezv;NlWJuSAvF`r&Q%gTbjU#q0{zgjvU9C1=(^ zamI(uAnxdyF_qW*4%A@>IL#>}i&&kRH8Nal$9}<89O+fXie18@Oh^V@g6!@V-@jGE zmQq?;4KIDq-Y|DAka!w3SKIirQw)Xop(s z-o`LymtB5oeqq6~QA#zFQ1hE}@^%W;53bldic+sAVd2?^_^m20QeGh)30|`+g6JK% zeKv7c(`pwFtrb*!`d!B7QKe z?$iri?v~{@VD_uTl-J6!%*HE%a8EJH*dcF z@PMn( zkHF?yBdt}~cuFu+LgY!1mr|#ApPrB(9q3yVIf7vy82N`x^XQ2aYi2dRgLNyPge|56 zb)~29wVy06)>skmWPWc}P_}r#ThXeMF96Gs7xBdL7V%22i$9E}e?fQ~!cDTiZgbc- zu6Vk`sp2)zLAzz6>>|W=s^Zc_vW!$OKShc!ZB0w1R7KsQqHQBzV>jXIq8(6}eUe}% zIAS=Fz(p`0irS#gHaM?8smaX;NHcMIUjxmN?Lel*kOI8<|=^hKC|FK~B|n;c%F z4mDEkuB0+O7;uP8t|e@)aNFc00D6SK!9A61uJVG!q$7x{bsnnn8{G4usy&T(6o^fZ zq7bJMx9sDU(&NT$y=h~|J#kw^)k2Sbb6d9xcE>Q|!ygpwFyx*Paf3t$d^q5~y1$J| z1@5c@M!r}NOO6VQOw`M{w35AXiidqITpm~+pnn#IJO^p`VdSlo@-cLafgU<{lYjxE z0ijTy?9F|CR6Mu;Jq$^M$e$E_&u>V(D7SPO?v5Ss{N6e~Hr1mVWGu>jpD=J)a}36- zjZT*TH3Nj$Wc&L(42n$*%34V}&GWQLw_p}1Ixv(%UfayNSK2vQ00Mh3bx>yK5|DUF z{hukH~j ze`WGaR7?Cye!s|mXF?O2kQ5{hUTug4GmunOuRloDL}h{Z@_@IhE~xbVEtcKe{3;03 zEQ;&Rxbvn9UhQLx>&SX)ST-8=!+FpL^)-m1Sn3ez;!pC}H=@oTY2*}Tw#I~szsdJP zM?~X5E-xZv5RL(x;|K6{8?57_16SsqBiUtj0k_C_9P*5Lclq!B*bZFA|I&-RlmgmSFIesvm;0 zo(H!1VTfmUBdf27`rE`XzEFZp?K^@rmmRLg^Z-A*@>*EcYEN7Y`!#UviAliO6XpTG2ISWO z{Ti@e1Ndv4H!nj~9N+ghWbj&{94?@v4gww@kh~s0-*p>qgQuVXkmT6Cf0M9(SNY~( zUu)(P?fs46YH zmm4n|UKJ0REzTyPx)Xv?AntN45SU70f-WwNuIuWIMs;(jLCw!}gG#-uKr?+= zzlJ;S!R>*q`un8h7R_lT+VyX-2zcbccH@w<+R*BH4~->@V!z`~FUrk#07e$(J^(RF z3f|Gmo)PgL)?8l!N$e-Jp-1BaQ8oQ&|3AjgDMqv=?9y%9-KTBawr$%!ZQHhO+qP}v zv~6qpznWz7O=d3Mq*Ap~cRPDm?e(meJV-^qCzE<0d?yAF7<{KOPyQ0NaUd#)u+$Ia z(anf{1-?yFUnY8Pda}>0Y6Z=fS0hTiQdJ+50DoAaiTSv7MbMfU zqm;86B$auRMAn=p4aZwVU|Tv+DPcbhYqgj@tVCo{Y~aC6LOQZxXHw%U$ckn!&FbJA zl5ZstkX72%b^01^Hn@jEx-hktvgfP_kxoy?3j>XG0%&aq0@(2G!3Q8()=E92Q@EX7 z-kA?0oLvW*9rkwr2U;cT=SS)T;(e%h$ze~>bbJ#{ZhuWWExx2Tc+T!X5k`ETLFV2I ze;pr-OxU$fC_A?nK+F0o>l<{>v0isnO|W}~!8bn%Rs&l80r3tH#lRBM?J>pjAhLj%8x)M@kA+|X>KLC~l?{wZ2m#9Kj^Z<`52dS>woYb+nWkMZmWRK##f$@v9)fsS(g5kP`nxSc+p=ADmp5pX_0DQ7DxYg*7VbUMCh`M^Dr@P2sk2v0US zaXNIEnywX9!%c&JT@K~EjMAA^lCO1nG>rShE$42N!Z6A1PJ^&=jGiH#<7ETvczphj zFU9H|CoHA^vjEa06%PnHpbJI>)>>Z|TSQ;5LKq^^v>2xYy9XE4N8dzQEC|-87%r$6 zWx?knRm2R2wbc}@x^EaYY4Od6`Wqhfn)~PopH|%vsMHBBdC37U@4Q>^xa8&7*vZBI zbiV{{%A=d^MM;%rXVB<%y=Z~x?y(k?EgX~4@hqD=| z?&5bvkIBSHPwDh0Qd$Hv1g4u(iB<%vDh}9VrokhkZYxD-U2%B=WwH28eXmECEmDR}k%?%c@@ZZeF6QH# zG6w=06r-FaBl<{9wx`?u)<(Zn+WSH|-_RgZHfg2d8BVtm`i-TQ+iGzB?K|p~EX^}{ zDvT{=Pn3$@81%^S9E%hfV)_0kKToX`8Y$Me#AEg7HpXJ2g3+~2Fam;*jSFX9e)7%MY`Xpn7v z^^7wzj3H1M;xrQlZDBwkCi#$*PYG0xVOfeQYXrO!3_0B5R#|7o@A6;w`g9Iwwi9;} zbN^?hfUH8C62Nls$r-&AYCskJuQ65MHV$=?cmV`n4w;*<3XLCd=HSWRn5Bwjz`ku^ zVZ1cVZOg|)l(Rn$EvgW%aXvn__jUOY@7v_y-A;dcak9tlL)2GXBP~$}Z@1ofv=y$E zhWq=A3mn(tBYH+yM!LJ%JRd)wN!{7qNETlcWznom1-G>QVJP-x`>XK-{f)bAqzn_) zeK-VEw|x-KUT(lHCaumqp$n66tRWI~M=%zU*{k?g|qRtI= zsjJi(ty?o=YT*O8elpd9?3Qx1D%XR)lb_(kq4b}1h^Bzb2}a3C>0LoBe=;g_8onSf zq4`nMd0p7DC1&0zV@*x@`zbmNqn zy0wsMCP7&;f+qkHr5~>ZLrZ7uw2fwG|+v*Yw|?lf*8iJ3#(+*n@uv(9H+Pf3Fe?i3w^dS%naOc{`2jeEBIuDbMm ziU`T31B)W*u_Bgr_2BS55LqmFgnB>~P*b%4pvO$8rNkd;g;_ZAMrBG&9kF@iztJ(} z6BG>6f`KWNsH;6@v@8p`VGMz5C#?NyCwUF_e!|f9f1QBTrJuy<1pvLa02bpRdpI_Y zmxK-{ep5|OS3t~Q$j=n7)%P%(J;t-Cx@Nh5zCS{HT=VLWu5T_qe;A#A-6mM=C;R1& zOLl)+vNhOlm!40TZi3?C2M%Ze;o(3Bk5~mB#GMe7;p-3!hML|1X+@C+k}%l@L7D9} zf2_~w4VV>Vq+V)ndA}YrA2&{@923Nvt_P4)@4iBNx?6jS%zltcgFR~NyoCmHyp?Wb zj!+fJH|d|KJt>>^h2=*5^I5a|ff*yTf8u=LKV^U`;8&ReG~Y0YL0N&If=~bIU_RFuZ6tf>^&MwzNSoFq`Z+>c+GTTsC28%lNRwN>y%$4xD_cIb&zVIx`35 zd=S9(4ALGznjuXQ7)4}2B0hxQ^I;Zj!k-ycwJ>@nmZBvCp3*$FTSb}L%|Up28^7>1 z75ETn#5VYoeUFQOiNZ&}aG{*82szQuVa+)bcm|bq8@cQi;X&q8)cfgh63zyX?e<`N za&-S)2)`P`U6-KC=YIaoh8I4J>;B+U#@BW4AJ3`Ilnrb`pv8`-jCR0EUxb+p-m3x8 zMRJGYFttC6!L-Tje0RAtEQY_{PnOIP0Gk_U&oLCWreyk6w6JsZ*Of$Oer;gg+Bn6i)T7rV!Kv*K(IFi50#k{JEXg|}u=bLHiuMtvDD6_+f&{`a;T!q5UJ!C1hh zP#F3Ych1Sf@47B1@*57{55c?y9L6B%EG(4CNxNn9?AhEnLYp4QgY%(3;8+Rl-xd%( z{wYA2uQ}(kOMAIvXHQ4@(q-iVP-MoR`%+pu@2?dTaMgFN>2}8MQlqmBca}eB?}TJO zkIVhd@oq+aNhT==H;kYrG9o$dveh#Rro|(jofTj)G?^PU(`SyVov?9utgA6J@C@0l z*LA2HPL%z4INjgqq=DTq9LS;1K}YTr(nxWTR)>99&}+{fF8yK=#sS_CpBR8XO%Kn# z;EbZ`s<-P3xAlY&NcjKm>a;Iz*>PNu471;e$Dq98#Hp0LBspLxgh?S9_7}7?WB8n2 zu2DUO_D4hije=8JvH6;8_wgJ#q+4CQ{ltLmzFtr2U1-{?X;oR=3|DvVuaeF?_2TC1?qA8jsm?x|z3i}h(Q4;&r7MpvP&4Vjk_)s>xkdmN!h{oN zbf!WKjsJ+$ew2{pgcBd^_f$qstO>)FQuh>MfPrvDK+;|(S*^;oEE_wx-vBLWVMonITDIL$$f$@kroVR7=~!=VV(bm2cr?xfo#t+`n;02Bx;HBEU31!KN#L zeMNDu*~jhN+~01cpy#xE;TomKyRt1Wk_^>EL(t@pZBhq~i&}glh!kQ%eA$NLg-FyN z2UD74ophi^!S7$lFXhAr5X3i~BjRo@!!A@vT7xUZ3qC+i zG?112&IA(?m^GhQcjot1LSjv7qo3ABgt)I5h%c(ok2|r5g)K{jXw<%PHR{}^T_m&B zRbIv|{Y>`5YFo#xy3tr#S)P$E3H^1|&wVN0BUP)|0QMEoOm(fRQV?s#wBE0NP|=+j zD?qB7%PpX1K)mP5(FDbVq3YRpM@w6bu@pj)0`}<$;9JWbtPiA3MeL|7=x@>>P++%! zOPmY^r@8?A?V=6z2%@hXQOwBgGw8|YO@uq+=m*NK%Axu+R2aRSkJQVuTNaum8NH0j zM4=+-EieW%RNd5k4&%XMJQRS3)TyKa6Yon8LP2r2V@NR6&IgLFc4Ui-yPl=ijIpcA z?E5q)uCeS@;Hn7WKAoNXobeCaQ6lJ0)Y`$hsM2QCp;z^W zi6aY3)RsE3nfY2<>B{D!)_PYyFIM#rus@;9e0R4ESIXOiLpU!EX!Q^3D>(3dP_`z- z@!?*8!3rW5dP_{<852r%4AYv1;qIcp6qSd$!78#Xcel@Y_GH&dXb9I$y6ZPL&qfz} z)AibYxz3V~*3G4P7UKXV$_7kiO#O)fk#w0#lLiqriTVzGkrW1e2_yRCR9^=Na6rX* zBMM_$&`QG)79j9;6S=U`5cJH~LLcaqX|7If>&MhFfLR`2&Qu=X$df5v>8hh3UeZue zjhJdQFA2}}9DndT310{)Su}9Wb|y_nJs2y&@u?y#gTQY!pa3o zqt1o%rZ|dtWE;fJYO(~*YL2k@FavwLV2lnX%QpmyFaO_$m9tQ!7nDe@Hr(yD^eZWG zvGIr4o(C=^?8nKqjgoFQJxlYTxJECsc6Qrh&ib*WVyE`%BPnp`mq#R4s0!%uXyS_| zRKtDJ>sTSFmg#*LCtdF+x2OC4B&KGUV5O98^93XHMS3E3Bd{kwQlwpy#DTOlm-P74DGaa|gjP0ACX7&TUJ1@fc3?Am4r_;C z&`)&8+9$z@bj}%Riz>^OYg`O zwf20DmSVmom3W<=XE!>9(@huDrRSxDjhU;5i;^VsjNM+K3XQ)HKcVY z=|9K{wjr2Z^ArE**866#3$o|gHZ;;9)iyR#s-R{XSn~XIFREx*r<>XMwYRJUdj``0 z>2RzcxkQRtA<2XYC57!4#oSXeW1|2K4Q_ogG#nlg02mL&L!AdW&YdhtE9z*ITjPmG z#Z{uSJBhHm54P4`-4%22eD@B=!8uu5xo*tXT7**VHorIWL80NgTfSN*LpMlUeQ$!H z?Ubu{dhUa7!rky>cn6L7Yh)c#z4u{IIpk>oSV~H05{oE7#^=wp9fCl5U}453r*nZB zQ@{`#7W!w8s~YjeRV^3YvuZdr$}!%y9TyjptOtrWHDh^(1aun>eZ_HoJcvadGNy@3 zDaafM!_TO~jfkt)*Voav z(K+I&4$Y8KBuVToROOezD5oPb2cn7%hJ@|xZE@MbiF0Niv2kU8IMQ=mY;(||QWjeh zw9HIAPOxTRiWj?v_9vu+BTWbMol3;Iou5EIOIvcBN>&%@#wa#WpLq5pSUdEHMF;@N zDuX}&yw1z^z#)00DZ^XHmy2@K_QZ=|i)vQKpUMxhiEyEW&R5Ob;}UiP!C-!C3!#o4 z=$CF`yw6dqI~Zp-j}#>tR|Y&MJZJb_f9mJN=SQ+`6)5f|C#L^7 zuSwew^0jV)_$Gq#RN`5)py9A85ALFcKYiV5OqpLdqj{*

  • hhIGBS{5WRmBqggVG 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 J$f?QW{4d(SCF1}9 literal 0 HcmV?d00001 diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 398cd51e9..dbecd3306 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -80,6 +80,7 @@ import com.demcha.examples.templates.coverletter.CvSidebarPortraitLetterV2Example; import com.demcha.examples.templates.coverletter.CvTimelineMinimalLetterV2Example; import com.demcha.examples.templates.cv.v2.CharcoalGoldExample; +import com.demcha.examples.templates.cv.v2.TealPulseExample; import com.demcha.examples.templates.cv.v2.TerracottaRailExample; import com.demcha.examples.templates.cv.v2.CvBlueBannerExample; import com.demcha.examples.templates.cv.v2.CvBoxedV2Example; @@ -156,6 +157,7 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + SerifHeadlineExample.generate()); System.out.println("Generated: " + CharcoalGoldExample.generate()); System.out.println("Generated: " + TerracottaRailExample.generate()); + System.out.println("Generated: " + TealPulseExample.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/ShowcaseMetadata.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java index 9df177429..0d2b08574 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -65,6 +65,7 @@ record Entry(String title, String description, List tags, String codeUrl cv("cv-serif-headline-v2", "SerifHeadlineExample", "Serif Headline", "Volkhov masthead over a two-column body: roles on a timeline rail and marked project cards beside degrees and skill meters, closing with full-width certification and achievement bands.", "serif", "two-column"); cv("cv-charcoal-gold-v2", "CharcoalGoldExample", "Charcoal Gold", "Charcoal sidebar with a ringed photograph, rated skills and languages, beside a paper column with a two-tone name, a dated experience rail and paired credential columns.", "sidebar", "photo", "gold"); cv("cv-terracotta-rail-v2", "TerracottaRailExample", "Terracotta Rail", "Serif monogram over a terracotta rule, contact channels behind their marks and two bulleted lists, beside a letter-spaced masthead, roles on a ringed rail, a projects grid and the degrees.", "sidebar", "monogram", "terracotta"); + cv("cv-teal-pulse-v2", "TealPulseExample", "Teal Pulse", "Clinical sheet in five bands: a heart crossed by a pulse beside the name, a contact strip on rules, competencies beside the summary and roles, and a three-column closing band over a tracked tagline.", "clinical", "badges", "teal"); // ===== 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/TealPulseSampleData.java b/examples/src/main/java/com/demcha/examples/support/TealPulseSampleData.java new file mode 100644 index 000000000..1022015bd --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/TealPulseSampleData.java @@ -0,0 +1,167 @@ +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.CvEntry; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.CvName; +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.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.OptionalDouble; + +/** + * Shared sample data for the Teal Pulse CV example. + * + *

    The sample is the preset's reference content: a nurse's one-page CV with + * four contact channels including a link, twelve competencies, a summary, + * three roles with their highlights, a degree, four certifications, three + * facts and the closing tagline.

    + * + *

    Kept in lockstep with the qa module's {@code TealPulseFixtures} — the + * two modules cannot share a source file, so a content change here belongs + * there too.

    + */ +public final class TealPulseSampleData { + + /** The break an entry stacks its highlights on. */ + private static final String NEWLINE = String.valueOf((char) 10); + + /** The dash this sheet writes a date range with. */ + private static final String EN_DASH = String.valueOf((char) 0x2013); + + private TealPulseSampleData() { + } + + /** The single-page reference CV. */ + public static CvDocument sample() { + List placements = new ArrayList<>(); + placements.add(new CvDocument.Placement(Slot.SIDEBAR, competencies())); + placements.add(new CvDocument.Placement(Slot.MAIN, summary())); + placements.add(new CvDocument.Placement(Slot.MAIN, experience())); + placements.add(new CvDocument.Placement(Slot.FOOTER, education())); + placements.add(new CvDocument.Placement(Slot.FOOTER, certifications())); + placements.add(new CvDocument.Placement(Slot.FOOTER, facts())); + placements.add(new CvDocument.Placement(Slot.FOOTER, tagline())); + return new CvDocument(identity(), placements); + } + + private static CvIdentity identity() { + return new CvIdentity( + CvName.of("ISABELLA", "MOORE"), + "REGISTERED NURSE", + new Contact("+44 7700 900123", "isabella.moore@email.com", + "Manchester, United Kingdom"), + List.of(new Link("LinkedIn", "https://www.linkedin.com/in/isabellamoore-rn")), + Optional.empty()); + } + + private static SkillsSection competencies() { + List entries = new ArrayList<>(); + for (String name : new String[] { + "Patient Assessment", "Care Planning", "Medication Administration", + "Clinical Documentation", "Infection Prevention", "IV Therapy", + "Wound Care", "Patient Education", "Safeguarding", "Team Collaboration", + "Discharge Coordination", "Electronic Health Records"}) { + entries.add(new CvSkill(name, OptionalDouble.empty())); + } + return new SkillsSection("CORE COMPETENCIES", + List.of(new SkillGroup("CORE COMPETENCIES", entries))); + } + + private static ParagraphSection summary() { + return new ParagraphSection("PROFESSIONAL SUMMARY", + "Compassionate Registered Nurse with 7+ years of experience delivering " + + "high-quality patient care across acute medical, surgical, and " + + "community settings. Skilled in patient assessment, medication " + + "administration, multidisciplinary collaboration, discharge " + + "planning, and maintaining accurate clinical documentation. Known " + + "for calm decision-making, strong communication, and patient-centred " + + "care."); + } + + private static EntriesSection experience() { + return new EntriesSection("PROFESSIONAL EXPERIENCE", List.of( + CvEntry.builder("Senior Staff Nurse") + .subtitle("Manchester Royal Infirmary, Manchester, UK") + .date("2021" + EN_DASH + "Present") + .body(String.join(NEWLINE, + "Deliver direct nursing care for adult patients on a busy " + + "acute medical ward.", + "Coordinate care plans with doctors, therapists, and support " + + "staff to improve outcomes.", + "Supervise junior nurses and support student placements during " + + "clinical rotations.", + "Improved discharge coordination and patient communication " + + "across the ward.", + "Maintain precise documentation and ensure compliance with " + + "clinical standards.")) + .build(), + CvEntry.builder("Staff Nurse") + .subtitle("Salford General Hospital, Salford, UK") + .date("2018" + EN_DASH + "2021") + .body(String.join(NEWLINE, + "Provided nursing care across medical and surgical units.", + "Administered medications, monitored vital signs, and escalated " + + "deteriorating patients promptly.", + "Supported infection control procedures and safe discharge " + + "planning.", + "Built strong rapport with patients and families during " + + "treatment and recovery.")) + .build(), + CvEntry.builder("Community Nurse") + .subtitle("NorthCare Community Health, Greater Manchester, UK") + .date("2016" + EN_DASH + "2018") + .body(String.join(NEWLINE, + "Delivered home-based nursing care and patient education.", + "Managed wound care, medication support, and follow-up visits " + + "for vulnerable patients.", + "Worked closely with GPs, social services, and families to " + + "coordinate holistic care.")) + .build())); + } + + private static EntriesSection education() { + return new EntriesSection("EDUCATION", List.of( + CvEntry.builder("BSc (Hons) Adult Nursing") + .subtitle("University of Manchester") + .date("2013" + EN_DASH + "2016") + .build())); + } + + private static EntriesSection certifications() { + List entries = new ArrayList<>(); + for (String name : new String[] { + "NMC Registered Nurse", "Immediate Life Support (ILS)", + "Venepuncture and Cannulation Certification", "Safeguarding Adults Level 3"}) { + entries.add(CvEntry.builder(name).build()); + } + return new EntriesSection("CERTIFICATIONS", entries); + } + + private static EntriesSection facts() { + return new EntriesSection("ADDITIONAL INFORMATION", List.of( + CvEntry.builder("Languages:") + .body("English (Native), Polish (Conversational)") + .build(), + CvEntry.builder("Right to Work:").body("United Kingdom").build(), + CvEntry.builder("Availability:").body("1 month notice").build())); + } + + /** + * The closing line. Its title names the berth and is not drawn — only the + * body reaches the sheet. + */ + private static ParagraphSection tagline() { + return new ParagraphSection("TAGLINE", + "COMPASSIONATE CARE. CLINICAL EXCELLENCE. BETTER OUTCOMES."); + } +} diff --git a/examples/src/main/java/com/demcha/examples/templates/cv/v2/TealPulseExample.java b/examples/src/main/java/com/demcha/examples/templates/cv/v2/TealPulseExample.java new file mode 100644 index 000000000..35243ac00 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/cv/v2/TealPulseExample.java @@ -0,0 +1,51 @@ +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.TealPulse; +import com.demcha.examples.support.ExampleOutputPaths; +import com.demcha.examples.support.TealPulseSampleData; + +import java.nio.file.Path; + +/** + * Renders the layered {@code cv.v2} Teal Pulse preset against the nursing + * sample. + * + *

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

    + * + *

    The preset owns its page geometry — the design is drawn on a raster + * whose proportion is not A4's — so the session starts unconfigured.

    + */ +public final class TealPulseExample { + + private TealPulseExample() { + } + + /** + * @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-teal-pulse-v2.pdf"); + CvDocument doc = TealPulseSampleData.sample(); + DocumentTemplate template = TealPulse.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/TealPulseFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseFixtures.java new file mode 100644 index 000000000..d9138f809 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseFixtures.java @@ -0,0 +1,166 @@ +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.CvEntry; +import com.demcha.compose.document.templates.cv.data.CvIdentity; +import com.demcha.compose.document.templates.cv.data.CvName; +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.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.OptionalDouble; + +/** + * Shared fixture data for the {@link TealPulse} gates — the SAME document + * feeds the pixel parity test and the layout snapshot test, so a geometry + * shift the pixel budget absorbs still trips the exact snapshot, and vice + * versa. + */ +final class TealPulseFixtures { + + /** The break an entry stacks its highlights on. */ + private static final String NEWLINE = String.valueOf((char) 10); + + /** The dash this sheet writes a date range with. */ + private static final String EN_DASH = String.valueOf((char) 0x2013); + + private TealPulseFixtures() { + } + + /** + * The canonical one-page CV — the brand mark, four contact channels + * including a link, twelve competencies, a summary, three roles with their + * highlights, a degree, four certifications, three facts and the closing + * tagline. + */ + static CvDocument canonicalCv() { + List placements = new ArrayList<>(); + placements.add(new CvDocument.Placement(Slot.SIDEBAR, competencies())); + placements.add(new CvDocument.Placement(Slot.MAIN, summary())); + placements.add(new CvDocument.Placement(Slot.MAIN, experience())); + placements.add(new CvDocument.Placement(Slot.FOOTER, education())); + placements.add(new CvDocument.Placement(Slot.FOOTER, certifications())); + placements.add(new CvDocument.Placement(Slot.FOOTER, facts())); + placements.add(new CvDocument.Placement(Slot.FOOTER, tagline())); + return new CvDocument(identity(), placements); + } + + static CvIdentity identity() { + return new CvIdentity( + CvName.of("ISABELLA", "MOORE"), + "REGISTERED NURSE", + new Contact("+44 7700 900123", "isabella.moore@email.com", + "Manchester, United Kingdom"), + List.of(new Link("LinkedIn", "https://www.linkedin.com/in/isabellamoore-rn")), + Optional.empty()); + } + + static SkillsSection competencies() { + List entries = new ArrayList<>(); + for (String name : new String[] { + "Patient Assessment", "Care Planning", "Medication Administration", + "Clinical Documentation", "Infection Prevention", "IV Therapy", + "Wound Care", "Patient Education", "Safeguarding", "Team Collaboration", + "Discharge Coordination", "Electronic Health Records"}) { + entries.add(new CvSkill(name, OptionalDouble.empty())); + } + return new SkillsSection("CORE COMPETENCIES", + List.of(new SkillGroup("CORE COMPETENCIES", entries))); + } + + static ParagraphSection summary() { + return new ParagraphSection("PROFESSIONAL SUMMARY", + "Compassionate Registered Nurse with 7+ years of experience delivering " + + "high-quality patient care across acute medical, surgical, and " + + "community settings. Skilled in patient assessment, medication " + + "administration, multidisciplinary collaboration, discharge " + + "planning, and maintaining accurate clinical documentation. Known " + + "for calm decision-making, strong communication, and patient-centred " + + "care."); + } + + static EntriesSection experience() { + return new EntriesSection("PROFESSIONAL EXPERIENCE", List.of( + CvEntry.builder("Senior Staff Nurse") + .subtitle("Manchester Royal Infirmary, Manchester, UK") + .date("2021" + EN_DASH + "Present") + .body(String.join(NEWLINE, + "Deliver direct nursing care for adult patients on a busy " + + "acute medical ward.", + "Coordinate care plans with doctors, therapists, and support " + + "staff to improve outcomes.", + "Supervise junior nurses and support student placements during " + + "clinical rotations.", + "Improved discharge coordination and patient communication " + + "across the ward.", + "Maintain precise documentation and ensure compliance with " + + "clinical standards.")) + .build(), + CvEntry.builder("Staff Nurse") + .subtitle("Salford General Hospital, Salford, UK") + .date("2018" + EN_DASH + "2021") + .body(String.join(NEWLINE, + "Provided nursing care across medical and surgical units.", + "Administered medications, monitored vital signs, and escalated " + + "deteriorating patients promptly.", + "Supported infection control procedures and safe discharge " + + "planning.", + "Built strong rapport with patients and families during " + + "treatment and recovery.")) + .build(), + CvEntry.builder("Community Nurse") + .subtitle("NorthCare Community Health, Greater Manchester, UK") + .date("2016" + EN_DASH + "2018") + .body(String.join(NEWLINE, + "Delivered home-based nursing care and patient education.", + "Managed wound care, medication support, and follow-up visits " + + "for vulnerable patients.", + "Worked closely with GPs, social services, and families to " + + "coordinate holistic care.")) + .build())); + } + + static EntriesSection education() { + return new EntriesSection("EDUCATION", List.of( + CvEntry.builder("BSc (Hons) Adult Nursing") + .subtitle("University of Manchester") + .date("2013" + EN_DASH + "2016") + .build())); + } + + static EntriesSection certifications() { + List entries = new ArrayList<>(); + for (String name : new String[] { + "NMC Registered Nurse", "Immediate Life Support (ILS)", + "Venepuncture and Cannulation Certification", "Safeguarding Adults Level 3"}) { + entries.add(CvEntry.builder(name).build()); + } + return new EntriesSection("CERTIFICATIONS", entries); + } + + static EntriesSection facts() { + return new EntriesSection("ADDITIONAL INFORMATION", List.of( + CvEntry.builder("Languages:") + .body("English (Native), Polish (Conversational)") + .build(), + CvEntry.builder("Right to Work:").body("United Kingdom").build(), + CvEntry.builder("Availability:").body("1 month notice").build())); + } + + /** + * The closing line. Its title names the berth and is not drawn — only the + * body reaches the sheet. + */ + static ParagraphSection tagline() { + return new ParagraphSection("TAGLINE", + "COMPASSIONATE CARE. CLINICAL EXCELLENCE. BETTER OUTCOMES."); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseLayoutSnapshotTest.java new file mode 100644 index 000000000..2725dc099 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseLayoutSnapshotTest.java @@ -0,0 +1,32 @@ +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 TealPulse} — freezes the resolved + * geometry of the canonical one-page CV, which the pixel budget cannot see: a + * small column or spacing shift stays under the visual-diff budget but changes + * the snapshot. + * + *

    The preset owns its page geometry, so the session starts unconfigured.

    + * + *

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

    + */ +class TealPulseLayoutSnapshotTest { + + @Test + void canonicalCvMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + TealPulse.create().compose(session, TealPulseFixtures.canonicalCv()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "teal_pulse_layout", "cv-v2"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseSmokeTest.java new file mode 100644 index 000000000..99be8f790 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseSmokeTest.java @@ -0,0 +1,265 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.core.identity.Contact; +import com.demcha.compose.document.templates.cv.data.CvDocument; +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.CvName; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +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 java.util.Optional; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Smoke test for {@link TealPulse} — proves the preset renders a + * {@link CvDocument} end-to-end with its packaged marks, sets its own page + * over whatever the caller configured, draws only the tagline's body, and + * carries the channels and the titles as link annotations, which move no pixel + * and no layout node so neither gate would notice them going missing. + * + *

    It also pins what happens past one page, which is not what the other + * ported CV presets do: the bands flow, so a longer CV runs onto a second + * page, while the body row itself cannot be split.

    + */ +class TealPulseSmokeTest { + + 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()) { + TealPulse.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); + } + } + + /** + * The text with its spaces removed. The sheet's headings and its name are + * letter-spaced with real space characters, so what is being asserted is + * the wording, not the tracking. + */ + private static String compact(String text) { + return text.replaceAll("(?U)\\s", ""); + } + + private static List linkTargets(byte[] pdfBytes) throws Exception { + List targets = 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 uri) { + targets.add(uri.getURI()); + } + } + } + } + return targets; + } + + /** The canonical document with one section replaced. */ + private static CvDocument withSection(Slot slot, EntriesSection replacement, + String replacedTitle) { + List placements = new ArrayList<>(); + for (CvDocument.Placement placement : TealPulseFixtures.canonicalCv().placements()) { + if (placement.section().title().equals(replacedTitle)) { + placements.add(new CvDocument.Placement(slot, replacement)); + } else { + placements.add(placement); + } + } + return new CvDocument(TealPulseFixtures.identity(), placements); + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = TealPulse.create(); + assertThat(template.id()).isEqualTo(TealPulse.ID); + assertThat(template.displayName()).isEqualTo(TealPulse.DISPLAY_NAME); + } + + @Test + void rendersCanonicalCvWithPackagedMarks() throws Exception { + render(TealPulseFixtures.canonicalCv()); + } + + @Test + void canonicalRenderCarriesEveryBandsText() throws Exception { + String text = textOf(render(TealPulseFixtures.canonicalCv())); + assertThat(text) + .contains("isabella.moore@email.com") + .contains("Patient Assessment") + .contains("Compassionate Registered Nurse") + .contains("Manchester Royal Infirmary") + .contains("BSc (Hons) Adult Nursing") + .contains("NMC Registered Nurse") + .contains("Right to Work:"); + assertThat(compact(text)) + .contains("ISABELLAMOORE") + .contains("REGISTEREDNURSE") + .contains("PROFESSIONALEXPERIENCE") + .contains("COMPASSIONATECARE.CLINICALEXCELLENCE.BETTEROUTCOMES."); + } + + @Test + void theTaglineBerthDrawsItsBodyAndNotItsTitle() throws Exception { + // The title is how a document names the berth; only the line reaches + // the sheet, so a document is free to call the berth what it likes. + String text = compact(textOf(render(TealPulseFixtures.canonicalCv()))); + assertThat(text) + .contains("COMPASSIONATECARE.") + .doesNotContain("TAGLINE"); + } + + @Test + void thePresetSetsItsOwnPageOverTheCallersOwn() throws Exception { + // The sheet is a fixed composition on the design's own page, so a + // caller who configures A4 still gets the design's proportion. + try (DocumentSession session = GraphCompose.document() + .pageSize(DocumentPageSize.A4) + .margin(40f, 40f, 40f, 40f) + .create()) { + TealPulse.create().compose(session, TealPulseFixtures.canonicalCv()); + byte[] pdfBytes = session.toPdfBytes(); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + float height = document.getPage(0).getMediaBox().getHeight(); + assertThat(height).isCloseTo((float) TealPulseStyles.PAGE_HEIGHT, + org.assertj.core.data.Offset.offset(0.5f)); + assertThat(height).isNotCloseTo((float) DocumentPageSize.A4.height(), + org.assertj.core.data.Offset.offset(1.0f)); + } + } + } + + @Test + void contactChannelsAndLinksAreClickable() throws Exception { + List targets = linkTargets(render(TealPulseFixtures.canonicalCv())); + assertThat(targets) + .contains("mailto:isabella.moore@email.com") + .contains("tel:+447700900123") + .contains("https://www.linkedin.com/in/isabellamoore-rn"); + } + + @Test + void aLinkShowsItsLabelAndHidesItsAddress() throws Exception { + // The strip draws the label, so its gaps are the same whatever the + // profile behind it is called; the address is reachable, not written. + byte[] pdfBytes = render(TealPulseFixtures.canonicalCv()); + assertThat(textOf(pdfBytes)) + .contains("LinkedIn") + .doesNotContain("linkedin.com/in/isabellamoore-rn"); + assertThat(linkTargets(pdfBytes)) + .contains("https://www.linkedin.com/in/isabellamoore-rn"); + } + + @Test + void aRoleAndADegreeBecomeLinksWhenTheirEntryCarriesOne() throws Exception { + CvDocument linked = withSection(Slot.MAIN, + new EntriesSection("PROFESSIONAL EXPERIENCE", List.of( + CvEntry.builder("Senior Staff Nurse") + .subtitle("Manchester Royal Infirmary, Manchester, UK") + .date("2021") + .link("https://example.test/mri") + .body("Deliver direct nursing care.") + .build())), + "PROFESSIONAL EXPERIENCE"); + List placements = new ArrayList<>(); + for (CvDocument.Placement placement : linked.placements()) { + if (placement.section().title().equals("EDUCATION")) { + placements.add(new CvDocument.Placement(Slot.FOOTER, + new EntriesSection("EDUCATION", List.of( + CvEntry.builder("BSc (Hons) Adult Nursing") + .subtitle("University of Manchester") + .date("2013") + .link("https://example.test/manchester") + .build())))); + } else { + placements.add(placement); + } + } + + List targets = linkTargets( + render(new CvDocument(TealPulseFixtures.identity(), placements))); + assertThat(targets) + .contains("https://example.test/mri") + .contains("https://example.test/manchester"); + } + + @Test + void aDocumentWithNothingButAnIdentityStillRenders() throws Exception { + // Every berth empty: no badge, no heading, and nothing drawn but the + // mark, the name and the rules that frame them. + render(new CvDocument(TealPulseFixtures.identity(), List.of())); + } + + @Test + void anIdentityWithoutLinksDrawsTheThreeChannels() throws Exception { + CvIdentity noLinks = new CvIdentity(CvName.of("Ada", "Lovelace"), "Analyst", + new Contact("+44 20 7946 0000", "ada@example.test", "London, UK"), + List.of(), Optional.empty()); + + // A run that breaks at a space carries one annotation per piece, so it + // is the set of targets that is asserted, not the count. + byte[] pdfBytes = render(new CvDocument(noLinks, List.of())); + assertThat(Set.copyOf(linkTargets(pdfBytes))) + .containsExactlyInAnyOrder("mailto:ada@example.test", "tel:+442079460000"); + } + + @Test + void aLongerCvCarriesTheClosingBandOntoASecondPage() throws Exception { + // The bands are stacked in the page flow, so a CV with more roles than + // the design holds runs over rather than losing anything. + try (DocumentSession session = GraphCompose.document().create()) { + TealPulse.create().compose(session, withRoles(6)); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(2); + } + } + + @Test + void refusesABodyTallerThanOnePage() { + // What cannot flow is the body itself: its two columns are one row, + // and a row is atomic, so it raises rather than being cut in half. + assertThatThrownBy(() -> render(withRoles(14))) + .hasMessageContaining("BodyGrid"); + } + + /** The canonical CV with its experience replaced by {@code count} roles. */ + private static CvDocument withRoles(int count) { + List many = new ArrayList<>(); + for (int index = 0; index < count; index++) { + many.add(CvEntry.builder("Senior Staff Nurse " + index) + .subtitle("Manchester Royal Infirmary, Manchester, UK") + .date("2021") + .body("Deliver direct nursing care for adult patients on a busy ward.") + .build()); + } + return withSection(Slot.MAIN, + new EntriesSection("PROFESSIONAL EXPERIENCE", many), + "PROFESSIONAL EXPERIENCE"); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseVisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseVisualParityTest.java new file mode 100644 index 000000000..70dd5fd05 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TealPulseVisualParityTest.java @@ -0,0 +1,41 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.testing.visual.PdfVisualRegression; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +/** + * Pixel-diff visual parity gate for {@link TealPulse} — 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 TealPulseVisualParityTest { + + 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()) { + TealPulse.create().compose(document, TealPulseFixtures.canonicalCv()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("teal_pulse", pdfBytes); + } +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json new file mode 100644 index 000000000..5ec326d45 --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/cv-v2/teal_pulse_layout.json @@ -0,0 +1,3647 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.28, + "pageHeight" : 769.6, + "innerWidth" : 595.28, + "innerHeight" : 769.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "TealPulseCv[0]", + "entityName" : "TealPulseCv", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 0.0, + "computedY" : 2.0, + "placementX" : 0.0, + "placementY" : 2.0, + "placementWidth" : 595.28, + "placementHeight" : 767.601, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.28, + "contentHeight" : 767.601, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 18.35, + "right" : 28.604, + "bottom" : 7.556, + "left" : 28.604 + } + }, { + "path" : "TealPulseCv[0]/Masthead[0]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 676.575, + "placementX" : 28.604, + "placementY" : 676.575, + "placementWidth" : 538.073, + "placementHeight" : 74.676, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 74.676, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 9.175, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]", + "entityName" : "BrandMark", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.604, + "computedY" : 685.579, + "placementX" : 28.604, + "placementY" : 685.579, + "placementWidth" : 71.239, + "placementHeight" : 56.668, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 71.239, + "contentHeight" : 56.668, + "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" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/Icon_brandheart[0]", + "entityName" : "Icon_brandheart", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 675.363, + "placementX" : 28.604, + "placementY" : 675.363, + "placementWidth" : 71.239, + "placementHeight" : 77.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 71.239, + "contentHeight" : 77.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" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/Icon_brandheart[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/Icon_brandheart[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 675.363, + "placementX" : 28.604, + "placementY" : 675.363, + "placementWidth" : 71.239, + "placementHeight" : 77.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 71.239, + "contentHeight" : 77.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" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/Icon_brandheart[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/Icon_brandheart[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 28.604, + "computedY" : 675.363, + "placementX" : 28.604, + "placementY" : 675.363, + "placementWidth" : 77.1, + "placementHeight" : 77.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.1, + "contentHeight" : 77.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" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]/BrandPulse[1]", + "entityName" : "BrandPulse", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/Masthead[0]/BrandMark[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 17.81, + "computedY" : 688.278, + "placementX" : 17.81, + "placementY" : 688.278, + "placementWidth" : 92.827, + "placementHeight" : 44.255, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 92.827, + "contentHeight" : 44.255, + "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" : "TealPulseCv[0]/Masthead[0]/Identity[1]", + "entityName" : "Identity", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 120.891, + "computedY" : 676.575, + "placementX" : 120.891, + "placementY" : 676.575, + "placementWidth" : 340.363, + "placementHeight" : 74.676, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 340.363, + "contentHeight" : 74.676, + "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" : "TealPulseCv[0]/Masthead[0]/Identity[1]/DisplayName[0]", + "entityName" : "DisplayName", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]/Identity[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 120.891, + "computedY" : 695.951, + "placementX" : 120.891, + "placementY" : 695.951, + "placementWidth" : 340.363, + "placementHeight" : 55.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 340.363, + "contentHeight" : 55.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" : "TealPulseCv[0]/Masthead[0]/Identity[1]/ProfessionalTitle[1]", + "entityName" : "ProfessionalTitle", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/Masthead[0]/Identity[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 120.891, + "computedY" : 676.575, + "placementX" : 120.891, + "placementY" : 676.575, + "placementWidth" : 205.712, + "placementHeight" : 19.376, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.712, + "contentHeight" : 19.376, + "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" : "TealPulseCv[0]/ContactStrip[1]", + "entityName" : "ContactStrip", + "entityKind" : "RowNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 646.892, + "placementX" : 28.604, + "placementY" : 646.892, + "placementWidth" : 538.073, + "placementHeight" : 20.508, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 20.508, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 12.413, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ContactStrip[1]/Contact_0_location[0]", + "entityName" : "Contact_0_location", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.604, + "computedY" : 651.505, + "placementX" : 28.604, + "placementY" : 651.505, + "placementWidth" : 120.885, + "placementHeight" : 15.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 120.885, + "contentHeight" : 15.6, + "margin" : { + "top" : -4.318, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ContactStrip[1]/ContactSeparator_1[1]", + "entityName" : "ContactSeparator_1", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 178.536, + "computedY" : 646.892, + "placementX" : 178.536, + "placementY" : 646.892, + "placementWidth" : 1.0, + "placementHeight" : 20.508, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 20.508, + "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" : "TealPulseCv[0]/ContactStrip[1]/Contact_1_email[2]", + "entityName" : "Contact_1_email", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 208.584, + "computedY" : 651.205, + "placementX" : 208.584, + "placementY" : 651.205, + "placementWidth" : 111.22, + "placementHeight" : 16.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 111.22, + "contentHeight" : 16.2, + "margin" : { + "top" : -4.318, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ContactStrip[1]/ContactSeparator_2[3]", + "entityName" : "ContactSeparator_2", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 3, + "depth" : 3, + "layer" : 3, + "computedX" : 348.852, + "computedY" : 646.892, + "placementX" : 348.852, + "placementY" : 646.892, + "placementWidth" : 1.0, + "placementHeight" : 20.508, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 20.508, + "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" : "TealPulseCv[0]/ContactStrip[1]/Contact_2_phone[4]", + "entityName" : "Contact_2_phone", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 4, + "depth" : 3, + "layer" : 3, + "computedX" : 378.9, + "computedY" : 652.155, + "placementX" : 378.9, + "placementY" : 652.155, + "placementWidth" : 81.613, + "placementHeight" : 14.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 81.613, + "contentHeight" : 14.3, + "margin" : { + "top" : -4.318, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ContactStrip[1]/ContactSeparator_3[5]", + "entityName" : "ContactSeparator_3", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 5, + "depth" : 3, + "layer" : 3, + "computedX" : 489.561, + "computedY" : 646.892, + "placementX" : 489.561, + "placementY" : 646.892, + "placementWidth" : 1.0, + "placementHeight" : 20.508, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 20.508, + "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" : "TealPulseCv[0]/ContactStrip[1]/Contact_3_linkedin[6]", + "entityName" : "Contact_3_linkedin", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ContactStrip[1]", + "childIndex" : 6, + "depth" : 3, + "layer" : 3, + "computedX" : 519.608, + "computedY" : 652.505, + "placementX" : 519.608, + "placementY" : 652.505, + "placementWidth" : 47.068, + "placementHeight" : 13.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.068, + "contentHeight" : 13.6, + "margin" : { + "top" : -4.318, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/MastheadRule[2]", + "entityName" : "MastheadRule", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 633.13, + "placementX" : 28.604, + "placementY" : 633.13, + "placementWidth" : 538.073, + "placementHeight" : 1.349, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 1.349, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 15.651, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]", + "entityName" : "BodyGrid", + "entityKind" : "RowNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 177.009, + "placementX" : 28.604, + "placementY" : 177.009, + "placementWidth" : 538.073, + "placementHeight" : 440.47, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 440.47, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 16.191, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]", + "entityName" : "Sidebar", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.604, + "computedY" : 239.229, + "placementX" : 28.604, + "placementY" : 239.229, + "placementWidth" : 118.781, + "placementHeight" : 378.25, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 118.781, + "contentHeight" : 378.25, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 4.857, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetenciesDash[0]", + "entityName" : "CompetenciesDash", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 611.002, + "placementX" : 28.604, + "placementY" : 611.002, + "placementWidth" : 29.143, + "placementHeight" : 1.619, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.143, + "contentHeight" : 1.619, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.556, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetenciesHeading[1]", + "entityName" : "CompetenciesHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 590.967, + "placementX" : 28.604, + "placementY" : 590.967, + "placementWidth" : 110.685, + "placementHeight" : 12.48, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 110.685, + "contentHeight" : 12.48, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 18.889, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "entityName" : "CompetencyItems", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 267.832, + "placementX" : 28.604, + "placementY" : 267.832, + "placementWidth" : 118.781, + "placementHeight" : 304.245, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 118.781, + "contentHeight" : 304.245, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_PatientAssessment[0]", + "entityName" : "Competency_PatientAssessment", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 561.169, + "placementX" : 28.604, + "placementY" : 561.169, + "placementWidth" : 90.748, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 90.748, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_CarePlanning[1]", + "entityName" : "Competency_CarePlanning", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 534.502, + "placementX" : 28.604, + "placementY" : 534.502, + "placementWidth" : 67.823, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 67.823, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_MedicationAdministration[2]", + "entityName" : "Competency_MedicationAdministration", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 507.835, + "placementX" : 28.604, + "placementY" : 507.835, + "placementWidth" : 118.781, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 118.781, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_ClinicalDocumentation[3]", + "entityName" : "Competency_ClinicalDocumentation", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 481.168, + "placementX" : 28.604, + "placementY" : 481.168, + "placementWidth" : 105.828, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 105.828, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_InfectionPrevention[4]", + "entityName" : "Competency_InfectionPrevention", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 454.501, + "placementX" : 28.604, + "placementY" : 454.501, + "placementWidth" : 94.302, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 94.302, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_IVTherapy[5]", + "entityName" : "Competency_IVTherapy", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 427.834, + "placementX" : 28.604, + "placementY" : 427.834, + "placementWidth" : 56.433, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.433, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_WoundCare[6]", + "entityName" : "Competency_WoundCare", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 401.167, + "placementX" : 28.604, + "placementY" : 401.167, + "placementWidth" : 63.378, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 63.378, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_PatientEducation[7]", + "entityName" : "Competency_PatientEducation", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 374.5, + "placementX" : 28.604, + "placementY" : 374.5, + "placementWidth" : 83.385, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 83.385, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_Safeguarding[8]", + "entityName" : "Competency_Safeguarding", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 8, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 347.833, + "placementX" : 28.604, + "placementY" : 347.833, + "placementWidth" : 64.687, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 64.687, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_TeamCollaboration[9]", + "entityName" : "Competency_TeamCollaboration", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 9, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 321.166, + "placementX" : 28.604, + "placementY" : 321.166, + "placementWidth" : 90.82, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 90.82, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_DischargeCoordination[10]", + "entityName" : "Competency_DischargeCoordination", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 10, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 294.499, + "placementX" : 28.604, + "placementY" : 294.499, + "placementWidth" : 106.901, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 106.901, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]/Competency_ElectronicHealthRecords[11]", + "entityName" : "Competency_ElectronicHealthRecords", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetencyItems[2]", + "childIndex" : 11, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 267.832, + "placementX" : 28.604, + "placementY" : 267.832, + "placementWidth" : 116.145, + "placementHeight" : 10.908, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.145, + "contentHeight" : 10.908, + "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" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]/CompetenciesClosingRule[3]", + "entityName" : "CompetenciesClosingRule", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Sidebar[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 239.229, + "placementX" : 28.604, + "placementY" : 239.229, + "placementWidth" : 116.573, + "placementHeight" : 1.619, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.573, + "contentHeight" : 1.619, + "margin" : { + "top" : 26.985, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "entityName" : "Main", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 171.37, + "computedY" : 177.009, + "placementX" : 171.37, + "placementY" : 177.009, + "placementWidth" : 395.306, + "placementHeight" : 440.47, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 395.306, + "contentHeight" : 440.47, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 17.27 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]", + "entityName" : "SectionHeader_PROFESSIONALSUMMARY", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 586.177, + "placementX" : 188.641, + "placementY" : 586.177, + "placementWidth" : 378.036, + "placementHeight" : 31.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 378.036, + "contentHeight" : 31.302, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 10.794, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]", + "entityName" : "Badge_PROFESSIONALSUMMARY", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 586.177, + "placementX" : 188.641, + "placementY" : 586.177, + "placementWidth" : 31.302, + "placementHeight" : 31.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 31.302, + "contentHeight" : 31.302, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]/Icon_summary[0]", + "entityName" : "Icon_summary", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 194.292, + "computedY" : 591.828, + "placementX" : 194.292, + "placementY" : 591.828, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]/Icon_summary[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]/Icon_summary[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 194.292, + "computedY" : 591.828, + "placementX" : 194.292, + "placementY" : 591.828, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]/Icon_summary[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/Badge_PROFESSIONALSUMMARY[0]/Icon_summary[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 194.292, + "computedY" : 591.828, + "placementX" : 194.292, + "placementY" : 591.828, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/SectionHeaderRule_PROFESSIONALSUMMARY[1]", + "entityName" : "SectionHeaderRule_PROFESSIONALSUMMARY", + "entityKind" : "ShapeNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 229.118, + "computedY" : 601.153, + "placementX" : 229.118, + "placementY" : 601.153, + "placementWidth" : 337.559, + "placementHeight" : 1.349, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 337.559, + "contentHeight" : 1.349, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]/SectionHeading_PROFESSIONALSUMMARY[2]", + "entityName" : "SectionHeading_PROFESSIONALSUMMARY", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALSUMMARY[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 229.118, + "computedY" : 594.208, + "placementX" : 229.118, + "placementY" : 594.208, + "placementWidth" : 144.93, + "placementHeight" : 15.24, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 144.93, + "contentHeight" : 15.24, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SummaryText[1]", + "entityName" : "SummaryText", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 477.181, + "placementX" : 188.641, + "placementY" : 477.181, + "placementWidth" : 317.12, + "placementHeight" : 98.202, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 317.12, + "contentHeight" : 98.202, + "margin" : { + "top" : 0.0, + "right" : 56.668, + "bottom" : 15.651, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]", + "entityName" : "SectionHeader_PROFESSIONALEXPERIENCE", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 430.228, + "placementX" : 188.641, + "placementY" : 430.228, + "placementWidth" : 378.036, + "placementHeight" : 31.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 378.036, + "contentHeight" : 31.302, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.556, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]", + "entityName" : "Badge_PROFESSIONALEXPERIENCE", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 430.228, + "placementX" : 188.641, + "placementY" : 430.228, + "placementWidth" : 31.302, + "placementHeight" : 31.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 31.302, + "contentHeight" : 31.302, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]", + "entityName" : "Icon_experience", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 194.292, + "computedY" : 435.879, + "placementX" : 194.292, + "placementY" : 435.879, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 194.292, + "computedY" : 435.879, + "placementX" : 194.292, + "placementY" : 435.879, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 194.292, + "computedY" : 435.879, + "placementX" : 194.292, + "placementY" : 435.879, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/Badge_PROFESSIONALEXPERIENCE[0]/Icon_experience[0]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 194.292, + "computedY" : 435.879, + "placementX" : 194.292, + "placementY" : 435.879, + "placementWidth" : 20.0, + "placementHeight" : 20.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.0, + "contentHeight" : 20.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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/SectionHeaderRule_PROFESSIONALEXPERIENCE[1]", + "entityName" : "SectionHeaderRule_PROFESSIONALEXPERIENCE", + "entityKind" : "ShapeNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 229.118, + "computedY" : 445.204, + "placementX" : 229.118, + "placementY" : 445.204, + "placementWidth" : 337.559, + "placementHeight" : 1.349, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 337.559, + "contentHeight" : 1.349, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]/SectionHeading_PROFESSIONALEXPERIENCE[2]", + "entityName" : "SectionHeading_PROFESSIONALEXPERIENCE", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/SectionHeader_PROFESSIONALEXPERIENCE[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 229.118, + "computedY" : 438.259, + "placementX" : 229.118, + "placementY" : 438.259, + "placementWidth" : 160.457, + "placementHeight" : 15.24, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 160.457, + "contentHeight" : 15.24, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHeadline_0[3]", + "entityName" : "ExperienceHeadline_0", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 411.992, + "placementX" : 188.641, + "placementY" : 411.992, + "placementWidth" : 325.998, + "placementHeight" : 10.68, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 325.998, + "contentHeight" : 10.68, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.016, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "entityName" : "ExperienceHighlights_0", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 338.962, + "placementX" : 188.641, + "placementY" : 338.962, + "placementWidth" : 321.805, + "placementHeight" : 66.014, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 321.805, + "contentHeight" : 66.014, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 18.35, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]/Highlight_0_Deliverdirectnursingcareforadultpatientsonabusyacutemedicalward[0]", + "entityName" : "Highlight_0_Deliverdirectnursingcareforadultpatientsonabusyacutemedicalward", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 395.184, + "placementX" : 188.641, + "placementY" : 395.184, + "placementWidth" : 279.348, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 279.348, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]/Highlight_0_Coordinatecareplanswithdoctorstherapistsandsupportstafftoimproveoutcomes[1]", + "entityName" : "Highlight_0_Coordinatecareplanswithdoctorstherapistsandsupportstafftoimproveoutcomes", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 381.128, + "placementX" : 188.641, + "placementY" : 381.128, + "placementWidth" : 321.805, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 321.805, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]/Highlight_0_Supervisejuniornursesandsupportstudentplacementsduringclinicalrotations[2]", + "entityName" : "Highlight_0_Supervisejuniornursesandsupportstudentplacementsduringclinicalrotations", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 367.073, + "placementX" : 188.641, + "placementY" : 367.073, + "placementWidth" : 299.585, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 299.585, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]/Highlight_0_Improveddischargecoordinationandpatientcommunicationacrosstheward[3]", + "entityName" : "Highlight_0_Improveddischargecoordinationandpatientcommunicationacrosstheward", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 353.017, + "placementX" : 188.641, + "placementY" : 353.017, + "placementWidth" : 289.874, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 289.874, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]/Highlight_0_Maintainprecisedocumentationandensurecompliancewithclinicalstandards[4]", + "entityName" : "Highlight_0_Maintainprecisedocumentationandensurecompliancewithclinicalstandards", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_0[4]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 338.962, + "placementX" : 188.641, + "placementY" : 338.962, + "placementWidth" : 294.444, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 294.444, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHeadline_1[5]", + "entityName" : "ExperienceHeadline_1", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 309.932, + "placementX" : 188.641, + "placementY" : 309.932, + "placementWidth" : 256.133, + "placementHeight" : 10.68, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 256.133, + "contentHeight" : 10.68, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.016, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]", + "entityName" : "ExperienceHighlights_1", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 6, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 250.957, + "placementX" : 188.641, + "placementY" : 250.957, + "placementWidth" : 351.719, + "placementHeight" : 51.959, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 351.719, + "contentHeight" : 51.959, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 18.35, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]/Highlight_1_Providednursingcareacrossmedicalandsurgicalunits[0]", + "entityName" : "Highlight_1_Providednursingcareacrossmedicalandsurgicalunits", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 293.124, + "placementX" : 188.641, + "placementY" : 293.124, + "placementWidth" : 209.76, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.76, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]/Highlight_1_Administeredmedicationsmonitoredvitalsignsandescalateddeterioratingpatientspromptly[1]", + "entityName" : "Highlight_1_Administeredmedicationsmonitoredvitalsignsandescalateddeterioratingpatientspromptly", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 279.069, + "placementX" : 188.641, + "placementY" : 279.069, + "placementWidth" : 351.719, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 351.719, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]/Highlight_1_Supportedinfectioncontrolproceduresandsafedischargeplanning[2]", + "entityName" : "Highlight_1_Supportedinfectioncontrolproceduresandsafedischargeplanning", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 265.013, + "placementX" : 188.641, + "placementY" : 265.013, + "placementWidth" : 255.643, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.643, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]/Highlight_1_Builtstrongrapportwithpatientsandfamiliesduringtreatmentandrecovery[3]", + "entityName" : "Highlight_1_Builtstrongrapportwithpatientsandfamiliesduringtreatmentandrecovery", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_1[6]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 250.957, + "placementX" : 188.641, + "placementY" : 250.957, + "placementWidth" : 289.05, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 289.05, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHeadline_2[7]", + "entityName" : "ExperienceHeadline_2", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 7, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 221.928, + "placementX" : 188.641, + "placementY" : 221.928, + "placementWidth" : 357.282, + "placementHeight" : 10.68, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 357.282, + "contentHeight" : 10.68, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 7.016, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]", + "entityName" : "ExperienceHighlights_2", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]", + "childIndex" : 8, + "depth" : 4, + "layer" : 4, + "computedX" : 188.641, + "computedY" : 177.009, + "placementX" : 188.641, + "placementY" : 177.009, + "placementWidth" : 321.315, + "placementHeight" : 37.903, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 321.315, + "contentHeight" : 37.903, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]/Highlight_2_Deliveredhomebasednursingcareandpatienteducation[0]", + "entityName" : "Highlight_2_Deliveredhomebasednursingcareandpatienteducation", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 205.12, + "placementX" : 188.641, + "placementY" : 205.12, + "placementWidth" : 220.645, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 220.645, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]/Highlight_2_Managedwoundcaremedicationsupportandfollowupvisitsforvulnerablepatients[1]", + "entityName" : "Highlight_2_Managedwoundcaremedicationsupportandfollowupvisitsforvulnerablepatients", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 191.064, + "placementX" : 188.641, + "placementY" : 191.064, + "placementWidth" : 321.315, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 321.315, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]/Highlight_2_WorkedcloselywithGPssocialservicesandfamiliestocoordinateholisticcare[2]", + "entityName" : "Highlight_2_WorkedcloselywithGPssocialservicesandfamiliestocoordinateholisticcare", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/BodyGrid[3]/Main[1]/ExperienceHighlights_2[8]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 188.641, + "computedY" : 177.009, + "placementX" : 188.641, + "placementY" : 177.009, + "placementWidth" : 299.862, + "placementHeight" : 9.792, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 299.862, + "contentHeight" : 9.792, + "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" : "TealPulseCv[0]/ClosingBandRule[4]", + "entityName" : "ClosingBandRule", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 159.469, + "placementX" : 28.604, + "placementY" : 159.469, + "placementWidth" : 538.073, + "placementHeight" : 1.349, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 1.349, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 14.572, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]", + "entityName" : "ClosingBand", + "entityKind" : "RowNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 43.334, + "placementX" : 28.604, + "placementY" : 43.334, + "placementWidth" : 538.073, + "placementHeight" : 101.564, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 101.564, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.873, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]", + "entityName" : "EducationColumn", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.604, + "computedY" : 60.866, + "placementX" : 28.604, + "placementY" : 60.866, + "placementWidth" : 121.179, + "placementHeight" : 84.031, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 121.179, + "contentHeight" : 84.031, + "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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]", + "entityName" : "ColumnHeader_EDUCATION", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 117.373, + "placementX" : 28.604, + "placementY" : 117.373, + "placementWidth" : 121.179, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 121.179, + "contentHeight" : 27.524, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.873, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]", + "entityName" : "Badge_EDUCATION", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 28.604, + "computedY" : 117.373, + "placementX" : 28.604, + "placementY" : 117.373, + "placementWidth" : 27.524, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 27.524, + "contentHeight" : 27.524, + "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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]/Icon_education[0]", + "entityName" : "Icon_education", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 33.616, + "computedY" : 122.385, + "placementX" : 33.616, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]/Icon_education[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]/Icon_education[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 33.616, + "computedY" : 122.385, + "placementX" : 33.616, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]/Icon_education[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/Badge_EDUCATION[0]/Icon_education[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 33.616, + "computedY" : 122.385, + "placementX" : 33.616, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/ColumnHeadingStack_EDUCATION[1]", + "entityName" : "ColumnHeadingStack_EDUCATION", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 65.842, + "computedY" : 115.526, + "placementX" : 65.842, + "placementY" : 115.526, + "placementWidth" : 83.94, + "placementHeight" : 18.266, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 83.94, + "contentHeight" : 18.266, + "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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/ColumnHeadingStack_EDUCATION[1]/ColumnHeading_EDUCATION[0]", + "entityName" : "ColumnHeading_EDUCATION", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/ColumnHeadingStack_EDUCATION[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 65.842, + "computedY" : 122.272, + "placementX" : 65.842, + "placementY" : 122.272, + "placementWidth" : 51.84, + "placementHeight" : 11.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.84, + "contentHeight" : 11.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" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/ColumnHeadingStack_EDUCATION[1]/ColumnHeadingRule_EDUCATION[1]", + "entityName" : "ColumnHeadingRule_EDUCATION", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/ColumnHeader_EDUCATION[0]/ColumnHeadingStack_EDUCATION[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 65.842, + "computedY" : 115.526, + "placementX" : 65.842, + "placementY" : 115.526, + "placementWidth" : 83.94, + "placementHeight" : 1.619, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 83.94, + "contentHeight" : 1.619, + "margin" : { + "top" : 5.127, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/EducationDegree_0[1]", + "entityName" : "EducationDegree_0", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 92.84, + "placementX" : 28.604, + "placementY" : 92.84, + "placementWidth" : 118.804, + "placementHeight" : 12.66, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 118.804, + "contentHeight" : 12.66, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 5.667, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/EducationInstitution_0[2]", + "entityName" : "EducationInstitution_0", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 76.853, + "placementX" : 28.604, + "placementY" : 76.853, + "placementWidth" : 95.907, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.907, + "contentHeight" : 10.32, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 5.667, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]/EducationDates_0[3]", + "entityName" : "EducationDates_0", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/EducationColumn[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 28.604, + "computedY" : 60.866, + "placementX" : 28.604, + "placementY" : 60.866, + "placementWidth" : 44.892, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 44.892, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]", + "entityName" : "CertificationsColumn", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 171.37, + "computedY" : 43.334, + "placementX" : 171.37, + "placementY" : 43.334, + "placementWidth" : 198.167, + "placementHeight" : 101.564, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 198.167, + "contentHeight" : 101.564, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 19.429 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]", + "entityName" : "ColumnHeader_CERTIFICATIONS", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 190.799, + "computedY" : 117.373, + "placementX" : 190.799, + "placementY" : 117.373, + "placementWidth" : 162.316, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 162.316, + "contentHeight" : 27.524, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.873, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]", + "entityName" : "Badge_CERTIFICATIONS", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 190.799, + "computedY" : 117.373, + "placementX" : 190.799, + "placementY" : 117.373, + "placementWidth" : 27.524, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 27.524, + "contentHeight" : 27.524, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]", + "entityName" : "Icon_certifications", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 195.812, + "computedY" : 122.385, + "placementX" : 195.812, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 195.812, + "computedY" : 122.385, + "placementX" : 195.812, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 195.812, + "computedY" : 122.385, + "placementX" : 195.812, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/Badge_CERTIFICATIONS[0]/Icon_certifications[0]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 195.812, + "computedY" : 122.385, + "placementX" : 195.812, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/ColumnHeadingStack_CERTIFICATIONS[1]", + "entityName" : "ColumnHeadingStack_CERTIFICATIONS", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 228.038, + "computedY" : 115.526, + "placementX" : 228.038, + "placementY" : 115.526, + "placementWidth" : 125.077, + "placementHeight" : 18.266, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 125.077, + "contentHeight" : 18.266, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/ColumnHeadingStack_CERTIFICATIONS[1]/ColumnHeading_CERTIFICATIONS[0]", + "entityName" : "ColumnHeading_CERTIFICATIONS", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/ColumnHeadingStack_CERTIFICATIONS[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 228.038, + "computedY" : 122.272, + "placementX" : 228.038, + "placementY" : 122.272, + "placementWidth" : 77.117, + "placementHeight" : 11.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.117, + "contentHeight" : 11.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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/ColumnHeadingStack_CERTIFICATIONS[1]/ColumnHeadingRule_CERTIFICATIONS[1]", + "entityName" : "ColumnHeadingRule_CERTIFICATIONS", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/ColumnHeader_CERTIFICATIONS[0]/ColumnHeadingStack_CERTIFICATIONS[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 228.038, + "computedY" : 115.526, + "placementX" : 228.038, + "placementY" : 115.526, + "placementWidth" : 125.077, + "placementHeight" : 1.619, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 125.077, + "contentHeight" : 1.619, + "margin" : { + "top" : 5.127, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]", + "entityName" : "CertificationItems", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 190.799, + "computedY" : 43.334, + "placementX" : 190.799, + "placementY" : 43.334, + "placementWidth" : 178.738, + "placementHeight" : 62.166, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 178.738, + "contentHeight" : 62.166, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]/Certification_NMCRegisteredNurse[0]", + "entityName" : "Certification_NMCRegisteredNurse", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 190.799, + "computedY" : 95.18, + "placementX" : 190.799, + "placementY" : 95.18, + "placementWidth" : 99.825, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 99.825, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]/Certification_ImmediateLifeSupportILS[1]", + "entityName" : "Certification_ImmediateLifeSupportILS", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 190.799, + "computedY" : 77.898, + "placementX" : 190.799, + "placementY" : 77.898, + "placementWidth" : 118.882, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 118.882, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]/Certification_VenepunctureandCannulationCertification[2]", + "entityName" : "Certification_VenepunctureandCannulationCertification", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 190.799, + "computedY" : 60.616, + "placementX" : 190.799, + "placementY" : 60.616, + "placementWidth" : 178.738, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 178.738, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]/Certification_SafeguardingAdultsLevel3[3]", + "entityName" : "Certification_SafeguardingAdultsLevel3", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/CertificationsColumn[1]/CertificationItems[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 190.799, + "computedY" : 43.334, + "placementX" : 190.799, + "placementY" : 43.334, + "placementWidth" : 117.214, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 117.214, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]", + "entityName" : "AdditionalColumn", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 374.703, + "computedY" : 43.751, + "placementX" : 374.703, + "placementY" : 43.751, + "placementWidth" : 191.974, + "placementHeight" : 101.146, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 191.974, + "contentHeight" : 101.146, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 19.429 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]", + "entityName" : "ColumnHeader_ADDITIONALINFORMATION", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 394.132, + "computedY" : 117.373, + "placementX" : 394.132, + "placementY" : 117.373, + "placementWidth" : 172.545, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 172.545, + "contentHeight" : 27.524, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 11.873, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]", + "entityName" : "Badge_ADDITIONALINFORMATION", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 394.132, + "computedY" : 117.373, + "placementX" : 394.132, + "placementY" : 117.373, + "placementWidth" : 27.524, + "placementHeight" : 27.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 27.524, + "contentHeight" : 27.524, + "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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]", + "entityName" : "Icon_additional", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 399.144, + "computedY" : 122.385, + "placementX" : 399.144, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 399.144, + "computedY" : 122.385, + "placementX" : 399.144, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 399.144, + "computedY" : 122.385, + "placementX" : 399.144, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]/SvgIcon[0]/SvgLayer1[1]", + "entityName" : "SvgLayer1", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/Badge_ADDITIONALINFORMATION[0]/Icon_additional[0]/SvgIcon[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 399.144, + "computedY" : 122.385, + "placementX" : 399.144, + "placementY" : 122.385, + "placementWidth" : 17.5, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.5, + "contentHeight" : 17.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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/ColumnHeadingStack_ADDITIONALINFORMATION[1]", + "entityName" : "ColumnHeadingStack_ADDITIONALINFORMATION", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 431.37, + "computedY" : 115.526, + "placementX" : 431.37, + "placementY" : 115.526, + "placementWidth" : 135.306, + "placementHeight" : 18.266, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 135.306, + "contentHeight" : 18.266, + "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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/ColumnHeadingStack_ADDITIONALINFORMATION[1]/ColumnHeading_ADDITIONALINFORMATION[0]", + "entityName" : "ColumnHeading_ADDITIONALINFORMATION", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/ColumnHeadingStack_ADDITIONALINFORMATION[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 431.37, + "computedY" : 122.272, + "placementX" : 431.37, + "placementY" : 122.272, + "placementWidth" : 123.773, + "placementHeight" : 11.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.773, + "contentHeight" : 11.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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/ColumnHeadingStack_ADDITIONALINFORMATION[1]/ColumnHeadingRule_ADDITIONALINFORMATION[1]", + "entityName" : "ColumnHeadingRule_ADDITIONALINFORMATION", + "entityKind" : "LineNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/ColumnHeader_ADDITIONALINFORMATION[0]/ColumnHeadingStack_ADDITIONALINFORMATION[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 431.37, + "computedY" : 115.526, + "placementX" : 431.37, + "placementY" : 115.526, + "placementWidth" : 135.306, + "placementHeight" : 1.619, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 135.306, + "contentHeight" : 1.619, + "margin" : { + "top" : 5.127, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]", + "entityName" : "AdditionalFacts", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 394.132, + "computedY" : 43.751, + "placementX" : 394.132, + "placementY" : 43.751, + "placementWidth" : 163.122, + "placementHeight" : 61.749, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 163.122, + "contentHeight" : 61.749, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 42.636, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]/Fact_Languages[0]", + "entityName" : "Fact_Languages", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 394.132, + "computedY" : 80.15, + "placementX" : 394.132, + "placementY" : 80.15, + "placementWidth" : 105.367, + "placementHeight" : 25.35, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 105.367, + "contentHeight" : 25.35, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]/Fact_RighttoWork[1]", + "entityName" : "Fact_RighttoWork", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 394.132, + "computedY" : 61.95, + "placementX" : 394.132, + "placementY" : 61.95, + "placementWidth" : 120.486, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 120.486, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]/Fact_Availability[2]", + "entityName" : "Fact_Availability", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]/ClosingBand[5]/AdditionalColumn[2]/AdditionalFacts[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 394.132, + "computedY" : 43.751, + "placementX" : 394.132, + "placementY" : 43.751, + "placementWidth" : 104.645, + "placementHeight" : 10.32, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 104.645, + "contentHeight" : 10.32, + "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" : "TealPulseCv[0]/TaglineRule[6]", + "entityName" : "TaglineRule", + "entityKind" : "ShapeContainerNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 20.127, + "placementX" : 28.604, + "placementY" : 20.127, + "placementWidth" : 538.073, + "placementHeight" : 11.334, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 11.334, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.864, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "TealPulseCv[0]/TaglineRule[6]/TaglineRuleLine[0]", + "entityName" : "TaglineRuleLine", + "entityKind" : "ShapeNode", + "parentPath" : "TealPulseCv[0]/TaglineRule[6]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.604, + "computedY" : 25.119, + "placementX" : 28.604, + "placementY" : 25.119, + "placementWidth" : 538.073, + "placementHeight" : 1.349, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 1.349, + "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" : "TealPulseCv[0]/TaglineRule[6]/Icon_heart[1]", + "entityName" : "Icon_heart", + "entityKind" : "SectionNode", + "parentPath" : "TealPulseCv[0]/TaglineRule[6]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 551.776, + "computedY" : 18.344, + "placementX" : 551.776, + "placementY" : 18.344, + "placementWidth" : 14.9, + "placementHeight" : 14.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 14.9, + "contentHeight" : 14.9, + "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" : "TealPulseCv[0]/TaglineRule[6]/Icon_heart[1]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "TealPulseCv[0]/TaglineRule[6]/Icon_heart[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 551.776, + "computedY" : 18.344, + "placementX" : 551.776, + "placementY" : 18.344, + "placementWidth" : 14.9, + "placementHeight" : 14.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 14.9, + "contentHeight" : 14.9, + "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" : "TealPulseCv[0]/TaglineRule[6]/Icon_heart[1]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "TealPulseCv[0]/TaglineRule[6]/Icon_heart[1]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 551.776, + "computedY" : 18.344, + "placementX" : 551.776, + "placementY" : 18.344, + "placementWidth" : 14.9, + "placementHeight" : 14.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 14.9, + "contentHeight" : 14.9, + "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" : "TealPulseCv[0]/Tagline[7]", + "entityName" : "Tagline", + "entityKind" : "ParagraphNode", + "parentPath" : "TealPulseCv[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 28.604, + "computedY" : 9.555, + "placementX" : 28.604, + "placementY" : 9.555, + "placementWidth" : 538.073, + "placementHeight" : 9.708, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 538.073, + "contentHeight" : 9.708, + "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/teal_pulse-page-0.png b/qa/src/test/resources/visual-baselines/cv-v2-layered/teal_pulse-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..6417b289f1b51f915a1b083c544e62faea5ca213 GIT binary patch literal 113663 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 literal 0 HcmV?d00001 diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulse.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulse.java new file mode 100644 index 000000000..7301d71ed --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulse.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.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.TealPulseStyles.MARGIN_X; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PAD_BOTTOM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PAD_TOP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PAGE; + +/** + * Teal Pulse — a clinical one-page CV in five stacked bands: a heart crossed + * by a pulse beside the name, a contact strip divided by short rules, a + * two-column body carrying the competencies beside the summary and the roles, + * a three-column closing band, and a tracked line under a rule that ends in a + * small heart. + * + *

    Exactly one of those bands is two-column, and both vertical rules on the + * sheet are the left border of the column to their right rather than lines + * placed beside it — so they are the grid: change a weight and the rules + * follow.

    + * + *

    The page is the design's, not the caller's

    + * + *

    The design was drawn on a raster whose proportion is not A4's, and every + * length on the sheet is a share of that grid, so the preset sets its own page + * size and margin. A session configured by the caller is overwritten. This is + * the opposite choice from {@link CharcoalGold}, which follows the page it is + * given, and it is made here because the sheet is a fixed composition rather + * than a layout that rescales.

    + * + *

    One page, and what happens past it

    + * + *

    The sheet is drawn for one page but does not insist on it, which sets it + * apart from the other ported presets in this package. The bands are stacked + * in the page flow, so a CV with more roles than the design holds carries the + * closing band onto a second page rather than losing anything — it will look + * like a one-page design that ran over, because that is what it is.

    + * + *

    What cannot flow is the body itself: its two columns are a single row, + * and a row is atomic. A body taller than one page — the competencies beside + * the summary and every role — raises {@code AtomicNodeTooLargeException}, + * naming the node and the height it needed. The preset draws no cap of its + * own, because a CV that quietly loses a role 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 bands are fixed, so the preset assigns each section a berth by title + * rather than reading {@link + * com.demcha.compose.document.templates.cv.data.Slot}. It has six:

    + * + *
      + *
    • competencies, a {@link SkillsSection} — the narrow column;
    • + *
    • the summary, a {@link ParagraphSection}, and experience, an + * {@link EntriesSection} whose bodies are one highlight per line — the + * wide column;
    • + *
    • education, certifications and the closing facts, + * {@link EntriesSection}s — the three columns of the closing band;
    • + *
    • the tagline, a {@link ParagraphSection} whose body is the line under + * the closing rule. Only its body is drawn: the title is how the + * document names the berth, not something the sheet prints.
    • + *
    + * + *

    A section whose title matches no berth is not drawn, and a berth with no + * section takes its badge and heading with it. The competencies are skills + * without levels: this design writes them as dotted lines, so a rating would + * have nowhere to go.

    + * + *

    The marks, the tracking and the links

    + * + *

    Every mark is chrome — the brand's two halves, the four contact glyphs, + * the five badges and the closing heart — so no document names one, and the + * badge each band carries is fixed by the berth it heads.

    + * + *

    Headings are letter-spaced by writing each character as its own run with + * a small space between: a text style carries no letter-spacing, and the gap + * is split across several spacers because a run's size sets its line's height + * as well as its advance.

    + * + *

    The email, the phone and each link are reachable from the PDF, with the + * {@code mailto:} and {@code tel:} targets built from the values. A link is + * drawn as its own label with the address behind it — {@code Link("LinkedIn", + * "https://…")} sets the word and links the URL — so the strip's gaps do not + * depend on how long a profile's address happens to be. A role and a degree + * become links when their entry carries {@code CvEntry.link()}.

    + * + *

    Fonts

    + * + *

    The sheet is set in Lato, with Poppins for the name and Barlow Condensed + * for the headings. The templates artifact carries none of them — 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 = TealPulse.create();
    + * template.compose(session, cv);
    + * }
    + * + * @since 2.2.3 + */ +public final class TealPulse { + + /** Stable identifier of this preset. */ + public static final String ID = "teal-pulse"; + + /** Human-readable name of this preset. */ + public static final String DISPLAY_NAME = "Teal Pulse"; + + private static final List COMPETENCY_KEYS = + List.of("competencies", "competency", "skills", "expertise"); + private static final List SUMMARY_KEYS = + List.of("summary", "profile", "about"); + private static final List TAGLINE_KEYS = + List.of("tagline", "motto", "closing"); + private static final List EXPERIENCE_KEYS = + List.of("experience", "employment", "work history", "career"); + private static final List EDUCATION_KEYS = + List.of("education", "qualifications"); + private static final List CERTIFICATION_KEYS = + List.of("certifications", "certification", "licences", "licenses"); + private static final List FACT_KEYS = + List.of("additional", "details", "other"); + + private TealPulse() { + } + + /** + * Creates the template. + * + * @return a template composing a {@link CvDocument} + */ + 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(); + + SkillsSection competencies = berth(sections, SkillsSection.class, COMPETENCY_KEYS); + // The tagline is claimed first: its own keys are narrow, but the + // summary's are broad enough to take a closing line titled loosely. + ParagraphSection tagline = berth(sections, ParagraphSection.class, TAGLINE_KEYS); + ParagraphSection summary = + berthExcept(sections, ParagraphSection.class, SUMMARY_KEYS, tagline); + EntriesSection experience = berth(sections, EntriesSection.class, EXPERIENCE_KEYS); + EntriesSection education = berth(sections, EntriesSection.class, EDUCATION_KEYS); + EntriesSection certifications = + berth(sections, EntriesSection.class, CERTIFICATION_KEYS); + EntriesSection facts = berth(sections, EntriesSection.class, FACT_KEYS); + + // The sheet is a fixed composition on the design's own page, so the + // preset sets both rather than following what the caller configured. + document.pageSize(PAGE).margin(DocumentInsets.zero()); + document.pageFlow(page -> { + page.name("TealPulseCv"); + page.spacing(0); + page.padding(new DocumentInsets(PAD_TOP, MARGIN_X, PAD_BOTTOM, MARGIN_X)); + TealPulseMasthead.render(page, doc.identity()); + TealPulseBody.render(page, competencies, summary, experience); + TealPulseClosing.render(page, education, certifications, facts, tagline); + }); + } + + /** + * 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) { + return berthExcept(sections, type, keys, null); + } + + /** The same, skipping a section another berth has already claimed. */ + private static T berthExcept(List sections, + Class type, + List keys, + CvSection taken) { + for (CvSection section : sections) { + if (!type.isInstance(section) || section == taken) { + 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/TealPulseBody.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseBody.java new file mode 100644 index 000000000..a0562a1c1 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseBody.java @@ -0,0 +1,239 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.node.DocumentLinkOptions; +import com.demcha.compose.document.node.RowVerticalAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.templates.cv.data.CvEntry; +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 java.util.ArrayList; +import java.util.List; + +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT_DEEP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_TO_CLOSING_RULE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BULLET_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BULLET_LEADING; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BULLET_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.COMPETENCY_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.COMPETENCY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DASH_TO_HEADING; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DIVIDER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ENTRY_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ENTRY_HEADLINE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ENTRY_TO_BULLETS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADER_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADER_TO_ENTRY; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADING_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADING_TO_ITEMS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ITEMS_TO_CLOSING_RULE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MAIN_PAD_LEFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MAIN_WEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_PALE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_SOFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_CLOSING_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_CLOSING_RULE_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_DASH_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_DASH_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_HEADING_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_PAD_TOP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SIDEBAR_WEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SUMMARY_LEADING; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SUMMARY_RIGHT_INSET; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SUMMARY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SUMMARY_TO_EXPERIENCE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.style; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.dottedLine; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.sectionHeader; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.tracked; + +/** + * The body row: the competencies in the narrow column, the summary and the + * roles in the wide one. + */ +final class TealPulseBody { + + private TealPulseBody() { + } + + /** + * The one two-column band on the sheet. + * + *

    The rule between the columns is the main column's own left accent, + * not a drawn line. That is what makes its height follow the taller of the + * two columns, which is what the design shows: it runs well past the end + * of the competency list.

    + */ + static void render(PageFlowBuilder page, SkillsSection competencies, + ParagraphSection summary, EntriesSection experience) { + page.addRow("BodyGrid", row -> { + row.weights(SIDEBAR_WEIGHT, MAIN_WEIGHT); + row.verticalAlign(RowVerticalAlign.TOP); + row.spacing(0); + row.addSection("Sidebar", sidebar -> renderCompetencies(sidebar, competencies)); + row.addSection("Main", main -> { + main.spacing(0); + main.accentLeft(RULE_SOFT, DIVIDER_WIDTH); + main.padding(new DocumentInsets(0, 0, 0, MAIN_PAD_LEFT)); + renderSummary(main, summary); + renderExperience(main, experience); + }); + row.margin(new DocumentInsets(0, 0, BODY_TO_CLOSING_RULE, 0)); + }); + } + + // -- the narrow column ------------------------------------------------- + + /** A dash, a tracked heading, the dotted lines, and a pale closing rule. */ + private static void renderCompetencies(SectionBuilder section, SkillsSection competencies) { + section.spacing(0); + section.padding(new DocumentInsets(SIDEBAR_PAD_TOP, 0, 0, 0)); + if (competencies == null) { + return; + } + section.addLine(line -> line + .name("CompetenciesDash") + .horizontal(SIDEBAR_DASH_WIDTH) + .thickness(SIDEBAR_DASH_THICKNESS) + .color(ACCENT) + .margin(new DocumentInsets(0, 0, DASH_TO_HEADING, 0))); + + DocumentTextStyle headingStyle = style( + HEADING_FONT, SIDEBAR_HEADING_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + ParagraphBuilder heading = new ParagraphBuilder() + .name("CompetenciesHeading") + .textStyle(headingStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + tracked(heading, competencies.title(), headingStyle, SIDEBAR_HEADING_TRACKING_EM); + section.add(heading.margin(new DocumentInsets(0, 0, HEADING_TO_ITEMS, 0)).build()); + + section.addSection("CompetencyItems", items -> { + items.spacing(COMPETENCY_GAP); + for (SkillGroup group : competencies.groups()) { + for (CvSkill skill : group.entries()) { + items.add(dottedLine("Competency_" + compact(skill.name()), skill.name(), + COMPETENCY_SIZE, 1.0)); + } + } + }); + section.addLine(line -> line + .name("CompetenciesClosingRule") + .horizontal(SIDEBAR_CLOSING_RULE_WIDTH) + .thickness(SIDEBAR_CLOSING_RULE_THICKNESS) + .color(RULE_PALE) + .margin(new DocumentInsets(ITEMS_TO_CLOSING_RULE, 0, 0, 0))); + } + + // -- the wide column --------------------------------------------------- + + /** + * The summary under its badge. + * + *

    The paragraph carries a right inset because the design breaks its + * first line with a finger's width of the column still free: reproducing + * the line breaks means reproducing the measure, not only the type + * size.

    + * + *

    The summary is one flowing block here, so a body written as several + * lines is joined into one and left to wrap. This is the one berth that + * does that — everywhere else a line the document wrote is a line the + * sheet draws.

    + */ + private static void renderSummary(SectionBuilder main, ParagraphSection summary) { + if (summary == null || summary.body().isBlank()) { + return; + } + main.add(sectionHeader(summary.title(), TealPulseIcons.SUMMARY, HEADER_TO_BODY)); + main.addParagraph(paragraph -> paragraph + .name("SummaryText") + .text(summary.body().replace(String.valueOf((char) 10), " ")) + .textStyle(style(BODY_FONT, SUMMARY_SIZE, BODY_TEXT, + DocumentTextDecoration.DEFAULT)) + .align(TextAlign.LEFT) + .lineSpacing(SUMMARY_LEADING) + .margin(new DocumentInsets(0, SUMMARY_RIGHT_INSET, SUMMARY_TO_EXPERIENCE, 0))); + } + + /** The roles, each a two-voice headline over its dotted highlights. */ + private static void renderExperience(SectionBuilder main, EntriesSection experience) { + if (experience == null || experience.entries().isEmpty()) { + return; + } + main.add(sectionHeader(experience.title(), TealPulseIcons.EXPERIENCE, HEADER_TO_ENTRY)); + List entries = experience.entries(); + for (int i = 0; i < entries.size(); i++) { + CvEntry entry = entries.get(i); + boolean last = i == entries.size() - 1; + int index = i; + DocumentTextStyle roleStyle = style( + BODY_FONT, ENTRY_HEADLINE_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + DocumentTextStyle metaStyle = style( + BODY_FONT, ENTRY_HEADLINE_SIZE, BODY_TEXT, DocumentTextDecoration.BOLD); + main.addParagraph(paragraph -> { + paragraph.name("ExperienceHeadline_" + index) + .textStyle(metaStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + if (entry.link().isBlank()) { + paragraph.inlineText(entry.title(), roleStyle); + } else { + paragraph.inlineText(entry.title(), roleStyle, + new DocumentLinkOptions(entry.link())); + } + paragraph.inlineText(headlineTail(entry), metaStyle) + .margin(new DocumentInsets(0, 0, ENTRY_TO_BULLETS, 0)); + }); + main.addSection("ExperienceHighlights_" + index, highlights -> { + highlights.spacing(BULLET_GAP); + for (String item : lines(entry.body())) { + highlights.add(dottedLine( + "Highlight_" + index + "_" + compact(item), item, + BULLET_SIZE, BULLET_LEADING)); + } + highlights.margin(new DocumentInsets(0, 0, last ? 0 : ENTRY_GAP, 0)); + }); + } + } + + /** + * What follows the role in its headline: the employer, then the dates, + * joined the way the design joins them. A dash and a pipe are typography + * rather than content, so they live here and not in the document. + */ + private static String headlineTail(CvEntry entry) { + StringBuilder tail = new StringBuilder(); + if (!entry.subtitle().isBlank()) { + tail.append(' ').append((char) 0x2014).append(' ').append(entry.subtitle()); + } + if (!entry.date().isBlank()) { + tail.append(tail.isEmpty() ? " " : " | ").append(entry.date()); + } + return tail.toString(); + } + + /** A body, one entry per line the document wrote. */ + static List lines(String body) { + List out = new ArrayList<>(); + for (String line : body.split(String.valueOf((char) 10))) { + if (!line.isBlank()) { + out.add(line.strip()); + } + } + return out; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseClosing.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseClosing.java new file mode 100644 index 000000000..a466210c0 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseClosing.java @@ -0,0 +1,235 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +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.node.DocumentLinkOptions; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.RowVerticalAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.templates.cv.data.CvEntry; +import com.demcha.compose.document.templates.cv.data.EntriesSection; +import com.demcha.compose.document.templates.cv.data.ParagraphSection; + +import java.util.List; + +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT_DEEP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_BODY_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_COL1_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_COL2_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_COL3_TEXT_INSET; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_COL3_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_DEGREE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_FACT_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_LEADING; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_LINE_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_PAD_LEFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_TO_TAGLINE_RULE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_WEIGHT_1; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_WEIGHT_2; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_WEIGHT_3; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CERT_ITEM_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CLOSING_RULE_TO_BAND; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DIVIDER_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.FULL_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADING_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_SOFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_STRONG; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.TAGLINE_RULE_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.TAGLINE_RULE_TO_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.TAGLINE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.TAGLINE_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.style; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.columnHeader; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.dottedLine; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.icon; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.tracked; + +/** + * What closes the sheet: the three-column band and the tagline under its + * rule. + */ +final class TealPulseClosing { + + private TealPulseClosing() { + } + + static void render(PageFlowBuilder page, EntriesSection education, + EntriesSection certifications, EntriesSection facts, + ParagraphSection tagline) { + page.addLine(line -> line + .name("ClosingBandRule") + .horizontal(CONTENT_WIDTH) + .thickness(FULL_RULE_THICKNESS) + .color(RULE_STRONG) + .margin(new DocumentInsets(0, 0, CLOSING_RULE_TO_BAND, 0))); + renderBand(page, education, certifications, facts); + renderTagline(page, tagline); + } + + // -- the band ---------------------------------------------------------- + + /** + * The three closing columns. + * + *

    The two rules between them are left accents on the second and third + * columns, so they sit on the band's own weight boundaries and cannot + * drift off the grid.

    + */ + private static void renderBand(PageFlowBuilder page, EntriesSection education, + EntriesSection certifications, EntriesSection facts) { + page.addRow("ClosingBand", row -> { + row.weights(BAND_WEIGHT_1, BAND_WEIGHT_2, BAND_WEIGHT_3); + row.verticalAlign(RowVerticalAlign.TOP); + row.spacing(0); + row.addSection("EducationColumn", column -> { + column.spacing(0); + renderEducation(column, education); + }); + row.addSection("CertificationsColumn", column -> { + column.spacing(0); + column.accentLeft(RULE_SOFT, DIVIDER_WIDTH); + column.padding(new DocumentInsets(0, 0, 0, BAND_PAD_LEFT)); + renderCertifications(column, certifications); + }); + row.addSection("AdditionalColumn", column -> { + column.spacing(0); + column.accentLeft(RULE_SOFT, DIVIDER_WIDTH); + column.padding(new DocumentInsets(0, 0, 0, BAND_PAD_LEFT)); + renderFacts(column, facts); + }); + row.margin(new DocumentInsets(0, 0, BAND_TO_TAGLINE_RULE, 0)); + }); + } + + /** Each degree as three stacked lines: the award, the campus, the years. */ + private static void renderEducation(SectionBuilder column, EntriesSection education) { + if (education == null || education.entries().isEmpty()) { + return; + } + column.add(columnHeader(education.title(), TealPulseIcons.EDUCATION, BAND_COL1_WIDTH)); + List entries = education.entries(); + for (int index = 0; index < entries.size(); index++) { + CvEntry entry = entries.get(index); + boolean last = index == entries.size() - 1; + column.add(bandLine("EducationDegree_" + index, entry.title(), BAND_DEGREE_SIZE, + DocumentTextDecoration.BOLD, BAND_LINE_GAP, entry.link())); + column.add(bandLine("EducationInstitution_" + index, entry.subtitle(), + BAND_BODY_SIZE, DocumentTextDecoration.DEFAULT, BAND_LINE_GAP, "")); + column.add(bandLine("EducationDates_" + index, entry.date(), BAND_BODY_SIZE, + DocumentTextDecoration.DEFAULT, last ? 0 : BAND_LINE_GAP, "")); + } + } + + /** One line of closing-band body text, carrying a link when it has one. */ + private static DocumentNode bandLine(String name, String text, double size, + DocumentTextDecoration decoration, double gapBelow, + String link) { + DocumentTextStyle textStyle = style(BODY_FONT, size, BODY_TEXT, decoration); + ParagraphBuilder paragraph = new ParagraphBuilder() + .name(name) + .text(text) + .textStyle(textStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0) + .margin(new DocumentInsets(0, 0, gapBelow, 0)); + if (link != null && !link.isBlank()) { + paragraph.link(new DocumentLinkOptions(link)); + } + return paragraph.build(); + } + + private static void renderCertifications(SectionBuilder column, EntriesSection section) { + if (section == null || section.entries().isEmpty()) { + return; + } + column.add(columnHeader(section.title(), TealPulseIcons.CERTIFICATIONS, + BAND_COL2_WIDTH)); + column.addSection("CertificationItems", items -> { + items.spacing(CERT_ITEM_GAP); + for (CvEntry entry : section.entries()) { + items.add(dottedLine("Certification_" + compact(entry.title()), entry.title(), + BAND_BODY_SIZE, 1.0)); + } + }); + } + + /** + * The closing facts: a bold label and its value as two runs of one + * wrapping paragraph, which is why a fact that runs to a second line + * starts it at the column edge rather than under its value. + */ + private static void renderFacts(SectionBuilder column, EntriesSection section) { + if (section == null || section.entries().isEmpty()) { + return; + } + column.add(columnHeader(section.title(), TealPulseIcons.ADDITIONAL, BAND_COL3_WIDTH)); + DocumentTextStyle labelStyle = + style(BODY_FONT, BAND_BODY_SIZE, BODY_TEXT, DocumentTextDecoration.BOLD); + DocumentTextStyle valueStyle = + style(BODY_FONT, BAND_BODY_SIZE, BODY_TEXT, DocumentTextDecoration.DEFAULT); + column.addSection("AdditionalFacts", facts -> { + facts.spacing(BAND_FACT_GAP); + facts.padding(new DocumentInsets(0, BAND_COL3_TEXT_INSET, 0, 0)); + for (CvEntry entry : section.entries()) { + facts.addParagraph(paragraph -> paragraph + .name("Fact_" + compact(entry.title())) + .textStyle(valueStyle) + .align(TextAlign.LEFT) + .lineSpacing(BAND_LEADING) + .inlineText(entry.title(), labelStyle) + .inlineText(" " + entry.body().replace(String.valueOf((char) 10), " "), + valueStyle) + .margin(DocumentInsets.zero())); + } + }); + } + + // -- the tagline ------------------------------------------------------- + + /** + * The rule and the heart are one terminal — the rule anchored to its left, + * the heart to its right — so the mark follows the rule's end whatever the + * content width becomes. The tracked line sits under it. + */ + private static void renderTagline(PageFlowBuilder page, ParagraphSection tagline) { + if (tagline == null || tagline.body().isBlank()) { + return; + } + double heartSize = TealPulseIcons.size(TealPulseIcons.HEART); + double heartLift = -(heartSize - TAGLINE_RULE_HEIGHT) / 2.0; + DocumentNode rule = new ShapeBuilder() + .name("TaglineRuleLine") + .size(CONTENT_WIDTH, FULL_RULE_THICKNESS) + .fillColor(RULE_STRONG) + .build(); + page.addContainer(container -> container + .name("TaglineRule") + .rectangle(CONTENT_WIDTH, TAGLINE_RULE_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(rule) + .position(icon(TealPulseIcons.HEART), 0, heartLift, LayerAlign.CENTER_RIGHT) + .margin(new DocumentInsets(0, 0, TAGLINE_RULE_TO_TEXT, 0))); + + DocumentTextStyle textStyle = + style(HEADING_FONT, TAGLINE_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + ParagraphBuilder line = new ParagraphBuilder() + .name("Tagline") + .textStyle(textStyle) + .align(TextAlign.CENTER) + .lineSpacing(1.0); + tracked(line, tagline.body().replace(String.valueOf((char) 10), " "), textStyle, + TAGLINE_TRACKING_EM); + page.add(line.margin(DocumentInsets.zero()).build()); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseIcons.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseIcons.java new file mode 100644 index 000000000..388e205e5 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseIcons.java @@ -0,0 +1,105 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.svg.SvgIcon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Classpath loader for the Teal Pulse CV marks: the two halves of the brand + * mark, the four contact glyphs, the five badge glyphs and the heart that + * closes the sheet. + * + *

    They ship inside the templates artifact under + * {@code templates/cv/teal-pulse/icons/} as SVG, so they scale with the box + * they are drawn into rather than being resampled. Parsed icons are cached + * per token, so a sheet that repeats a mark reads each file once per JVM.

    + * + *

    Every mark here is chrome — this sheet draws the same ones whatever the + * CV says — so the tokens are constants and no document names one. Each + * carries the width it is drawn at: an icon's box is not its glyph, and the + * sizes are measurements off the drawing rather than a shared constant.

    + */ +final class TealPulseIcons { + + static final String BRAND_HEART = "brand-heart"; + static final String BRAND_PULSE = "brand-pulse"; + static final String LOCATION = "location"; + static final String EMAIL = "email"; + static final String PHONE = "phone"; + static final String LINKEDIN = "linkedin"; + static final String SUMMARY = "summary"; + static final String EXPERIENCE = "experience"; + static final String EDUCATION = "education"; + static final String CERTIFICATIONS = "certifications"; + static final String ADDITIONAL = "additional"; + static final String HEART = "heart"; + + private static final String ICON_ROOT = "/templates/cv/teal-pulse/icons/"; + + /** + * The width each mark is drawn at — its whole box, not the glyph inside, + * which sits a few points within it. These are points rather than + * measurements off the drawing: the asset resolver chose them per glyph so + * that each one's visible ink matches what the design shows. + */ + private static final Map SIZES = Map.ofEntries( + Map.entry(BRAND_HEART, 77.1), + Map.entry(BRAND_PULSE, 92.8), + Map.entry(LOCATION, 15.6), + Map.entry(EMAIL, 16.2), + Map.entry(PHONE, 14.3), + Map.entry(LINKEDIN, 13.6), + Map.entry(SUMMARY, 20.0), + Map.entry(EXPERIENCE, 20.0), + Map.entry(EDUCATION, 17.5), + Map.entry(CERTIFICATIONS, 17.5), + Map.entry(ADDITIONAL, 17.5), + Map.entry(HEART, 14.9)); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private TealPulseIcons() { + } + + /** + * The width one mark is drawn at. + * + * @param token one of the packaged tokens + * @return the drawn width in points + */ + static double size(String token) { + Double size = SIZES.get(token); + if (size == null) { + throw new IllegalStateException("No size for teal pulse CV icon '" + token + "'"); + } + return size; + } + + /** + * Reads one mark. + * + * @param token one of the packaged tokens + * @return the parsed icon + */ + static SvgIcon icon(String token) { + return CACHE.computeIfAbsent(token, TealPulseIcons::read); + } + + private static SvgIcon read(String token) { + String resourcePath = ICON_ROOT + token + ".svg"; + try (InputStream input = TealPulseIcons.class.getResourceAsStream(resourcePath)) { + if (input == null) { + throw new IllegalStateException("Missing teal pulse CV icon: " + resourcePath); + } + return SvgIcon.parse(new String(input.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to read teal pulse CV icon: " + resourcePath, e); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseMasthead.java new file mode 100644 index 000000000..d83774d96 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseMasthead.java @@ -0,0 +1,264 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.PathBuilder; +import com.demcha.compose.document.dsl.RowBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.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.RowArrangement; +import com.demcha.compose.document.node.RowVerticalAlign; +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.DocumentLineCap; +import com.demcha.compose.document.style.DocumentLineJoin; +import com.demcha.compose.document.style.DocumentRowColumn; +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.svg.SvgPath; +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.CvIdentity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT_DEEP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTACT_ICON_DROP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTACT_ICON_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTACT_PAIR_LIFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTACT_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTACT_TO_RULE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DISPLAY_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DISPLAY_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.FULL_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.LOGO_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.LOGO_TO_IDENTITY; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.LOGO_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MARK_STROKE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MASTHEAD_TO_CONTACT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.NAME_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.NAME_TO_ROLE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.NAME_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PULSE_BOX_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PULSE_BOX_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PULSE_DROP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PULSE_SHIFT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ROLE_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ROLE_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_STRONG; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.RULE_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SEPARATOR; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SEPARATOR_HEIGHT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SEPARATOR_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.gapRun; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.style; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.icon; +import static com.demcha.compose.document.templates.cv.presets.TealPulseWidgets.tracked; + +/** + * The top of the sheet: the mark beside the name, the contact strip, and the + * rule that closes them. + */ +final class TealPulseMasthead { + + private TealPulseMasthead() { + } + + /** One channel of the contact strip: a mark, a value and where it points. */ + private record Channel(String token, String value, String href) { + } + + static void render(PageFlowBuilder page, CvIdentity identity) { + page.addRow("Masthead", row -> { + row.columns(DocumentRowColumn.fixed(LOGO_WIDTH), DocumentRowColumn.weight(1)); + row.verticalAlign(RowVerticalAlign.CENTER); + row.spacing(LOGO_TO_IDENTITY); + row.add(brandMark()); + row.addSection("Identity", section -> renderIdentity(section, identity)); + row.margin(new DocumentInsets(0, 0, MASTHEAD_TO_CONTACT, 0)); + }); + renderContactStrip(page, identity); + page.addLine(line -> line + .name("MastheadRule") + .horizontal(CONTENT_WIDTH) + .thickness(FULL_RULE_THICKNESS) + .color(RULE_STRONG) + .margin(new DocumentInsets(0, 0, RULE_TO_BODY, 0))); + } + + // -- the mark ---------------------------------------------------------- + + /** + * A heart outline crossed by a flat pulse. + * + *

    No single glyph has this geometry — every heartbeat icon puts the + * pulse in the left half — so the mark is two vectors centred in one box. + * Each child is wider or taller than that box, and a shape container + * clamps an over-sized child to the top left rather than centring it, so + * each is pulled back by half its own overflow. Those two corrections + * exist only to cancel the clamp.

    + */ + private static DocumentNode brandMark() { + double heartSize = TealPulseIcons.size(TealPulseIcons.BRAND_HEART); + double heartLift = -(heartSize - LOGO_HEIGHT) / 2.0; + return new ShapeContainerBuilder() + .name("BrandMark") + .rectangle(LOGO_WIDTH, LOGO_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(icon(TealPulseIcons.BRAND_HEART), 0, heartLift, LayerAlign.CENTER) + .position(pulse(), PULSE_SHIFT, PULSE_DROP, LayerAlign.CENTER) + .build(); + } + + /** + * The pulse, drawn from the packaged glyph's own geometry at a box this + * preset chooses, so the line spans the mark while the spike keeps the + * height the design draws. The stroke is the design's, not the glyph's. + */ + private static DocumentNode pulse() { + SvgPath geometry = TealPulseIcons.icon(TealPulseIcons.BRAND_PULSE) + .layers().get(0).geometry(); + return new PathBuilder() + .name("BrandPulse") + .size(PULSE_BOX_WIDTH, PULSE_BOX_HEIGHT) + .svg(geometry) + .stroke(DocumentStroke.of(ACCENT, MARK_STROKE)) + .lineCap(DocumentLineCap.ROUND) + .lineJoin(DocumentLineJoin.ROUND) + .build(); + } + + // -- the name ---------------------------------------------------------- + + /** The tracked display name over the tracked role, both in capitals. */ + private static void renderIdentity(SectionBuilder section, CvIdentity identity) { + section.spacing(0); + DocumentTextStyle nameStyle = + style(DISPLAY_FONT, NAME_SIZE, DISPLAY_TEXT, DocumentTextDecoration.DEFAULT); + ParagraphBuilder name = new ParagraphBuilder() + .name("DisplayName") + .textStyle(nameStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + tracked(name, identity.name().full().toUpperCase(Locale.ROOT), nameStyle, + NAME_TRACKING_EM); + section.add(name.margin(new DocumentInsets(0, 0, NAME_TO_ROLE, 0)).build()); + + DocumentTextStyle roleStyle = + style(DISPLAY_FONT, ROLE_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + ParagraphBuilder role = new ParagraphBuilder() + .name("ProfessionalTitle") + .textStyle(roleStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + tracked(role, identity.jobTitle().toUpperCase(Locale.ROOT), roleStyle, ROLE_TRACKING_EM); + section.add(role.margin(DocumentInsets.zero()).build()); + } + + // -- the strip --------------------------------------------------------- + + /** + * The contact strip: the three channels and a row per link, each a mark + * and a value, divided by short rules. + * + *

    Each pair is one paragraph, so the row's distribution can never split + * a mark from its value. Spreading the children pins the run to both + * margins and makes the gaps even, which a fixed gap would reach only by + * luck of the font's metrics.

    + * + *

    A link shows its own label and carries the address behind it, so the + * strip's gaps do not depend on how long a profile's URL happens to be.

    + */ + private static void renderContactStrip(PageFlowBuilder page, CvIdentity identity) { + List channels = channels(identity); + page.addRow("ContactStrip", row -> { + row.verticalAlign(RowVerticalAlign.CENTER); + row.arrangement(RowArrangement.SPACE_BETWEEN); + for (int index = 0; index < channels.size(); index++) { + if (index > 0) { + separator(row, index); + } + row.add(channelPair(channels.get(index), index)); + } + row.margin(new DocumentInsets(0, 0, CONTACT_TO_RULE, 0)); + }); + } + + /** The strip's order: where, then how to write, then how to call, then links. */ + private static List channels(CvIdentity identity) { + Contact contact = identity.contact(); + List channels = new ArrayList<>(); + channels.add(new Channel(TealPulseIcons.LOCATION, contact.address(), null)); + channels.add(new Channel(TealPulseIcons.EMAIL, contact.email(), + "mailto:" + contact.email())); + channels.add(new Channel(TealPulseIcons.PHONE, contact.phone(), telUri(contact.phone()))); + for (Link link : identity.links()) { + channels.add(new Channel(TealPulseIcons.LINKEDIN, link.label(), link.url())); + } + return channels; + } + + private static DocumentNode channelPair(Channel channel, int index) { + DocumentTextStyle textStyle = + style(BODY_FONT, CONTACT_SIZE, BODY_TEXT, DocumentTextDecoration.DEFAULT); + DocumentLinkOptions link = channel.href() == null || channel.href().isBlank() + ? null + : new DocumentLinkOptions(channel.href()); + ParagraphBuilder pair = new ParagraphBuilder() + .name("Contact_" + index + "_" + compact(channel.token())) + .textStyle(textStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0) + .inlineSvgIcon(TealPulseIcons.icon(channel.token()), + TealPulseIcons.size(channel.token()), InlineImageAlignment.CENTER, + CONTACT_ICON_DROP, link); + String value = gapRun(CONTACT_ICON_GAP, CONTACT_SIZE) + channel.value(); + if (link == null) { + pair.inlineText(value, textStyle); + } else { + pair.inlineText(value, textStyle, link); + } + // The pair still sits below the axis the design uses. It is centred in + // a row whose height the separators set, so a NEGATIVE top margin of + // twice the wanted lift raises it by half of it. Negative rather than a + // positive bottom margin: both shift a centred child equally, but a + // bottom margin would grow the box past the separators and take the + // whole strip — and everything under it — down the page. + return pair.margin(new DocumentInsets(-2 * CONTACT_PAIR_LIFT, 0, 0, 0)).build(); + } + + private static void separator(RowBuilder row, int index) { + row.addLine(line -> line + .name("ContactSeparator_" + index) + .vertical(SEPARATOR_HEIGHT) + .thickness(SEPARATOR_THICKNESS) + .color(SEPARATOR) + .margin(DocumentInsets.zero())); + } + + /** + * The dial target for a phone number: its digits, keeping a leading + * {@code +} so an international number stays international, and dropping a + * parenthesised trunk prefix the way a caller dialling from abroad does. + */ + private static String telUri(String phone) { + String dialled = phone.replaceAll("\\(0+\\)", ""); + String digits = dialled.replaceAll("[^0-9]", ""); + return digits.isEmpty() + ? null + : "tel:" + (phone.trim().startsWith("+") ? "+" : "") + digits; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseStyles.java new file mode 100644 index 000000000..5f8cb68e4 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseStyles.java @@ -0,0 +1,313 @@ +package com.demcha.compose.document.templates.cv.presets; + +import com.demcha.compose.document.api.DocumentPageSize; +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.font.FontName; + +/** + * The measured geometry, palette and type scale of the Teal Pulse CV. + * + *

    Every length is a measurement off one grid

    + * + *

    The design was drawn on a 1103×1426 raster, so each length here is + * written as {@link #px} of a pixel measured off it and {@code px} is the one + * conversion into points. Re-measuring the drawing therefore changes one + * number per length and never a chain of them — and the page itself takes + * that grid's proportion rather than A4's, which is why this preset sets its + * own page.

    + * + *

    Leading is not a multiple of the type size

    + * + *

    A paragraph's line pitch on this engine is about + * {@code 1.216 × size + 0.872 × lineSpacing}, so the leading constants below + * are the values that produce the drawn pitch rather than ratios of it. A + * single-line paragraph ignores leading entirely and takes {@code 1.216 × + * size}, which is why the bullet rhythm is section spacing instead.

    + */ +final class TealPulseStyles { + + private TealPulseStyles() { + } + + // -- the grid ---------------------------------------------------------- + + /** The raster the design was drawn on. */ + static final double REFERENCE_WIDTH_PX = 1103.0; + static final double REFERENCE_HEIGHT_PX = 1426.0; + + static final double PAGE_WIDTH = 595.28; + static final double PAGE_HEIGHT = PAGE_WIDTH * REFERENCE_HEIGHT_PX / REFERENCE_WIDTH_PX; + static final DocumentPageSize PAGE = DocumentPageSize.of(PAGE_WIDTH, PAGE_HEIGHT); + + /** + * One measurement off the drawing, in points. + * + * @param referencePixels the pixel measured on the 1103-wide raster + * @return the same distance on the page + */ + static double px(double referencePixels) { + return referencePixels * PAGE_WIDTH / REFERENCE_WIDTH_PX; + } + + static final double MARGIN_X = px(53); + static final double PAD_TOP = px(34); + static final double PAD_BOTTOM = px(14); + static final double CONTENT_WIDTH = PAGE_WIDTH - 2 * MARGIN_X; + + /** The sidebar runs from the left margin to the column rule. */ + static final double SIDEBAR_WEIGHT = 0.26533; + static final double MAIN_WEIGHT = 1.0 - SIDEBAR_WEIGHT; + static final double MAIN_PAD_LEFT = px(32); + static final double MAIN_CONTENT_WIDTH = CONTENT_WIDTH * MAIN_WEIGHT - MAIN_PAD_LEFT; + + /** + * The closing band's first divider is collinear with the body's column + * rule, so its first weight is the sidebar's — that is the shared grid, + * not a coincidence to be measured twice. + */ + static final double BAND_WEIGHT_1 = SIDEBAR_WEIGHT; + static final double BAND_WEIGHT_2 = 0.37789; + static final double BAND_WEIGHT_3 = 1.0 - BAND_WEIGHT_1 - BAND_WEIGHT_2; + + static final double BAND_PAD_LEFT = px(36); + + /** + * Two right insets, because the design uses two: a heading's underline + * stops well short of the divider while the body under it runs on almost + * to the rule. One inset for both would either wrap the longest line or + * overrun every underline. + */ + static final double BAND_RULE_INSET = px(40); + static final double BAND_COL1_WIDTH = CONTENT_WIDTH * BAND_WEIGHT_1 - BAND_RULE_INSET; + static final double BAND_COL2_WIDTH = + CONTENT_WIDTH * BAND_WEIGHT_2 - BAND_PAD_LEFT - BAND_RULE_INSET; + static final double BAND_COL3_WIDTH = CONTENT_WIDTH * BAND_WEIGHT_3 - BAND_PAD_LEFT; + + /** + * Two blocks wrap inside a measure narrower than the column holding them, + * and the design is unambiguous about both: the summary breaks with a + * finger's width of its column still free, and so does the first fact. + * Reproducing the line breaks means reproducing the measure, not only the + * type size. + */ + static final double SUMMARY_RIGHT_INSET = px(105); + static final double BAND_COL3_TEXT_INSET = px(79); + + // -- type -------------------------------------------------------------- + + static final FontName DISPLAY_FONT = FontName.POPPINS; + + /** + * The drawing's heading face sets about a fifth narrower per cap height + * than the body's bold, so the headings take a condensed face and keep + * both dimensions rather than shrinking to fit and losing the cap height. + */ + static final FontName HEADING_FONT = FontName.BARLOW_CONDENSED; + static final FontName BODY_FONT = FontName.LATO; + + static final double NAME_SIZE = 39.5; + static final double ROLE_SIZE = 13.84; + static final double CONTACT_SIZE = 7.86; + static final double SIDEBAR_HEADING_SIZE = 10.4; + static final double COMPETENCY_SIZE = 9.09; + static final double MAIN_HEADING_SIZE = 12.7; + static final double SUMMARY_SIZE = 9.91; + static final double ENTRY_HEADLINE_SIZE = 8.90; + static final double BULLET_SIZE = 8.16; + static final double BAND_HEADING_SIZE = 9.6; + static final double BAND_BODY_SIZE = 8.6; + static final double BAND_DEGREE_SIZE = 10.55; + static final double TAGLINE_SIZE = 8.09; + + static final double SUMMARY_LEADING = 5.37; + static final double BULLET_LEADING = 1.0; + static final double BAND_LEADING = 4.71; + + // -- tracking ---------------------------------------------------------- + + /** + * A space's advance as a fraction of the type size. Tracking is written as + * spacer runs between the letters because a text style carries no + * letter-spacing, and this is what turns a wanted em fraction into a + * number of spaces. + */ + static final double SPACE_ADVANCE_EM = 0.25; + + static final double NAME_TRACKING_EM = 0.045; + static final double ROLE_TRACKING_EM = 0.43; + static final double MAIN_HEADING_TRACKING_EM = 0.124; + static final double SIDEBAR_HEADING_TRACKING_EM = 0.251; + static final double BAND_HEADING_TRACKING_EM = 0.215; + static final double TAGLINE_TRACKING_EM = 0.239; + + // -- palette ----------------------------------------------------------- + + static final DocumentColor ACCENT = DocumentColor.rgb(6, 100, 112); + static final DocumentColor ACCENT_DEEP = DocumentColor.rgb(0, 80, 95); + static final DocumentColor RULE_STRONG = DocumentColor.rgb(0, 88, 104); + static final DocumentColor RULE_SOFT = DocumentColor.rgb(119, 174, 182); + static final DocumentColor RULE_PALE = DocumentColor.rgb(177, 204, 207); + static final DocumentColor SEPARATOR = DocumentColor.rgb(54, 125, 135); + static final DocumentColor DISPLAY_TEXT = DocumentColor.rgb(34, 36, 50); + static final DocumentColor BODY_TEXT = DocumentColor.rgb(17, 17, 17); + static final DocumentColor PAPER = DocumentColor.WHITE; + + // -- the mark ---------------------------------------------------------- + + static final double LOGO_WIDTH = px(132); + static final double LOGO_HEIGHT = px(105); + static final double LOGO_TO_IDENTITY = px(39); + static final double MARK_STROKE = px(3); + + /** The pulse crosses the heart below its centre, not through it. */ + static final double PULSE_DROP = px(6.5); + + /** + * The pulse's box is its INK box: a path is mapped onto the size given by + * its own bounds rather than its viewBox. Its height is the spike's, and + * that is why the pulse is a path and not an icon — the drawing's line is + * flatter than any heartbeat glyph, and an icon keeps its aspect. + */ + static final double PULSE_BOX_WIDTH = px(172); + static final double PULSE_BOX_HEIGHT = px(82); + + /** + * A shape container clamps an over-wide child to the left exactly as it + * top-clamps an over-tall one, so the pulse is pulled back by half its own + * overflow. + */ + static final double PULSE_SHIFT = -(PULSE_BOX_WIDTH - LOGO_WIDTH) / 2.0; + + // -- rules, badges and dots -------------------------------------------- + + static final double DIVIDER_WIDTH = px(2); + static final double FULL_RULE_THICKNESS = px(2.5); + static final double HEADER_RULE_THICKNESS = px(2.5); + static final double BAND_RULE_THICKNESS = px(3); + static final double SIDEBAR_DASH_WIDTH = px(54); + static final double SIDEBAR_DASH_THICKNESS = px(3); + static final double SIDEBAR_CLOSING_RULE_WIDTH = px(216); + static final double SIDEBAR_CLOSING_RULE_THICKNESS = px(3); + static final double TAGLINE_RULE_HEIGHT = px(21); + + static final double BADGE_MAIN = px(58); + static final double BADGE_BAND = px(51); + static final double SECTION_GAP = px(17); + static final double BAND_HEADER_GAP = px(18); + static final double DOT_DIAMETER = px(6); + static final double DOT_GAP = px(17); + + static final double SEPARATOR_HEIGHT = px(38); + static final double SEPARATOR_THICKNESS = px(1.5); + + /** + * A contact icon is twice the height of the value beside it, so it is the + * icon that sets the line box: centring puts the icon on that box's middle + * while the value still sits near its foot, and the pair reads as standing + * at two levels. These two corrections put both back where the drawing has + * them — the first raises the pair, the second returns the icon to the + * value's own axis. + */ + static final double CONTACT_ICON_DROP = -px(4); + static final double CONTACT_PAIR_LIFT = px(4); + + /** + * The gap asked of the type, not the gap that appears: an icon's box + * carries its own bearing, so about half the drawn gap is requested and + * the bearing makes up the rest. + */ + static final double CONTACT_ICON_GAP = px(7.5); + + // -- the rhythm between blocks ----------------------------------------- + + static final double MASTHEAD_TO_CONTACT = px(17); + static final double CONTACT_TO_RULE = px(23); + static final double RULE_TO_BODY = px(29); + static final double NAME_TO_ROLE = px(0); + static final double SIDEBAR_PAD_TOP = px(9); + static final double DASH_TO_HEADING = px(14); + static final double HEADING_TO_ITEMS = px(35); + static final double COMPETENCY_GAP = px(29.2); + static final double ITEMS_TO_CLOSING_RULE = px(50); + static final double HEADER_TO_BODY = px(20); + static final double SUMMARY_TO_EXPERIENCE = px(29); + static final double HEADER_TO_ENTRY = px(14); + static final double ENTRY_TO_BULLETS = px(13); + static final double ENTRY_GAP = px(34); + static final double BODY_TO_CLOSING_RULE = px(30); + static final double CLOSING_RULE_TO_BAND = px(27); + static final double BAND_HEADING_TO_UNDERLINE = px(9.5); + static final double BAND_HEADER_TO_BODY = px(22); + + /** + * The closing-band heading does not sit on its badge's centre line: the + * stack is seated below it so the underline clears the badge's lower half + * rather than cutting through it. + */ + static final double BAND_HEADING_DROP = px(12); + static final double BAND_LINE_GAP = px(10.5); + static final double BAND_FACT_GAP = px(14.6); + static final double CERT_ITEM_GAP = px(12.9); + static final double BAND_TO_TAGLINE_RULE = px(22); + static final double TAGLINE_RULE_TO_TEXT = px(1.6); + + /** + * Bullet pitch is section spacing, not line spacing: a single-line + * paragraph takes the font's own line height whatever leading it is given, + * so the drawn pitch has to be the gap between paragraphs. + */ + static final double BULLET_GAP = px(7.9); + + // -- helpers ----------------------------------------------------------- + + static DocumentTextStyle style(FontName font, double size, DocumentColor color, + DocumentTextDecoration decoration) { + return DocumentTextStyle.builder() + .fontName(font) + .size(size) + .color(color) + .decoration(decoration) + .build(); + } + + /** + * The size a spacer run is set at so that {@code runs} of them advance the + * wanted fraction of an em. + */ + static DocumentTextStyle spacerStyle(DocumentTextStyle textStyle, double trackingEm, + int runs) { + return textStyle.withSize(trackingEm * textStyle.size() / (runs * SPACE_ADVANCE_EM)); + } + + /** + * How many spacer characters carry one gap. + * + *

    A run's size sets the line's height as well as its advance, so a + * single space wide enough for heavy tracking would make the line taller + * than its own type. Splitting the gap across several smaller spaces keeps + * every spacer below the text size.

    + */ + static int spacerRuns(double trackingEm) { + return Math.max(1, (int) Math.ceil(trackingEm / SPACE_ADVANCE_EM)); + } + + /** + * Spaces that advance about {@code width} points at {@code size}. + * + *

    Deliberately not one resized space: a run's size sets the line's + * height as well as its advance, so a single space wide enough for the gap + * would make its line several times too tall. The count follows the size, + * so changing the type scale moves the gap with it.

    + */ + static String gapRun(double width, double size) { + int spaces = (int) Math.max(1, Math.round(width / (SPACE_ADVANCE_EM * size))); + return " ".repeat(spaces); + } + + /** A node name built from a heading, with the spacing taken out of it. */ + static String compact(String value) { + return value == null ? "" : value.replaceAll("[^A-Za-z0-9]", ""); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java new file mode 100644 index 000000000..1a40b3a73 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/cv/presets/TealPulseWidgets.java @@ -0,0 +1,234 @@ +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.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; + +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.ACCENT_DEEP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BADGE_BAND; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BADGE_MAIN; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADER_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADER_TO_BODY; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADING_DROP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADING_TO_UNDERLINE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_HEADING_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BAND_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.BODY_TEXT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DOT_DIAMETER; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.DOT_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADER_RULE_THICKNESS; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.HEADING_FONT; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MAIN_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MAIN_HEADING_SIZE; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.MAIN_HEADING_TRACKING_EM; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.PAPER; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.SECTION_GAP; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.compact; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.gapRun; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.spacerRuns; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.spacerStyle; +import static com.demcha.compose.document.templates.cv.presets.TealPulseStyles.style; + +/** + * The idioms this sheet repeats: the tracked run, the badge, the dotted line + * and the two heading bars. + */ +final class TealPulseWidgets { + + private TealPulseWidgets() { + } + + // -- tracking ---------------------------------------------------------- + + /** + * A letter-spaced run. + * + *

    A text style carries no letter-spacing, so every character is its own + * run and the gaps between them are spaces set small enough to advance the + * wanted fraction of an em. The gap is split across several spacers rather + * than carried on one, because a run's size sets its line's height as well + * as its advance.

    + * + * @param paragraph the paragraph to write into + * @param text the text to space out + * @param textStyle the style of the letters + * @param trackingEm the gap as a fraction of an em + */ + static void tracked(ParagraphBuilder paragraph, String text, DocumentTextStyle textStyle, + double trackingEm) { + int runs = spacerRuns(trackingEm); + DocumentTextStyle spacer = spacerStyle(textStyle, trackingEm, runs); + for (int index = 0; index < text.length(); index++) { + paragraph.inlineText(String.valueOf(text.charAt(index)), textStyle); + if (index + 1 < text.length()) { + paragraph.inlineText(" ".repeat(runs), spacer); + } + } + } + + /** + * The same, with the paper laid behind every run, so a rule the heading is + * drawn over shows only past the end of the words. + */ + static void knockedOut(ParagraphBuilder paragraph, String text, + DocumentTextStyle textStyle, double trackingEm) { + int runs = spacerRuns(trackingEm); + DocumentTextStyle spacer = spacerStyle(textStyle, trackingEm, runs); + for (int index = 0; index < text.length(); index++) { + knockedOutRun(paragraph, String.valueOf(text.charAt(index)), textStyle); + if (index + 1 < text.length()) { + knockedOutRun(paragraph, " ".repeat(runs), spacer); + } + } + } + + /** One knocked-out run. No horizontal padding, so neighbours abut. */ + private static void knockedOutRun(ParagraphBuilder paragraph, String text, + DocumentTextStyle textStyle) { + paragraph.inlineHighlight(text, textStyle, PAPER, 0, + new DocumentInsets(HEADER_RULE_THICKNESS, 0, HEADER_RULE_THICKNESS, 0)); + } + + // -- marks ------------------------------------------------------------- + + /** A teal disc owning a white glyph — the pair moves and scales as one. */ + static DocumentNode badge(String name, String token, double diameter) { + return new ShapeContainerBuilder() + .name("Badge_" + compact(name)) + .circle(diameter) + .fillColor(ACCENT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .center(icon(token)) + .build(); + } + + /** + * One mark as a node. It is wrapped in a section rather than placed + * directly, so the vector path reaches the page rather than a coloured + * stand-in shaped like its box. + */ + static DocumentNode icon(String token) { + return new SectionBuilder() + .name("Icon_" + compact(token)) + .spacing(0) + .padding(DocumentInsets.zero()) + .margin(DocumentInsets.zero()) + .addSvgIcon(TealPulseIcons.icon(token), TealPulseIcons.size(token)) + .build(); + } + + // -- lines ------------------------------------------------------------- + + /** + * A teal dot leading a near-black label. + * + *

    Not a list: a list marker takes its item's own text colour, and here + * the dot and the label are deliberately different colours.

    + */ + static DocumentNode dottedLine(String name, String text, double size, double leading) { + DocumentTextStyle textStyle = + style(BODY_FONT, size, BODY_TEXT, DocumentTextDecoration.DEFAULT); + return new ParagraphBuilder() + .name(name) + .textStyle(textStyle) + .align(TextAlign.LEFT) + .lineSpacing(leading) + .dot(DOT_DIAMETER, ACCENT) + .inlineText(gapRun(DOT_GAP, size) + text, textStyle) + .margin(DocumentInsets.zero()) + .build(); + } + + // -- heading bars ------------------------------------------------------ + + /** + * The main column's heading: a badge, the words, and a rule running from + * them to the right margin. + * + *

    The obvious construction is unavailable here. A row of fixed / auto / + * weighted cells would let the layout derive the rule's length from the + * heading's width, but a row cannot nest inside a row cell and the main + * column is a row cell; the alternative, a shape container placing + * children by anchor, needs every width up front.

    + * + *

    So the rule is drawn at full length from just past the badge and the + * heading is laid over it with the paper knocked out behind every run. The + * rule then shows exactly where the heading is not, which is the picture an + * auto column would have produced, and its visible length still follows the + * words rather than a width guessed while authoring.

    + */ + static DocumentNode sectionHeader(String title, String token, double gapBelow) { + double railStart = BADGE_MAIN + SECTION_GAP; + DocumentNode rail = new ShapeBuilder() + .name("SectionHeaderRule_" + compact(title)) + .size(MAIN_CONTENT_WIDTH - railStart, HEADER_RULE_THICKNESS) + .fillColor(ACCENT) + .build(); + DocumentTextStyle headingStyle = style( + HEADING_FONT, MAIN_HEADING_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + ParagraphBuilder heading = new ParagraphBuilder() + .name("SectionHeading_" + compact(title)) + .textStyle(headingStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + knockedOut(heading, title, headingStyle, MAIN_HEADING_TRACKING_EM); + knockedOutRun(heading, gapRun(SECTION_GAP, MAIN_HEADING_SIZE), headingStyle); + return new ShapeContainerBuilder() + .name("SectionHeader_" + compact(title)) + .rectangle(MAIN_CONTENT_WIDTH, BADGE_MAIN) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(badge(title, token, BADGE_MAIN)) + .position(rail, railStart, 0, LayerAlign.CENTER_LEFT, 0) + .position(heading.margin(DocumentInsets.zero()).build(), + railStart, 0, LayerAlign.CENTER_LEFT, 1) + .margin(new DocumentInsets(0, 0, gapBelow, 0)) + .build(); + } + + /** + * The closing band's heading: the rule sits UNDER the words rather than + * after them, so its width is derivable — the column less the badge and + * the gap — and nothing has to be knocked out. + */ + static DocumentNode columnHeader(String title, String token, double columnWidth) { + DocumentTextStyle headingStyle = style( + HEADING_FONT, BAND_HEADING_SIZE, ACCENT_DEEP, DocumentTextDecoration.BOLD); + ParagraphBuilder heading = new ParagraphBuilder() + .name("ColumnHeading_" + compact(title)) + .textStyle(headingStyle) + .align(TextAlign.LEFT) + .lineSpacing(1.0); + tracked(heading, title, headingStyle, BAND_HEADING_TRACKING_EM); + double stackStart = BADGE_BAND + BAND_HEADER_GAP; + DocumentNode stack = new SectionBuilder() + .name("ColumnHeadingStack_" + compact(title)) + .spacing(0) + .add(heading.margin(DocumentInsets.zero()).build()) + .addLine(line -> line + .name("ColumnHeadingRule_" + compact(title)) + .horizontal(columnWidth - stackStart) + .thickness(BAND_RULE_THICKNESS) + .color(ACCENT) + .margin(new DocumentInsets(BAND_HEADING_TO_UNDERLINE, 0, 0, 0))) + .build(); + return new ShapeContainerBuilder() + .name("ColumnHeader_" + compact(title)) + .rectangle(columnWidth, BADGE_BAND) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(badge(title, token, BADGE_BAND)) + .position(stack, stackStart, BAND_HEADING_DROP, LayerAlign.CENTER_LEFT) + .margin(new DocumentInsets(0, 0, BAND_HEADER_TO_BODY, 0)) + .build(); + } +} diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/additional.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/additional.svg new file mode 100644 index 000000000..50719fb48 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/additional.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-heart.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-heart.svg new file mode 100644 index 000000000..e678eff0f --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-pulse.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-pulse.svg new file mode 100644 index 000000000..b02fd7af5 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/brand-pulse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/certifications.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/certifications.svg new file mode 100644 index 000000000..972d65546 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/certifications.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/education.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/education.svg new file mode 100644 index 000000000..66eb8e377 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/email.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/email.svg new file mode 100644 index 000000000..291f1c368 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/experience.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/experience.svg new file mode 100644 index 000000000..d474a2838 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/experience.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/heart.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/heart.svg new file mode 100644 index 000000000..20d5f5076 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/linkedin.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/linkedin.svg new file mode 100644 index 000000000..3ed716e9e --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/location.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/location.svg new file mode 100644 index 000000000..876c7101e --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/phone.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/phone.svg new file mode 100644 index 000000000..bfab7b00d --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/cv/teal-pulse/icons/summary.svg b/templates/src/main/resources/templates/cv/teal-pulse/icons/summary.svg new file mode 100644 index 000000000..173514856 --- /dev/null +++ b/templates/src/main/resources/templates/cv/teal-pulse/icons/summary.svg @@ -0,0 +1 @@ + \ No newline at end of file