From 89724590cbc3d8a8f0bc334fb39b90df52a64af0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 11 Feb 2025 17:19:59 +0400 Subject: [PATCH] cover letter added --- .../{index-Hi6j_poh.js => index-C8cJAPg2.js} | 16 +-- docs/cv-maker/assets/index-CpA7MgDL.css | 1 + docs/cv-maker/assets/index-yRNwTtQE.css | 1 - docs/cv-maker/index.html | 4 +- docs/cv-maker/john-doe.json | 7 + docs/cv-maker/resume-schema.json | 20 +++ src/cv-maker/core/schema.ts | 7 +- src/cv-maker/core/template.tsx | 123 ++++++++++-------- src/cv-maker/static/john-doe.json | 7 + src/cv-maker/static/resume-schema.json | 20 +++ src/cv-maker/style.css | 2 +- 11 files changed, 140 insertions(+), 68 deletions(-) rename docs/cv-maker/assets/{index-Hi6j_poh.js => index-C8cJAPg2.js} (83%) create mode 100644 docs/cv-maker/assets/index-CpA7MgDL.css delete mode 100644 docs/cv-maker/assets/index-yRNwTtQE.css diff --git a/docs/cv-maker/assets/index-Hi6j_poh.js b/docs/cv-maker/assets/index-C8cJAPg2.js similarity index 83% rename from docs/cv-maker/assets/index-Hi6j_poh.js rename to docs/cv-maker/assets/index-C8cJAPg2.js index 53a474b..b6d1fd3 100644 --- a/docs/cv-maker/assets/index-Hi6j_poh.js +++ b/docs/cv-maker/assets/index-C8cJAPg2.js @@ -1,14 +1,14 @@ -var nb=Object.defineProperty;var Dl=e=>{throw TypeError(e)};var rb=(e,t,n)=>t in e?nb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var u=(e,t,n)=>rb(e,typeof t!="symbol"?t+"":t,n),Ul=(e,t,n)=>t.has(e)||Dl("Cannot "+n);var Bl=(e,t,n)=>(Ul(e,t,"read from private field"),n?n.call(e):t.get(e)),ql=(e,t,n)=>t.has(e)?Dl("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),Jl=(e,t,n,r)=>(Ul(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();var Mc=!1,Rc=!1,hn=[],Cc=-1;function sb(e){ob(e)}function ob(e){hn.includes(e)||hn.push(e),cb()}function ib(e){let t=hn.indexOf(e);t!==-1&&t>Cc&&hn.splice(t,1)}function cb(){!Rc&&!Mc&&(Mc=!0,queueMicrotask(ab))}function ab(){Mc=!1,Rc=!0;for(let e=0;ee.effect(t,{scheduler:n=>{Nc?sb(n):n()}}),Rh=e.raw}function Vl(e){Rn=e}function fb(e){let t=()=>{};return[r=>{let s=Rn(r);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(s),t=()=>{s!==void 0&&(e._x_effects.delete(s),yr(s))},s},()=>{t()}]}function Ch(e,t){let n=!0,r,s=Rn(()=>{let o=e();JSON.stringify(o),n?r=o:queueMicrotask(()=>{t(o,r),r=o}),n=!1});return()=>yr(s)}var Nh=[],Fh=[],Ph=[];function db(e){Ph.push(e)}function za(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Fh.push(t))}function jh(e){Nh.push(e)}function Lh(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}function Kh(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([n,r])=>{(t===void 0||t.includes(n))&&(r.forEach(s=>s()),delete e._x_attributeCleanups[n])})}function hb(e){var t,n;for((t=e._x_effects)==null||t.forEach(ib);(n=e._x_cleanups)!=null&&n.length;)e._x_cleanups.pop()()}var Ya=new MutationObserver(eu),Za=!1;function Qa(){Ya.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Za=!0}function Dh(){pb(),Ya.disconnect(),Za=!1}var Mr=[];function pb(){let e=Ya.takeRecords();Mr.push(()=>e.length>0&&eu(e));let t=Mr.length;queueMicrotask(()=>{if(Mr.length===t)for(;Mr.length>0;)Mr.shift()()})}function re(e){if(!Za)return e();Dh();let t=e();return Qa(),t}var Xa=!1,Io=[];function mb(){Xa=!0}function gb(){Xa=!1,eu(Io),Io=[]}function eu(e){if(Xa){Io=Io.concat(e);return}let t=[],n=new Set,r=new Map,s=new Map;for(let o=0;o{i.nodeType===1&&i._x_marker&&n.add(i)}),e[o].addedNodes.forEach(i=>{if(i.nodeType===1){if(n.has(i)){n.delete(i);return}i._x_marker||t.push(i)}})),e[o].type==="attributes")){let i=e[o].target,c=e[o].attributeName,a=e[o].oldValue,l=()=>{r.has(i)||r.set(i,[]),r.get(i).push({name:c,value:i.getAttribute(c)})},f=()=>{s.has(i)||s.set(i,[]),s.get(i).push(c)};i.hasAttribute(c)&&a===null?l():i.hasAttribute(c)?(f(),l()):f()}s.forEach((o,i)=>{Kh(i,o)}),r.forEach((o,i)=>{Nh.forEach(c=>c(i,o))});for(let o of n)t.some(i=>i.contains(o))||Fh.forEach(i=>i(o));for(let o of t)o.isConnected&&Ph.forEach(i=>i(o));t=null,n=null,r=null,s=null}function Uh(e){return ws(Zn(e))}function Ss(e,t,n){return e._x_dataStack=[t,...Zn(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter(r=>r!==t)}}function Zn(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?Zn(e.host):e.parentNode?Zn(e.parentNode):[]}function ws(e){return new Proxy({objects:e},_b)}var _b={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(n=>Object.prototype.hasOwnProperty.call(n,t)||Reflect.has(n,t))},get({objects:e},t,n){return t=="toJSON"?yb:Reflect.get(e.find(r=>Reflect.has(r,t))||{},t,n)},set({objects:e},t,n,r){const s=e.find(i=>Object.prototype.hasOwnProperty.call(i,t))||e[e.length-1],o=Object.getOwnPropertyDescriptor(s,t);return o!=null&&o.set&&(o!=null&&o.get)?o.set.call(r,n)||!0:Reflect.set(s,t,n)}};function yb(){return Reflect.ownKeys(this).reduce((t,n)=>(t[n]=Reflect.get(this,n),t),{})}function Bh(e){let t=r=>typeof r=="object"&&!Array.isArray(r)&&r!==null,n=(r,s="")=>{Object.entries(Object.getOwnPropertyDescriptors(r)).forEach(([o,{value:i,enumerable:c}])=>{if(c===!1||i===void 0||typeof i=="object"&&i!==null&&i.__v_skip)return;let a=s===""?o:`${s}.${o}`;typeof i=="object"&&i!==null&&i._x_interceptor?r[o]=i.initialize(e,a,o):t(i)&&i!==r&&!(i instanceof Element)&&n(i,a)})};return n(e)}function qh(e,t=()=>{}){let n={initialValue:void 0,_x_interceptor:!0,initialize(r,s,o){return e(this.initialValue,()=>bb(r,s),i=>Fc(r,s,i),s,o)}};return t(n),r=>{if(typeof r=="object"&&r!==null&&r._x_interceptor){let s=n.initialize.bind(n);n.initialize=(o,i,c)=>{let a=r.initialize(o,i,c);return n.initialValue=a,s(o,i,c)}}else n.initialValue=r;return n}}function bb(e,t){return t.split(".").reduce((n,r)=>n[r],e)}function Fc(e,t,n){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=n;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Fc(e[t[0]],t.slice(1),n)}}var Jh={};function ht(e,t){Jh[e]=t}function Pc(e,t){let n=Sb(t);return Object.entries(Jh).forEach(([r,s])=>{Object.defineProperty(e,`$${r}`,{get(){return s(t,n)},enumerable:!1})}),e}function Sb(e){let[t,n]=Yh(e),r={interceptor:qh,...t};return za(e,n),r}function wb(e,t,n,...r){try{return n(...r)}catch(s){rs(s,e,t)}}function rs(e,t,n=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message} +var nb=Object.defineProperty;var Dl=e=>{throw TypeError(e)};var rb=(e,t,n)=>t in e?nb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var u=(e,t,n)=>rb(e,typeof t!="symbol"?t+"":t,n),Ul=(e,t,n)=>t.has(e)||Dl("Cannot "+n);var Bl=(e,t,n)=>(Ul(e,t,"read from private field"),n?n.call(e):t.get(e)),ql=(e,t,n)=>t.has(e)?Dl("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),Jl=(e,t,n,r)=>(Ul(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();var Mc=!1,Rc=!1,pn=[],Cc=-1;function sb(e){ob(e)}function ob(e){pn.includes(e)||pn.push(e),cb()}function ib(e){let t=pn.indexOf(e);t!==-1&&t>Cc&&pn.splice(t,1)}function cb(){!Rc&&!Mc&&(Mc=!0,queueMicrotask(ab))}function ab(){Mc=!1,Rc=!0;for(let e=0;ee.effect(t,{scheduler:n=>{Nc?sb(n):n()}}),Rh=e.raw}function Vl(e){Rn=e}function fb(e){let t=()=>{};return[r=>{let s=Rn(r);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(s),t=()=>{s!==void 0&&(e._x_effects.delete(s),yr(s))},s},()=>{t()}]}function Ch(e,t){let n=!0,r,s=Rn(()=>{let o=e();JSON.stringify(o),n?r=o:queueMicrotask(()=>{t(o,r),r=o}),n=!1});return()=>yr(s)}var Nh=[],Fh=[],Ph=[];function db(e){Ph.push(e)}function za(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Fh.push(t))}function jh(e){Nh.push(e)}function Lh(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}function Kh(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([n,r])=>{(t===void 0||t.includes(n))&&(r.forEach(s=>s()),delete e._x_attributeCleanups[n])})}function hb(e){var t,n;for((t=e._x_effects)==null||t.forEach(ib);(n=e._x_cleanups)!=null&&n.length;)e._x_cleanups.pop()()}var Ya=new MutationObserver(eu),Za=!1;function Qa(){Ya.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Za=!0}function Dh(){pb(),Ya.disconnect(),Za=!1}var Mr=[];function pb(){let e=Ya.takeRecords();Mr.push(()=>e.length>0&&eu(e));let t=Mr.length;queueMicrotask(()=>{if(Mr.length===t)for(;Mr.length>0;)Mr.shift()()})}function re(e){if(!Za)return e();Dh();let t=e();return Qa(),t}var Xa=!1,Io=[];function mb(){Xa=!0}function gb(){Xa=!1,eu(Io),Io=[]}function eu(e){if(Xa){Io=Io.concat(e);return}let t=[],n=new Set,r=new Map,s=new Map;for(let o=0;o{i.nodeType===1&&i._x_marker&&n.add(i)}),e[o].addedNodes.forEach(i=>{if(i.nodeType===1){if(n.has(i)){n.delete(i);return}i._x_marker||t.push(i)}})),e[o].type==="attributes")){let i=e[o].target,c=e[o].attributeName,a=e[o].oldValue,l=()=>{r.has(i)||r.set(i,[]),r.get(i).push({name:c,value:i.getAttribute(c)})},f=()=>{s.has(i)||s.set(i,[]),s.get(i).push(c)};i.hasAttribute(c)&&a===null?l():i.hasAttribute(c)?(f(),l()):f()}s.forEach((o,i)=>{Kh(i,o)}),r.forEach((o,i)=>{Nh.forEach(c=>c(i,o))});for(let o of n)t.some(i=>i.contains(o))||Fh.forEach(i=>i(o));for(let o of t)o.isConnected&&Ph.forEach(i=>i(o));t=null,n=null,r=null,s=null}function Uh(e){return ws(Zn(e))}function Ss(e,t,n){return e._x_dataStack=[t,...Zn(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter(r=>r!==t)}}function Zn(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?Zn(e.host):e.parentNode?Zn(e.parentNode):[]}function ws(e){return new Proxy({objects:e},_b)}var _b={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(n=>Object.prototype.hasOwnProperty.call(n,t)||Reflect.has(n,t))},get({objects:e},t,n){return t=="toJSON"?yb:Reflect.get(e.find(r=>Reflect.has(r,t))||{},t,n)},set({objects:e},t,n,r){const s=e.find(i=>Object.prototype.hasOwnProperty.call(i,t))||e[e.length-1],o=Object.getOwnPropertyDescriptor(s,t);return o!=null&&o.set&&(o!=null&&o.get)?o.set.call(r,n)||!0:Reflect.set(s,t,n)}};function yb(){return Reflect.ownKeys(this).reduce((t,n)=>(t[n]=Reflect.get(this,n),t),{})}function Bh(e){let t=r=>typeof r=="object"&&!Array.isArray(r)&&r!==null,n=(r,s="")=>{Object.entries(Object.getOwnPropertyDescriptors(r)).forEach(([o,{value:i,enumerable:c}])=>{if(c===!1||i===void 0||typeof i=="object"&&i!==null&&i.__v_skip)return;let a=s===""?o:`${s}.${o}`;typeof i=="object"&&i!==null&&i._x_interceptor?r[o]=i.initialize(e,a,o):t(i)&&i!==r&&!(i instanceof Element)&&n(i,a)})};return n(e)}function qh(e,t=()=>{}){let n={initialValue:void 0,_x_interceptor:!0,initialize(r,s,o){return e(this.initialValue,()=>bb(r,s),i=>Fc(r,s,i),s,o)}};return t(n),r=>{if(typeof r=="object"&&r!==null&&r._x_interceptor){let s=n.initialize.bind(n);n.initialize=(o,i,c)=>{let a=r.initialize(o,i,c);return n.initialValue=a,s(o,i,c)}}else n.initialValue=r;return n}}function bb(e,t){return t.split(".").reduce((n,r)=>n[r],e)}function Fc(e,t,n){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=n;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Fc(e[t[0]],t.slice(1),n)}}var Jh={};function mt(e,t){Jh[e]=t}function Pc(e,t){let n=Sb(t);return Object.entries(Jh).forEach(([r,s])=>{Object.defineProperty(e,`$${r}`,{get(){return s(t,n)},enumerable:!1})}),e}function Sb(e){let[t,n]=Yh(e),r={interceptor:qh,...t};return za(e,n),r}function wb(e,t,n,...r){try{return n(...r)}catch(s){rs(s,e,t)}}function rs(e,t,n=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message} ${n?'Expression: "'+n+`" -`:""}`,t),setTimeout(()=>{throw e},0)}var fo=!0;function Vh(e){let t=fo;fo=!1;let n=e();return fo=t,n}function pn(e,t,n={}){let r;return Re(e,t)(s=>r=s,n),r}function Re(...e){return Hh(...e)}var Hh=Wh;function vb(e){Hh=e}function Wh(e,t){let n={};Pc(n,e);let r=[n,...Zn(e)],s=typeof t=="function"?kb(r,t):Eb(r,t,e);return wb.bind(null,e,t,s)}function kb(e,t){return(n=()=>{},{scope:r={},params:s=[]}={})=>{let o=t.apply(ws([r,...e]),s);Ao(n,o)}}var ec={};function Ob(e,t){if(ec[e])return ec[e];let n=Object.getPrototypeOf(async function(){}).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,o=(()=>{try{let i=new n(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`);return Object.defineProperty(i,"name",{value:`[Alpine] ${e}`}),i}catch(i){return rs(i,t,e),Promise.resolve()}})();return ec[e]=o,o}function Eb(e,t,n){let r=Ob(t,n);return(s=()=>{},{scope:o={},params:i=[]}={})=>{r.result=void 0,r.finished=!1;let c=ws([o,...e]);if(typeof r=="function"){let a=r(r,c).catch(l=>rs(l,n,t));r.finished?(Ao(s,r.result,c,i,n),r.result=void 0):a.then(l=>{Ao(s,l,c,i,n)}).catch(l=>rs(l,n,t)).finally(()=>r.result=void 0)}}}function Ao(e,t,n,r,s){if(fo&&typeof t=="function"){let o=t.apply(n,r);o instanceof Promise?o.then(i=>Ao(e,i,n,r)).catch(i=>rs(i,s,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var tu="x-";function br(e=""){return tu+e}function Tb(e){tu=e}var Mo={};function pe(e,t){return Mo[e]=t,{before(n){if(!Mo[n]){console.warn(String.raw`Cannot find directive \`${n}\`. \`${e}\` will use the default order of execution`);return}const r=un.indexOf(n);un.splice(r>=0?r:un.indexOf("DEFAULT"),0,e)}}}function xb(e){return Object.keys(Mo).includes(e)}function nu(e,t,n){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([c,a])=>({name:c,value:a})),i=Gh(o);o=o.map(c=>i.find(a=>a.name===c.name)?{name:`x-bind:${c.name}`,value:`"${c.value}"`}:c),t=t.concat(o)}let r={};return t.map(Xh((o,i)=>r[o]=i)).filter(tp).map(Ab(r,n)).sort(Mb).map(o=>Ib(e,o))}function Gh(e){return Array.from(e).map(Xh()).filter(t=>!tp(t))}var jc=!1,Ur=new Map,zh=Symbol();function $b(e){jc=!0;let t=Symbol();zh=t,Ur.set(t,[]);let n=()=>{for(;Ur.get(t).length;)Ur.get(t).shift()();Ur.delete(t)},r=()=>{jc=!1,n()};e(n),r()}function Yh(e){let t=[],n=c=>t.push(c),[r,s]=fb(e);return t.push(s),[{Alpine:vs,effect:r,cleanup:n,evaluateLater:Re.bind(Re,e),evaluate:pn.bind(pn,e)},()=>t.forEach(c=>c())]}function Ib(e,t){let n=()=>{},r=Mo[t.type]||n,[s,o]=Yh(e);Lh(e,t.original,o);let i=()=>{e._x_ignore||e._x_ignoreSelf||(r.inline&&r.inline(e,t,s),r=r.bind(r,e,t,s),jc?Ur.get(zh).push(r):r())};return i.runCleanups=o,i}var Zh=(e,t)=>({name:n,value:r})=>(n.startsWith(e)&&(n=n.replace(e,t)),{name:n,value:r}),Qh=e=>e;function Xh(e=()=>{}){return({name:t,value:n})=>{let{name:r,value:s}=ep.reduce((o,i)=>i(o),{name:t,value:n});return r!==t&&e(r,t),{name:r,value:s}}}var ep=[];function ru(e){ep.push(e)}function tp({name:e}){return np().test(e)}var np=()=>new RegExp(`^${tu}([^:^.]+)\\b`);function Ab(e,t){return({name:n,value:r})=>{let s=n.match(np()),o=n.match(/:([a-zA-Z0-9\-_:]+)/),i=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],c=t||e[n]||n;return{type:s?s[1]:null,value:o?o[1]:null,modifiers:i.map(a=>a.replace(".","")),expression:r,original:c}}}var Lc="DEFAULT",un=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",Lc,"teleport"];function Mb(e,t){let n=un.indexOf(e.type)===-1?Lc:e.type,r=un.indexOf(t.type)===-1?Lc:t.type;return un.indexOf(n)-un.indexOf(r)}function zr(e,t,n={}){e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0,cancelable:!0}))}function wn(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(s=>wn(s,t));return}let n=!1;if(t(e,()=>n=!0),n)return;let r=e.firstElementChild;for(;r;)wn(r,t),r=r.nextElementSibling}function Ze(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var Hl=!1;function Rb(){Hl&&Ze("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),Hl=!0,document.body||Ze("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` CV Maker - - + + diff --git a/docs/cv-maker/john-doe.json b/docs/cv-maker/john-doe.json index 7489300..4f59a0f 100644 --- a/docs/cv-maker/john-doe.json +++ b/docs/cv-maker/john-doe.json @@ -8,6 +8,13 @@ "expertise": [ "Frontend", "UI/UX" ], + "coverLetter": { + "position": "React developer", + "content": [ + "I'm really good at fronted and I will be great asset at your company", + "Your company needs a developer who can work remotely. I've experience working experience in distibuted teams" + ] + }, "expertSummary": [ "Skillful frontend developer with UX/UI practical experience" ], diff --git a/docs/cv-maker/resume-schema.json b/docs/cv-maker/resume-schema.json index 205ac82..f1cfe8f 100644 --- a/docs/cv-maker/resume-schema.json +++ b/docs/cv-maker/resume-schema.json @@ -51,6 +51,26 @@ "name": { "$ref": "#/$defs/NonEmptyString" }, + "coverLetter": { + "type": "object", + "required": [ + "position", + "content" + ], + "properties": { + "position": { + "$ref": "#/$defs/NonEmptyString" + }, + "content": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + } + }, + "additionalProperties": false + }, "expertise": { "type": "array", "minItems": 1, diff --git a/src/cv-maker/core/schema.ts b/src/cv-maker/core/schema.ts index 158ce21..db4681a 100644 --- a/src/cv-maker/core/schema.ts +++ b/src/cv-maker/core/schema.ts @@ -63,6 +63,11 @@ export class EmploymentRecord export class Me extends S.Class("Me")({ name: S.NonEmptyString, + coverLetter: + S.Struct({ + position: S.NonEmptyString, + content: S.NonEmptyString.pipe(S.NonEmptyArray) + }).pipe(S.optional), expertise: S.NonEmptyString.pipe(S.NonEmptyArray), location: S.NonEmptyString.pipe(S.optional), phone: S.NonEmptyString.pipe(S.optional), @@ -86,5 +91,5 @@ export class ResumeObject $schema: S.NonEmptyString.pipe(S.optional), me: Me, technologies: ProjectTechnology.pipe(S.NonEmptyArray), - employmentHistory: EmploymentRecord.pipe(S.NonEmptyArray) + employmentHistory: EmploymentRecord.pipe(S.NonEmptyArray), }) { }; diff --git a/src/cv-maker/core/template.tsx b/src/cv-maker/core/template.tsx index 7844ae3..22e9051 100644 --- a/src/cv-maker/core/template.tsx +++ b/src/cv-maker/core/template.tsx @@ -2,50 +2,63 @@ import { EmploymentRecord, ProjectDetails, ProjectTechnology, ResumeObject } fro import { DateTime, pipe, Array } from "effect"; export function Resume(resume: ResumeObject) { + const coverLetter = resume.me.coverLetter; return (
- {ResumeHead(resume)} + {ResumeHead(resume)} -
- Summary -
- -
- {resume.me.expertSummary.map(s => -

- )} -
- -
- Skills -
- -
- - {Object.entries(getSkills(resume)).map(([ category, group ]) => -
- {category} -
- {group.map(t => - {t.technology.name} - )} + {coverLetter ? ( +
+
+ Why I'm the Right Choice for "{coverLetter.position}" +
+
+ {coverLetter.content.map(line =>

)} +
+
+ ): null} + +
+ Summary +
+ +
+ {resume.me.expertSummary.map(s => +

+ )} +
+ +
+ Skills +
+ +
+ + {Object.entries(getSkills(resume)).map(([category, group]) => +
+ {category} +
+ {group.map(t => + {t.technology.name} + )} +
+
+ )} + +
+ +
+ Employment +
+ +
+ {EmploymentHistory(resume)}
- )} - -
-
- Employment -
- -
- {EmploymentHistory(resume)} -
-
- + ) } @@ -120,27 +133,27 @@ function ResumeHead(resume: ResumeObject) { function CompanyProject(project: ProjectDetails) { return (
-
-
- Project: - {project.title} -
-
- Roles: - {project.roles.join('/')} +
+
+ Project: + {project.title} +
+
+ Roles: + {project.roles.join('/')} +
+ Stack: {ProjectStack(project)} +
    + {project.achivements.map(achivement => +
    +
  • {achivement.human ?? achivement.technical}
  • +
    + )} +
- Stack: {ProjectStack(project)} -
    - {project.achivements.map(achivement => -
    -
  • {achivement.human ?? achivement.technical}
  • -
    - )} -
-
) } diff --git a/src/cv-maker/static/john-doe.json b/src/cv-maker/static/john-doe.json index 7489300..4f59a0f 100644 --- a/src/cv-maker/static/john-doe.json +++ b/src/cv-maker/static/john-doe.json @@ -8,6 +8,13 @@ "expertise": [ "Frontend", "UI/UX" ], + "coverLetter": { + "position": "React developer", + "content": [ + "I'm really good at fronted and I will be great asset at your company", + "Your company needs a developer who can work remotely. I've experience working experience in distibuted teams" + ] + }, "expertSummary": [ "Skillful frontend developer with UX/UI practical experience" ], diff --git a/src/cv-maker/static/resume-schema.json b/src/cv-maker/static/resume-schema.json index 205ac82..f1cfe8f 100644 --- a/src/cv-maker/static/resume-schema.json +++ b/src/cv-maker/static/resume-schema.json @@ -51,6 +51,26 @@ "name": { "$ref": "#/$defs/NonEmptyString" }, + "coverLetter": { + "type": "object", + "required": [ + "position", + "content" + ], + "properties": { + "position": { + "$ref": "#/$defs/NonEmptyString" + }, + "content": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/NonEmptyString" + } + } + }, + "additionalProperties": false + }, "expertise": { "type": "array", "minItems": 1, diff --git a/src/cv-maker/style.css b/src/cv-maker/style.css index d240493..9976c2b 100644 --- a/src/cv-maker/style.css +++ b/src/cv-maker/style.css @@ -92,7 +92,7 @@ div#contact { div#profiles { display: flex; gap: 5px; - padding-top: 5px; + padding-top: 10px; padding-bottom: 5px; text-decoration: none; }