jsonresume-theme-cjean 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Christophe Jean
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # jsonresume-theme-cjean
2
+
3
+ A clean, professional [JSON Resume](https://jsonresume.org/) theme built with Tailwind CSS and TypeScript.
4
+
5
+ ## Features
6
+
7
+ - **Responsive Design**: Looks great on mobile and desktop.
8
+ - **Print Optimized**: Automatically adjusted for high-quality PDF exports.
9
+ - **SEO Ready**: Full support for Meta tags, OpenGraph, Twitter Cards, and JSON-LD.
10
+ - **Customizable Aesthetics**: Easy branding via granular `ui` configuration and geometric patterns.
11
+ - **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.
13
+
14
+ ## Usage
15
+
16
+ ### Installation
17
+
18
+ ```bash
19
+ bun install
20
+ ```
21
+
22
+ ### Build
23
+
24
+ ```bash
25
+ bun run build
26
+ ```
27
+
28
+ ### Resume Commands
29
+
30
+ To export your resume to an HTML file:
31
+
32
+ ```bash
33
+ bun run resume:export
34
+ ```
35
+
36
+ To live preview your resume (auto-reloads on changes):
37
+
38
+ ```bash
39
+ bun run resume:serve
40
+ ```
41
+
42
+ ## Configuration
43
+
44
+ You can customize the theme by adding a `meta` object to your `resume.json`.
45
+
46
+ ```json
47
+ {
48
+ "meta": {
49
+ "theme": "cjean",
50
+ "lang": "fr",
51
+ "lastModified": "2026-02-06",
52
+ "themeConfig": {
53
+ "ui": {
54
+ "primary": "#c80044",
55
+ "headerFrom": "#0271bf",
56
+ "headerTo": "#c80044",
57
+ "footerFrom": "#0271bf",
58
+ "footerTo": "#003d68",
59
+ "backgroundTilesSeed": 188
60
+ },
61
+ "seo": {
62
+ "title": "CV de Jean Dupont",
63
+ "description": "Développeur Fullstack expérimenté",
64
+ "robots": "index, follow"
65
+ },
66
+ "modest": false
67
+ }
68
+ },
69
+ "basics": { ... }
70
+ }
71
+ ```
72
+
73
+ ### themeConfig Options
74
+
75
+ #### UI Options (`ui`)
76
+
77
+ | Option | Description | Default |
78
+ | :-------------------- | :---------------------------------------------------- | :------------------------------------------- |
79
+ | `primary` | Primary theme color | `#c80044` |
80
+ | `headerFrom` | Gradient start color for header | `#0271bf` |
81
+ | `headerTo` | Gradient end color for header | `#c80044` |
82
+ | `footerFrom` | Gradient start color for footer | `#0271bf` |
83
+ | `footerTo` | Gradient end color for footer | `#003d68` |
84
+ | `backgroundTilesSeed` | Seed for the geometric background patterns | `188` |
85
+ | `contactLinks` | Order and choice of contact links (phone, email, ...) | `["phone", "email", "location", "profiles"]` |
86
+
87
+ **Note on `contactLinks`**:
88
+
89
+ - The order in the array determines the order of appearance.
90
+ - **Special keywords**: `phone`, `email`, `location`.
91
+ - **`profiles` keyword**: A "catch-all" that renders all social networks not explicitly mentioned.
92
+ - **Specific networks**: You can use the name of a network (e.g., `"LinkedIn"`, `"GitHub"`) to place it exactly where you want.
93
+ - _Example_: `["LinkedIn", "email", "location"]` will show only these three, in that order.
94
+ - _Example_: `["phone", "profiles", "email"]` will show the phone, then ALL social profiles, then the email.
95
+ | `cta` | Call to Action FAB (`text`, `url`, `icon`) | - |
96
+
97
+ **Icons & Social Networks**:
98
+ The theme uses [Iconify](https://icon-sets.iconify.design/) to dynamically fetch icons.
99
+
100
+ - **Social Networks**: Icons for profiles are automatically prefixed with `tabler:brand-`. For example, a network named `LinkedIn` will search for `tabler:brand-linkedin`.
101
+ - **Custom Icons**: For the `cta.icon`, you must provide the full Iconify identifier (e.g., `mdi:email`, `tabler:message-circle`).
102
+ - **Search Icons**: You can browse thousands of available icons on the [Iconify Explorer](https://icon-sets.iconify.design/).
103
+
104
+ #### SEO Options (`seo`)
105
+
106
+ | Option | Description | Default |
107
+ | :------------- | :------------------------------------------ | :----------------- |
108
+ | `title` | Meta title (overrides default name - label) | - |
109
+ | `description` | Meta description (overrides basics.summary) | - |
110
+ | `canonical` | Canonical URL | `basics.url` |
111
+ | `ogImage` | Open Graph image URL | `basics.image` |
112
+ | `twitterImage` | Twitter card image URL | `basics.image` |
113
+ | `robots` | Robots meta tag content | `index, follow` |
114
+ | `firstName` | SEO explicit first name | (parsed from name) |
115
+ | `lastName` | SEO explicit last name | (parsed from name) |
116
+
117
+ #### Other Options
118
+
119
+ | Option | Description | Default |
120
+ | :------- | :---------------------------------------------------- | :------ |
121
+ | `modest` | Minimal branding (removes theme credit and generator) | `false` |
122
+
123
+ ### Meta Options (root)
124
+
125
+ | Option | Description | Default |
126
+ | :------------- | :---------------------------------- | :------ |
127
+ | `lang` | Locale of the resume (`en` or `fr`) | `en` |
128
+ | `lastModified` | Last modification date (ISO format) | (now) |
129
+
130
+ ## Adding New Locales
131
+
132
+ To add a new locale (e.g., Spanish `es`):
133
+
134
+ 1. Open `src/lib/i18n.ts`.
135
+ 2. Add the new translations to the `fr` or `en` model to stay in sync with the `ThemeSpec`.
136
+ 3. Define the new locale resource:
137
+ ```typescript
138
+ const es = defineTranslations<ThemeSpec>()({
139
+ work_experience: "Experiencia laboral",
140
+ // ... copy and translate all keys
141
+ });
142
+ ```
143
+ 4. Add it to the `resources` object:
144
+ ```typescript
145
+ const resources = {
146
+ en,
147
+ fr,
148
+ es,
149
+ };
150
+ ```
151
+ 5. Update the `Locale` type if necessary (though it's usually inferred).
152
+
153
+ ## License
154
+
155
+ MIT © Christophe Jean
156
+
157
+ ---
158
+
159
+ <p align="center">Made with ❤️ in Paris</p>
package/dist/index.cjs ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var Ne=new Map([["&","&amp;"],["<","&lt;"],[">","&gt;"],['"',"&quot;"],["'","&#x27;"]]),Oe=new Set(["href","src","action","formaction","cite","poster","icon","data"]),Te=/[&<>]/g,Ce=/[&<>"]/g,Ee=new RegExp("\\p{C}","gu"),Le=/^[^\s"'>/=]+$/u,Ie=/^(?:java|vb)script:/i,Ae=/^data:(?!image\/)/i,me=e=>e.replace(Ee,""),O=(e,t="content")=>{let r=t==="attr"?Ce:Te;return e.replaceAll(r,n=>Ne.get(n)??n)},Re=e=>{let t=me(e).trim();return t?!(Ie.test(t)||Ae.test(t)):!0},De=e=>Le.test(e),Fe=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Ue=/[A-Z]/g,Be=new Set(["children","dangerouslySetInnerHTML","key","ref"]),we=e=>{if(e instanceof Promise)return!0;if(Array.isArray(e)){for(let t=0;t<e.length;t++)if(we(e[t]))return!0}return!1};class z{value;constructor(t){this.value=t}toString(){return this.value}}function Ve(e){if(!e)return"";let t=Object.keys(e);for(let r=0;r<t.length;r++){let n=t[r];if(n&&we(e[n]))return Promise.all(t.map(async a=>[a,await e[a]])).then(a=>ae(Object.fromEntries(a)))}return ae(e)}function ae(e){let t="",r=new Set,n=Object.keys(e);for(let a=0;a<n.length;a++){let o=n[a];if(!o)continue;let i=e[o];if(Be.has(o)||i===!1||i==null)continue;if(o==="class"||o==="className"){if(typeof i=="string")for(let l of i.split(/\s+/))l&&r.add(l);continue}let s=o.length>20||!/^[a-z]+$/.test(o)?me(o.toLowerCase()):o;if(De(s))if(s==="style"){let l=typeof i=="object"?We(i):String(i);t+=` style="${O(l,"attr")}"`}else if(i===!0)t+=` ${s}`;else{let l=String(i);Oe.has(s)&&!Re(l)&&(l="#blocked"),t+=` ${s}="${O(l,"attr")}"`}}return r.size>0&&(t=` class="${O([...r].join(" "),"attr")}"`+t),t}function We(e){let t=[];for(let[r,n]of Object.entries(e)){if(n==null)continue;let a=r.startsWith("--")?r:r.replace(Ue,"-$&").toLowerCase();t.push(`${a}:${n}`)}return t.join(";")}function X(e){if(e==null||e===!0||e===!1)return"";if(e instanceof z)return e;if(e instanceof Promise)return e.then(X).then(t=>t instanceof z?t:new z(O(String(t))));if(Array.isArray(e)){let t=e.length,r=Array(t),n=!1;for(let a=0;a<t;a++){let o=X(e[a]);r[a]=o,o instanceof Promise&&(n=!0)}if(!n){let a="";for(let o=0;o<t;o++){let i=r[o];a+=i instanceof z?i.value:O(String(i))}return new z(a)}return Promise.all(r).then(a=>{let o="";for(let i=0;i<a.length;i++){let s=a[i];o+=s instanceof z?s.value:O(String(s))}return new z(o)})}return String(e)}function He(e,t,r){let n=Ve(t),a=t.dangerouslySetInnerHTML?new z(t.dangerouslySetInnerHTML.__html):X(r);return n instanceof Promise||a instanceof Promise?Promise.all([n,a]).then(([o,i])=>oe(e,o,i)):oe(e,n,a)}function oe(e,t,r){if(Fe.has(e))return new z(`<${e}${t}>`);let n=r instanceof z?r.value:O(String(r));return new z(`<${e}${t}>${n}</${e}>`)}function c(e,t,r){let n=t||{},a=n.children,o=Array.isArray(a)?a:a!==void 0?[a]:[];return typeof e=="function"?e(n):He(e,n,o)}var m=c;function q({children:e}){return e}function Je(e,t={}){return e.replace(/\{([\w-]+?)\}/g,(r,n)=>{let a=t[n];return a!==void 0?String(a):r})}function be(e,t){return(r,...n)=>{let a=e[r]??r,o=n[0]||{};return n.length===0?a:Je(a,o)}}function Ye(){return e=>e}const qe={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}"},Ke=Ye()({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}"}),ve={en:qe,fr:Ke};let W,H="en";const Z=(e,...t)=>(W||(W=be(ve[H])),W(e,...t)),ie=(e,...t)=>new z(Z(e,...t));function Ge(e){H=e,W=be(ve[e])}const T={normalize(e){const t=typeof e=="string"?new Date(e):e;return isNaN(t.getTime())?null:t},format(e,t){const r=this.normalize(e);if(!r)return"";const n=typeof H<"u"?H:"fr-FR";switch(t){case"month":return new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}).format(r);case"year":return r.getFullYear().toString();case"date":return new Intl.DateTimeFormat(n,{day:"numeric",month:"numeric",year:"numeric"}).format(r);case"iso":return r.toISOString();default:throw new Error(`Unhandled date format: ${t}`)}},toISO(e){return this.normalize(e)?.toISOString()??""}};class Qe{seed;constructor(t){this.seed=t}next(){return this.seed=this.seed*16807%2147483647,(this.seed-1)/2147483646}}function Xe(e={}){const{width:t=900,height:r=300,cellSize:n=50,variance:a=.75,seed:o=1}=e,i=new Qe(o),s=[],l=Math.ceil(t/n)+2,d=Math.ceil(r/n)+2;for(let g=0;g<d;g++){const b=[];for(let y=0;y<l;y++){const S=(y-.5)*n+(i.next()-.5)*n*a,M=(g-.5)*n+(i.next()-.5)*n*a;b.push({x:Math.round(S*10)/10,y:Math.round(M*10)/10})}s.push(b)}let p="";for(let g=0;g<d-1;g++)for(let b=0;b<l-1;b++){const y=s[g][b],S=s[g][b+1],M=s[g+1][b],Q=s[g+1][b+1];p+=se(y,S,M,i.next()),p+=se(S,Q,M,i.next())}const w=`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${r}" viewBox="0 0 ${t} ${r}" preserveAspectRatio="xMidYMid slice">
2
+ <g fill-rule="evenodd">${p}</g>
3
+ </svg>`;return`data:image/svg+xml;base64,${btoa(w)}`}function se(e,t,r,n){const a=n>.5,o=(Math.round(n*100)/1e3).toFixed(3),i=a?"0,0,0":"255,255,255";return`<path d="M${e.x},${e.y}L${t.x},${t.y}L${r.x},${r.y}Z" fill="rgba(${i},${o})"/>`}function et({name:e,label:t,children:r,...n}){return m("header",{className:"flex-1 grow pr-14 md:pr-0",...n,children:[c("h1",{className:"text-primary kerning-none inline-block text-4xl font-bold tracking-widest uppercase",children:e}),t&&c("p",{className:"text-3xl",children:t}),r]})}const tt=async(e,t={})=>{const r=new URL(`https://api.iconify.design/${e}.svg`);for(const[a,o]of Object.entries(t))o&&r.searchParams.set(a,o.toString());const n=await fetch(r);if(!n.ok)throw new Error(`Failed to fetch icon ${e}`);return n.text()},C=async(e,t=24)=>{const r=await tt(e,{height:t});return new z(r)};function rt(e){return`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(e)}`}function ce(e){try{return C(`tabler:brand-${e.toLowerCase()}`)}catch{return C("tabler:link")}}const D=({children:e,...t})=>c("li",{className:"inline-flex items-center gap-x-1",...t,children:e});function nt({basics:e,themeConfig:t}){const{phone:r,email:n,location:a,profiles:o=[]}=e,{contactLinks:i=["phone","email","location","profiles"]}=t.ui,s=new Set,l=d=>{const p=d.toLowerCase();if(p==="phone"&&r)return m(D,{children:[C("tabler:phone"),c("a",{href:`tel:${encodeURIComponent(r)}`,title:Z("phone_call"),children:r})]});if(p==="email"&&n)return m(D,{children:[C("tabler:mail"),c("a",{href:`mailto:${n}`,title:Z("email_send"),children:n})]});if(p==="location"&&a)return m(D,{children:[C("tabler:map-pin"),m("a",{href:rt(`${a.city}, ${a.region}, ${a.postalCode||""}, ${a.countryCode}`),title:Z("show_address"),target:"_blank",rel:"noopener noreferrer",referrerPolicy:"no-referrer",children:[a.city,", ",a.countryCode]})]});if(p==="profiles")return o.filter(g=>!s.has(g.network.toLowerCase())).map(g=>(s.add(g.network.toLowerCase()),m(D,{children:[ce(g.network),c("a",{href:g.url,rel:"me noopener noreferrer",title:g.username,target:"_blank",referrerPolicy:"no-referrer",children:g.network})]},g.network)));const w=o.find(g=>g.network.toLowerCase()===p);return w&&!s.has(p)?(s.add(p),m(D,{children:[ce(w.network),c("a",{href:w.url,rel:"me noopener noreferrer",title:w.username,target:"_blank",referrerPolicy:"no-referrer",children:w.network})]},w.network)):null};return c("ul",{className:"my-3 inline-flex flex-wrap gap-x-[2ch] gap-y-2","aria-label":Z("contact_info"),children:i.map(l)})}function f(e,t,r){function n(s,l){if(s._zod||Object.defineProperty(s,"_zod",{value:{def:l,constr:i,traits:new Set},enumerable:!1}),s._zod.traits.has(e))return;s._zod.traits.add(e),t(s,l);const d=i.prototype,p=Object.keys(d);for(let w=0;w<p.length;w++){const g=p[w];g in s||(s[g]=d[g].bind(s))}}const a=r?.Parent??Object;class o extends a{}Object.defineProperty(o,"name",{value:e});function i(s){var l;const d=r?.Parent?new o:this;n(d,s),(l=d._zod).deferred??(l.deferred=[]);for(const p of d._zod.deferred)p();return d}return Object.defineProperty(i,"init",{value:n}),Object.defineProperty(i,Symbol.hasInstance,{value:s=>r?.Parent&&s instanceof r.Parent?!0:s?._zod?.traits?.has(e)}),Object.defineProperty(i,"name",{value:e}),i}class E extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}class at extends Error{constructor(t){super(`Encountered unidirectional transform during encode: ${t}`),this.name="ZodEncodeError"}}const ot={};function L(e){return ot}function it(e){const t=Object.values(e).filter(n=>typeof n=="number");return Object.entries(e).filter(([n,a])=>t.indexOf(+n)===-1).map(([n,a])=>a)}function st(e,t){return typeof t=="bigint"?t.toString():t}function ct(e){return{get value(){{const t=e();return Object.defineProperty(this,"value",{value:t}),t}}}}function lt(e){return e==null}function dt(e){const t=e.startsWith("^")?1:0,r=e.endsWith("$")?e.length-1:e.length;return e.slice(t,r)}const le=Symbol("evaluating");function k(e,t,r){let n;Object.defineProperty(e,t,{get(){if(n!==le)return n===void 0&&(n=le,n=r()),n},set(a){Object.defineProperty(e,t,{value:a})},configurable:!0})}const ye="captureStackTrace"in Error?Error.captureStackTrace:(...e)=>{};function ee(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ut(e){if(ee(e)===!1)return!1;const t=e.constructor;if(t===void 0||typeof t!="function")return!0;const r=t.prototype;return!(ee(r)===!1||Object.prototype.hasOwnProperty.call(r,"isPrototypeOf")===!1)}function xe(e){return ut(e)?{...e}:Array.isArray(e)?[...e]:e}const pt=new Set(["string","number","symbol"]);function ht(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e,t,r){const n=new e._zod.constr(t??e._zod.def);return(!t||r?.parent)&&(n._zod.parent=e),n}function $(e){const t=e;if(!t)return{};if(typeof t=="string")return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw new 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 gt(e){return Object.keys(e).filter(t=>e[t]._zod.optin==="optional"&&e[t]._zod.optout==="optional")}function U(e,t=0){if(e.aborted===!0)return!0;for(let r=t;r<e.issues.length;r++)if(e.issues[r]?.continue!==!0)return!0;return!1}function ke(e,t){return t.map(r=>{var n;return(n=r).path??(n.path=[]),r.path.unshift(e),r})}function B(e){return typeof e=="string"?e:e?.message}function I(e,t,r){const n={...e,path:e.path??[]};if(!e.message){const a=B(e.inst?._zod.def?.error?.(e))??B(t?.error?.(e))??B(r.customError?.(e))??B(r.localeError?.(e))??"Invalid input";n.message=a}return delete n.inst,delete n.continue,t?.reportInput||delete n.input,n}function mt(e){return Array.isArray(e)?"array":typeof e=="string"?"string":"unknown"}function wt(...e){const[t,r,n]=e;return typeof t=="string"?{message:t,code:"custom",input:r,inst:n}:{...t}}const _e=(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,st,2),Object.defineProperty(e,"toString",{value:()=>e.message,enumerable:!1})},bt=f("$ZodError",_e),K=f("$ZodError",_e,{Parent:Error}),vt=e=>(t,r,n,a)=>{const o=n?Object.assign(n,{async:!1}):{async:!1},i=t._zod.run({value:r,issues:[]},o);if(i instanceof Promise)throw new E;if(i.issues.length){const s=new(a?.Err??e)(i.issues.map(l=>I(l,o,L())));throw ye(s,a?.callee),s}return i.value},yt=vt(K),xt=e=>async(t,r,n,a)=>{const o=n?Object.assign(n,{async:!0}):{async:!0};let i=t._zod.run({value:r,issues:[]},o);if(i instanceof Promise&&(i=await i),i.issues.length){const s=new(a?.Err??e)(i.issues.map(l=>I(l,o,L())));throw ye(s,a?.callee),s}return i.value},kt=xt(K),_t=e=>(t,r,n)=>{const a=n?{...n,async:!1}:{async:!1},o=t._zod.run({value:r,issues:[]},a);if(o instanceof Promise)throw new E;return o.issues.length?{success:!1,error:new(e??bt)(o.issues.map(i=>I(i,a,L())))}:{success:!0,data:o.value}},ze=_t(K),zt=e=>async(t,r,n)=>{const a=n?Object.assign(n,{async:!0}):{async:!0};let o=t._zod.run({value:r,issues:[]},a);return o instanceof Promise&&(o=await o),o.issues.length?{success:!1,error:new e(o.issues.map(i=>I(i,a,L())))}:{success:!0,data:o.value}},$e=zt(K),$t=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,St="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",Zt=new RegExp(`^${St}$`),Pt=e=>{const t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${t}$`)},jt=/^-?\d+(?:\.\d+)?$/,Mt=/^(?:true|false)$/i,te=f("$ZodCheck",(e,t)=>{var r;e._zod??(e._zod={}),e._zod.def=t,(r=e._zod).onattach??(r.onattach=[])}),Nt=f("$ZodCheckLengthEquals",(e,t)=>{var r;te.init(e,t),(r=e._zod.def).when??(r.when=n=>{const a=n.value;return!lt(a)&&a.length!==void 0}),e._zod.onattach.push(n=>{const a=n._zod.bag;a.minimum=t.length,a.maximum=t.length,a.length=t.length}),e._zod.check=n=>{const a=n.value,o=a.length;if(o===t.length)return;const i=mt(a),s=o>t.length;n.issues.push({origin:i,...s?{code:"too_big",maximum:t.length}:{code:"too_small",minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),Se=f("$ZodCheckStringFormat",(e,t)=>{var r,n;te.init(e,t),e._zod.onattach.push(a=>{const o=a._zod.bag;o.format=t.format,t.pattern&&(o.patterns??(o.patterns=new Set),o.patterns.add(t.pattern))}),t.pattern?(r=e._zod).check??(r.check=a=>{t.pattern.lastIndex=0,!t.pattern.test(a.value)&&a.issues.push({origin:"string",code:"invalid_format",format:t.format,input:a.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(n=e._zod).check??(n.check=()=>{})}),Ot=f("$ZodCheckRegex",(e,t)=>{Se.init(e,t),e._zod.check=r=>{t.pattern.lastIndex=0,!t.pattern.test(r.value)&&r.issues.push({origin:"string",code:"invalid_format",format:"regex",input:r.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),Tt={major:4,minor:3,patch:6},x=f("$ZodType",(e,t)=>{var r;e??(e={}),e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=Tt;const n=[...e._zod.def.checks??[]];e._zod.traits.has("$ZodCheck")&&n.unshift(e);for(const a of n)for(const o of a._zod.onattach)o(e);if(n.length===0)(r=e._zod).deferred??(r.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{const a=(i,s,l)=>{let d=U(i),p;for(const w of s){if(w._zod.def.when){if(!w._zod.def.when(i))continue}else if(d)continue;const g=i.issues.length,b=w._zod.check(i);if(b instanceof Promise&&l?.async===!1)throw new E;if(p||b instanceof Promise)p=(p??Promise.resolve()).then(async()=>{await b,i.issues.length!==g&&(d||(d=U(i,g)))});else{if(i.issues.length===g)continue;d||(d=U(i,g))}}return p?p.then(()=>i):i},o=(i,s,l)=>{if(U(i))return i.aborted=!0,i;const d=a(s,n,l);if(d instanceof Promise){if(l.async===!1)throw new E;return d.then(p=>e._zod.parse(p,l))}return e._zod.parse(d,l)};e._zod.run=(i,s)=>{if(s.skipChecks)return e._zod.parse(i,s);if(s.direction==="backward"){const d=e._zod.parse({value:i.value,issues:[]},{...s,skipChecks:!0});return d instanceof Promise?d.then(p=>o(p,i,s)):o(d,i,s)}const l=e._zod.parse(i,s);if(l instanceof Promise){if(s.async===!1)throw new E;return l.then(d=>a(d,n,s))}return a(l,n,s)}}k(e,"~standard",()=>({validate:a=>{try{const o=ze(e,a);return o.success?{value:o.data}:{issues:o.error?.issues}}catch{return $e(e,a).then(i=>i.success?{value:i.data}:{issues:i.error?.issues})}},vendor:"zod",version:1}))}),Ze=f("$ZodString",(e,t)=>{x.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??Pt(e._zod.bag),e._zod.parse=(r,n)=>{if(t.coerce)try{r.value=String(r.value)}catch{}return typeof r.value=="string"||r.issues.push({expected:"string",code:"invalid_type",input:r.value,inst:e}),r}}),G=f("$ZodStringFormat",(e,t)=>{Se.init(e,t),Ze.init(e,t)}),Ct=f("$ZodEmail",(e,t)=>{t.pattern??(t.pattern=$t),G.init(e,t)}),Et=f("$ZodURL",(e,t)=>{G.init(e,t),e._zod.check=r=>{try{const n=r.value.trim(),a=new URL(n);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(a.hostname)||r.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:t.hostname.source,input:r.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(a.protocol.endsWith(":")?a.protocol.slice(0,-1):a.protocol)||r.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:t.protocol.source,input:r.value,inst:e,continue:!t.abort})),t.normalize?r.value=a.href:r.value=n;return}catch{r.issues.push({code:"invalid_format",format:"url",input:r.value,inst:e,continue:!t.abort})}}}),Lt=f("$ZodISODate",(e,t)=>{t.pattern??(t.pattern=Zt),G.init(e,t)}),It=f("$ZodNumber",(e,t)=>{x.init(e,t),e._zod.pattern=e._zod.bag.pattern??jt,e._zod.parse=(r,n)=>{if(t.coerce)try{r.value=Number(r.value)}catch{}const a=r.value;if(typeof a=="number"&&!Number.isNaN(a)&&Number.isFinite(a))return r;const o=typeof a=="number"?Number.isNaN(a)?"NaN":Number.isFinite(a)?void 0:"Infinity":void 0;return r.issues.push({expected:"number",code:"invalid_type",input:a,inst:e,...o?{received:o}:{}}),r}}),At=f("$ZodBoolean",(e,t)=>{x.init(e,t),e._zod.pattern=Mt,e._zod.parse=(r,n)=>{if(t.coerce)try{r.value=!!r.value}catch{}const a=r.value;return typeof a=="boolean"||r.issues.push({expected:"boolean",code:"invalid_type",input:a,inst:e}),r}}),Rt=f("$ZodUnknown",(e,t)=>{x.init(e,t),e._zod.parse=r=>r});function de(e,t,r){e.issues.length&&t.issues.push(...ke(r,e.issues)),t.value[r]=e.value}const Dt=f("$ZodArray",(e,t)=>{x.init(e,t),e._zod.parse=(r,n)=>{const a=r.value;if(!Array.isArray(a))return r.issues.push({expected:"array",code:"invalid_type",input:a,inst:e}),r;r.value=Array(a.length);const o=[];for(let i=0;i<a.length;i++){const s=a[i],l=t.element._zod.run({value:s,issues:[]},n);l instanceof Promise?o.push(l.then(d=>de(d,r,i))):de(l,r,i)}return o.length?Promise.all(o).then(()=>r):r}});function J(e,t,r,n,a){if(e.issues.length){if(a&&!(r in n))return;t.issues.push(...ke(r,e.issues))}e.value===void 0?r in n&&(t.value[r]=void 0):t.value[r]=e.value}function Ft(e){const t=Object.keys(e.shape);for(const n of t)if(!e.shape?.[n]?._zod?.traits?.has("$ZodType"))throw new Error(`Invalid element at key "${n}": expected a Zod schema`);const r=gt(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(r)}}function Ut(e,t,r,n,a,o){const i=[],s=a.keySet,l=a.catchall._zod,d=l.def.type,p=l.optout==="optional";for(const w in t){if(s.has(w))continue;if(d==="never"){i.push(w);continue}const g=l.run({value:t[w],issues:[]},n);g instanceof Promise?e.push(g.then(b=>J(b,r,w,t,p))):J(g,r,w,t,p)}return i.length&&r.issues.push({code:"unrecognized_keys",keys:i,input:t,inst:o}),e.length?Promise.all(e).then(()=>r):r}const Bt=f("$ZodObject",(e,t)=>{if(x.init(e,t),!Object.getOwnPropertyDescriptor(t,"shape")?.get){const s=t.shape;Object.defineProperty(t,"shape",{get:()=>{const l={...s};return Object.defineProperty(t,"shape",{value:l}),l}})}const n=ct(()=>Ft(t));k(e._zod,"propValues",()=>{const s=t.shape,l={};for(const d in s){const p=s[d]._zod;if(p.values){l[d]??(l[d]=new Set);for(const w of p.values)l[d].add(w)}}return l});const a=ee,o=t.catchall;let i;e._zod.parse=(s,l)=>{i??(i=n.value);const d=s.value;if(!a(d))return s.issues.push({expected:"object",code:"invalid_type",input:d,inst:e}),s;s.value={};const p=[],w=i.shape;for(const g of i.keys){const b=w[g],y=b._zod.optout==="optional",S=b._zod.run({value:d[g],issues:[]},l);S instanceof Promise?p.push(S.then(M=>J(M,s,g,d,y))):J(S,s,g,d,y)}return o?Ut(p,d,s,l,n.value,e):p.length?Promise.all(p).then(()=>s):s}}),Vt=f("$ZodEnum",(e,t)=>{x.init(e,t);const r=it(t.entries),n=new Set(r);e._zod.values=n,e._zod.pattern=new RegExp(`^(${r.filter(a=>pt.has(typeof a)).map(a=>typeof a=="string"?ht(a):a.toString()).join("|")})$`),e._zod.parse=(a,o)=>{const i=a.value;return n.has(i)||a.issues.push({code:"invalid_value",values:r,input:i,inst:e}),a}}),Wt=f("$ZodTransform",(e,t)=>{x.init(e,t),e._zod.parse=(r,n)=>{if(n.direction==="backward")throw new at(e.constructor.name);const a=t.transform(r.value,r);if(n.async)return(a instanceof Promise?a:Promise.resolve(a)).then(i=>(r.value=i,r));if(a instanceof Promise)throw new E;return r.value=a,r}});function ue(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const Ht=f("$ZodOptional",(e,t)=>{x.init(e,t),e._zod.optin="optional",e._zod.optout="optional",k(e._zod,"values",()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),k(e._zod,"pattern",()=>{const r=t.innerType._zod.pattern;return r?new RegExp(`^(${dt(r.source)})?$`):void 0}),e._zod.parse=(r,n)=>{if(t.innerType._zod.optin==="optional"){const a=t.innerType._zod.run(r,n);return a instanceof Promise?a.then(o=>ue(o,r.value)):ue(a,r.value)}return r.value===void 0?r:t.innerType._zod.run(r,n)}}),Jt=f("$ZodDefault",(e,t)=>{x.init(e,t),e._zod.optin="optional",k(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(r,n)=>{if(n.direction==="backward")return t.innerType._zod.run(r,n);if(r.value===void 0)return r.value=t.defaultValue,r;const a=t.innerType._zod.run(r,n);return a instanceof Promise?a.then(o=>pe(o,t)):pe(a,t)}});function pe(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const Yt=f("$ZodPrefault",(e,t)=>{x.init(e,t),e._zod.optin="optional",k(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(r,n)=>(n.direction==="backward"||r.value===void 0&&(r.value=t.defaultValue),t.innerType._zod.run(r,n))}),qt=f("$ZodCatch",(e,t)=>{x.init(e,t),k(e._zod,"optin",()=>t.innerType._zod.optin),k(e._zod,"optout",()=>t.innerType._zod.optout),k(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(r,n)=>{if(n.direction==="backward")return t.innerType._zod.run(r,n);const a=t.innerType._zod.run(r,n);return a instanceof Promise?a.then(o=>(r.value=o.value,o.issues.length&&(r.value=t.catchValue({...r,error:{issues:o.issues.map(i=>I(i,n,L()))},input:r.value}),r.issues=[]),r)):(r.value=a.value,a.issues.length&&(r.value=t.catchValue({...r,error:{issues:a.issues.map(o=>I(o,n,L()))},input:r.value}),r.issues=[]),r)}}),Kt=f("$ZodPipe",(e,t)=>{x.init(e,t),k(e._zod,"values",()=>t.in._zod.values),k(e._zod,"optin",()=>t.in._zod.optin),k(e._zod,"optout",()=>t.out._zod.optout),k(e._zod,"propValues",()=>t.in._zod.propValues),e._zod.parse=(r,n)=>{if(n.direction==="backward"){const o=t.out._zod.run(r,n);return o instanceof Promise?o.then(i=>V(i,t.in,n)):V(o,t.in,n)}const a=t.in._zod.run(r,n);return a instanceof Promise?a.then(o=>V(o,t.out,n)):V(a,t.out,n)}});function V(e,t,r){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},r)}const Gt=f("$ZodCustom",(e,t)=>{te.init(e,t),x.init(e,t),e._zod.parse=(r,n)=>r,e._zod.check=r=>{const n=r.value,a=t.fn(n);if(a instanceof Promise)return a.then(o=>he(o,r,n,e));he(a,r,n,e)}});function he(e,t,r,n){if(!e){const a={code:"custom",input:r,inst:n,path:[...n._zod.def.path??[]],continue:!n._zod.def.abort};n._zod.def.params&&(a.params=n._zod.def.params),t.issues.push(wt(a))}}var fe;class Qt{constructor(){this._map=new WeakMap,this._idmap=new Map}add(t,...r){const n=r[0];return this._map.set(t,n),n&&typeof n=="object"&&"id"in n&&this._idmap.set(n.id,t),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(t){const r=this._map.get(t);return r&&typeof r=="object"&&"id"in r&&this._idmap.delete(r.id),this._map.delete(t),this}get(t){const r=t._zod.parent;if(r){const n={...this.get(r)??{}};delete n.id;const a={...n,...this._map.get(t)};return Object.keys(a).length?a:void 0}return this._map.get(t)}has(t){return this._map.has(t)}}function Xt(){return new Qt}(fe=globalThis).__zod_globalRegistry??(fe.__zod_globalRegistry=Xt());function er(e,t){return new e({type:"string",...$(t)})}function tr(e,t){return new e({type:"string",format:"email",check:"string_format",abort:!1,...$(t)})}function rr(e,t){return new e({type:"string",format:"url",check:"string_format",abort:!1,...$(t)})}function nr(e,t){return new e({type:"string",format:"date",check:"string_format",...$(t)})}function ar(e,t){return new e({type:"number",checks:[],...$(t)})}function or(e,t){return new e({type:"boolean",...$(t)})}function ir(e){return new e({type:"unknown"})}function sr(e,t){return new Nt({check:"length_equals",...$(t),length:e})}function cr(e,t){return new Ot({check:"string_format",format:"regex",...$(t),pattern:e})}function lr(e,t,r){return new e({type:"custom",check:"custom",fn:t,...$(r)})}const _=f("ZodMiniType",(e,t)=>{if(!e._zod)throw new Error("Uninitialized schema in ZodMiniType.");x.init(e,t),e.def=t,e.type=t.type,e.parse=(r,n)=>yt(e,r,n,{callee:e.parse}),e.safeParse=(r,n)=>ze(e,r,n),e.parseAsync=async(r,n)=>kt(e,r,n,{callee:e.parseAsync}),e.safeParseAsync=async(r,n)=>$e(e,r,n),e.check=(...r)=>e.clone({...t,checks:[...t.checks??[],...r.map(n=>typeof n=="function"?{_zod:{check:n,def:{check:"custom"},onattach:[]}}:n)]},{parent:!0}),e.with=e.check,e.clone=(r,n)=>ft(e,r,n),e.brand=()=>e,e.register=((r,n)=>(r.add(e,n),e)),e.apply=r=>r(e)}),Pe=f("ZodMiniString",(e,t)=>{Ze.init(e,t),_.init(e,t)});function h(e){return er(Pe,e)}const re=f("ZodMiniStringFormat",(e,t)=>{G.init(e,t),Pe.init(e,t)}),dr=f("ZodMiniEmail",(e,t)=>{Ct.init(e,t),re.init(e,t)});function ur(e){return tr(dr,e)}const pr=f("ZodMiniURL",(e,t)=>{Et.init(e,t),re.init(e,t)});function j(e){return rr(pr,e)}const hr=f("ZodMiniNumber",(e,t)=>{It.init(e,t),_.init(e,t)});function fr(e){return ar(hr,e)}const gr=f("ZodMiniBoolean",(e,t)=>{At.init(e,t),_.init(e,t)});function ge(e){return or(gr,e)}const mr=f("ZodMiniUnknown",(e,t)=>{Rt.init(e,t),_.init(e,t)});function wr(){return ir(mr)}const br=f("ZodMiniArray",(e,t)=>{Dt.init(e,t),_.init(e,t)});function P(e,t){return new br({type:"array",element:e,...$(t)})}const je=f("ZodMiniObject",(e,t)=>{Bt.init(e,t),_.init(e,t),k(e,"shape",()=>t.shape)});function N(e,t){const r={type:"object",shape:e??{},...$(t)};return new je(r)}function R(e,t){return new je({type:"object",shape:e,catchall:wr(),...$(t)})}const vr=f("ZodMiniEnum",(e,t)=>{Vt.init(e,t),_.init(e,t),e.options=Object.values(t.entries)});function yr(e,t){const r=Array.isArray(e)?Object.fromEntries(e.map(n=>[n,n])):e;return new vr({type:"enum",entries:r,...$(t)})}const xr=f("ZodMiniTransform",(e,t)=>{Wt.init(e,t),_.init(e,t)});function kr(e){return new xr({type:"transform",transform:e})}const _r=f("ZodMiniOptional",(e,t)=>{Ht.init(e,t),_.init(e,t)});function u(e){return new _r({type:"optional",innerType:e})}const zr=f("ZodMiniDefault",(e,t)=>{Jt.init(e,t),_.init(e,t)});function v(e,t){return new zr({type:"default",innerType:e,get defaultValue(){return typeof t=="function"?t():xe(t)}})}const $r=f("ZodMiniPrefault",(e,t)=>{Yt.init(e,t),_.init(e,t)});function Y(e,t){return new $r({type:"prefault",innerType:e,get defaultValue(){return typeof t=="function"?t():xe(t)}})}const Sr=f("ZodMiniCatch",(e,t)=>{qt.init(e,t),_.init(e,t)});function Zr(e,t){return new Sr({type:"catch",innerType:e,catchValue:(()=>t)})}const Pr=f("ZodMiniPipe",(e,t)=>{Kt.init(e,t),_.init(e,t)});function jr(e,t){return new Pr({type:"pipe",in:e,out:t})}const Mr=f("ZodMiniCustom",(e,t)=>{Gt.init(e,t),_.init(e,t)});function Me(e,t={}){return lr(Mr,e,t)}const Nr=f("ZodMiniISODate",(e,t)=>{Lt.init(e,t),re.init(e,t)});function Or(e){return nr(Nr,e)}const Tr=N({ui:Y(N({primary:v(h(),"#c80044"),headerFrom:v(h(),"#0271bf"),headerTo:v(h(),"#c80044"),footerFrom:v(h(),"#0271bf"),footerTo:v(h(),"#003d68"),backgroundTilesSeed:v(fr(),1),showFavicons:v(ge(),!0),cta:u(N({text:h(),url:h(),icon:v(u(h().check(cr(/^[a-z]+:[a-z-]+$/))),"tabler:message-circle")})),contactLinks:v(P(h()),["phone","email","location","profiles"])}),{}),seo:Y(N({title:u(h()),description:u(h()),canonical:u(j()),ogImage:u(j()),twitterImage:u(j()),firstName:u(h()),lastName:u(h()),robots:v(u(h()),"index, follow")}),{}),modest:v(ge(),!1)}),A=h().check(Me(e=>!isNaN(new Date(e).getTime()))),Cr=jr(R({name:u(h()),company:u(h()),location:u(h()),description:u(h()),position:u(h()),url:u(j()),startDate:A,endDate:u(A),summary:u(h()),highlights:u(P(h())),logo:u(j())}).check(Me(({name:e,company:t})=>!!(e||t),{path:["name"],message:"Either 'name' or 'company' must be provided."})),kr(({company:e,name:t,...r})=>({...r,name:t??e}))),Er=R({network:h(),username:u(h()),url:u(j())}),Lr=R({address:u(h()),postalCode:u(h()),city:u(h()),countryCode:u(h().check(sr(2))),region:u(h())}),Ir=R({name:h(),label:u(h()),image:u(j()),email:u(ur()),phone:u(h()),birthDate:u(A),url:u(j()),summary:u(h()),location:u(Lr),profiles:u(P(Er))}),Ar=N({institution:h(),url:u(j()),area:u(h()),studyType:u(h()),startDate:A,endDate:u(A),score:u(h()),courses:u(P(h()))}),Rr=N({name:h(),date:u(A),url:u(j()),issuer:u(h())}),Dr=N({name:h(),level:u(h()),keywords:u(P(h()))}),Fr=R({language:h(),fluency:u(h())}),Ur=N({meta:Y(R({lang:v(Zr(yr(["en","fr"]),"en"),"en"),lastModified:v(Or(),()=>new Date().toISOString()),themeConfig:Y(Tr,{})}),{}),work:v(u(P(Cr)),[]),basics:Ir,education:v(u(P(Ar)),[]),certificates:v(u(P(Rr)),[]),skills:v(u(P(Dr)),[]),languages:v(u(P(Fr)),[])});function F({date:e,children:t,...r}){const n=T.normalize(e);return n?c("time",{dateTime:T.toISO(n),...r,children:t}):c("span",{...r,children:t})}function ne({name:e,children:t,...r}){return m("section",{...r,children:[e&&c("h2",{className:"before:bg-primary relative mt-4 mb-4 text-2xl before:absolute before:-bottom-1 before:left-0 before:h-1 before:w-[3ch] before:rounded-[0_0.25rem_0.25rem_0] before:print:[print-color-adjust:exact]",children:e}),t]})}function Br({education:e,certificates:t}){const r=e&&e.length>0,n=t&&t.length>0;return!r&&!n?null:m(ne,{name:Z("education"),className:"break-inside-avoid",children:[e?.map((a,o)=>m("article",{className:"mb-4 break-inside-avoid",children:[m("h3",{className:"text-lg font-bold",children:[a.studyType," : ",a.area]}),m("p",{children:[a.institution," (",a.startDate&&c(F,{date:a.startDate,children:T.format(a.startDate,"year")}),")"]})]},`edu-${o}`)),r&&n&&c("br",{}),t?.map((a,o)=>m("article",{className:"mb-4 break-inside-avoid",children:[c("h3",{className:"text-lg font-bold",children:a.name}),m("p",{children:[a.issuer," (",a.date&&c(F,{date:a.date,children:T.format(a.date,"year")}),")"]})]},`cert-${o}`))]})}const Vr=({text:e,url:t,icon:r="tabler:message-circle",...n})=>m(q,{children:[m("a",{href:t,target:"_blank",rel:"noopener noreferrer",id:"cta-fab",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",...n,children:[c("span",{className:"shrink-0",children:C(r)}),c("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})]}),c("script",{dangerouslySetInnerHTML:{__html:`(${Wr.toString()})();`}})]}),Wr=()=>{const e=document.getElementById("cta-fab");if(!e||window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;let r=window.pageYOffset||document.documentElement.scrollTop;const n=15,a=()=>{const o=window.pageYOffset||document.documentElement.scrollTop,i=o-r;Math.abs(i)>n&&(i>0?e.classList.remove("fab--extended"):e.classList.add("fab--extended"),r=Math.max(o,0))};window.addEventListener("scroll",a,{passive:!0})};function Hr({meta:e,...t}){const r=e.lastModified;return m("footer",{className:"bg-svg-tiles from-footer-from to-footer-to -z-10 -mt-10 h-32 content-center bg-cover bg-center pt-12 pb-2 text-center text-sm text-white dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden",...t,children:[c("div",{children:ie("last_modified",{date:c(F,{date:r,children:T.format(r,"date")})})}),c("div",{className:"mt-1 text-xs opacity-75",children:!e.themeConfig.modest&&ie("theme_credit",{link:c("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"})})})]})}const Jr=()=>c("header",{className:"bg-primary bg-svg-tiles from-header-from to-header-to h-2.5 bg-cover bg-center shadow-inner md:-mb-60 md:h-80 dark:opacity-90 dark:contrast-125 dark:saturate-50 print:hidden","aria-hidden":"true"});function Yr(e){return{"@context":"https://schema.org","@type":"ProfilePage",name:e.basics.label?Z("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(t=>({"@type":"EducationalOrganization",name:t.institution,url:t.url})),worksFor:e.work.map(t=>({"@type":"Organization",name:t.name,location:t.location,member:{"@type":"OrganizationRole",roleName:t.position},url:t.url})),sameAs:e.basics.profiles?.map(t=>t.url),knowsAbout:e.skills.flatMap(t=>t.keywords)}}}function qr({resume:e}){return c("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(Yr(e))}})}function Kr(e){const[t,...r]=e.split(" ");return{firstNameSlice:t,lastNameSlice:r.join(" ")}}function Gr({title:e,description:t,canonical:r,robots:n}){return m(q,{children:[c("title",{children:e}),t&&c("meta",{name:"description",content:t}),c("meta",{name:"robots",content:n||"index, follow"}),r&&c("link",{rel:"canonical",href:r})]})}function Qr({title:e,description:t,url:r,image:n,firstName:a,lastName:o}){return m(q,{children:[c("meta",{property:"og:type",content:"profile"}),c("meta",{property:"og:title",content:e}),t&&c("meta",{property:"og:description",content:t}),a&&c("meta",{property:"profile:first_name",content:a}),o&&c("meta",{property:"profile:last_name",content:o}),n&&c("meta",{property:"og:image",content:n}),r&&c("meta",{property:"og:url",content:r})]})}function Xr({title:e,description:t,url:r,image:n}){return m(q,{children:[c("meta",{property:"twitter:card",content:"summary_large_image"}),c("meta",{property:"twitter:title",content:e}),t&&c("meta",{property:"twitter:description",content:t}),n&&c("meta",{property:"twitter:image",content:n}),r&&c("meta",{property:"twitter:url",content:r})]})}function en({skills:e,...t}){return!e||e.length===0?null:c(ne,{name:Z("skills"),...t,children:e.map(r=>m("div",{className:"mb-4 break-inside-avoid",children:[c("h3",{className:"text-lg font-bold",children:r.name}),c("ul",{className:"my-3 flex flex-wrap gap-2 leading-8",children:r.keywords?.map(n=>c("li",{className:"inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-sm font-medium text-gray-600 inset-ring inset-ring-gray-500/10 dark:bg-slate-800 dark:text-slate-300 dark:inset-ring-white/10",children:n},n))})]},r.name))})}function tn({works:e,showFavicons:t}){return!e||e.length===0?null:c(ne,{name:Z("work_experience"),children:c("ol",{className:"relative list-none border-gray-200 md:ml-4 md:border-l-[5px] md:pl-6 dark:border-slate-700/50",reversed:!0,children:e.map(r=>m("li",{className:"break-inside-avoid",children:[m("div",{className:"before:border-primary relative text-gray-500 before:absolute before:top-0 before:-left-[calc(1.5rem+2.5px)] before:hidden before:h-[19px] before:w-[19px] before:-translate-x-1/2 before:rounded-full before:border-4 before:bg-white md:before:block dark:text-slate-400 dark:before:bg-slate-900",children:[c(F,{date:r.startDate,children:T.format(r.startDate,"month")})," — ",r.endDate?c(F,{date:r.endDate,children:T.format(r.endDate,"month")}):Z("present")]}),m("article",{children:[m("header",{className:`grid grid-cols-[auto_1fr] ${t&&r.logo?"gap-x-3":""}`,children:[t&&r.logo?c("img",{src:r.logo,alt:r.name,width:"64",height:"64",className:"row-span-2 h-12 w-12 object-contain",loading:"lazy"}):null,c("h3",{className:"col-start-2 text-xl font-semibold",children:r.position}),m("div",{className:"col-start-2",children:[r.url?c("a",{href:r.url,target:"_blank",rel:"noopener noreferrer",translate:"no",children:r.name}):c("span",{translate:"no",children:r.name})," - ",c("small",{children:r.description})]})]}),c("ul",{className:"m-2 mb-6 list-inside list-disc",children:r.highlights?.map(n=>c("li",{children:n},n))})]})]},r.name))})})}const rn=({resume:e,css:t,...r})=>{const{basics:n,work:a,education:o,certificates:i,skills:s,meta:l}=e,{ui:d,seo:p,modest:w}=l.themeConfig,g=Xe({seed:d.backgroundTilesSeed,cellSize:60,variance:.8}),b=p.title||(n.label?`${n.name} - ${n.label}`:n.name),y=p.description||n.summary,S=p.canonical||n.url,{firstNameSlice:M,lastNameSlice:Q}=Kr(n.name);return m("html",{lang:l.lang,children:[m("head",{children:[c("meta",{charSet:"UTF-8"}),c("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),c("meta",{name:"theme-color",content:d.primary}),!w&&c("meta",{name:"generator",content:"JSON Resume Theme CJEAN"}),c(Gr,{title:b,description:y,canonical:S,robots:p.robots}),c(Qr,{title:b,description:y,url:S,image:p.ogImage||n.image,firstName:p.firstName||M,lastName:p.lastName||Q}),c(Xr,{title:b,description:y,url:S,image:p.twitterImage||n.image}),c("script",{dangerouslySetInnerHTML:{__html:"if (window.matchMedia('(prefers-color-scheme: dark)').matches) document.documentElement.classList.add('dark');"}}),c("style",{dangerouslySetInnerHTML:{__html:`
4
+ :root {
5
+ --theme-primary: ${d.primary};
6
+ --theme-header-from: ${d.headerFrom};
7
+ --theme-header-to: ${d.headerTo};
8
+ --theme-footer-from: ${d.footerFrom};
9
+ --theme-footer-to: ${d.footerTo};
10
+ --theme-bg-tiles: url("${g}");
11
+ }
12
+ ${t}
13
+ `}})]}),m("body",{className:"bg-gray-200 text-gray-800 dark:bg-slate-950 dark:text-slate-300 print:bg-transparent print:text-sm",...r,children:[c(Jr,{}),c("main",{className:"relative z-10 container mx-auto max-w-5xl rounded bg-white p-4 shadow-md backdrop-blur-3xl md:p-6 dark:bg-slate-900/95 dark:text-slate-200 dark:shadow-2xl dark:ring-1 dark:ring-white/10 print:rounded-none print:shadow-none [&_a]:underline",role:"main",children:m("article",{children:[c(et,{name:n.name,label:n.label}),c(nt,{basics:n,themeConfig:l.themeConfig}),m("div",{className:"flex break-inside-avoid flex-wrap justify-center gap-4 sm:flex-nowrap",children:[c("div",{className:"relative inline-block",children:c("img",{src:n.image,alt:Z("portrait_alt",{name:n.name}),width:"200",height:"200",className:"relative aspect-square min-w-30 rounded-full object-cover"})}),c("p",{className:"text-lg print:text-base",children:n.summary})]}),c(tn,{works:a,showFavicons:d.showFavicons}),c(Br,{education:o,certificates:i}),c(en,{skills:s})]})}),c(Hr,{meta:l}),d.cta&&c(Vr,{text:d.cta.text,url:d.cta.url,icon:d.cta.icon}),c(qr,{resume:e}),c("script",{dangerouslySetInnerHTML:{__html:`
14
+ document.addEventListener('click', (e) => {
15
+ const card = e.target.closest('.portrait-card');
16
+ if (card) {
17
+ card.classList.toggle('rotate-y-180');
18
+ }
19
+ });
20
+ `}})]})]})};function nn(e,t=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(e)}&sz=${t}`}function an(e,t={}){const r=new URL("https://wsrv.nl/");return r.searchParams.set("url",e),t.w&&r.searchParams.set("w",t.w.toString()),t.h&&r.searchParams.set("h",t.h.toString()),t.output&&r.searchParams.set("output",t.output),t.encoding&&r.searchParams.set("encoding",t.encoding),t.fit&&r.searchParams.set("fit",t.fit),t.a&&r.searchParams.set("a",t.a),r.toString()}async function on(e,t=64){if(e)try{const r=nn(e,t),n=an(r,{w:t,h:t,output:"webp",encoding:"base64"}),a=await fetch(n);if(!a.ok){console.warn(n,a);return}return await a.text()}catch{return}}const sn='@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-x-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-widest:.1em;--radius-md:.375rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-sm:8px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary:var(--theme-primary);--color-header-from:var(--theme-header-from);--color-header-to:var(--theme-header-to);--color-footer-from:var(--theme-footer-from);--color-footer-to:var(--theme-footer-to);--min-width-30:7.5rem}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.portrait-card{width:calc(var(--spacing) * 48);height:calc(var(--spacing) * 48);cursor:pointer;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;-webkit-user-select:none;user-select:none;transform-style:preserve-3d;flex-shrink:0;transition-duration:.2s;position:relative}@media(min-width:48rem){.portrait-card{width:calc(var(--spacing) * 32);height:calc(var(--spacing) * 32)}}@media(hover:hover){.portrait-card:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.portrait-card:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.portrait-card.rotate-y-180{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.portrait-card__side{inset:calc(var(--spacing) * 0);border-style:var(--tw-border-style);border-width:4px;border-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.7s;backface-visibility:hidden;transition-duration:.7s;position:absolute}.portrait-card__side:where(.dark,.dark *){border-color:var(--color-slate-800)}.portrait-card__front{object-fit:cover;border-radius:3.40282e38px}.portrait-card__back{--tw-rotate-y:rotateY(180deg);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing) * .5);justify-content:center;align-items:center;display:flex}@media print{.portrait-card__back{display:none}}.portrait-card__back img{object-fit:contain;width:100%;height:100%}}@layer utilities{.fixed{position:fixed}.relative{position:relative}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.right-8{right:calc(var(--spacing) * 8)}.bottom-8{bottom:calc(var(--spacing) * 8)}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-2{margin:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-10{margin-top:calc(var(--spacing) * -10)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-4{margin-top:calc(var(--spacing) * 4)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.h-2\\.5{height:calc(var(--spacing) * 2.5)}.h-12{height:calc(var(--spacing) * 12)}.h-32{height:calc(var(--spacing) * 32)}.w-12{width:calc(var(--spacing) * 12)}.max-w-0{max-width:calc(var(--spacing) * 0)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-30{min-width:var(--min-width-30)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.rotate-y-180{--tw-rotate-y:rotateY(180deg);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.break-inside-avoid{break-inside:avoid}.grid-cols-\\[auto_1fr\\]{grid-template-columns:auto 1fr}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-1{column-gap:calc(var(--spacing) * 1)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-\\[2ch\\]{column-gap:2ch}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.border-gray-200{border-color:var(--color-gray-200)}.bg-black\\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-primary{background-color:var(--color-primary)}.bg-white{background-color:var(--color-white)}.bg-svg-tiles{--gradient-angle:16deg;background-image:var(--theme-bg-tiles),linear-gradient(var(--gradient-angle),var(--tw-gradient-from,transparent),var(--tw-gradient-to,transparent))}.from-footer-from{--tw-gradient-from:var(--color-footer-from);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-header-from{--tw-gradient-from:var(--color-header-from);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-footer-to{--tw-gradient-to:var(--color-footer-to);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-header-to{--tw-gradient-to:var(--color-header-to);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-cover{background-size:cover}.bg-center{background-position:50%}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-4{padding:calc(var(--spacing) * 4)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-1{padding-block:calc(var(--spacing) * 1)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pr-14{padding-right:calc(var(--spacing) * 14)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-primary{color:var(--color-primary)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.decoration-white\\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.underline-offset-2{text-underline-offset:2px}.opacity-75{opacity:.75}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.inset-ring{--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.inset-ring-gray-500\\/10{--tw-inset-ring-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.inset-ring-gray-500\\/10{--tw-inset-ring-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.backdrop-blur-3xl{--tw-backdrop-blur:blur(var(--blur-3xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.kerning-none{font-kerning:none}@media(hover:hover){.group-hover\\:mr-0:is(:where(.group):hover *){margin-right:calc(var(--spacing) * 0)}.group-hover\\:max-w-96:is(:where(.group):hover *){max-width:calc(var(--spacing) * 96)}.group-hover\\:text-inherit:is(:where(.group):hover *){color:inherit}}.group-focus\\:mr-0:is(:where(.group):focus *){margin-right:calc(var(--spacing) * 0)}.group-focus\\:max-w-96:is(:where(.group):focus *){max-width:calc(var(--spacing) * 96)}.group-focus\\:text-inherit:is(:where(.group):focus *){color:inherit}.group-\\[\\.fab--extended\\]\\:mr-0:is(:where(.group).fab--extended *){margin-right:calc(var(--spacing) * 0)}.group-\\[\\.fab--extended\\]\\:max-w-96:is(:where(.group).fab--extended *){max-width:calc(var(--spacing) * 96)}.group-\\[\\.fab--extended\\]\\:text-inherit:is(:where(.group).fab--extended *){color:inherit}.before\\:absolute:before{content:var(--tw-content);position:absolute}.before\\:top-0:before{content:var(--tw-content);top:calc(var(--spacing) * 0)}.before\\:-bottom-1:before{content:var(--tw-content);bottom:calc(var(--spacing) * -1)}.before\\:-left-\\[calc\\(1\\.5rem\\+2\\.5px\\)\\]:before{content:var(--tw-content);left:calc(-1.5rem - 2.5px)}.before\\:left-0:before{content:var(--tw-content);left:calc(var(--spacing) * 0)}.before\\:hidden:before{content:var(--tw-content);display:none}.before\\:h-1:before{content:var(--tw-content);height:calc(var(--spacing) * 1)}.before\\:h-\\[19px\\]:before{content:var(--tw-content);height:19px}.before\\:w-\\[3ch\\]:before{content:var(--tw-content);width:3ch}.before\\:w-\\[19px\\]:before{content:var(--tw-content);width:19px}.before\\:-translate-x-1\\/2:before{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.before\\:rounded-\\[0_0\\.25rem_0\\.25rem_0\\]:before{content:var(--tw-content);border-radius:0 .25rem .25rem 0}.before\\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\\:border-4:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:4px}.before\\:border-primary:before{content:var(--tw-content);border-color:var(--color-primary)}.before\\:bg-primary:before{content:var(--tw-content);background-color:var(--color-primary)}.before\\:bg-white:before{content:var(--tw-content);background-color:var(--color-white)}@media(hover:hover){.hover\\:bg-black:hover{background-color:var(--color-black)}.hover\\:decoration-white\\/80:hover{text-decoration-color:#fffc}@supports (color:color-mix(in lab,red,red)){.hover\\:decoration-white\\/80:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 80%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}}@media(min-width:40rem){.sm\\:flex-nowrap{flex-wrap:nowrap}}@media(min-width:48rem){.md\\:-mb-60{margin-bottom:calc(var(--spacing) * -60)}.md\\:ml-4{margin-left:calc(var(--spacing) * 4)}.md\\:h-80{height:calc(var(--spacing) * 80)}.md\\:border-l-\\[5px\\]{border-left-style:var(--tw-border-style);border-left-width:5px}.md\\:p-6{padding:calc(var(--spacing) * 6)}.md\\:pr-0{padding-right:calc(var(--spacing) * 0)}.md\\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\\:before\\:block:before{content:var(--tw-content);display:block}}.dark\\:border-slate-700\\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\\:border-slate-700\\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\\:bg-slate-900\\/95:where(.dark,.dark *){background-color:#0f172bf2}@supports (color:color-mix(in lab,red,red)){.dark\\:bg-slate-900\\/95:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 95%,transparent)}}.dark\\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\\:opacity-90:where(.dark,.dark *){opacity:.9}.dark\\:shadow-2xl:where(.dark,.dark *){--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:ring-1:where(.dark,.dark *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:ring-white\\/10:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\\:ring-white\\/10:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\\:inset-ring-white\\/10:where(.dark,.dark *){--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\\:inset-ring-white\\/10:where(.dark,.dark *){--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\\:contrast-125:where(.dark,.dark *){--tw-contrast:contrast(125%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\\:saturate-50:where(.dark,.dark *){--tw-saturate:saturate(50%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\\:before\\:bg-slate-900:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--color-slate-900)}@media print{.print\\:hidden{display:none}.print\\:rounded-none{border-radius:0}.print\\:bg-transparent{background-color:#0000}.print\\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.print\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.print\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.before\\:print\\:\\[print-color-adjust\\:exact\\]:before{content:var(--tw-content)}@media print{.before\\:print\\:\\[print-color-adjust\\:exact\\]:before{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}}:where(.dark){--color-primary:oklch(from var(--theme-primary) calc(l*.9) calc(c*.7) h)}@media print{.portrait-card{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);transform:none}.portrait-card__side{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}';async function cn(e){const t=Ur.parse(e);return Ge(t.meta.lang),t.meta.themeConfig.ui.showFavicons&&await Promise.all(t.work.map(async r=>{r.logo=await on(r.url)})),`<!doctype html>${await rn({resume:t,css:sn})}`}exports.render=cn;