:root{color-scheme:light dark;--nuit:#0a0d09;--sous-bois:#11170f;--lisiere:#1d261a;--lisiere-forte:#2f3b2a;--brume:#eef1ea;--texte:#b9c1b3;--lichen:#8c9587;--citron:#a3e635;--citron-vif:#bef264;--mousse:#4d7c0f;--bg:var(--nuit);--surface:var(--sous-bois);--code-bg:#060805;--line:var(--lisiere);--line-strong:var(--lisiere-forte);--heading:var(--brume);--text:var(--texte);--muted:var(--lichen);--accent:var(--citron);--accent-hover:var(--citron-vif);--mark:var(--citron);--on-accent:var(--nuit);--glow-a:#a3e63524;--glow-b:#4d7c0f2e;--tok-keyword:var(--citron);--tok-string:#e5d29f;--tok-number:#f2a37c;--tok-comment:var(--lichen);--tok-function:var(--brume);--tok-punct:#7d8778;--tok-attr:#86d7c3;--tok-variable:#f2a37c;--font:"Inter Tight", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--mono:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--fs-xs:.8125rem;--fs-sm:.875rem;--fs-base:1.0625rem;--fs-read:1.125rem;--fs-lead:clamp(1.125rem, 1rem + .35vw, 1.3125rem);--fs-h3:clamp(1.25rem, 1.1rem + .4vw, 1.5rem);--fs-h2:clamp(1.5rem, 1.25rem + .9vw, 2rem);--fs-title:clamp(2.5rem, 1.4rem + 3.6vw, 4.5rem);--fs-display:clamp(3rem, 1.4rem + 5vw, 6rem);--measure:68ch;--wrap:72rem;--gutter:clamp(20px, 4vw, 48px);--radius:20px;--radius-sm:12px;--ease:cubic-bezier(.22, 1, .36, 1);--astro-code-foreground:var(--text);--astro-code-background:transparent;--astro-code-token-keyword:var(--tok-keyword);--astro-code-token-constant:var(--tok-attr);--astro-code-token-string:var(--tok-string);--astro-code-token-string-expression:var(--tok-string);--astro-code-token-comment:var(--tok-comment);--astro-code-token-function:var(--tok-function);--astro-code-token-parameter:var(--tok-variable);--astro-code-token-punctuation:var(--tok-punct);--astro-code-token-link:var(--tok-string)}@media (prefers-color-scheme:light){:root{--bg:#f4f6f0;--surface:#eaede4;--code-bg:#e8ebe2;--line:#dfe3da;--line-strong:#c9cfc2;--heading:var(--nuit);--text:#262d22;--muted:#5b6456;--accent:#3f6212;--accent-hover:var(--nuit);--mark:var(--mousse);--on-accent:#f4f6f0;--glow-a:#a3e63547;--glow-b:#4d7c0f1a;--tok-keyword:#3f6212;--tok-string:#7a5a12;--tok-number:#9a3d1c;--tok-comment:#5b6456;--tok-function:var(--nuit);--tok-punct:#5b6456;--tok-attr:#1d6b5a;--tok-variable:#9a3d1c}}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;background:var(--bg)}@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}@view-transition{navigation:auto}::view-transition-old(root),::view-transition-new(root){animation-duration:.22s;animation-timing-function:var(--ease)}}body{background:radial-gradient(64rem 38rem at 88% -10rem, var(--glow-a), transparent 70%), radial-gradient(52rem 44rem at -12% 26rem, var(--glow-b), transparent 70%), var(--bg);min-height:100vh;color:var(--text);font-family:var(--font);font-size:var(--fs-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;background-repeat:no-repeat;flex-direction:column;margin:0;line-height:1.65;display:flex;overflow-x:clip}main{flex:1}h1,h2,h3,p,ul,ol,dl,dd,figure,blockquote{margin:0}h1,h2,h3{color:var(--heading);letter-spacing:-.03em;text-wrap:balance;font-weight:500;line-height:1.1}p{text-wrap:pretty}img,svg{max-width:100%;height:auto;display:block}a{color:inherit}code,kbd,pre,samp{font-family:var(--mono);font-variant-ligatures:none}::selection{background:var(--citron);color:var(--nuit)}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:4px}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}.skip-link{z-index:10;background:var(--citron);color:var(--nuit);border-radius:999px;padding:10px 16px;font-weight:600;text-decoration:none;position:absolute;top:12px;left:12px;transform:translateY(-200%)}.skip-link:focus{transform:none}.wrap{width:100%;max-width:var(--wrap);padding-inline:var(--gutter);margin-inline:auto}.column{width:100%;max-width:calc(var(--measure) + 2 * var(--gutter));padding-inline:var(--gutter);margin-inline:auto}.site-header{view-transition-name:site-header;border-bottom:1px solid var(--line)}.site-header .wrap{justify-content:space-between;align-items:center;gap:24px;min-height:72px;display:flex}.wordmark{font-family:var(--mono);letter-spacing:-.02em;color:var(--heading);font-size:1.0625rem;font-weight:600;text-decoration:none}.wordmark .dot{color:var(--mark)}.brand{flex-direction:column;gap:2px;display:flex}.tagline{font-family:var(--mono);font-size:var(--fs-xs);color:var(--muted);margin:0}@media (width<=640px){.site-header .wrap{grid-template-columns:auto auto;justify-content:space-between;row-gap:2px;padding-block:14px;display:grid}.brand{display:contents}.tagline{order:1;grid-column:1/-1}}.site-nav ul{gap:clamp(16px,3vw,32px);padding:0;list-style:none;display:flex}.site-nav a{font-family:var(--mono);font-size:var(--fs-sm);color:var(--muted);transition:color .16s var(--ease);text-decoration:none}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--heading)}.site-nav a[aria-current=page]{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:.45em;text-decoration-thickness:2px}.site-footer{background:var(--surface);font-size:var(--fs-sm);color:var(--muted);margin-top:clamp(80px,12vw,160px);position:relative}.site-footer:before{content:"";background:linear-gradient(90deg,#0000,#a3e6358c 30% 70%,#0000);height:1px;position:absolute;inset:0 0 auto}.site-footer .wrap{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:20px 32px;padding-block:36px;display:flex}.footer-sign{color:var(--text);align-items:center;gap:12px;text-decoration:none;display:inline-flex}.footer-sign svg{width:22px;color:var(--mark);transition:transform .3s var(--ease)}.footer-sign:hover svg{transform:rotate(-8deg)}.footer-sign:hover span{color:var(--heading)}.footer-links{font-family:var(--mono);flex-wrap:wrap;gap:8px 24px;padding:0;list-style:none;display:flex}.footer-links a{text-decoration:none}.footer-links a:hover{color:var(--heading)}.flag{object-fit:cover;width:21px;height:14px;box-shadow:0 0 0 1px var(--line-strong);vertical-align:-.1em;border-radius:3px;display:inline-block}.tags{font-family:var(--mono);font-size:var(--fs-xs);flex-wrap:wrap;gap:6px 8px;padding:0;list-style:none;display:flex}.tags a{z-index:1;border:1px solid var(--line);background:var(--surface);color:var(--text);transition:border-color .16s var(--ease), color .16s var(--ease);border-radius:999px;padding:1px 9px;text-decoration:none;display:inline-block;position:relative}.tags a:before{content:"#";color:var(--accent)}.tags a:hover{border-color:var(--accent);color:var(--heading)}time{font-family:var(--mono);font-variant-numeric:tabular-nums}.intro{padding-block:clamp(56px,9vw,112px) clamp(40px,6vw,72px)}.intro h1{font-size:var(--fs-display);letter-spacing:-.045em;line-height:.98}.intro p{max-width:52ch;font-size:var(--fs-lead);margin-top:20px;line-height:1.5}.intro .prompt{font-family:var(--mono);font-size:var(--fs-sm);color:var(--muted);margin-bottom:18px}.intro .prompt span{color:var(--accent)}.intro .prompt:after{content:"";vertical-align:-.22em;background:var(--accent);width:.6em;height:1.15em;margin-left:.4em;animation:1.1s step-end infinite caret;display:inline-block}@keyframes caret{50%{opacity:0}}.filter{font-family:var(--mono);font-size:var(--fs-sm);border:0;align-items:center;gap:4px;margin:0 0 40px;padding:0;display:flex}.filter legend{float:left;color:var(--muted);margin-right:12px}.filter label{color:var(--muted);cursor:pointer;transition:color .16s var(--ease), border-color .16s var(--ease);border:1px solid #0000;border-radius:999px;padding:4px 14px}.filter label:hover{color:var(--heading)}.filter input:checked+label{border-color:var(--line-strong);color:var(--heading)}.filter input:focus-visible+label{outline:2px solid var(--accent);outline-offset:2px}.year+.year{margin-top:48px}.year h2{border-bottom:1px solid var(--line-strong);font-size:var(--fs-h2);letter-spacing:-.04em;color:var(--heading);padding-bottom:8px;font-weight:500}.year h2:after{content:".";color:var(--mark)}.posts{padding:0;list-style:none}.post{border-bottom:1px solid var(--line);transition:background-color .2s var(--ease);grid-template-columns:7.5rem 1fr auto;align-items:baseline;gap:8px 24px;margin-inline:-16px;padding:20px 16px;display:grid;position:relative}.post:has(.post-title a:hover){background:var(--surface)}.post:before{content:"";background:var(--accent);width:2px;transition:transform .3s var(--ease);border-radius:2px;position:absolute;inset:20px auto 20px 0;transform:scaleY(0)}.post:has(.post-title a:hover):before,.post:has(.post-title a:focus-visible):before{transform:none}.post time{font-size:var(--fs-sm);color:var(--muted)}.post-title{text-wrap:pretty;letter-spacing:-.015em;color:var(--heading);font-size:1.3125rem;font-weight:500;line-height:1.35}.post-title a{background:linear-gradient(var(--accent), var(--accent)) 0 100% / 0 1px no-repeat;transition:background-size .3s var(--ease);text-decoration:none}.post-title a:after{content:"";position:absolute;inset:0}.post-title a:hover{background-size:100% 1px}.post .tags{grid-column:2}.post .flag{grid-area:1/3}.index:has(#lang-fr:checked) .post:not([lang=fr]),.index:has(#lang-en:checked) .post:not([lang=en]),.index:has(#lang-fr:checked) .year:not(:has(.post[lang=fr])),.index:has(#lang-en:checked) .year:not(:has(.post[lang=en])){display:none}@media (width<=640px){.post{grid-template-columns:1fr auto}.post time{grid-column:1}.post .flag{grid-column:2}.post-title,.post .tags{grid-column:1/-1}}.article-head{padding-block:clamp(48px,8vw,96px) 40px}.article-head .tags{margin-bottom:20px}.article-head h1{font-size:var(--fs-title);letter-spacing:-.04em;line-height:1.04}.standfirst{font-size:var(--fs-lead);color:var(--text);margin-top:24px;line-height:1.5}.meta{border-top:1px solid var(--line);font-size:var(--fs-sm);flex-wrap:wrap;gap:12px 32px;margin-top:32px;padding-top:20px;display:flex}.meta div{flex-direction:column;gap:2px;display:flex}.meta dt{font-size:var(--fs-xs);color:var(--muted)}.meta dd{font-family:var(--mono);color:var(--heading)}.meta-lang{align-items:center;gap:8px;display:flex}.toc{border:1px solid var(--line);border-radius:var(--radius-sm);font-size:var(--fs-sm);margin-bottom:48px}.toc summary{font-family:var(--mono);color:var(--heading);cursor:pointer;padding:14px 20px}.toc summary::marker{color:var(--accent)}.toc ol{padding:0 20px 18px 40px}.toc li{padding-block:3px}.toc li::marker{font-family:var(--mono);color:var(--muted)}.toc a{text-decoration:none}.toc a:hover{color:var(--accent)}.prose{font-size:var(--fs-read);line-height:1.72}.prose>*+*{margin-top:1.25em}.prose :where(h2){font-size:var(--fs-h2);margin-top:2.4em;scroll-margin-top:24px}.prose :where(h3){font-size:var(--fs-h3);letter-spacing:-.02em;margin-top:1.9em;scroll-margin-top:24px}.prose :where(h2,h3)>.anchor:before{font-family:var(--mono);letter-spacing:0;color:var(--accent);margin-right:.35em;font-weight:400;display:inline-block}.prose :where(h2)>.anchor:before{content:"#"}.prose :where(h3)>.anchor:before{content:"##";color:var(--muted)}.prose .anchor{color:inherit;text-decoration:none}.prose .anchor:hover{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:.18em;text-decoration-thickness:2px}.prose .anchor:hover:before,.prose :where(h2,h3):target>.anchor:before{color:var(--accent-hover)}.copy-link{border:1px solid var(--line-strong);background:var(--surface);width:28px;height:28px;color:var(--muted);vertical-align:.15em;cursor:pointer;opacity:0;transition:opacity .16s var(--ease), color .16s var(--ease), border-color .16s var(--ease);border-radius:8px;justify-content:center;align-items:center;margin-left:10px;padding:0;display:inline-flex;position:relative}.copy-link svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:15px;height:15px}.prose :where(h2,h3):hover .copy-link,.copy-link:focus-visible,.copy-link[data-copied]{opacity:1}@media (hover:none){.copy-link{opacity:1}}.copy-link:hover,.copy-link[data-copied]{border-color:var(--accent);color:var(--accent)}.copy-link[data-copied]:after{content:"Copied";font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:0;white-space:nowrap;color:var(--accent);font-weight:400;position:absolute;top:50%;left:calc(100% + 8px);transform:translateY(-50%)}@media (width>=960px){.prose :where(h2,h3){position:relative}.prose :where(h2,h3)>.anchor:before{position:absolute;right:100%}}.prose :where(h2,h3)+*{margin-top:.8em}.prose :where(a){color:var(--accent);text-underline-offset:.2em;transition:color .16s var(--ease);text-decoration-thickness:1px}.prose :where(a:hover){color:var(--accent-hover);text-decoration-thickness:2px}.prose :where(strong){color:var(--heading);font-weight:600}.prose :where(ul,ol){padding-left:1.4em}.prose :where(li+li){margin-top:.4em}.prose :where(ul>li)::marker{color:var(--accent)}.prose :where(ol>li)::marker{font-family:var(--mono);color:var(--muted);font-size:.875em}.prose :where(hr){border:0;border-top:1px solid var(--line);margin-block:3em}.prose :where(:not(pre)>code){border:1px solid var(--line);background:var(--surface);color:var(--heading);overflow-wrap:anywhere;border-radius:6px;padding:.12em .4em;font-size:.86em}.prose :where(kbd){border:1px solid var(--line-strong);color:var(--heading);border-bottom-width:2px;border-radius:6px;padding:.1em .45em;font-size:.82em}.prose :where(mark){background:var(--citron);color:var(--nuit);border-radius:3px;padding:0 .2em}.prose :where(blockquote){border-left:2px solid var(--accent);font-size:var(--fs-lead);color:var(--heading);padding-left:24px;line-height:1.55}.prose :where(blockquote) cite{font-size:var(--fs-sm);color:var(--muted);margin-top:10px;font-style:normal;display:block}.figure img{border:1px solid var(--line);border-radius:var(--radius-sm);width:100%}.figure--wide{--wide:min(64rem, 100vw - 2 * var(--gutter));width:var(--wide);margin:0 calc((100% - var(--wide)) / 2) 48px}.figure--wide img{border-radius:var(--radius);border:0}.figure figcaption a{color:inherit;text-underline-offset:.2em}.figure figcaption a:hover{color:var(--accent)}.video video{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--code-bg);width:100%;height:auto;display:block}.figure-scroll{border:1px solid var(--line);border-radius:var(--radius-sm);overflow-x:auto}.figure-scroll img{border:0;border-radius:0;min-width:560px}.figure figcaption,.table-wrap+.caption{max-width:var(--measure);font-size:var(--fs-sm);color:var(--muted);margin-top:10px}.code{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--code-bg);overflow:hidden}.code figcaption:before{content:"";background:var(--accent);vertical-align:.05em;border-radius:50%;width:7px;height:7px;margin-right:10px;display:inline-block}.code figcaption{border-bottom:1px solid var(--line);font-family:var(--mono);font-size:var(--fs-xs);color:var(--muted);padding:9px 18px}.code pre{tab-size:2;color:var(--text);margin:0;padding:18px;font-size:.8125rem;line-height:1.7;overflow-x:auto}.tok-keyword{color:var(--tok-keyword)}.tok-string{color:var(--tok-string)}.tok-number{color:var(--tok-number)}.tok-comment{color:var(--tok-comment)}.tok-function{color:var(--tok-function);font-weight:600}.tok-punct{color:var(--tok-punct)}.tok-prompt{color:var(--tok-punct);user-select:none}.callout{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--surface);font-size:var(--fs-base);padding:18px 22px}.callout-title{color:var(--heading);margin-bottom:6px;font-weight:600}.callout--warning{border-color:var(--accent)}.callout>:last-child{margin-bottom:0}.table-wrap{border:1px solid var(--line);border-radius:var(--radius-sm);overflow-x:auto}.table-wrap table{border-collapse:collapse;width:100%;min-width:520px;font-size:var(--fs-sm)}.table-wrap th,.table-wrap td{border-bottom:1px solid var(--line);text-align:left;vertical-align:top;padding:12px 16px}.table-wrap code{white-space:nowrap;overflow-wrap:normal}.table-wrap th{color:var(--heading);background:var(--surface);white-space:nowrap;font-weight:600}.table-wrap tr:last-child td{border-bottom:0}.prose sup:has([data-footnote-ref]){font-family:var(--mono);font-size:.72em;line-height:0}[data-footnote-ref]{text-decoration:none}.footnotes{border-top:1px solid var(--line);font-size:var(--fs-sm);color:var(--muted);margin-top:3.5em;padding-top:1.5em}.footnotes h2{font-family:var(--mono);font-size:var(--fs-sm);letter-spacing:0;color:var(--muted);margin:0 0 .8em;font-weight:500}.footnotes ol{padding-left:1.4em}.footnotes li:target{color:var(--heading)}.data-footnote-backref{margin-left:4px;text-decoration:none}.article-foot{margin-top:72px}.share{margin-bottom:32px}.share h2{font-family:var(--mono);font-size:var(--fs-sm);letter-spacing:0;color:var(--muted);margin-bottom:12px;font-weight:500}.share-links{font-family:var(--mono);font-size:var(--fs-sm);flex-wrap:wrap;gap:8px;padding:0;list-style:none;display:flex}.share-links a,.share-links button{border:1px solid var(--line-strong);background:var(--surface);min-height:36px;color:var(--text);font:inherit;cursor:pointer;transition:border-color .16s var(--ease), color .16s var(--ease);border-radius:999px;align-items:center;gap:8px;padding:0 14px;text-decoration:none;display:inline-flex}.share-icon{width:15px;height:15px;color:var(--heading);flex:none}.share-icon--stroke{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.share-links a:hover .share-icon,.share-links button:hover .share-icon,.share-links [data-copied] .share-icon{color:var(--accent)}.share-links a:hover,.share-links button:hover,.share-links [data-copied]{border-color:var(--accent);color:var(--heading)}.bio{border:1px solid var(--line);border-radius:var(--radius);grid-template-columns:auto 1fr;gap:16px 20px;padding:24px;display:grid}.bio svg{width:36px;color:var(--mark)}.bio p{font-size:var(--fs-base)}.bio strong{color:var(--heading);font-weight:600}.bio a{color:var(--accent);text-underline-offset:.2em}.bio .button{background:var(--accent);min-height:44px;color:var(--on-accent);transition:background-color .16s var(--ease);border-radius:999px;grid-column:-2/-1;justify-self:start;align-items:center;padding:0 22px;font-weight:600;text-decoration:none;display:inline-flex}.bio .button:hover{background:var(--accent-hover)}.pager{grid-template-columns:1fr 1fr;gap:16px;margin-top:32px;display:grid}.pager a{border:1px solid var(--line);border-radius:var(--radius-sm);transition:border-color .16s var(--ease);flex-direction:column;gap:6px;padding:18px 20px;text-decoration:none;display:flex}.pager a:hover{border-color:var(--line-strong)}.pager .next{text-align:right;grid-column:2}.pager small{font-family:var(--mono);font-size:var(--fs-xs);color:var(--muted)}.pager span{color:var(--heading);font-weight:500;line-height:1.35}.subscribe{font-family:var(--mono);font-size:var(--fs-sm);color:var(--muted);margin-top:32px}.subscribe a{color:var(--accent)}@media (width<=640px){.pager{grid-template-columns:1fr}.pager .next{grid-column:1}.bio{grid-template-columns:1fr}}.lost{padding-block:clamp(80px,14vw,180px)}.lost .code{margin-bottom:40px}.lost h1{font-size:var(--fs-title);letter-spacing:-.04em}.lost p{font-size:var(--fs-lead);margin-top:16px}.lost p a{color:var(--accent);text-underline-offset:.2em}.progress{display:none}@supports (animation-timeline:scroll()){.progress{z-index:20;background:var(--accent);transform-origin:0;height:2px;animation:linear both progress scroll(root);display:block;position:fixed;inset:0 0 auto}@keyframes progress{0%{transform:scaleX(0)}to{transform:scaleX(1)}}}@media (prefers-reduced-motion:reduce){:not(.progress),:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.intro .prompt:after{animation:none}}
