jsonresume-theme-cjean 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A clean, professional [JSON Resume](https://jsonresume.org/) theme built with Tailwind CSS and TypeScript.
4
4
 
5
+ ![Theme Preview](https://i.imgur.com/lWBFRBK.png)
6
+
5
7
  ## Features
6
8
 
7
9
  - **Responsive Design**: Looks great on mobile and desktop.
@@ -9,7 +11,8 @@ A clean, professional [JSON Resume](https://jsonresume.org/) theme built with Ta
9
11
  - **SEO Ready**: Full support for Meta tags, OpenGraph, Twitter Cards, and JSON-LD.
10
12
  - **Customizable Aesthetics**: Easy branding via granular `ui` configuration and geometric patterns.
11
13
  - **Multi-locale Support**: Comes with `fr` and `en`. Locales are managed in a single file (`i18n.ts`) — feel free to contribute yours!
12
- - **Modern Tech Stack**: Built with Bun, TypeScript, and functional components.
14
+ - **Modern Tech Stack**: Built with Bun, TypeScript, and JSX components.
15
+ - **CLI**: Built-in CLI to render your resume to an HTML file.
13
16
 
14
17
  ## Usage
15
18
 
@@ -25,18 +28,20 @@ bun install
25
28
  bun run build
26
29
  ```
27
30
 
28
- ### Resume Commands
31
+ ### Execution (CLI)
32
+
33
+ While this theme is compatible with the official [resume-cli](https://github.com/jsonresume/resume-cli), it also comes with its own built-in CLI to render your resume to an HTML file:
29
34
 
30
- To export your resume to an HTML file:
35
+ #### Using npx
31
36
 
32
37
  ```bash
33
- bun run resume:export
38
+ npx jsonresume-theme-cjean resume.json -o resume.html
34
39
  ```
35
40
 
36
- To live preview your resume (auto-reloads on changes):
41
+ #### Using bunx
37
42
 
38
43
  ```bash
39
- bun run resume:serve
44
+ bunx jsonresume-theme-cjean resume.json -o resume.html
40
45
  ```
41
46
 
42
47
  ## Configuration
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { parseArgs } from "node:util";
5
+ import { render } from "../dist/index.js";
6
+
7
+ async function main() {
8
+ const { values, positionals } = parseArgs({
9
+ args: process.argv.slice(2),
10
+ options: {
11
+ help: { type: "boolean", short: "h" },
12
+ output: { type: "string", short: "o" },
13
+ },
14
+ allowPositionals: true,
15
+ });
16
+
17
+ if (values.help) {
18
+ console.log(`
19
+ Usage: npx jsonresume-theme-cjean [resume.json]
20
+
21
+ Options:
22
+ -o, --output <file> Output file (default: resume.html)
23
+ -h, --help Show help
24
+ `);
25
+ return;
26
+ }
27
+
28
+ const input = positionals[0] || "resume.json";
29
+ const output = values.output || "resume.html";
30
+
31
+ try {
32
+ console.log(`⌛ Rendering resume from ${input}...`);
33
+ const resumePath = resolve(process.cwd(), input);
34
+ const resumeData = JSON.parse(await readFile(resumePath, "utf-8"));
35
+ const html = await render(resumeData);
36
+ const outputPath = resolve(process.cwd(), output);
37
+ await writeFile(outputPath, html);
38
+ console.log(`✅ Successfully exported resume to ${output}`);
39
+ } catch (error) {
40
+ if (error.code === 'ENOENT') {
41
+ console.error(`❌ Error: File not found: ${error.path}`);
42
+ } else {
43
+ console.error(`❌ Error: ${error.message}`);
44
+ }
45
+ process.exit(1);
46
+ }
47
+ }
48
+
49
+ main();
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t={}){return e.replace(/\{([\w-]+?)\}/g,(e,n)=>{let r=t[n];return r===void 0?e:String(r)})}function t(t,n){return(r,...i)=>{let a=t[r]??r,o=i[0]||{},s={locale:n?.locale,key:r};return n?.interpolate?n.interpolate(a,o,s):i.length===0?a:e(a,o)}}function n(){return e=>e}var r=new Map([[`&`,`&amp;`],[`<`,`&lt;`],[`>`,`&gt;`],[`"`,`&quot;`],[`'`,`&#x27;`]]),i=new Set([`href`,`src`,`action`,`formaction`,`cite`,`poster`,`icon`,`data`,`xlink:href`]),a=/[&<>]/g,o=/[&<>"]/g,s=/\p{C}/gu,c=/^[^\s"'>/=]+$/u,l=/^(?:java|vb)script:/i,u=/^data:(?!image\/)/i,d=e=>e.replace(s,``),f=(e,t=`content`)=>{let n=t===`attr`?o:a;return e.replaceAll(n,e=>r.get(e)??e)},ee=e=>{let t=d(e).trim();return t?!(l.test(t)||u.test(t)):!0},te=e=>c.test(e),ne=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]),re=/[A-Z]/g,ie=/^on[a-z]/i,ae=/expression\s*\(|javascript\s*:/i,oe=/url\(\s*(['"]?)(.*?)\1\s*\)/gi,se=new Set([`children`,`dangerouslySetInnerHTML`,`key`,`ref`]),ce=new Map([[`htmlFor`,`for`],[`acceptCharset`,`accept-charset`],[`httpEquiv`,`http-equiv`],[`xlinkHref`,`xlink:href`],[`xmlnsXlink`,`xmlns:xlink`],[`xmlLang`,`xml:lang`],[`xmlBase`,`xml:base`],[`xmlSpace`,`xml:space`]]),le=e=>{if(e instanceof Promise)return!0;if(Array.isArray(e)){for(let t=0;t<e.length;t++)if(le(e[t]))return!0}return!1},p=e=>{if(!e)return!1;if(e instanceof Promise)return!0;if(Array.isArray(e)){for(let t=0;t<e.length;t++)if(p(e[t]))return!0;return!1}if(typeof e==`object`){for(let t of Object.values(e))if(p(t))return!0}return!1},m=async e=>{if(e instanceof Promise)return m(await e);if(Array.isArray(e))return Promise.all(e.map(e=>m(e)));if(e&&typeof e==`object`){let t=await Promise.all(Object.entries(e).map(async([e,t])=>[e,await m(t)]));return Object.fromEntries(t)}return e},ue=e=>{let t=d(e);if(ae.test(t))return!1;oe.lastIndex=0;let n;for(;n=oe.exec(t);)if(!ee(n[2].trim()))return!1;return!0},h=class{value;constructor(e){this.value=e}toString(){return this.value}};function de(e){if(!e)return``;let t=Object.keys(e);for(let n=0;n<t.length;n++){let r=t[n],i=r?e[r]:void 0;if(r&&(le(i)||r===`style`&&typeof i==`object`&&p(i)))return Promise.all(t.map(async t=>[t,await e[t]])).then(e=>m(Object.fromEntries(e))).then(e=>fe(e))}return fe(e)}function fe(e){let t=``,n=new Set,r=Object.keys(e);for(let a=0;a<r.length;a++){let o=r[a];if(!o)continue;let s=e[o];if(se.has(o)||s===!1||s==null)continue;if(o===`class`||o===`className`){if(typeof s==`string`)for(let e of s.split(/\s+/))e&&n.add(e);continue}let c=ce.get(o)||d(o);if(te(c)&&!(ie.test(o)||ie.test(c)))if(c===`style`)if(typeof s==`object`){let e=pe(s);if(!e)continue;t+=` style="${f(e,`attr`)}"`}else{let e=String(s);if(!ue(e)||!e)continue;t+=` style="${f(e,`attr`)}"`}else if(s===!0)t+=` ${c}`;else{let e=String(s);i.has(c)&&!ee(e)&&(e=`#blocked`),t+=` ${c}="${f(e,`attr`)}"`}}return n.size>0&&(t=` class="${f([...n].join(` `),`attr`)}"`+t),t}function pe(e){let t=[];for(let[n,r]of Object.entries(e)){if(r==null)continue;let e=n.startsWith(`--`)?n:n.replace(re,`-$&`).toLowerCase(),i=String(r);ue(i)&&t.push(`${e}:${i}`)}return t.join(`;`)}function g(e){if(e==null||e===!0||e===!1)return``;if(e instanceof h)return e;if(e instanceof Promise)return e.then(g).then(e=>e instanceof h?e:new h(f(String(e))));if(Array.isArray(e)){let t=e.length,n=Array(t),r=!1;for(let i=0;i<t;i++){let t=g(e[i]);n[i]=t,t instanceof Promise&&(r=!0)}if(!r){let e=``;for(let r=0;r<t;r++){let t=n[r];e+=t instanceof h?t.value:f(String(t))}return new h(e)}return Promise.all(n).then(e=>{let t=``;for(let n=0;n<e.length;n++){let r=e[n];t+=r instanceof h?r.value:f(String(r))}return new h(t)})}return String(e)}function me(e,t,n){let r=de(t),i=t.dangerouslySetInnerHTML?new h(t.dangerouslySetInnerHTML.__html==null?``:String(t.dangerouslySetInnerHTML.__html)):g(n);return r instanceof Promise||i instanceof Promise?Promise.all([r,i]).then(([t,n])=>he(e,t,n)):he(e,r,i)}function he(e,t,n){return ne.has(e)?new h(`<${e}${t}>`):new h(`<${e}${t}>${n instanceof h?n.value:f(String(n))}</${e}>`)}function _(e,t,...n){let r={...t||{}};n.length>0&&r.children===void 0&&(r.children=n.length===1?n[0]:n);let i=r.children;return typeof e==`function`?e(r):me(e,r,Array.isArray(i)?i:i===void 0?[]:[i])}var v=_;function y({children:e}){return e}var ge={en:n()({work_experience:`Work Experience`,education:`Education`,skills:`Skills`,present:`Present`,contact_info:`Contact Information`,phone_call:`Call mobile phone`,email_send:`Send email`,show_address:`Show address`,portrait_alt:`Portrait of {name}`,last_modified:`Last updated on {date}`,profile_page_name:`{name}'s resume - {label}`,theme_credit:`Theme made with love by {link}`}),fr:n()({work_experience:`Expériences professionnelles`,education:`Formations`,skills:`Compétences`,present:`Présent`,contact_info:`Informations de contact`,phone_call:`Appeler sur le téléphone mobile`,email_send:`Envoyer un email`,show_address:`Afficher l'adresse`,portrait_alt:`Portrait de {name}`,last_modified:`Dernière mise à jour le {date}`,profile_page_name:`CV de {name} - {label}`,theme_credit:`Thème proposé avec amour par {link}`})},b=void 0,x=`en`,S=(e,...n)=>(b||=t(ge[x]),b(e,...n)),_e=(e,...t)=>new h(S(e,...t));function ve(e){x=e,b=t(ge[e])}var C={normalize(e){let t=typeof e==`string`?new Date(e):e;return isNaN(t.getTime())?null:t},format(e,t){let n=this.normalize(e);if(!n)return``;let r=x===void 0?`fr-FR`:x;switch(t){case`month`:return new Intl.DateTimeFormat(r,{month:`long`,year:`numeric`}).format(n);case`year`:return n.getFullYear().toString();case`date`:return new Intl.DateTimeFormat(r,{day:`numeric`,month:`numeric`,year:`numeric`}).format(n);case`iso`:return n.toISOString();default:throw Error(`Unhandled date format: ${t}`)}},toISO(e){return this.normalize(e)?.toISOString()??``}},ye=class{seed;constructor(e){this.seed=e}next(){return this.seed=this.seed*16807%2147483647,(this.seed-1)/2147483646}};function be(e={}){let{width:t=900,height:n=300,cellSize:r=50,variance:i=.75,seed:a=1}=e,o=new ye(a),s=Te(t,n,we(xe(t,n,r,i,o),o));return`data:image/svg+xml,${encodeURIComponent(s).replace(/%20/g,` `).replace(/%3D/g,`=`).replace(/%3A/g,`:`).replace(/%2F/g,`/`).replace(/%22/g,`'`)}`}function xe(e,t,n,r,i){let a=[],o=Math.ceil(e/n)+2,s=Math.ceil(t/n)+2;for(let e=0;e<s;e++){let t=[];for(let a=0;a<o;a++){let o=Math.round((a-.5)*n+(i.next()-.5)*n*r),s=Math.round((e-.5)*n+(i.next()-.5)*n*r);t.push({x:o,y:s})}a.push(t)}return a}function Se(e){let t=e.next();return(t>.5?`#000000`:`#ffffff`)+(Math.round(t*5)*5).toString(16).padStart(2,`0`)}function Ce(e,t){let[n,r,i]=e;return`m${n.x-t.x} ${n.y-t.y} ${r.x-n.x} ${r.y-n.y} ${i.x-r.x} ${i.y-r.y}`.replace(/ -/g,`-`)}function we(e,t){let n={},r={},i=e.length,a=e[0]?.length??0;for(let o=0;o<i-1;o++)for(let i=0;i<a-1;i++)[[e[o][i],e[o][i+1],e[o+1][i]],[e[o][i+1],e[o+1][i+1],e[o+1][i]]].forEach(e=>{let i=Se(t);n[i]||(n[i]=``,r[i]={x:0,y:0});let a=r[i],o=Ce(e,a);n[i]+=o,r[i]=e[2]});return n}function Te(e,t,n){let r=``;for(let[e,t]of Object.entries(n))r+=`<path fill="${e}" d="${t}"/>`;return`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${t}" viewBox="0 0 ${e} ${t}" preserveAspectRatio="xMidYMid slice">${r}</svg>`}function Ee({name:e,label:t,children:n,...r}){return v(`header`,{className:`flex-1 grow border-b border-gray-100 pb-8 dark:border-white/5`,...r,children:[_(`h1`,{className:`text-primary kerning-normal inline-block text-5xl font-extrabold tracking-tight uppercase sm:text-6xl`,children:e}),t&&_(`p`,{className:`mt-2 text-3xl font-light tracking-wide text-gray-500 dark:text-slate-400`,children:t}),n]})}function w({date:e,format:t,children:n,...r}){let i=C.normalize(e);if(!i)return _(`span`,{...r,children:n});let a=n;return t&&!a&&(a=C.format(i,t)),_(`time`,{dateTime:C.toISO(i),...r,children:a})}function T({startDate:e,endDate:t,format:n,...r}){return!e&&!t?null:_(`div`,{...r,children:e?v(y,{children:[_(w,{date:e,format:n}),`\xA0—\xA0`,t?_(w,{date:t,format:n}):_(`span`,{className:`text-primary font-bold`,children:S(`present`)})]}):_(w,{date:t,format:n})})}function E({name:e,children:t,...n}){let r=e?`section-${e.toLowerCase().replace(/\s+/g,`-`)}`:void 0;return v(`section`,{"aria-labelledby":r,...n,children:[e&&_(`h2`,{id:r,className:`before:bg-primary relative mt-8 mb-4 break-after-avoid text-2xl tracking-tight text-gray-900 before:absolute before:-bottom-1 before:left-0 before:h-1 before:w-[3ch] before:rounded-[0_0.25rem_0.25rem_0] dark:text-white before:print:[print-color-adjust:exact]`,children:e}),t]})}function De({education:e,certificates:t}){let n=e&&e.length>0,r=t&&t.length>0;return!n&&!r?null:_(E,{name:S(`education`),children:v(`ol`,{className:`timeline`,children:[e?.map((e,t)=>_(`li`,{className:`timeline-item`,children:_(`article`,{className:`group`,children:_(`div`,{className:`min-w-0 flex-1`,children:v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.studyType})}),v(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:[e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.institution}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.institution}),e.area&&v(`span`,{className:`ml-2 text-sm text-gray-500`,children:[`- `,e.area]})]})]}),_(T,{startDate:e.startDate,endDate:e.endDate,format:`year`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]})})})},`edu-${t}`)),t?.map((e,t)=>_(`li`,{className:`timeline-item timeline-item-secondary`,children:_(`article`,{className:`group`,children:_(`div`,{className:`min-w-0 flex-1`,children:v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.name})}),_(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.issuer}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.issuer})})]}),_(T,{endDate:e.date,format:`year`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]})})})},`cert-${t}`))]})})}var Oe=async(e,t={})=>{let n=new URL(`https://api.iconify.design/${e}.svg`);for(let[e,r]of Object.entries(t))r&&n.searchParams.set(e,r.toString());let r=await fetch(n);if(!r.ok)throw Error(`Failed to fetch icon ${e}`);return r.text()},D=async(e,t=24,n=!0)=>{let r=await Oe(e,{height:t});return new h(n?r.replace(`<svg`,`<svg aria-hidden="true"`):r)},ke=({text:e,url:t,icon:n=`tabler:message-circle`,...r})=>v(y,{children:[v(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,id:`cta-fab`,"aria-label":e,className:`fab--extended group fixed right-8 bottom-8 z-20 inline-flex items-center space-x-2 rounded-full bg-black/80 p-4 text-lg whitespace-nowrap text-white shadow-md backdrop-blur-sm transition-colors hover:bg-black dark:bg-gray-700 dark:text-white print:hidden`,...r,children:[_(`span`,{className:`shrink-0`,children:D(n)}),_(`span`,{className:`-mr-2 max-w-0 overflow-hidden text-transparent transition-all duration-300 ease-in-out group-hover:mr-0 group-hover:max-w-96 group-hover:text-inherit group-focus:mr-0 group-focus:max-w-96 group-focus:text-inherit group-[.fab--extended]:mr-0 group-[.fab--extended]:max-w-96 group-[.fab--extended]:text-inherit`,children:e})]}),_(`script`,{dangerouslySetInnerHTML:{__html:`(${Ae.toString()})();`}})]}),Ae=()=>{let e=document.getElementById(`cta-fab`);if(!e||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=window.scrollY||document.documentElement.scrollTop;window.addEventListener(`scroll`,()=>{let n=window.scrollY||document.documentElement.scrollTop,r=n-t;Math.abs(r)>15&&(r>0?e.classList.remove(`fab--extended`):e.classList.add(`fab--extended`),t=Math.max(n,0))},{passive:!0})};function je({meta:e,bgTiles:t,...n}){let r=e.lastModified;return v(`footer`,{className:`bg-angled-gradient from-footer-from to-footer-to relative isolate z-0 -mt-10 h-32 content-center pt-12 pb-2 text-center text-sm text-white dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden`,...n,children:[_(`img`,{src:t,alt:``,loading:`lazy`,className:`absolute inset-0 -z-10 size-full object-cover object-center`,"aria-hidden":`true`}),_(`div`,{children:_e(`last_modified`,{date:_(w,{date:r,children:C.format(r,`date`)})})}),_(`div`,{className:`mt-1 text-xs opacity-75`,children:!e.themeConfig.modest&&_e(`theme_credit`,{link:_(`a`,{href:`https://www.cjean.fr`,target:`_blank`,className:`underline decoration-white/30 underline-offset-2 transition-colors hover:decoration-white/80`,children:`Christophe Jean`})})})]})}var Me=({bgTiles:e})=>_(`div`,{className:`bg-primary bg-angled-gradient from-header-from to-header-to relative h-2.5 overflow-hidden shadow-inner md:-mb-60 md:h-80 dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden`,"aria-hidden":`true`,children:_(`img`,{src:e,alt:``,fetchPriority:`high`,className:`absolute inset-0 size-full object-cover object-center`})});function Ne(e){return`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(e)}`}async function Pe(e){try{return await D(`tabler:brand-${e.toLowerCase()}`)}catch{return D(`tabler:link`)}}var O=({children:e,...t})=>_(`li`,{className:`inline-flex items-center gap-x-1`,...t,children:e});function Fe({basics:e,list:t=[`phone`,`email`,`location`,`profiles`]}){let{phone:n,email:r,location:i,profiles:a=[]}=e,o=new Set,s=e=>{let t=e.toLowerCase();if(t===`phone`&&n)return v(O,{children:[D(`tabler:phone`),_(`a`,{href:`tel:${encodeURIComponent(n)}`,title:S(`phone_call`),children:n})]},`phone`);if(t===`email`&&r)return v(O,{children:[D(`tabler:mail`),_(`a`,{href:`mailto:${r}`,title:S(`email_send`),children:r})]},`email`);if(t===`location`&&i&&i.city&&(i.countryCode||i.region))return v(O,{children:[D(`tabler:map-pin`),v(`a`,{href:Ne([i.city,i.postalCode,i.region,i.countryCode].filter(Boolean).join(`, `)),title:S(`show_address`),target:`_blank`,rel:`noopener noreferrer`,referrerPolicy:`no-referrer`,children:[i.city,`, `,i.countryCode||i.region]})]},`location`);if(t===`profiles`)return a.filter(e=>!o.has(e.network.toLowerCase())).map(e=>(o.add(e.network.toLowerCase()),v(O,{children:[Pe(e.network),_(`a`,{href:e.url,rel:`me noopener noreferrer`,title:e.username,target:`_blank`,referrerPolicy:`no-referrer`,children:e.network})]},e.network)));let s=a.find(e=>e.network.toLowerCase()===t);return s&&!o.has(t)?(o.add(t),v(O,{children:[Pe(s.network),_(`a`,{href:s.url,rel:`me noopener noreferrer`,title:s.username,target:`_blank`,referrerPolicy:`no-referrer`,children:s.network})]},s.network)):null};return _(`ul`,{className:`my-3 inline-flex flex-wrap gap-x-[2ch] gap-y-2`,"aria-label":S(`contact_info`),children:t.map(s)})}function Ie(e){return{"@context":`https://schema.org`,"@type":`ProfilePage`,name:e.basics.label?S(`profile_page_name`,{name:e.basics.name,label:e.basics.label}):e.basics.name,description:e.basics.summary,dateModified:e.meta.lastModified,mainEntity:{"@type":`Person`,name:e.basics.name,birthDate:e.basics.birthDate,jobTitle:e.basics.label,url:e.basics.url,description:e.basics.summary,image:e.basics.image,email:e.basics.email,telephone:e.basics.phone,address:{"@type":`PostalAddress`,addressLocality:e.basics.location?.city,addressRegion:e.basics.location?.region,postalCode:e.basics.location?.postalCode,addressCountry:e.basics.location?.countryCode},alumniOf:e.education.map(e=>({"@type":`EducationalOrganization`,name:e.institution,url:e.url})),worksFor:e.work.map(e=>({"@type":`Organization`,name:e.name,location:e.location,member:{"@type":`OrganizationRole`,roleName:e.position},url:e.url})),sameAs:e.basics.profiles?.map(e=>e.url).filter(Boolean),knowsAbout:e.skills.flatMap(e=>e.keywords||[])}}}function Le({resume:e}){return _(`script`,{type:`application/ld+json`,dangerouslySetInnerHTML:{__html:JSON.stringify(Ie(e))}})}async function Re({resume:e}){let{basics:t,meta:n}=e,{seo:r}=n.themeConfig,i=r.title||(t.label?`${t.name} - ${t.label}`:t.name),a=r.description||t.summary,{firstNameSlice:o,lastNameSlice:s}=ze(t.name);return v(y,{children:[_(Be,{title:i,description:a,canonical:r.canonical,robots:r.robots,favicon:r.favicon}),_(Ve,{title:i,description:a,url:r.canonical,image:r.ogImage||t.image,firstName:r.firstName||o,lastName:r.lastName||s}),_(He,{title:i,description:a,url:r.canonical,image:r.twitterImage||t.image})]})}function ze(e){let[t,...n]=e.split(` `);return{firstNameSlice:t,lastNameSlice:n.join(` `)}}async function Be({title:e,description:t,canonical:n,robots:r,favicon:i}){return v(y,{children:[_(`title`,{children:e}),t&&_(`meta`,{name:`description`,content:t}),_(`meta`,{name:`robots`,content:r||`index, follow`}),n&&_(`link`,{rel:`canonical`,href:n}),i&&_(`link`,{rel:`icon`,href:`data:image/svg+xml;base64,${btoa((await D(i)).toString())}`})]})}function Ve({title:e,description:t,url:n,image:r,firstName:i,lastName:a}){return v(y,{children:[_(`meta`,{property:`og:type`,content:`profile`}),_(`meta`,{property:`og:title`,content:e}),t&&_(`meta`,{property:`og:description`,content:t}),i&&_(`meta`,{property:`profile:first_name`,content:i}),a&&_(`meta`,{property:`profile:last_name`,content:a}),r&&_(`meta`,{property:`og:image`,content:r}),n&&_(`meta`,{property:`og:url`,content:n})]})}function He({title:e,description:t,url:n,image:r}){return v(y,{children:[_(`meta`,{property:`twitter:card`,content:`summary_large_image`}),_(`meta`,{property:`twitter:title`,content:e}),t&&_(`meta`,{property:`twitter:description`,content:t}),r&&_(`meta`,{property:`twitter:image`,content:r}),n&&_(`meta`,{property:`twitter:url`,content:n})]})}function Ue({skills:e,...t}){return!e||e.length===0?null:_(E,{name:S(`skills`),...t,children:e.map(e=>v(`div`,{className:`mb-4 break-inside-avoid`,children:[_(`h3`,{className:`text-xl font-bold tracking-tight text-gray-900 dark:text-white`,children:e.name}),_(`ul`,{className:`my-3 flex flex-wrap gap-2 leading-8`,children:e.keywords?.map(e=>_(`li`,{className:`badge`,children:e},e))})]},e.name))})}Object.freeze({status:`aborted`});function k(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var A=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},We=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}},Ge={};function j(e){return e&&Object.assign(Ge,e),Ge}function Ke(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function qe(e,t){return typeof t==`bigint`?t.toString():t}function Je(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Ye(e){return e==null}function Xe(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}var Ze=Symbol(`evaluating`);function M(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Ze)return r===void 0&&(r=Ze,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}var Qe=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $e(e){if(N(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(N(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function et(e){return $e(e)?{...e}:Array.isArray(e)?[...e]:e}var tt=new Set([`string`,`number`,`symbol`]);function nt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function rt(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function P(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function it(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}-Number.MAX_VALUE,Number.MAX_VALUE;function F(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function at(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function I(e){return typeof e==`string`?e:e?.message}function L(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=I(e.inst?._zod.def?.error?.(e))??I(t?.error?.(e))??I(n.customError?.(e))??I(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function ot(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function st(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}var ct=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,qe,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},lt=k(`$ZodError`,ct),R=k(`$ZodError`,ct,{Parent:Error}),ut=(e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new A;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,j())));throw Qe(t,i?.callee),t}return o.value})(R),dt=(e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,j())));throw Qe(t,i?.callee),t}return o.value})(R),ft=(e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new A;return a.issues.length?{success:!1,error:new(e??lt)(a.issues.map(e=>L(e,i,j())))}:{success:!0,data:a.value}})(R),pt=(e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>L(e,i,j())))}:{success:!0,data:a.value}})(R),mt=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,ht=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},gt=/^-?\d+(?:\.\d+)?$/,_t=/^(?:true|false)$/i,z=k(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),vt=k(`$ZodCheckLengthEquals`,(e,t)=>{var n;z.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ye(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=ot(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),yt=k(`$ZodCheckStringFormat`,(e,t)=>{var n,r;z.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),bt=k(`$ZodCheckRegex`,(e,t)=>{yt.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),xt={major:4,minor:3,patch:6},B=k(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=xt;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=F(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new A;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=F(e,t))});else{if(e.issues.length===t)continue;r||=F(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(F(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new A;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new A;return o.then(e=>t(e,r,a))}return t(o,r,a)}}M(e,`~standard`,()=>({validate:t=>{try{let n=ft(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return pt(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),St=k(`$ZodString`,(e,t)=>{B.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??ht(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),V=k(`$ZodStringFormat`,(e,t)=>{yt.init(e,t),St.init(e,t)}),Ct=k(`$ZodEmail`,(e,t)=>{t.pattern??=mt,V.init(e,t)}),wt=k(`$ZodURL`,(e,t)=>{V.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),Tt=k(`$ZodNumber`,(e,t)=>{B.init(e,t),e._zod.pattern=e._zod.bag.pattern??gt,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Et=k(`$ZodBoolean`,(e,t)=>{B.init(e,t),e._zod.pattern=_t,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=!!n.value}catch{}let i=n.value;return typeof i==`boolean`||n.issues.push({expected:`boolean`,code:`invalid_type`,input:i,inst:e}),n}}),Dt=k(`$ZodUnknown`,(e,t)=>{B.init(e,t),e._zod.parse=e=>e});function Ot(e,t,n){e.issues.length&&t.issues.push(...at(n,e.issues)),t.value[n]=e.value}var kt=k(`$ZodArray`,(e,t)=>{B.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>Ot(t,n,e))):Ot(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function H(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...at(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function At(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=it(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function jt(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>H(e,n,i,t,u))):H(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}var Mt=k(`$ZodObject`,(e,t)=>{if(B.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=Je(()=>At(t));M(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=N,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>H(n,t,e,s,r))):H(i,t,e,s,r)}return i?jt(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Nt=k(`$ZodEnum`,(e,t)=>{B.init(e,t);let n=Ke(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>tt.has(typeof e)).map(e=>typeof e==`string`?nt(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),Pt=k(`$ZodTransform`,(e,t)=>{B.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new We(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new A;return n.value=i,n}});function Ft(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}var It=k(`$ZodOptional`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),M(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Xe(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>Ft(t,e.value)):Ft(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Lt=k(`$ZodDefault`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>Rt(e,t)):Rt(r,t)}});function Rt(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}var zt=k(`$ZodPrefault`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),Bt=k(`$ZodCatch`,(e,t)=>{B.init(e,t),M(e._zod,`optin`,()=>t.innerType._zod.optin),M(e._zod,`optout`,()=>t.innerType._zod.optout),M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,j()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,j()))},input:e.value}),e.issues=[]),e)}}),Vt=k(`$ZodPipe`,(e,t)=>{B.init(e,t),M(e._zod,`values`,()=>t.in._zod.values),M(e._zod,`optin`,()=>t.in._zod.optin),M(e._zod,`optout`,()=>t.out._zod.optout),M(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>U(e,t.in,n)):U(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>U(e,t.out,n)):U(r,t.out,n)}});function U(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}var Ht=k(`$ZodCustom`,(e,t)=>{z.init(e,t),B.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Ut(t,n,r,e));Ut(i,n,r,e)}});function Ut(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(st(e))}}var Wt,Gt=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Kt(){return new Gt}(Wt=globalThis).__zod_globalRegistry??(Wt.__zod_globalRegistry=Kt()),globalThis.__zod_globalRegistry;function qt(e,t){return new e({type:`string`,...P(t)})}function Jt(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...P(t)})}function Yt(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...P(t)})}function Xt(e,t){return new e({type:`number`,checks:[],...P(t)})}function Zt(e,t){return new e({type:`boolean`,...P(t)})}function Qt(e){return new e({type:`unknown`})}function $t(e,t){return new vt({check:`length_equals`,...P(t),length:e})}function en(e,t){return new bt({check:`string_format`,format:`regex`,...P(t),pattern:e})}function tn(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...P(n)})}var W=k(`ZodMiniType`,(e,t)=>{if(!e._zod)throw Error(`Uninitialized schema in ZodMiniType.`);B.init(e,t),e.def=t,e.type=t.type,e.parse=(t,n)=>ut(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>ft(e,t,n),e.parseAsync=async(t,n)=>dt(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>pt(e,t,n),e.check=(...n)=>e.clone({...t,checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]},{parent:!0}),e.with=e.check,e.clone=(t,n)=>rt(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.apply=t=>t(e)}),nn=k(`ZodMiniString`,(e,t)=>{St.init(e,t),W.init(e,t)});function G(e){return qt(nn,e)}var rn=k(`ZodMiniStringFormat`,(e,t)=>{V.init(e,t),nn.init(e,t)}),an=k(`ZodMiniEmail`,(e,t)=>{Ct.init(e,t),rn.init(e,t)});function on(e){return Jt(an,e)}var sn=k(`ZodMiniURL`,(e,t)=>{wt.init(e,t),rn.init(e,t)});function K(e){return Yt(sn,e)}var cn=k(`ZodMiniNumber`,(e,t)=>{Tt.init(e,t),W.init(e,t)});function ln(e){return Xt(cn,e)}var un=k(`ZodMiniBoolean`,(e,t)=>{Et.init(e,t),W.init(e,t)});function q(e){return Zt(un,e)}var dn=k(`ZodMiniUnknown`,(e,t)=>{Dt.init(e,t),W.init(e,t)});function fn(){return Qt(dn)}var pn=k(`ZodMiniArray`,(e,t)=>{kt.init(e,t),W.init(e,t)});function J(e,t){return new pn({type:`array`,element:e,...P(t)})}var mn=k(`ZodMiniObject`,(e,t)=>{Mt.init(e,t),W.init(e,t),M(e,`shape`,()=>t.shape)});function Y(e,t){return new mn({type:`object`,shape:e??{},...P(t)})}function X(e,t){return new mn({type:`object`,shape:e,catchall:fn(),...P(t)})}var hn=k(`ZodMiniEnum`,(e,t)=>{Nt.init(e,t),W.init(e,t),e.options=Object.values(t.entries)});function gn(e,t){return new hn({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...P(t)})}var _n=k(`ZodMiniTransform`,(e,t)=>{Pt.init(e,t),W.init(e,t)});function vn(e){return new _n({type:`transform`,transform:e})}var yn=k(`ZodMiniOptional`,(e,t)=>{It.init(e,t),W.init(e,t)});function Z(e){return new yn({type:`optional`,innerType:e})}var bn=k(`ZodMiniDefault`,(e,t)=>{Lt.init(e,t),W.init(e,t)});function Q(e,t){return new bn({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():et(t)}})}var xn=k(`ZodMiniPrefault`,(e,t)=>{zt.init(e,t),W.init(e,t)});function $(e,t){return new xn({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():et(t)}})}var Sn=k(`ZodMiniCatch`,(e,t)=>{Bt.init(e,t),W.init(e,t)});function Cn(e,t){return new Sn({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}var wn=k(`ZodMiniPipe`,(e,t)=>{Vt.init(e,t),W.init(e,t)});function Tn(e,t){return new wn({type:`pipe`,in:e,out:t})}var En=k(`ZodMiniCustom`,(e,t)=>{Ht.init(e,t),W.init(e,t)});function Dn(e,t={}){return tn(En,e,t)}var On=Y({ui:$(Y({primary:Q(G(),`#255b8f`),headerFrom:Q(G(),`#ccc074`),headerTo:Q(G(),`#4971af`),footerFrom:Q(G(),`#463932`),footerTo:Q(G(),`#7fbdbc`),backgroundTilesSeed:Q(ln(),1),showLogos:Q(q(),!0),cta:Z(Y({text:G(),url:G(),icon:Q(Z(G().check(en(/^[a-z]+:[a-z-]+$/))),`tabler:message-circle`)})),links:Q(J(G()),[`phone`,`email`,`location`,`profiles`])}),{}),seo:$(Y({title:Z(G()),description:Z(G()),canonical:Z(K()),favicon:Z(G()),ogImage:Z(K()),twitterImage:Z(K()),firstName:Z(G()),lastName:Z(G()),robots:Q(Z(G()),`index, follow`)}),{}),modest:Q(q(),!1)}),kn=Tn(X({name:Z(G()),company:Z(G()),location:Z(G()),description:Z(G()),position:Z(G()),url:Z(K()),website:Z(K()),startDate:G(),endDate:Z(G()),summary:Z(G()),highlights:Z(J(G())),logo:Z(K())}).check(Dn(({name:e,company:t})=>!!(e||t),{path:[`name`],message:`Either 'name' or 'company' must be provided.`})),vn(({company:e,name:t,url:n,website:r,...i})=>({...i,name:t??e,...n||r?{url:n??r}:{}}))),An=X({network:G(),username:Z(G()),url:Z(K())}),jn=X({address:Z(G()),postalCode:Z(G()),city:Z(G()),countryCode:Z(G().check($t(2))),region:Z(G())}),Mn=Y({meta:$(X({lang:Q(Cn(gn([`en`,`fr`]),`en`),`en`),lastModified:Q(G(),()=>new Date().toISOString()),themeConfig:$(On,{})}),{}),work:Q(Z(J(kn)),[]),basics:X({name:G(),label:Z(G()),image:Z(K()),email:Z(on()),phone:Z(G()),birthDate:Z(G()),url:Z(K()),summary:Z(G()),location:Z(jn),profiles:Z(J(An))}),education:Q(Z(J(Y({institution:G(),url:Z(K()),area:Z(G()),studyType:Z(G()),startDate:G(),endDate:Z(G()),score:Z(G()),courses:Z(J(G()))}))),[]),certificates:Q(Z(J(Y({name:G(),date:Z(G()),url:Z(K()),issuer:Z(G())}))),[]),skills:Q(Z(J(Y({name:G(),level:Z(G()),keywords:Z(J(G()))}))),[]),languages:Q(Z(J(X({language:G(),fluency:Z(G())}))),[])});function Nn({works:e,showLogos:t}){return!e||e.length===0?null:_(E,{name:S(`work_experience`),children:_(`ol`,{className:`timeline`,reversed:!0,children:e.map(e=>_(`li`,{className:`timeline-item`,children:_(`article`,{className:`group`,children:v(`div`,{className:`flex items-start gap-4`,children:[t&&_(`div`,{className:`mt-1 shrink-0`,children:e.logo?_(`img`,{src:e.logo,alt:e.name,width:`48`,height:`48`,className:`h-12 w-12 rounded-lg object-contain`,loading:`lazy`}):_(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-lg bg-gray-100 font-bold text-gray-400 uppercase select-none dark:bg-slate-800 dark:text-slate-500`,children:e.name?.charAt(0)})}),v(`div`,{className:`min-w-0 flex-1`,children:[v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.position})}),v(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:[e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.name}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.name}),e.description&&v(`span`,{className:`ml-2 text-sm text-gray-500`,children:[`- `,e.description]})]})]}),_(T,{startDate:e.startDate,endDate:e.endDate,format:`month`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]}),e.summary&&_(`p`,{className:`mt-3 text-sm leading-relaxed text-pretty text-gray-600 dark:text-slate-400`,children:e.summary}),_(`ul`,{className:`bullet-list`,children:e.highlights?.map(e=>_(`li`,{className:`bullet-item`,children:_(`span`,{children:e})},e))})]})]})})},e.name+e.startDate))})})}var Pn=async({resume:e,css:t,...n})=>{let{basics:r,work:i,education:a,certificates:o,skills:s,meta:c}=e,{ui:l,modest:u}=c.themeConfig,d=be({seed:l.backgroundTilesSeed,cellSize:60,variance:.8});return v(`html`,{lang:c.lang,children:[v(`head`,{children:[_(`meta`,{charSet:`UTF-8`}),_(`meta`,{name:`viewport`,content:`width=device-width, initial-scale=1.0`}),_(`meta`,{name:`theme-color`,content:l.primary}),!u&&_(`meta`,{name:`generator`,content:`JSON Resume Theme CJEAN`}),_(Re,{resume:e}),r.image&&_(`link`,{rel:`preload`,as:`image`,href:r.image,fetchPriority:`high`}),_(`style`,{dangerouslySetInnerHTML:{__html:`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t={}){return e.replace(/\{([\w-]+?)\}/g,(e,n)=>{let r=t[n];return r===void 0?e:String(r)})}function t(t,n){return(r,...i)=>{let a=t[r]??r,o=i[0]||{},s={locale:n?.locale,key:r};return n?.interpolate?n.interpolate(a,o,s):i.length===0?a:e(a,o)}}function n(){return e=>e}var r=new Map([[`&`,`&amp;`],[`<`,`&lt;`],[`>`,`&gt;`],[`"`,`&quot;`],[`'`,`&#x27;`]]),i=new Set([`href`,`src`,`action`,`formaction`,`cite`,`poster`,`icon`,`data`,`xlink:href`]),a=/[&<>]/g,o=/[&<>"]/g,s=/\p{C}/gu,c=/^[^\s"'>/=]+$/u,l=/^(?:java|vb)script:/i,u=/^data:(?!image\/)/i,d=e=>e.replace(s,``),f=(e,t=`content`)=>{let n=t===`attr`?o:a;return e.replaceAll(n,e=>r.get(e)??e)},ee=e=>{let t=d(e).trim();return t?!(l.test(t)||u.test(t)):!0},te=e=>c.test(e),ne=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]),re=/[A-Z]/g,ie=/^on[a-z]/i,ae=/expression\s*\(|javascript\s*:/i,oe=/url\(\s*(['"]?)(.*?)\1\s*\)/gi,se=new Set([`children`,`dangerouslySetInnerHTML`,`key`,`ref`]),ce=new Map([[`htmlFor`,`for`],[`acceptCharset`,`accept-charset`],[`httpEquiv`,`http-equiv`],[`xlinkHref`,`xlink:href`],[`xmlnsXlink`,`xmlns:xlink`],[`xmlLang`,`xml:lang`],[`xmlBase`,`xml:base`],[`xmlSpace`,`xml:space`]]),le=e=>{if(e instanceof Promise)return!0;if(Array.isArray(e)){for(let t=0;t<e.length;t++)if(le(e[t]))return!0}return!1},p=e=>{if(!e)return!1;if(e instanceof Promise)return!0;if(Array.isArray(e)){for(let t=0;t<e.length;t++)if(p(e[t]))return!0;return!1}if(typeof e==`object`){for(let t of Object.values(e))if(p(t))return!0}return!1},m=async e=>{if(e instanceof Promise)return m(await e);if(Array.isArray(e))return Promise.all(e.map(e=>m(e)));if(e&&typeof e==`object`){let t=await Promise.all(Object.entries(e).map(async([e,t])=>[e,await m(t)]));return Object.fromEntries(t)}return e},ue=e=>{let t=d(e);if(ae.test(t))return!1;oe.lastIndex=0;let n;for(;n=oe.exec(t);)if(!ee(n[2]?.trim()??``))return!1;return!0},h=class{value;constructor(e){this.value=e}toString(){return this.value}};function de(e){if(!e)return``;let t=Object.keys(e);for(let n=0;n<t.length;n++){let r=t[n],i=r?e[r]:void 0;if(r&&(le(i)||r===`style`&&typeof i==`object`&&p(i)))return Promise.all(t.map(async t=>[t,await e[t]])).then(e=>m(Object.fromEntries(e))).then(e=>fe(e))}return fe(e)}function fe(e){let t=``,n=new Set,r=Object.keys(e);for(let a=0;a<r.length;a++){let o=r[a];if(!o)continue;let s=e[o];if(se.has(o)||s===!1||s==null)continue;if(o===`class`||o===`className`){if(typeof s==`string`)for(let e of s.split(/\s+/))e&&n.add(e);continue}let c=ce.get(o)||d(o);if(te(c)&&!(ie.test(o)||ie.test(c)))if(c===`style`)if(typeof s==`object`){let e=pe(s);if(!e)continue;t+=` style="${f(e,`attr`)}"`}else{let e=String(s);if(!ue(e)||!e)continue;t+=` style="${f(e,`attr`)}"`}else if(s===!0)t+=` ${c}`;else{let e=String(s);i.has(c)&&!ee(e)&&(e=`#blocked`),t+=` ${c}="${f(e,`attr`)}"`}}return n.size>0&&(t=` class="${f([...n].join(` `),`attr`)}"`+t),t}function pe(e){let t=[];for(let[n,r]of Object.entries(e)){if(r==null)continue;let e=n.startsWith(`--`)?n:n.replace(re,`-$&`).toLowerCase(),i=String(r);ue(i)&&t.push(`${e}:${i}`)}return t.join(`;`)}function g(e){if(e==null||e===!0||e===!1)return``;if(e instanceof h)return e;if(e instanceof Promise)return e.then(g).then(e=>e instanceof h?e:new h(f(String(e))));if(Array.isArray(e)){let t=e.length,n=Array(t),r=!1;for(let i=0;i<t;i++){let t=g(e[i]);n[i]=t,t instanceof Promise&&(r=!0)}if(!r){let e=``;for(let r=0;r<t;r++){let t=n[r];e+=t instanceof h?t.value:f(String(t))}return new h(e)}return Promise.all(n).then(e=>{let t=``;for(let n=0;n<e.length;n++){let r=e[n];t+=r instanceof h?r.value:f(String(r))}return new h(t)})}return String(e)}function me(e,t,n){let r=de(t),i=t.dangerouslySetInnerHTML?new h(t.dangerouslySetInnerHTML.__html==null?``:String(t.dangerouslySetInnerHTML.__html)):g(n);return r instanceof Promise||i instanceof Promise?Promise.all([r,i]).then(([t,n])=>he(e,t,n)):he(e,r,i)}function he(e,t,n){return ne.has(e)?new h(`<${e}${t}>`):new h(`<${e}${t}>${n instanceof h?n.value:f(String(n))}</${e}>`)}function _(e,t,...n){let r={...t||{}};n.length>0&&r.children===void 0&&(r.children=n.length===1?n[0]:n);let i=r.children;return typeof e==`function`?e(r):me(e,r,Array.isArray(i)?i:i===void 0?[]:[i])}var v=_;function y({children:e}){return e}var ge={en:n()({work_experience:`Work Experience`,education:`Education`,skills:`Skills`,present:`Present`,contact_info:`Contact Information`,phone_call:`Call mobile phone`,email_send:`Send email`,show_address:`Show address`,portrait_alt:`Portrait of {name}`,last_modified:`Last updated on {date}`,profile_page_name:`{name}'s resume - {label}`,theme_credit:`Theme made with love by {link}`}),fr:n()({work_experience:`Expériences professionnelles`,education:`Formations`,skills:`Compétences`,present:`Présent`,contact_info:`Informations de contact`,phone_call:`Appeler sur le téléphone mobile`,email_send:`Envoyer un email`,show_address:`Afficher l'adresse`,portrait_alt:`Portrait de {name}`,last_modified:`Dernière mise à jour le {date}`,profile_page_name:`CV de {name} - {label}`,theme_credit:`Thème proposé avec amour par {link}`})},b=void 0,x=`en`,S=(e,...n)=>(b||=t(ge[x]),b(e,...n)),_e=(e,...t)=>new h(S(e,...t));function ve(e){x=e,b=t(ge[e])}var C={normalize(e){let t=typeof e==`string`?new Date(e):e;return isNaN(t.getTime())?null:t},format(e,t){let n=this.normalize(e);if(!n)return``;let r=x===void 0?`fr-FR`:x;switch(t){case`month`:return new Intl.DateTimeFormat(r,{month:`long`,year:`numeric`}).format(n);case`year`:return n.getFullYear().toString();case`date`:return new Intl.DateTimeFormat(r,{day:`numeric`,month:`numeric`,year:`numeric`}).format(n);case`iso`:return n.toISOString();default:throw Error(`Unhandled date format: ${t}`)}},toISO(e){return this.normalize(e)?.toISOString()??``}},ye=class{seed;constructor(e){this.seed=e}next(){return this.seed=this.seed*16807%2147483647,(this.seed-1)/2147483646}};function be(e={}){let{width:t=900,height:n=300,cellSize:r=50,variance:i=.75,seed:a=1}=e,o=new ye(a),s=Te(t,n,we(xe(t,n,r,i,o),o));return`data:image/svg+xml,${encodeURIComponent(s).replace(/%20/g,` `).replace(/%3D/g,`=`).replace(/%3A/g,`:`).replace(/%2F/g,`/`).replace(/%22/g,`'`)}`}function xe(e,t,n,r,i){let a=[],o=Math.ceil(e/n)+2,s=Math.ceil(t/n)+2;for(let e=0;e<s;e++){let t=[];for(let a=0;a<o;a++){let o=Math.round((a-.5)*n+(i.next()-.5)*n*r),s=Math.round((e-.5)*n+(i.next()-.5)*n*r);t.push({x:o,y:s})}a.push(t)}return a}function Se(e){let t=e.next();return(t>.5?`#000000`:`#ffffff`)+(Math.round(t*5)*5).toString(16).padStart(2,`0`)}function Ce(e,t){let[n,r,i]=e;return`m${n.x-t.x} ${n.y-t.y} ${r.x-n.x} ${r.y-n.y} ${i.x-r.x} ${i.y-r.y}`.replace(/ -/g,`-`)}function we(e,t){let n={},r={},i=e.length,a=e[0]?.length??0;for(let o=0;o<i-1;o++)for(let i=0;i<a-1;i++)[[e[o][i],e[o][i+1],e[o+1][i]],[e[o][i+1],e[o+1][i+1],e[o+1][i]]].forEach(e=>{let i=Se(t);n[i]||(n[i]=``,r[i]={x:0,y:0});let a=r[i],o=Ce(e,a);n[i]+=o,r[i]=e[2]});return n}function Te(e,t,n){let r=``;for(let[e,t]of Object.entries(n))r+=`<path fill="${e}" d="${t}"/>`;return`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${t}" viewBox="0 0 ${e} ${t}" preserveAspectRatio="xMidYMid slice">${r}</svg>`}function Ee({name:e,label:t,children:n,...r}){return v(`header`,{className:`flex-1 grow border-b border-gray-100 pb-8 dark:border-white/5`,...r,children:[_(`h1`,{className:`text-primary kerning-normal inline-block text-5xl font-extrabold tracking-tight uppercase sm:text-6xl`,children:e}),t&&_(`p`,{className:`mt-2 text-3xl font-light tracking-wide text-gray-500 dark:text-slate-400`,children:t}),n]})}function w({date:e,format:t,children:n,...r}){let i=C.normalize(e);if(!i)return _(`span`,{...r,children:n});let a=n;return t&&!a&&(a=C.format(i,t)),_(`time`,{dateTime:C.toISO(i),...r,children:a})}function T({startDate:e,endDate:t,format:n,...r}){return!e&&!t?null:_(`div`,{...r,children:e?v(y,{children:[_(w,{date:e,format:n}),`\xA0—\xA0`,t?_(w,{date:t,format:n}):_(`span`,{className:`text-primary font-bold`,children:S(`present`)})]}):_(w,{date:t,format:n})})}function E({name:e,children:t,...n}){let r=e?`section-${e.toLowerCase().replace(/\s+/g,`-`)}`:void 0;return v(`section`,{"aria-labelledby":r,...n,children:[e&&_(`h2`,{id:r,className:`before:bg-primary relative mt-8 mb-4 break-after-avoid text-2xl tracking-tight text-gray-900 before:absolute before:-bottom-1 before:left-0 before:h-1 before:w-[3ch] before:rounded-[0_0.25rem_0.25rem_0] dark:text-white before:print:[print-color-adjust:exact]`,children:e}),t]})}function De({education:e,certificates:t}){let n=e&&e.length>0,r=t&&t.length>0;return!n&&!r?null:_(E,{name:S(`education`),children:v(`ol`,{className:`timeline`,children:[e?.map((e,t)=>_(`li`,{className:`timeline-item`,children:_(`article`,{className:`group`,children:_(`div`,{className:`min-w-0 flex-1`,children:v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.studyType})}),v(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:[e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.institution}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.institution}),e.area&&v(`span`,{className:`ml-2 text-sm text-gray-500`,children:[`- `,e.area]})]})]}),_(T,{startDate:e.startDate,endDate:e.endDate,format:`year`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]})})})},`edu-${t}`)),t?.map((e,t)=>_(`li`,{className:`timeline-item timeline-item-secondary`,children:_(`article`,{className:`group`,children:_(`div`,{className:`min-w-0 flex-1`,children:v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.name})}),_(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.issuer}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.issuer})})]}),_(T,{endDate:e.date,format:`year`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]})})})},`cert-${t}`))]})})}var Oe=async(e,t={})=>{let n=new URL(`https://api.iconify.design/${e}.svg`);for(let[e,r]of Object.entries(t))r&&n.searchParams.set(e,r.toString());let r=await fetch(n);if(!r.ok)throw Error(`Failed to fetch icon ${e}`);return r.text()},D=async(e,t=24,n=!0)=>{let r=await Oe(e,{height:t});return new h(n?r.replace(`<svg`,`<svg aria-hidden="true"`):r)},ke=({text:e,url:t,icon:n=`tabler:message-circle`,...r})=>v(y,{children:[v(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,id:`cta-fab`,"aria-label":e,className:`fab--extended group fixed right-8 bottom-8 z-20 inline-flex items-center space-x-2 rounded-full bg-black/80 p-4 text-lg whitespace-nowrap text-white shadow-md backdrop-blur-sm transition-colors hover:bg-black dark:bg-gray-700 dark:text-white print:hidden`,...r,children:[_(`span`,{className:`shrink-0`,children:D(n)}),_(`span`,{className:`-mr-2 max-w-0 overflow-hidden text-transparent transition-all duration-300 ease-in-out group-hover:mr-0 group-hover:max-w-96 group-hover:text-inherit group-focus:mr-0 group-focus:max-w-96 group-focus:text-inherit group-[.fab--extended]:mr-0 group-[.fab--extended]:max-w-96 group-[.fab--extended]:text-inherit`,children:e})]}),_(`script`,{dangerouslySetInnerHTML:{__html:`(${Ae.toString()})();`}})]}),Ae=()=>{let e=document.getElementById(`cta-fab`);if(!e||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=window.scrollY||document.documentElement.scrollTop;window.addEventListener(`scroll`,()=>{let n=window.scrollY||document.documentElement.scrollTop,r=n-t;Math.abs(r)>15&&(r>0?e.classList.remove(`fab--extended`):e.classList.add(`fab--extended`),t=Math.max(n,0))},{passive:!0})};function je({meta:e,bgTiles:t,...n}){let r=e.lastModified;return v(`footer`,{className:`bg-angled-gradient from-footer-from to-footer-to relative isolate z-0 -mt-10 h-32 content-center pt-12 pb-2 text-center text-sm text-white dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden`,...n,children:[_(`img`,{src:t,alt:``,loading:`lazy`,className:`absolute inset-0 -z-10 size-full object-cover object-center`,"aria-hidden":`true`}),_(`div`,{children:_e(`last_modified`,{date:_(w,{date:r,children:C.format(r,`date`)})})}),_(`div`,{className:`mt-1 text-xs opacity-75`,children:!e.themeConfig.modest&&_e(`theme_credit`,{link:_(`a`,{href:`https://www.cjean.fr`,target:`_blank`,className:`underline decoration-white/30 underline-offset-2 transition-colors hover:decoration-white/80`,children:`Christophe Jean`})})})]})}var Me=({bgTiles:e})=>_(`div`,{className:`bg-primary bg-angled-gradient from-header-from to-header-to relative h-2.5 overflow-hidden shadow-inner md:-mb-60 md:h-80 dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden`,"aria-hidden":`true`,children:_(`img`,{src:e,alt:``,fetchPriority:`high`,className:`absolute inset-0 size-full object-cover object-center`})});function Ne(e){return`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(e)}`}async function Pe(e){try{return await D(`tabler:brand-${e.toLowerCase()}`)}catch{return D(`tabler:link`)}}var O=({children:e,...t})=>_(`li`,{className:`inline-flex items-center gap-x-1`,...t,children:e});function Fe({basics:e,list:t=[`phone`,`email`,`location`,`profiles`]}){let{phone:n,email:r,location:i,profiles:a=[]}=e,o=new Set,s=e=>{let t=e.toLowerCase();if(t===`phone`&&n)return v(O,{children:[D(`tabler:phone`),_(`a`,{href:`tel:${encodeURIComponent(n)}`,title:S(`phone_call`),children:n})]},`phone`);if(t===`email`&&r)return v(O,{children:[D(`tabler:mail`),_(`a`,{href:`mailto:${r}`,title:S(`email_send`),children:r})]},`email`);if(t===`location`&&i&&i.city&&(i.countryCode||i.region))return v(O,{children:[D(`tabler:map-pin`),v(`a`,{href:Ne([i.city,i.postalCode,i.region,i.countryCode].filter(Boolean).join(`, `)),title:S(`show_address`),target:`_blank`,rel:`noopener noreferrer`,referrerPolicy:`no-referrer`,children:[i.city,`, `,i.countryCode||i.region]})]},`location`);if(t===`profiles`)return a.filter(e=>!o.has(e.network.toLowerCase())).map(e=>(o.add(e.network.toLowerCase()),v(O,{children:[Pe(e.network),_(`a`,{href:e.url,rel:`me noopener noreferrer`,title:e.username,target:`_blank`,referrerPolicy:`no-referrer`,children:e.network})]},e.network)));let s=a.find(e=>e.network.toLowerCase()===t);return s&&!o.has(t)?(o.add(t),v(O,{children:[Pe(s.network),_(`a`,{href:s.url,rel:`me noopener noreferrer`,title:s.username,target:`_blank`,referrerPolicy:`no-referrer`,children:s.network})]},s.network)):null};return _(`ul`,{className:`my-3 inline-flex flex-wrap gap-x-[2ch] gap-y-2`,"aria-label":S(`contact_info`),children:t.map(s)})}function Ie(e){return{"@context":`https://schema.org`,"@type":`ProfilePage`,name:e.basics.label?S(`profile_page_name`,{name:e.basics.name,label:e.basics.label}):e.basics.name,description:e.basics.summary,dateModified:e.meta.lastModified,mainEntity:{"@type":`Person`,name:e.basics.name,birthDate:e.basics.birthDate,jobTitle:e.basics.label,url:e.basics.url,description:e.basics.summary,image:e.basics.image,email:e.basics.email,telephone:e.basics.phone,address:{"@type":`PostalAddress`,addressLocality:e.basics.location?.city,addressRegion:e.basics.location?.region,postalCode:e.basics.location?.postalCode,addressCountry:e.basics.location?.countryCode},alumniOf:e.education.map(e=>({"@type":`EducationalOrganization`,name:e.institution,url:e.url})),worksFor:e.work.map(e=>({"@type":`Organization`,name:e.name,location:e.location,member:{"@type":`OrganizationRole`,roleName:e.position},url:e.url})),sameAs:e.basics.profiles?.map(e=>e.url).filter(Boolean),knowsAbout:e.skills.flatMap(e=>e.keywords||[])}}}function Le({resume:e}){return _(`script`,{type:`application/ld+json`,dangerouslySetInnerHTML:{__html:JSON.stringify(Ie(e))}})}async function Re({resume:e}){let{basics:t,meta:n}=e,{seo:r}=n.themeConfig,i=r.title||(t.label?`${t.name} - ${t.label}`:t.name),a=r.description||t.summary,{firstNameSlice:o,lastNameSlice:s}=ze(t.name);return v(y,{children:[_(Be,{title:i,description:a,canonical:r.canonical,robots:r.robots,favicon:r.favicon}),_(Ve,{title:i,description:a,url:r.canonical,image:r.ogImage||t.image,firstName:r.firstName||o,lastName:r.lastName||s}),_(He,{title:i,description:a,url:r.canonical,image:r.twitterImage||t.image})]})}function ze(e){let[t,...n]=e.split(` `);return{firstNameSlice:t,lastNameSlice:n.join(` `)}}async function Be({title:e,description:t,canonical:n,robots:r,favicon:i}){return v(y,{children:[_(`title`,{children:e}),t&&_(`meta`,{name:`description`,content:t}),_(`meta`,{name:`robots`,content:r||`index, follow`}),n&&_(`link`,{rel:`canonical`,href:n}),i&&_(`link`,{rel:`icon`,href:`data:image/svg+xml;base64,${btoa((await D(i)).toString())}`})]})}function Ve({title:e,description:t,url:n,image:r,firstName:i,lastName:a}){return v(y,{children:[_(`meta`,{property:`og:type`,content:`profile`}),_(`meta`,{property:`og:title`,content:e}),t&&_(`meta`,{property:`og:description`,content:t}),i&&_(`meta`,{property:`profile:first_name`,content:i}),a&&_(`meta`,{property:`profile:last_name`,content:a}),r&&_(`meta`,{property:`og:image`,content:r}),n&&_(`meta`,{property:`og:url`,content:n})]})}function He({title:e,description:t,url:n,image:r}){return v(y,{children:[_(`meta`,{property:`twitter:card`,content:`summary_large_image`}),_(`meta`,{property:`twitter:title`,content:e}),t&&_(`meta`,{property:`twitter:description`,content:t}),r&&_(`meta`,{property:`twitter:image`,content:r}),n&&_(`meta`,{property:`twitter:url`,content:n})]})}function Ue({skills:e,...t}){return!e||e.length===0?null:_(E,{name:S(`skills`),...t,children:e.map(e=>v(`div`,{className:`mb-4 break-inside-avoid`,children:[_(`h3`,{className:`text-xl font-bold tracking-tight text-gray-900 dark:text-white`,children:e.name}),_(`ul`,{className:`my-3 flex flex-wrap gap-2 leading-8`,children:e.keywords?.map(e=>_(`li`,{className:`badge`,children:e},e))})]},e.name))})}Object.freeze({status:`aborted`});function k(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var A=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},We=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}},Ge={};function j(e){return e&&Object.assign(Ge,e),Ge}function Ke(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function qe(e,t){return typeof t==`bigint`?t.toString():t}function Je(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Ye(e){return e==null}function Xe(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}var Ze=Symbol(`evaluating`);function M(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Ze)return r===void 0&&(r=Ze,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}var Qe=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $e(e){if(N(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(N(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function et(e){return $e(e)?{...e}:Array.isArray(e)?[...e]:e}var tt=new Set([`string`,`number`,`symbol`]);function nt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function rt(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function P(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function it(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}-Number.MAX_VALUE,Number.MAX_VALUE;function F(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function at(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function I(e){return typeof e==`string`?e:e?.message}function L(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=I(e.inst?._zod.def?.error?.(e))??I(t?.error?.(e))??I(n.customError?.(e))??I(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function ot(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function st(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}var ct=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,qe,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},lt=k(`$ZodError`,ct),R=k(`$ZodError`,ct,{Parent:Error}),ut=(e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new A;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,j())));throw Qe(t,i?.callee),t}return o.value})(R),dt=(e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,j())));throw Qe(t,i?.callee),t}return o.value})(R),ft=(e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new A;return a.issues.length?{success:!1,error:new(e??lt)(a.issues.map(e=>L(e,i,j())))}:{success:!0,data:a.value}})(R),pt=(e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>L(e,i,j())))}:{success:!0,data:a.value}})(R),mt=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,ht=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},gt=/^-?\d+(?:\.\d+)?$/,_t=/^(?:true|false)$/i,z=k(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),vt=k(`$ZodCheckLengthEquals`,(e,t)=>{var n;z.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ye(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=ot(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),yt=k(`$ZodCheckStringFormat`,(e,t)=>{var n,r;z.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),bt=k(`$ZodCheckRegex`,(e,t)=>{yt.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),xt={major:4,minor:3,patch:6},B=k(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=xt;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=F(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new A;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=F(e,t))});else{if(e.issues.length===t)continue;r||=F(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(F(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new A;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new A;return o.then(e=>t(e,r,a))}return t(o,r,a)}}M(e,`~standard`,()=>({validate:t=>{try{let n=ft(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return pt(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),St=k(`$ZodString`,(e,t)=>{B.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??ht(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),V=k(`$ZodStringFormat`,(e,t)=>{yt.init(e,t),St.init(e,t)}),Ct=k(`$ZodEmail`,(e,t)=>{t.pattern??=mt,V.init(e,t)}),wt=k(`$ZodURL`,(e,t)=>{V.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),Tt=k(`$ZodNumber`,(e,t)=>{B.init(e,t),e._zod.pattern=e._zod.bag.pattern??gt,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Et=k(`$ZodBoolean`,(e,t)=>{B.init(e,t),e._zod.pattern=_t,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=!!n.value}catch{}let i=n.value;return typeof i==`boolean`||n.issues.push({expected:`boolean`,code:`invalid_type`,input:i,inst:e}),n}}),Dt=k(`$ZodUnknown`,(e,t)=>{B.init(e,t),e._zod.parse=e=>e});function Ot(e,t,n){e.issues.length&&t.issues.push(...at(n,e.issues)),t.value[n]=e.value}var kt=k(`$ZodArray`,(e,t)=>{B.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>Ot(t,n,e))):Ot(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function H(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...at(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function At(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=it(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function jt(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>H(e,n,i,t,u))):H(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}var Mt=k(`$ZodObject`,(e,t)=>{if(B.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=Je(()=>At(t));M(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=N,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>H(n,t,e,s,r))):H(i,t,e,s,r)}return i?jt(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Nt=k(`$ZodEnum`,(e,t)=>{B.init(e,t);let n=Ke(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>tt.has(typeof e)).map(e=>typeof e==`string`?nt(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),Pt=k(`$ZodTransform`,(e,t)=>{B.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new We(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new A;return n.value=i,n}});function Ft(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}var It=k(`$ZodOptional`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),M(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Xe(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>Ft(t,e.value)):Ft(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Lt=k(`$ZodDefault`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>Rt(e,t)):Rt(r,t)}});function Rt(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}var zt=k(`$ZodPrefault`,(e,t)=>{B.init(e,t),e._zod.optin=`optional`,M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),Bt=k(`$ZodCatch`,(e,t)=>{B.init(e,t),M(e._zod,`optin`,()=>t.innerType._zod.optin),M(e._zod,`optout`,()=>t.innerType._zod.optout),M(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,j()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,j()))},input:e.value}),e.issues=[]),e)}}),Vt=k(`$ZodPipe`,(e,t)=>{B.init(e,t),M(e._zod,`values`,()=>t.in._zod.values),M(e._zod,`optin`,()=>t.in._zod.optin),M(e._zod,`optout`,()=>t.out._zod.optout),M(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>U(e,t.in,n)):U(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>U(e,t.out,n)):U(r,t.out,n)}});function U(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}var Ht=k(`$ZodCustom`,(e,t)=>{z.init(e,t),B.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Ut(t,n,r,e));Ut(i,n,r,e)}});function Ut(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(st(e))}}var Wt,Gt=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Kt(){return new Gt}(Wt=globalThis).__zod_globalRegistry??(Wt.__zod_globalRegistry=Kt()),globalThis.__zod_globalRegistry;function qt(e,t){return new e({type:`string`,...P(t)})}function Jt(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...P(t)})}function Yt(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...P(t)})}function Xt(e,t){return new e({type:`number`,checks:[],...P(t)})}function Zt(e,t){return new e({type:`boolean`,...P(t)})}function Qt(e){return new e({type:`unknown`})}function $t(e,t){return new vt({check:`length_equals`,...P(t),length:e})}function en(e,t){return new bt({check:`string_format`,format:`regex`,...P(t),pattern:e})}function tn(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...P(n)})}var W=k(`ZodMiniType`,(e,t)=>{if(!e._zod)throw Error(`Uninitialized schema in ZodMiniType.`);B.init(e,t),e.def=t,e.type=t.type,e.parse=(t,n)=>ut(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>ft(e,t,n),e.parseAsync=async(t,n)=>dt(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>pt(e,t,n),e.check=(...n)=>e.clone({...t,checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]},{parent:!0}),e.with=e.check,e.clone=(t,n)=>rt(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.apply=t=>t(e)}),nn=k(`ZodMiniString`,(e,t)=>{St.init(e,t),W.init(e,t)});function G(e){return qt(nn,e)}var rn=k(`ZodMiniStringFormat`,(e,t)=>{V.init(e,t),nn.init(e,t)}),an=k(`ZodMiniEmail`,(e,t)=>{Ct.init(e,t),rn.init(e,t)});function on(e){return Jt(an,e)}var sn=k(`ZodMiniURL`,(e,t)=>{wt.init(e,t),rn.init(e,t)});function K(e){return Yt(sn,e)}var cn=k(`ZodMiniNumber`,(e,t)=>{Tt.init(e,t),W.init(e,t)});function ln(e){return Xt(cn,e)}var un=k(`ZodMiniBoolean`,(e,t)=>{Et.init(e,t),W.init(e,t)});function q(e){return Zt(un,e)}var dn=k(`ZodMiniUnknown`,(e,t)=>{Dt.init(e,t),W.init(e,t)});function fn(){return Qt(dn)}var pn=k(`ZodMiniArray`,(e,t)=>{kt.init(e,t),W.init(e,t)});function J(e,t){return new pn({type:`array`,element:e,...P(t)})}var mn=k(`ZodMiniObject`,(e,t)=>{Mt.init(e,t),W.init(e,t),M(e,`shape`,()=>t.shape)});function Y(e,t){return new mn({type:`object`,shape:e??{},...P(t)})}function X(e,t){return new mn({type:`object`,shape:e,catchall:fn(),...P(t)})}var hn=k(`ZodMiniEnum`,(e,t)=>{Nt.init(e,t),W.init(e,t),e.options=Object.values(t.entries)});function gn(e,t){return new hn({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...P(t)})}var _n=k(`ZodMiniTransform`,(e,t)=>{Pt.init(e,t),W.init(e,t)});function vn(e){return new _n({type:`transform`,transform:e})}var yn=k(`ZodMiniOptional`,(e,t)=>{It.init(e,t),W.init(e,t)});function Z(e){return new yn({type:`optional`,innerType:e})}var bn=k(`ZodMiniDefault`,(e,t)=>{Lt.init(e,t),W.init(e,t)});function Q(e,t){return new bn({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():et(t)}})}var xn=k(`ZodMiniPrefault`,(e,t)=>{zt.init(e,t),W.init(e,t)});function $(e,t){return new xn({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():et(t)}})}var Sn=k(`ZodMiniCatch`,(e,t)=>{Bt.init(e,t),W.init(e,t)});function Cn(e,t){return new Sn({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}var wn=k(`ZodMiniPipe`,(e,t)=>{Vt.init(e,t),W.init(e,t)});function Tn(e,t){return new wn({type:`pipe`,in:e,out:t})}var En=k(`ZodMiniCustom`,(e,t)=>{Ht.init(e,t),W.init(e,t)});function Dn(e,t={}){return tn(En,e,t)}var On=Y({ui:$(Y({primary:Q(G(),`#255b8f`),headerFrom:Q(G(),`#ccc074`),headerTo:Q(G(),`#4971af`),footerFrom:Q(G(),`#463932`),footerTo:Q(G(),`#7fbdbc`),backgroundTilesSeed:Q(ln(),1),showLogos:Q(q(),!0),cta:Z(Y({text:G(),url:G(),icon:Q(Z(G().check(en(/^[a-z]+:[a-z-]+$/))),`tabler:message-circle`)})),links:Q(J(G()),[`phone`,`email`,`location`,`profiles`])}),{}),seo:$(Y({title:Z(G()),description:Z(G()),canonical:Z(K()),favicon:Z(G()),ogImage:Z(K()),twitterImage:Z(K()),firstName:Z(G()),lastName:Z(G()),robots:Q(Z(G()),`index, follow`)}),{}),modest:Q(q(),!1)}),kn=Tn(X({name:Z(G()),company:Z(G()),location:Z(G()),description:Z(G()),position:Z(G()),url:Z(K()),website:Z(K()),startDate:G(),endDate:Z(G()),summary:Z(G()),highlights:Z(J(G())),logo:Z(K())}).check(Dn(({name:e,company:t})=>!!(e||t),{path:[`name`],message:`Either 'name' or 'company' must be provided.`})),vn(({company:e,name:t,url:n,website:r,...i})=>({...i,name:t??e,...n||r?{url:n??r}:{}}))),An=X({network:G(),username:Z(G()),url:Z(K())}),jn=X({address:Z(G()),postalCode:Z(G()),city:Z(G()),countryCode:Z(G().check($t(2))),region:Z(G())}),Mn=Y({meta:$(X({lang:Q(Cn(gn([`en`,`fr`]),`en`),`en`),lastModified:Q(G(),()=>new Date().toISOString()),themeConfig:$(On,{})}),{}),work:Q(Z(J(kn)),[]),basics:X({name:G(),label:Z(G()),image:Z(K()),email:Z(on()),phone:Z(G()),birthDate:Z(G()),url:Z(K()),summary:Z(G()),location:Z(jn),profiles:Z(J(An))}),education:Q(Z(J(Y({institution:G(),url:Z(K()),area:Z(G()),studyType:Z(G()),startDate:G(),endDate:Z(G()),score:Z(G()),courses:Z(J(G()))}))),[]),certificates:Q(Z(J(Y({name:G(),date:Z(G()),url:Z(K()),issuer:Z(G())}))),[]),skills:Q(Z(J(Y({name:G(),level:Z(G()),keywords:Z(J(G()))}))),[]),languages:Q(Z(J(X({language:G(),fluency:Z(G())}))),[])});function Nn({works:e,showLogos:t}){return!e||e.length===0?null:_(E,{name:S(`work_experience`),children:_(`ol`,{className:`timeline`,reversed:!0,children:e.map(e=>_(`li`,{className:`timeline-item`,children:v(`article`,{className:`group`,children:[v(`div`,{className:`flex items-start gap-4`,children:[t&&_(`div`,{className:`mt-1 shrink-0`,children:e.logo?_(`img`,{src:e.logo,alt:e.name,width:`48`,height:`48`,className:`h-12 w-12 rounded-lg object-contain`,loading:`lazy`}):_(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-lg bg-gray-100 font-bold text-gray-400 uppercase select-none dark:bg-slate-800 dark:text-slate-500`,children:e.name?.charAt(0)})}),_(`div`,{className:`min-w-0 flex-1`,children:v(`div`,{className:`grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]`,children:[v(`div`,{className:`min-w-0`,children:[_(`header`,{children:_(`h3`,{className:`truncate text-xl font-bold tracking-tight text-gray-900 md:whitespace-normal dark:text-white`,children:e.position})}),v(`div`,{className:`mt-1 text-gray-600 dark:text-slate-300`,children:[e.url?_(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,translate:`no`,className:`hover:text-primary font-medium text-gray-700 underline-offset-4 transition-colors hover:underline dark:text-slate-200`,children:e.name}):_(`span`,{translate:`no`,className:`font-medium text-gray-700 dark:text-slate-200`,children:e.name}),e.description&&v(`span`,{className:`ml-2 text-sm text-gray-500`,children:[`- `,e.description]})]})]}),_(T,{startDate:e.startDate,endDate:e.endDate,format:`month`,className:`mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400`})]})})]}),e.summary&&_(`p`,{className:`mt-3 text-sm leading-relaxed text-pretty text-gray-600 dark:text-slate-400`,children:e.summary}),_(`ul`,{className:`bullet-list`,children:e.highlights?.map(e=>_(`li`,{className:`bullet-item`,children:_(`span`,{children:e})},e))})]})},e.name+e.startDate))})})}var Pn=async({resume:e,css:t,...n})=>{let{basics:r,work:i,education:a,certificates:o,skills:s,meta:c}=e,{ui:l,modest:u}=c.themeConfig,d=be({seed:l.backgroundTilesSeed,cellSize:60,variance:.8});return v(`html`,{lang:c.lang,children:[v(`head`,{children:[_(`meta`,{charSet:`UTF-8`}),_(`meta`,{name:`viewport`,content:`width=device-width, initial-scale=1.0`}),_(`meta`,{name:`theme-color`,content:l.primary}),!u&&_(`meta`,{name:`generator`,content:`JSON Resume Theme CJEAN`}),_(Re,{resume:e}),r.image&&_(`link`,{rel:`preload`,as:`image`,href:r.image,fetchPriority:`high`}),_(`style`,{dangerouslySetInnerHTML:{__html:`
2
2
  :root {
3
3
  --theme-primary: ${l.primary};
4
4
  --theme-header-from: ${l.headerFrom};
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ function n() {
18
18
  return (e) => e;
19
19
  }
20
20
  //#endregion
21
- //#region ../../node_modules/.bun/@cjean-fr+jsx-string@1.2.1/node_modules/@cjean-fr/jsx-string/dist/index.js
21
+ //#region ../../node_modules/.bun/@cjean-fr+jsx-string@1.2.2/node_modules/@cjean-fr/jsx-string/dist/index.js
22
22
  var r = new Map([
23
23
  ["&", "&amp;"],
24
24
  ["<", "&lt;"],
@@ -100,7 +100,7 @@ var r = new Map([
100
100
  if (ae.test(t)) return !1;
101
101
  oe.lastIndex = 0;
102
102
  let n;
103
- for (; n = oe.exec(t);) if (!ee(n[2].trim())) return !1;
103
+ for (; n = oe.exec(t);) if (!ee(n[2]?.trim() ?? "")) return !1;
104
104
  return !0;
105
105
  }, h = class {
106
106
  value;
@@ -1872,27 +1872,27 @@ function Nn({ works: e, showLogos: t }) {
1872
1872
  reversed: !0,
1873
1873
  children: e.map((e) => /* @__PURE__ */ _("li", {
1874
1874
  className: "timeline-item",
1875
- children: /* @__PURE__ */ _("article", {
1875
+ children: /* @__PURE__ */ v("article", {
1876
1876
  className: "group",
1877
- children: /* @__PURE__ */ v("div", {
1878
- className: "flex items-start gap-4",
1879
- children: [t && /* @__PURE__ */ _("div", {
1880
- className: "mt-1 shrink-0",
1881
- children: e.logo ? /* @__PURE__ */ _("img", {
1882
- src: e.logo,
1883
- alt: e.name,
1884
- width: "48",
1885
- height: "48",
1886
- className: "h-12 w-12 rounded-lg object-contain",
1887
- loading: "lazy"
1888
- }) : /* @__PURE__ */ _("div", {
1889
- className: "flex h-12 w-12 items-center justify-center rounded-lg bg-gray-100 font-bold text-gray-400 uppercase select-none dark:bg-slate-800 dark:text-slate-500",
1890
- children: e.name?.charAt(0)
1891
- })
1892
- }), /* @__PURE__ */ v("div", {
1893
- className: "min-w-0 flex-1",
1894
- children: [
1895
- /* @__PURE__ */ v("div", {
1877
+ children: [
1878
+ /* @__PURE__ */ v("div", {
1879
+ className: "flex items-start gap-4",
1880
+ children: [t && /* @__PURE__ */ _("div", {
1881
+ className: "mt-1 shrink-0",
1882
+ children: e.logo ? /* @__PURE__ */ _("img", {
1883
+ src: e.logo,
1884
+ alt: e.name,
1885
+ width: "48",
1886
+ height: "48",
1887
+ className: "h-12 w-12 rounded-lg object-contain",
1888
+ loading: "lazy"
1889
+ }) : /* @__PURE__ */ _("div", {
1890
+ className: "flex h-12 w-12 items-center justify-center rounded-lg bg-gray-100 font-bold text-gray-400 uppercase select-none dark:bg-slate-800 dark:text-slate-500",
1891
+ children: e.name?.charAt(0)
1892
+ })
1893
+ }), /* @__PURE__ */ _("div", {
1894
+ className: "min-w-0 flex-1",
1895
+ children: /* @__PURE__ */ v("div", {
1896
1896
  className: "grid grid-cols-1 gap-x-4 md:grid-cols-[1fr_auto]",
1897
1897
  children: [/* @__PURE__ */ v("div", {
1898
1898
  className: "min-w-0",
@@ -1923,21 +1923,21 @@ function Nn({ works: e, showLogos: t }) {
1923
1923
  format: "month",
1924
1924
  className: "mt-1 flex shrink-0 text-sm text-gray-500 capitalize md:mt-1.5 md:items-start md:text-right dark:text-slate-400"
1925
1925
  })]
1926
- }),
1927
- e.summary && /* @__PURE__ */ _("p", {
1928
- className: "mt-3 text-sm leading-relaxed text-pretty text-gray-600 dark:text-slate-400",
1929
- children: e.summary
1930
- }),
1931
- /* @__PURE__ */ _("ul", {
1932
- className: "bullet-list",
1933
- children: e.highlights?.map((e) => /* @__PURE__ */ _("li", {
1934
- className: "bullet-item",
1935
- children: /* @__PURE__ */ _("span", { children: e })
1936
- }, e))
1937
1926
  })
1938
- ]
1939
- })]
1940
- })
1927
+ })]
1928
+ }),
1929
+ e.summary && /* @__PURE__ */ _("p", {
1930
+ className: "mt-3 text-sm leading-relaxed text-pretty text-gray-600 dark:text-slate-400",
1931
+ children: e.summary
1932
+ }),
1933
+ /* @__PURE__ */ _("ul", {
1934
+ className: "bullet-list",
1935
+ children: e.highlights?.map((e) => /* @__PURE__ */ _("li", {
1936
+ className: "bullet-item",
1937
+ children: /* @__PURE__ */ _("span", { children: e })
1938
+ }, e))
1939
+ })
1940
+ ]
1941
1941
  })
1942
1942
  }, e.name + e.startDate))
1943
1943
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsonresume-theme-cjean",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "A clean, professional, and print-optimized JSON Resume theme built with Tailwind CSS and TypeScript.",
5
5
  "author": "Christophe Jean",
6
6
  "license": "MIT",
@@ -20,6 +20,9 @@
20
20
  "main": "./dist/index.cjs",
21
21
  "module": "./dist/index.js",
22
22
  "types": "./dist/index.d.ts",
23
+ "bin": {
24
+ "jsonresume-theme-cjean": "./bin/jsonresume-theme-cjean.js"
25
+ },
23
26
  "devDependencies": {
24
27
  "@cjean-fr/i18n-tiny": "catalog:",
25
28
  "@cjean-fr/jsx-string": "catalog:",
@@ -43,6 +46,7 @@
43
46
  },
44
47
  "files": [
45
48
  "dist",
49
+ "bin",
46
50
  "package.json",
47
51
  "README.md",
48
52
  "LICENSE"
@@ -51,9 +55,7 @@
51
55
  "build": "vite build",
52
56
  "check": "tsc --noEmit",
53
57
  "format": "prettier --write \"**/*.{ts,tsx,json,md}\"",
54
- "publish": "bun pm pack && npm publish",
55
- "resume:export": "bunx resume-cli export output.html -t .",
56
- "resume:serve": "bunx resume-cli serve -t ."
58
+ "publish": "bun pm pack && npm publish"
57
59
  },
58
60
  "type": "module"
59
61
  }