@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;font-stretch:75% 100%;src:url(/assets/bricolage-grotesque-vietnamese-wdth-normal-BKE08zty.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;font-stretch:75% 100%;src:url(/assets/bricolage-grotesque-latin-ext-wdth-normal-DoS1gVTC.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;font-stretch:75% 100%;src:url(/assets/bricolage-grotesque-latin-wdth-normal-Dtb2a5nO.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Hanken Grotesk Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(data:font/woff2;base64,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) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Hanken Grotesk Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/hanken-grotesk-vietnamese-wght-normal-CHiFlh_0.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Hanken Grotesk Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/hanken-grotesk-latin-ext-wght-normal-Dg-wlmqe.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Hanken Grotesk Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/hanken-grotesk-latin-wght-normal-CaVRRdDk.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper: #eef1f5;--sheet: #ffffff;--ink: #131a2a;--mute: #566073;--rule: #d3d9e3;--pass: #0b7a52;--pass-bg: #e2f3ec;--pending: #8a5a00;--pending-bg: #fbf0d9;--link: #3b2bd9;--display: "Bricolage Grotesque Variable", "Arial Narrow", sans-serif;--body: "Hanken Grotesk Variable", system-ui, sans-serif;--mono: "IBM Plex Mono", ui-monospace, monospace;--gutter: clamp(16px, 4vw, 56px);--max: 1240px;--radius: 14px}*,*:before,*:after{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:80px;-webkit-text-size-adjust:100%}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--body);font-size:17px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}img{display:block;max-width:100%}a{color:inherit}h1,h2,h3,p,ul,ol,dl,dd{margin:0}ul,ol{padding:0;list-style:none}:focus-visible{outline:2.5px solid var(--link);outline-offset:3px;border-radius:4px}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.skip{position:absolute;left:12px;top:-60px;z-index:50;background:var(--ink);color:var(--paper);padding:10px 14px;border-radius:8px}.skip:focus{top:12px}.btn{display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:0 22px;border-radius:999px;background:var(--ink);color:var(--paper);font-weight:600;text-decoration:none;border:1.5px solid var(--ink);transition:background .2s,color .2s}.btn:hover{background:var(--link);border-color:var(--link)}.btn--ghost{background:transparent;color:var(--ink)}.btn--ghost:hover{background:var(--ink);border-color:var(--ink);color:var(--paper)}.btn--small{min-height:38px;padding:0 16px;font-size:14px}button.btn{font:inherit;font-weight:600;cursor:pointer}button.contact__mail{background:none;border:0;padding:0;color:inherit;line-height:1.3;text-align:left;cursor:pointer}.mail--up .mail__menu{top:auto;bottom:calc(100% + 12px)}.mail{position:relative;display:inline-block;max-width:100%}.mail__menu{position:absolute;z-index:30;top:calc(100% + 8px);left:0;min-width:250px;padding:8px;background:var(--sheet);color:var(--ink);border:1px solid #d3d9e3;border-radius:12px;box-shadow:0 18px 40px -18px #131a2a73;font-family:var(--body);font-size:15px;font-weight:500;animation:menu-in .16s ease}@keyframes menu-in{0%{opacity:0;transform:translateY(-4px)}}.mail__addr{padding:6px 10px 8px;margin-bottom:4px;border-bottom:1px solid #d3d9e3;font-family:var(--mono);font-size:12.5px;color:#566073}.mail__menu a,.mail__menu button{display:block;width:100%;padding:9px 10px;border-radius:8px;text-align:left;text-decoration:none;color:var(--ink);background:none;border:0;font:inherit;cursor:pointer}.mail__menu a:hover,.mail__menu button:hover{background:#eef1f5}.arrow{width:.8em;height:.8em;vertical-align:-.05em}.top{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:24px;padding:12px var(--gutter);background:color-mix(in srgb,var(--paper) 88%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--rule)}.top__name{font-family:var(--mono);font-weight:500;font-size:15px;text-decoration:none}.top__name span{color:var(--pass)}.top nav{margin-left:auto}.top__nav{display:flex;gap:26px;font-size:15px}.top__nav a{text-decoration:none;color:var(--mute)}.top__nav a:hover{color:var(--ink)}.cov{font-family:var(--mono);font-size:12.5px;color:var(--mute);white-space:nowrap;min-width:9.5em;text-align:right}.cov b{font-weight:500;color:var(--pass)}.cov__bar{position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--pass);transform-origin:left;transform:scaleX(0)}.hero{position:relative;isolation:isolate;max-width:var(--max);margin:0 auto;padding:clamp(40px,8vw,96px) var(--gutter) clamp(56px,8vw,112px);display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:clamp(32px,5vw,72px);align-items:center}.hero:before{content:"";position:absolute;z-index:-1;top:0;bottom:0;left:50%;width:100vw;transform:translate(-50%);background-image:radial-gradient(color-mix(in srgb,var(--ink) 16%,transparent) 1px,transparent 1.2px);background-size:22px 22px;-webkit-mask-image:linear-gradient(to bottom,#000 30%,transparent);mask-image:linear-gradient(to bottom,#000 30%,transparent)}.status{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-size:13px;color:var(--pass);background:var(--pass-bg);padding:6px 12px;border-radius:999px}.status__dot{width:8px;height:8px;border-radius:50%;background:var(--pass);box-shadow:0 0 color-mix(in srgb,var(--pass) 50%,transparent);animation:ping 2.4s infinite}@keyframes ping{70%{box-shadow:0 0 0 8px transparent}}.hero__name{margin-top:22px;font-family:var(--display);font-stretch:75%;font-weight:800;font-size:clamp(4.2rem,11vw,9.5rem);line-height:.84;letter-spacing:-.025em;display:flex;flex-direction:column}.hero__name span:last-child{padding-left:.42em}.hero__role{margin-top:22px;font-family:var(--display);font-stretch:90%;font-weight:600;font-size:clamp(1.35rem,2.4vw,1.75rem)}.hero__search{display:block;margin-top:2px;font-family:var(--mono);font-stretch:100%;font-weight:400;font-size:14px;color:var(--mute)}.hero__intro{margin-top:14px;max-width:34em;color:var(--mute)}.hero__cta{margin-top:28px;display:flex;flex-wrap:wrap;gap:12px}.runner{background:var(--sheet);border:1px solid var(--rule);border-radius:var(--radius);font-family:var(--mono);font-size:14px;box-shadow:0 1px 0 var(--rule),0 24px 48px -28px #131a2a59;overflow:hidden}.runner__bar{display:flex;justify-content:space-between;padding:12px 18px;border-bottom:1px solid var(--rule);font-size:12.5px;color:var(--mute)}.runner__state.is-done{color:var(--pass)}.runner__file{display:inline-flex;align-items:center;gap:12px}.runner__dots,.shot__dots{display:inline-flex;gap:5px}.runner__dots i,.shot__dots i{width:8px;height:8px;border-radius:50%;background:var(--rule)}.runner__rerun{font:inherit;color:var(--pass);background:none;border:0;padding:0;cursor:pointer}.runner__rerun:hover{color:var(--link)}.runner__body{padding:18px 10px 12px}.runner__describe{padding:0 10px 10px}.tok-fn{color:var(--link)}.tok-str{color:var(--pass)}.runner__list{border-left:1px dashed var(--rule);margin-left:18px}.spec__link{display:grid;grid-template-columns:22px 1fr auto;gap:10px;align-items:start;padding:8px 10px;border-radius:8px;text-decoration:none;transition:background .15s}.spec.is-pass .spec__link:hover,.spec.is-pending .spec__link:hover{background:var(--paper)}.spec__icon{font-weight:500;text-align:center}.spec__text{display:flex;flex-direction:column}.spec__it{color:var(--ink)}.spec__proof{font-size:12.5px;color:var(--mute);max-height:0;opacity:0;overflow:hidden;transition:max-height .35s ease,opacity .35s ease}.spec__ms{font-size:12px;color:var(--mute);white-space:nowrap}.spec.is-wait{opacity:.32}.spec.is-pass .spec__icon{color:var(--pass)}.spec.is-pending .spec__icon,.spec.is-pending .spec__ms{color:var(--pending)}.spec.is-pass .spec__proof,.spec.is-pending .spec__proof{max-height:3em;opacity:1}.spec.is-run .spec__icon:before{content:"";display:inline-block;width:11px;height:11px;border:1.5px solid var(--rule);border-top-color:var(--ink);border-radius:50%;animation:spin .6s linear infinite;vertical-align:-1px}@keyframes spin{to{transform:rotate(360deg)}}.runner__summary{display:flex;flex-wrap:wrap;gap:8px 18px;padding:14px 18px;border-top:1px solid var(--rule);background:var(--paper);font-size:13px;min-height:48px}.sum-pass{color:var(--pass);font-weight:500}.sum-pending{color:var(--pending)}.sum-fail,.sum-time,.sum-wait{color:var(--mute)}.sum-time{margin-left:auto}.sec{max-width:var(--max);margin:0 auto;padding:clamp(56px,8vw,104px) var(--gutter);border-top:1px solid var(--rule);display:grid;grid-template-columns:260px minmax(0,1fr);gap:clamp(28px,4vw,64px)}.sec__head{position:sticky;top:96px;align-self:start}.sec__title{font-family:var(--display);font-stretch:75%;font-weight:800;font-size:clamp(2.6rem,5vw,3.6rem);line-height:.95;letter-spacing:-.015em}.proves{margin-top:16px;display:flex;flex-direction:column;gap:6px;font-family:var(--mono);font-size:13px}.proves li{display:flex;gap:8px;padding:4px 10px;border-radius:6px;width:fit-content;color:var(--mute);background:color-mix(in srgb,var(--rule) 55%,transparent);transition:color .3s,background .3s}.proves__icon{width:1em;text-align:center}[data-reveal]:not(.is-checked) .proves__icon{font-size:0}[data-reveal]:not(.is-checked) .proves__icon:before{content:"";display:inline-block;width:10px;height:10px;border:1.5px solid var(--rule);border-top-color:var(--mute);border-radius:50%;animation:spin .6s linear infinite;vertical-align:-1px}.is-checked .proves .is-pass{color:var(--pass);background:var(--pass-bg)}.is-checked .proves .is-pending{color:var(--pending);background:var(--pending-bg)}.is-checked .proves__icon{animation:pop .35s ease}@keyframes pop{0%{transform:scale(.4)}70%{transform:scale(1.3)}}[data-reveal]{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s ease}[data-reveal].is-in{opacity:1;transform:none}.kind{font-family:var(--mono);font-size:12.5px;color:var(--mute);text-transform:lowercase}.proj__name{margin-top:4px;font-family:var(--display);font-stretch:85%;font-weight:700;font-size:1.6rem;line-height:1.1}.proj__name--big{font-size:clamp(2.2rem,4vw,3rem);font-stretch:75%;font-weight:800}.proj__summary{margin-top:8px}.proj__detail{margin-top:10px;color:var(--mute);font-size:15.5px}.checks{margin-top:14px;display:flex;flex-wrap:wrap;gap:6px;font-family:var(--mono);font-size:12.5px}.checks li{color:var(--pass);background:var(--pass-bg);padding:3px 9px;border-radius:6px}.checks li:before{content:"✓ "}.stack{margin-top:12px;font-size:14px;color:var(--mute)}.proj__links{margin-top:14px;display:flex;flex-wrap:wrap;gap:18px;font-weight:600;font-size:15px}.proj__links a{text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:4px;text-decoration-color:var(--rule)}.proj__links a:hover{color:var(--link);text-decoration-color:currentColor}.proj__nolink{margin-top:14px;font-size:14px;color:var(--mute)}.feature{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:clamp(20px,3vw,40px);align-items:center;padding-bottom:clamp(36px,5vw,56px)}.shot{border-radius:var(--radius);overflow:hidden;border:1px solid var(--rule);background:var(--sheet);box-shadow:0 1px 0 var(--rule);transition:transform .35s ease,box-shadow .35s ease}.shot--big{box-shadow:0 1px 0 var(--rule),0 30px 60px -36px #131a2a73}.shot__bar{display:flex;align-items:center;gap:12px;padding:9px 12px;border-bottom:1px solid var(--rule)}.shot__url{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:11.5px;color:var(--mute);background:var(--paper);padding:3px 10px;border-radius:6px}.shot__img{aspect-ratio:16 / 10;overflow:hidden}.shot__img img{width:100%;height:100%;object-fit:cover;object-position:top;transition:object-position 2.4s ease}.feature:hover .shot__img img,.card:hover .shot__img img{object-position:bottom}.card:hover .shot{transform:translateY(-4px);box-shadow:0 1px 0 var(--rule),0 22px 40px -28px #131a2a66}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(28px,4vw,48px) clamp(20px,3vw,36px)}.card .kind{margin-top:16px}.xp{display:flex;flex-direction:column}.xp__item{display:grid;grid-template-columns:200px minmax(0,1fr);gap:24px;padding:28px 0;border-bottom:1px solid var(--rule)}.xp__item:first-child{padding-top:0}.xp__item:last-child{border-bottom:0}.xp__when{font-family:var(--mono);font-size:13.5px}.xp__site{display:inline-block;margin-top:6px;font-size:14px;color:var(--mute);text-decoration:none}.xp__site:hover{color:var(--link)}.xp__org{font-family:var(--display);font-stretch:85%;font-weight:700;font-size:1.7rem;line-height:1.1}.xp__role{color:var(--mute);margin-top:2px}.xp__points{margin-top:14px;display:flex;flex-direction:column;gap:8px}.xp__points li{position:relative;padding-left:20px}.xp__points li:before{content:"";position:absolute;left:2px;top:.7em;width:8px;height:1.5px;background:var(--ink)}.skills{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:32px 36px}.skills__title{font-size:15px;font-weight:700;padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--rule)}.tags{display:flex;flex-wrap:wrap;gap:8px}.tag{background:var(--sheet);border:1px solid var(--rule);padding:5px 12px;border-radius:999px;font-size:15px}.tag.is-pending{border-style:dashed;border-color:var(--pending);background:var(--pending-bg)}.tag__note{font-family:var(--mono);font-size:12px;color:var(--pending)}.soft{display:flex;flex-direction:column;gap:6px}.edu{display:flex;flex-direction:column;gap:0}.edu__item{display:grid;grid-template-columns:200px minmax(0,1fr);gap:24px;padding:26px 0;border-bottom:1px solid var(--rule)}.edu__item:first-child{padding-top:0}.edu__item:last-child{border-bottom:0}.edu__when{font-family:var(--mono);font-size:13.5px}.edu__item.is-current .edu__when:after{content:" · en cours";color:var(--pass)}.edu__title{font-family:var(--display);font-stretch:85%;font-weight:700;font-size:1.7rem;line-height:1.12}.edu__detail{margin-top:4px;color:var(--mute)}.edu__detail strong{color:var(--ink);font-weight:600}.end{max-width:var(--max);margin:0 auto;padding:clamp(24px,4vw,48px) var(--gutter) clamp(40px,5vw,64px)}.end__inner{--rule: #2c3550;--mute: #a3adc2;--pass: #3ddc97;--pass-bg: rgb(61 220 151 / .12);--link: #a99dff;background:var(--ink);color:#f2f4f8;border-radius:22px;padding:clamp(36px,6vw,80px) clamp(24px,4vw,56px)}.end__report{font-family:var(--mono);font-size:13px;color:var(--mute);padding-bottom:18px;margin-bottom:18px;border-bottom:1px dashed var(--rule)}.end__ok{display:inline-block;margin-right:10px;padding:2px 8px;border-radius:5px;background:var(--pass);color:var(--ink);font-weight:500}.end__title em{font-style:normal;color:var(--pass)}.end .btn{background:#f2f4f8;color:var(--ink)}.end__title{margin-top:18px;max-width:15em;font-family:var(--display);font-stretch:75%;font-weight:800;font-size:clamp(2.6rem,6.4vw,5.4rem);line-height:.92;letter-spacing:-.02em}.facts{margin-top:clamp(32px,5vw,56px);display:grid;grid-template-columns:repeat(5,minmax(0,1fr));border-top:1.5px solid var(--rule)}.facts__row{padding:14px 16px 0 0}.facts dt{font-family:var(--mono);font-size:12.5px;color:var(--mute)}.facts dd{margin-top:4px;font-weight:600}.contact{margin-top:clamp(40px,6vw,72px);display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:20px 40px}.contact__mail{font-family:var(--display);font-stretch:80%;font-weight:700;font-size:clamp(1.7rem,4.2vw,3.2rem);text-decoration:underline;text-decoration-thickness:3px;text-underline-offset:8px;text-decoration-color:var(--pass);overflow-wrap:anywhere}.contact__mail:hover{color:var(--link);text-decoration-color:currentColor}.contact__links{display:flex;flex-wrap:wrap;gap:10px 24px;font-weight:600}.contact__links a{text-decoration:none}.contact__links a:hover{color:var(--link)}.foot{max-width:var(--max);margin:0 auto;padding:24px var(--gutter) 40px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;font-family:var(--mono);font-size:12.5px;color:var(--mute);border-top:1px solid var(--rule)}@media(max-width:1020px){.hero,.sec{grid-template-columns:1fr}.sec__head{position:static}.facts{grid-template-columns:repeat(2,minmax(0,1fr));border-top:0}.facts__row{border-top:1.5px solid var(--rule);padding-bottom:14px}}@media(max-width:820px){.top__nav,.cov{display:none}.top .btn--small{margin-left:auto}.feature,.grid,.skills{grid-template-columns:1fr}.xp__item,.edu__item{grid-template-columns:1fr;gap:8px}}@media(max-width:480px){body{font-size:16px}.runner{font-size:13px}.runner__list{margin-left:8px}.spec__link{grid-template-columns:18px 1fr}.spec__ms{display:none}.facts{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation:none!important;transition:none!important}[data-reveal]{opacity:1;transform:none}}
