@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter-cyrillic-ext.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter-cyrillic.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter-latin-ext.woff2) format("woff2");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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter-latin.woff2) format("woff2");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:JetBrains Mono;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/jetbrains-mono-cyrillic-ext.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/jetbrains-mono-cyrillic.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin-ext.woff2) format("woff2");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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin.woff2) format("woff2");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[data-theme=phosphore],:root[data-theme=acidule],:root[data-theme=pierre]{--papier: #0d0a05;--rouille: #1a1207;--grid: #402c0e;--braise: #ff7a18;--encre: #ffb000;--creme: #ffe0a8;--fort: #e09a20;--faible: #a8752a;--erreur: #ff7a5c;--braise-txt: #ff9a5c;--focus-ring: #ffb000;--code-kw: #ffd08a;--code-str: #b7e8c0;--code-num: #ffd08a;--code-cm: #e6b894;--ok: #7dffa0;--placeholder: #c08a2a;--table-rule: #6b4715;--theme-color: var(--papier);--led-on: #7dffa0;--led-warn: #ffb000;--led-off: #4a340f}:root[data-theme=acidule]{--papier: #000a06;--rouille: #03150c;--grid: #14432f;--braise: #00e5c0;--encre: #35ff8a;--creme: #c2ffdb;--fort: #24b96a;--faible: #1e9c58;--erreur: #ff8f6e;--braise-txt: #5fe6c2;--focus-ring: var(--encre);--code-kw: #a7e0ac;--code-str: #b7e8c0;--code-num: #ffd0dc;--code-cm: #cfe6d1;--ok: #7dffa0;--placeholder: #1e9c58;--table-rule: #1c6b47;--led-on: #35ff8a;--led-warn: #ffd24a;--led-off: #0d3b26}:root[data-theme=pierre]{--papier: #f4efe6;--rouille: #e9e1d0;--grid: #c9bda6;--braise: #a8431a;--encre: #2f2618;--creme: #1a1409;--fort: #6b5c42;--faible: #6f6147;--erreur: #a32c0c;--braise-txt: #9a3b1c;--focus-ring: var(--braise);--code-kw: #8f2f10;--code-str: #1f6b2b;--code-num: #3d3124;--code-cm: #5b4d3d;--ok: #1f6b2b;--placeholder: #5b4d3d;--table-rule: #8a7a63;--led-on: #1f6b2b;--led-warn: #a8431a;--led-off: #c9bda6}@font-face{font-family:Cascadia Mono Art;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/cascadia-mono-art.woff2) format("woff2")}:root{--filet: 1px;--trait: 1px;--trait-fin: 1px;--ombre: 0 0 18px -6px color-mix(in srgb, var(--braise) 55%, transparent);--ombre-sm: 0 0 10px -4px color-mix(in srgb, var(--braise) 45%, transparent);--glow: 0 0 6px color-mix(in srgb, var(--encre) 45%, transparent);--glow-strong: 0 0 14px color-mix(in srgb, var(--encre) 60%, transparent);--status-h: 1.5rem;--menu-h: 3.5rem;--font-display: "JetBrains Mono", ui-monospace, "Cascadia Mono", monospace;--font-ui: "Inter", system-ui, -apple-system, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, "Cascadia Mono", monospace;--font-body: "Inter", system-ui, -apple-system, sans-serif;--font-art: "Cascadia Mono Art", "Cascadia Mono", Consolas, "SF Mono", Menlo, "DejaVu Sans Mono", "Liberation Mono", monospace;--ui-zoom: 1;--wrap: 100%;--chrome-h: calc(var(--status-h) + var(--filet) + var(--menu-h));--fs-label: .75rem;--fs-micro: .8rem;--fs-small: .875rem;--fs-lead: .95rem;--sp-1: .25rem;--sp-2: .5rem;--sp-3: .75rem;--sp-4: 1rem;--sp-5: 1.5rem;--sp-6: 2rem;--sp-7: 3rem;--bp-2xs: 30rem;--bp-xs: 34rem;--bp-sm: 40rem;--bp-md: 44rem;--bp-lg: 52rem;--bp-xl: 74rem;--bp-wide: 60rem;--bp-hero: 62rem;color-scheme:dark}:root[data-theme=pierre]{color-scheme:light}::selection{background:var(--braise);color:var(--papier)}::placeholder{color:var(--placeholder);opacity:1}*,*:before,*:after{box-sizing:border-box}[hidden]{display:none!important}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}[id]{scroll-margin-top:var(--chrome-h)}body{margin:0;background:var(--papier);color:var(--encre);font-family:var(--font-ui);font-size:calc(1rem * var(--ui-zoom));line-height:1.65;min-height:100vh}img,svg,video{max-width:100%;height:auto;display:block}a{color:var(--encre);text-decoration-color:var(--braise);text-underline-offset:.2em}a:hover{color:var(--fort)}:focus-visible{outline:var(--trait) solid var(--focus-ring);outline-offset:2px}button{font:inherit;color:inherit;cursor:pointer}h1,h2,h3,h4{font-family:var(--font-display);font-weight:700;line-height:1.2;letter-spacing:-.005em;margin:0 0 .6em;color:var(--creme);text-wrap:balance}h1{font-size:clamp(1.75rem,5vw,3.1rem);line-height:1.12}h2{font-size:clamp(1.3rem,3vw,1.9rem)}h3{font-size:clamp(1.05rem,2.2vw,1.3rem)}.hero h1{text-transform:uppercase;letter-spacing:-.02em;text-shadow:var(--glow);font-size:clamp(1.35rem,3.6vw,2.4rem)}.article h1,.project h1{text-transform:none;letter-spacing:-.01em;text-shadow:none}.section-head h2,.sticky-head h2{display:flex;align-items:baseline;gap:.6ch;text-transform:uppercase;letter-spacing:.06em;font-size:clamp(1rem,2.2vw,1.25rem)}.section-head h2:before,.sticky-head h2:before{content:"▌";color:var(--braise);font-size:1.15em;line-height:1}p{margin:0 0 1em}code,pre,kbd{font-family:var(--font-ui)}code{background:var(--rouille);color:var(--fort);padding:.1em .35em}pre{background:var(--rouille);border:var(--filet) solid var(--braise);box-shadow:var(--ombre-sm);padding:var(--sp-4);overflow-x:auto;color:var(--fort)}pre code{background:none;padding:0}pre.astro-code{background-color:var(--shiki-dark-bg, var(--rouille));color:var(--shiki-dark, var(--fort))}pre.astro-code code,pre.astro-code span{color:var(--shiki-dark, var(--fort))}:root[data-theme=pierre] pre.astro-code{background-color:var(--shiki-light-bg, var(--rouille));color:var(--shiki-light, var(--fort))}:root[data-theme=pierre] pre.astro-code code,:root[data-theme=pierre] pre.astro-code span{color:var(--shiki-light, var(--fort))}blockquote{margin:1.5rem 0;padding-left:1.2rem;border-left:var(--trait) solid var(--braise);color:var(--fort)}.wrap{width:var(--wrap);max-width:96rem;margin-inline:auto;padding-inline:clamp(1rem,4vw,3rem)}.os-panel{background:var(--papier);border:var(--filet) solid var(--braise);box-shadow:var(--ombre);padding:var(--sp-5)}.site-header{position:sticky;top:0;z-index:40;background:var(--papier);border-bottom:var(--filet) solid var(--braise)}.site-header .wrap{display:flex;align-items:center;gap:var(--sp-4);justify-content:space-between;padding-block:var(--sp-3);flex-wrap:wrap}.brand{display:inline-flex;align-items:center;gap:var(--sp-2);text-decoration:none;font-family:var(--font-display);font-size:1.15rem;color:var(--fort)}.brand-mark{width:.9em;height:.9em;background:var(--braise);box-shadow:2px 2px 0 var(--rouille)}.main-nav ul{display:flex;gap:var(--sp-1);list-style:none;margin:0;padding:0;flex-wrap:wrap}.nav-link{display:inline-flex;align-items:center;padding:.35rem .7rem;border:var(--filet) solid transparent;text-decoration:none;text-transform:uppercase;letter-spacing:.08em;font-size:var(--fs-small);min-height:44px}.nav-link:hover{border-color:var(--braise)}.nav-link[aria-current=page]{background:var(--braise);color:var(--papier);border-color:var(--braise)}.header-tools{display:flex;gap:var(--sp-2);align-items:center}.btn{display:inline-block;padding:.6rem 1.1rem;border:var(--trait) solid var(--braise);background:var(--papier);color:var(--encre);text-decoration:none;font-family:var(--font-ui);text-transform:uppercase;letter-spacing:.06em;box-shadow:var(--ombre);transition:transform .2s cubic-bezier(.2,.9,.2,1),box-shadow .2s cubic-bezier(.2,.9,.2,1)}.btn:hover{transform:translate(3px,3px);box-shadow:3px 3px 0 var(--braise);color:var(--fort)}.btn-primary{background:var(--braise);color:var(--papier)}.btn-row{display:flex;gap:var(--sp-3);flex-wrap:wrap;margin-block:var(--sp-5)}.hero{padding-block:3rem 2rem}.hero h1{margin-bottom:.4em}.eyebrow{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-label);letter-spacing:.18em;text-transform:uppercase;color:var(--braise);margin-bottom:1.6rem}.eyebrow:before{content:"";width:1.6rem;height:var(--trait);background:var(--braise);flex-shrink:0}.lede{font-size:1.1rem;max-width:60ch;color:var(--fort);text-wrap:balance}.section{padding-block:2.5rem;border-top:var(--filet) solid var(--grid)}.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap;margin-bottom:1.25rem}.card-grid{display:grid;gap:var(--sp-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,17rem),1fr))}.card-row{display:flex;gap:var(--sp-4);overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scroll-padding-inline:clamp(1rem,4vw,3rem);margin-inline:calc(-1*clamp(1rem,4vw,3rem));padding-inline:clamp(1rem,4vw,3rem);--edge-fade: 3.5rem;padding-block:.35rem .4rem;scrollbar-width:none;-ms-overflow-style:none}.card-row.is-auto{scroll-snap-type:none}.card-row.is-scrollable{-webkit-mask-image:linear-gradient(to right,transparent 0,#000 var(--edge-fade),#000 calc(100% - var(--edge-fade)),transparent 100%);mask-image:linear-gradient(to right,transparent 0,#000 var(--edge-fade),#000 calc(100% - var(--edge-fade)),transparent 100%)}.card-row.is-scrollable.at-start{-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - var(--edge-fade)),transparent 100%);mask-image:linear-gradient(to right,#000 0,#000 calc(100% - var(--edge-fade)),transparent 100%)}.card-row.is-scrollable.at-end{-webkit-mask-image:linear-gradient(to right,transparent 0,#000 var(--edge-fade),#000 100%);mask-image:linear-gradient(to right,transparent 0,#000 var(--edge-fade),#000 100%)}.card-row>.card{flex:0 0 18rem;max-width:82vw;scroll-snap-align:start}.card-row::-webkit-scrollbar{display:none}.card-row::-webkit-scrollbar-track{background:transparent}.card-row::-webkit-scrollbar-thumb{background:var(--braise)}.card{display:flex;flex-direction:column;gap:var(--sp-2);padding:1.1rem;border:var(--filet) solid var(--braise);background:var(--papier);box-shadow:var(--ombre-sm);text-decoration:none;color:inherit}.card h3{margin:0}.card p{margin:0;color:var(--fort);font-size:var(--fs-lead)}.card-meta{font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--braise)}.tag-row{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin-top:auto;padding-top:var(--sp-2)}.tag{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.08em;border:var(--filet) solid var(--rouille);padding:.1rem .45rem;color:var(--fort)}@media(max-width:40rem){.tag{padding:.7rem .6rem}a.tag{display:inline-block;min-width:2.75rem;text-align:center}a.card-meta{display:inline-block;padding-block:.75rem}}.prose{max-width:68ch}.prose.post-prose{font-family:var(--font-body);font-size:1rem;line-height:1.72;color:var(--fort);max-width:64ch}.post-prose>:first-child{margin-top:0}.post-prose h1,.post-prose h2,.post-prose h3,.post-prose h4{font-family:var(--font-display);color:var(--encre);letter-spacing:-.01em;text-transform:none;text-shadow:none}.post-prose h1{font-size:1.35rem}.post-prose h2{font-size:1.2rem}.post-prose h3{font-size:1.05rem}.post-prose strong{color:var(--encre)}.post-prose a{color:var(--braise-txt)}.post-prose a:hover{color:var(--creme)}.post-prose blockquote{margin-inline:0;padding-left:1rem;border-left:var(--trait) solid var(--braise);color:var(--fort)}.post-prose code{font-family:var(--font-mono);font-size:.88em;color:var(--code-kw)}.post-prose pre{background:var(--rouille);border:var(--filet) solid var(--grid);padding:.9rem 1rem;overflow-x:auto;font-size:var(--fs-small);line-height:1.6}.post-prose pre code{font-size:inherit;color:var(--encre)}.post-prose hr{border:0;border-top:var(--filet) dashed var(--grid);margin:2rem 0}.post-prose li{margin-block:.3rem}.post-prose p{margin-block:1.1rem}.prose h2{margin-top:var(--sp-6);padding-bottom:.3rem;border-bottom:var(--filet) solid var(--grid)}.prose h3{margin-top:var(--sp-5)}.prose img{border:var(--filet) solid var(--braise);box-shadow:var(--ombre-sm)}.prose table{width:100%;border-collapse:collapse;margin-block:var(--sp-5);font-size:var(--fs-lead)}.prose th,.prose td{border:var(--filet) solid var(--table-rule);padding:.5rem .7rem;text-align:left}.prose th{background:var(--rouille);color:var(--fort)}.table-scroll{overflow-x:auto;max-width:100%;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch}.hero-lead{font-size:1.05rem;color:var(--fort)}.metrics{display:flex;gap:var(--sp-5);flex-wrap:wrap;margin-block:var(--sp-5)}.metric strong{display:block;font-family:var(--font-display);font-size:1.8rem;color:var(--braise)}.metric span{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.1em}.warning{border:var(--trait) solid var(--braise);background:var(--rouille);padding:var(--sp-4)}.field{display:flex;flex-direction:column;gap:var(--sp-1);margin-bottom:1.1rem}.field label{font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--braise)}.field input,.field select,.field textarea{font:inherit;padding:.6rem .7rem;background:var(--papier);color:var(--encre);border:var(--trait) solid var(--braise);border-radius:0;width:100%}.field input:focus,.field select:focus,.field textarea:focus{background:var(--rouille);color:var(--fort)}.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.form-status{margin-top:var(--sp-4);padding:.8rem 1rem;border:var(--trait) solid var(--braise);background:var(--rouille);color:var(--fort)}.form-status:empty{display:none}.palette{position:fixed;inset:0;z-index:90;display:grid;place-items:start center;padding-top:12vh;background:color-mix(in srgb,var(--papier) 82%,transparent);backdrop-filter:blur(2px)}.palette[hidden]{display:none}.palette-box{width:min(100% - 2rem,34rem);background:var(--papier);border:var(--trait) solid var(--braise);box-shadow:var(--ombre)}.palette-input{width:100%;padding:.9rem 1rem;background:none;border:none;border-bottom:var(--filet) solid var(--braise);color:var(--fort);font-size:1.05rem}.palette-input:focus{background:var(--rouille)}.palette-list{list-style:none;margin:0;padding:.4rem;max-height:22rem;overflow-y:auto}.palette-item{display:block;padding:.5rem .7rem;color:var(--encre);cursor:pointer}.palette-item[aria-selected=true],.palette-item:hover{background:var(--braise);color:var(--papier)}.palette-empty{padding:.9rem 1rem;color:var(--braise);font-size:var(--fs-small)}.palette-group{display:inline-block;min-width:5.5rem;font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.1em;opacity:.7}.site-footer{margin-top:var(--sp-7);border-top:var(--trait) solid var(--braise);background:var(--rouille);padding-block:var(--sp-5)}.footer-links{display:flex;gap:var(--sp-4);flex-wrap:wrap}[data-reveal]{opacity:0;transform:translateY(14px);transition:opacity .62s cubic-bezier(.22,.7,.25,1),transform .62s cubic-bezier(.22,.7,.25,1);transition-delay:var(--reveal-delay, 0ms)}[data-reveal].is-in{opacity:1;transform:none}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}[data-reveal]{opacity:1;transform:none;transition:none}.btn{transition:none}}.skip-link{position:absolute;left:-9999px;top:0;background:var(--braise);color:var(--papier);padding:.6rem 1rem;z-index:100}.skip-link:focus{left:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.crt:after{content:"";position:fixed;inset:0;z-index:80;pointer-events:none;background:repeating-linear-gradient(to right,rgba(0,0,0,.16) 0 1px,transparent 1px 3px),repeating-linear-gradient(to bottom,rgba(0,0,0,.28) 0 1px,transparent 1px 3px);opacity:.55;mix-blend-mode:multiply}.crt:before{content:"";position:fixed;inset:0;z-index:79;pointer-events:none;background:radial-gradient(120% 90% at 50% 45%,transparent 55%,color-mix(in srgb,var(--papier) 55%,transparent) 100%);opacity:.9}.crt .tube-flicker{position:fixed;inset:0;z-index:81;pointer-events:none;background:var(--papier);opacity:.014;animation:tube-flicker 7s steps(1,end) infinite}@keyframes tube-flicker{0%,96%{opacity:.014}97%{opacity:.05}98%{opacity:.006}to{opacity:.014}}@media(prefers-reduced-motion:reduce){.crt:after{display:none}.crt:before{opacity:.55}.crt .tube-flicker{display:none}}.lead-label{display:inline-flex;align-items:center;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.16em;text-transform:uppercase;color:var(--braise);margin-bottom:.9rem}.lead-label:before{content:"";width:1.4rem;height:var(--trait);background:var(--braise)}.prose .lede{max-width:60ch}.lead-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.08em;text-transform:uppercase;color:var(--encre);margin-bottom:1.6rem}.lead-sep{opacity:.5}.pull{margin:1.8rem 0;padding:1rem 1.2rem;border-left:var(--trait) solid var(--braise);background:color-mix(in srgb,var(--rouille) 45%,var(--papier));font-family:var(--font-display);font-size:clamp(1.05rem,2.4vw,1.3rem);color:var(--fort)}.figure{margin:2rem 0;border:var(--filet) solid var(--braise);background:var(--papier);padding:1rem 1.1rem 1.2rem}.figure-label{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;color:var(--braise);padding-bottom:.6rem;margin-bottom:.9rem;border-bottom:var(--filet) solid var(--grid)}.figure-body{display:flex;flex-direction:column;gap:var(--sp-1)}.pipe-row{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--sp-3);padding:.35rem 0}.pipe-connector{display:flex;flex-direction:column;align-items:center;align-self:stretch;width:.85rem}.pipe-dot{width:.62rem;height:.62rem;flex-shrink:0;border:var(--trait) solid var(--braise);background:var(--papier)}.pipe-line{flex:1;width:var(--trait);background:var(--grid);min-height:.8rem}.pipe-row:last-child .pipe-line{background:transparent}.pipe-stage{border:var(--filet) solid var(--grid);background:color-mix(in srgb,var(--rouille) 28%,var(--papier));padding:.5rem .75rem;border-left-width:var(--trait)}.pipe-name{font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--fort)}.pipe-desc{font-size:var(--fs-small);color:var(--encre)}.pipe-cost{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.1em;text-transform:uppercase;border:var(--filet) solid currentColor;padding:.1rem .45rem;white-space:nowrap}.c-free,.c-mute{color:var(--encre)}.c-ok{color:var(--ok)}.c-warm,.c-cool{color:var(--encre)}.c-hot{color:var(--braise)}.s-mute{border-color:var(--grid)}.s-ok{border-color:var(--ok)}.s-warm,.s-cool{border-color:var(--encre)}.s-hot{border-color:var(--braise);background:color-mix(in srgb,var(--braise) 25%,var(--papier))}.card-title{font-family:var(--font-display);font-size:1.1rem;color:var(--fort);margin:.2rem 0 .35rem}.card-body{margin:0 0 .6rem;font-size:var(--fs-small);color:var(--encre)}.ctx-rule{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-3);padding:.6rem 0;border-top:var(--filet) solid var(--grid);font-size:var(--fs-lead)}.ctx-rule:first-of-type{border-top:none}.ctx-num{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--braise)}.tok{color:var(--fort)}.t-kw,.t-cl{color:var(--code-kw)}.t-str{color:var(--code-str)}.t-num{color:var(--code-num)}.t-cm{color:var(--code-cm)}.os-panel.cta{border-width:var(--trait)}.article,.project{margin-inline:auto;max-width:46rem}.article-back{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.12em;text-transform:uppercase;margin-bottom:var(--sp-5)}.article hr{border:none;border-top:var(--filet) solid var(--grid);margin:1.8rem 0}.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-4);margin-top:var(--sp-7);padding-top:1.2rem;border-top:var(--trait) solid var(--braise)}.post-nav-link{display:block;padding:.8rem .9rem;border:var(--filet) solid var(--braise);background:var(--papier);text-decoration:none;color:inherit}.post-nav-link:hover{background:var(--rouille)}.post-nav-newer{text-align:right}.post-nav-empty{border-color:transparent;background:none}.post-nav-label{display:block;font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;color:var(--braise);margin-bottom:.3rem}.post-nav-title{display:block;color:var(--fort);line-height:1.3}.post-related{margin-top:2.4rem}.post-related-head{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.16em;text-transform:uppercase;color:var(--braise);margin-bottom:.7rem}.post-related-list{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-2)}.post-related-list a{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-4);padding:.6rem .8rem;border:var(--filet) solid var(--grid);text-decoration:none;color:inherit}.post-related-list a:hover{border-color:var(--braise);background:var(--rouille)}.post-related-title{color:var(--fort);text-wrap:balance}.post-related-date{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--encre);white-space:nowrap}.post-cta{margin-top:2.8rem;padding:1.6rem 1.5rem;border:var(--trait) solid var(--braise);background:var(--rouille);text-align:center}.post-cta h2{margin-top:0}.post-cta p{max-width:48ch;margin-inline:auto;color:var(--fort)}.post-cta .btn-row{justify-content:center;margin-bottom:0}.post-cta-mail{color:inherit;text-decoration:underline;text-decoration-color:var(--fort);text-decoration-thickness:2px;text-underline-offset:.18em;white-space:nowrap}.post-cta-mail:hover{color:var(--fort)}@media(max-width:34rem){.post-nav{grid-template-columns:1fr}.post-nav-newer{text-align:left}}.article h1{margin-bottom:.6rem;--title-w: min(56rem, calc(100vw - (2*clamp(1rem, 4vw, 3rem))) );width:var(--title-w);margin-left:calc(50% - var(--title-w) / 2)}.project>.hero,.project .hero{margin-bottom:var(--sp-6);padding:0}.project h1{font-size:clamp(1.9rem,5.5vw,3.2rem);line-height:1.1}.project .hero-lead{font-size:1.05rem;max-width:56ch}.project .hero-fit{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.12em;text-transform:uppercase;color:var(--braise)}.project .metrics{display:flex;flex-wrap:wrap;gap:1px;background:var(--braise);border:var(--trait) solid var(--braise);margin-block:1.8rem}.project .metric{flex:1 1 10rem;background:var(--papier);padding:1rem 1.1rem}.project .metric strong{display:block;font-family:var(--font-display);font-size:clamp(1.5rem,3.6vw,2.1rem);color:var(--braise);line-height:1.1}.project .metric span{display:block;margin-top:var(--sp-1);font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.12em;text-transform:uppercase;color:var(--encre)}.project .section-title{font-family:var(--font-display);color:var(--fort)}.project .btn-group{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-block:1.6rem}.project .btn-outline{background:transparent}.project .warning{border:var(--trait) solid var(--braise);background:color-mix(in srgb,var(--rouille) 50%,var(--papier));padding:1rem 1.1rem;color:var(--fort);font-weight:500}.project .warning h2,.project .warning h3{color:var(--fort);border:none}.project table{background:var(--papier)}.project img{max-width:100%}.boot-overlay{position:fixed;inset:0;z-index:200;display:grid;place-items:center;background:var(--papier);padding:var(--sp-5)}.boot-overlay[hidden]{display:none}.boot-overlay.is-done{animation:boot-out .52s cubic-bezier(.4,0,.2,1) forwards}@keyframes boot-out{to{opacity:0;visibility:hidden;clip-path:inset(0 0 100% 0)}}.boot-box{width:min(100%,30rem);font-family:var(--font-mono);font-size:var(--fs-micro);line-height:1.9;color:var(--encre);border:var(--filet) solid var(--braise);background:var(--papier);box-shadow:var(--ombre);padding:1rem 1.2rem}.boot-line{display:flex;gap:var(--sp-2);white-space:nowrap;overflow:hidden}.boot-line b{color:var(--braise);font-weight:500;flex-shrink:0}.boot-cursor{display:inline-block;width:.6em;height:1em;background:var(--braise);vertical-align:text-bottom;animation:blink .9s steps(2,jump-none) infinite}@keyframes blink{50%{opacity:0}}.boot-bar{height:.75rem;border:var(--filet) solid var(--braise);margin-top:.9rem;padding:1px}.boot-bar i{display:block;height:100%;width:0;background:var(--braise);animation:boot-fill 1.5s steps(24,end) forwards}@keyframes boot-fill{to{width:100%}}.progress-rail{position:fixed;inset:0 0 auto;height:var(--trait);z-index:70;background:var(--grid);pointer-events:none}.progress-rail i{display:block;height:100%;width:100%;background:var(--braise);transform:scaleX(var(--progress, 0));transform-origin:left center;transition:transform 90ms linear}[data-anim=type]{display:block;white-space:pre-wrap}[data-anim=type] .word{display:inline-block;white-space:nowrap}[data-anim=type] .ch{display:inline-block;opacity:0;transform:translateY(.25em) rotate(2deg);animation:ch-in .42s cubic-bezier(.2,.9,.25,1) forwards}@keyframes ch-in{to{opacity:1;transform:none}}[data-anim=underline]{position:relative;display:inline-block}[data-anim=underline]:after{content:"";position:absolute;left:0;bottom:-.12em;width:100%;height:var(--trait);background:var(--braise);transform:scaleX(0);transform-origin:left;transition:transform .62s cubic-bezier(.2,.9,.2,1);transition-delay:var(--reveal-delay, 0ms)}[data-anim=underline].is-in:after{transform:scaleX(1)}.card{position:relative;overflow:hidden;transition:transform .22s cubic-bezier(.2,.9,.2,1),box-shadow .22s ease}@media(hover:hover){.card:hover{transform:translate(-2px,-2px);box-shadow:8px 8px 0 var(--braise)}.card:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(16rem circle at var(--mx, 50%) var(--my, 50%),color-mix(in srgb,var(--braise) 18%,transparent),transparent 70%);opacity:0;transition:opacity .2s ease}.card:hover:before{opacity:1}}.card-grid[data-anim=tilt] .card,.card-row[data-anim=tilt] .card{transition:transform .26s cubic-bezier(.2,.9,.2,1),box-shadow .26s ease}.btn{position:relative;overflow:hidden}.btn:before{content:"";position:absolute;inset:0;background:var(--braise);transform:translateY(101%);transition:transform .2s cubic-bezier(.2,.9,.2,1);z-index:-1}.btn:hover{color:var(--papier)}.btn:hover:before{transform:translateY(0)}.btn{isolation:isolate}.btn:active{transform:translate(6px,6px);box-shadow:none}.eyebrow{position:relative;overflow:hidden}.eyebrow:after{content:"";position:absolute;inset:0;background:linear-gradient(100deg,transparent 20%,color-mix(in srgb,var(--creme) 55%,transparent) 50%,transparent 80%);transform:translate(-100%);animation:sweep 3.6s ease-in-out infinite}@keyframes sweep{0%,60%{transform:translate(-100%)}to{transform:translate(100%)}}.pulse-dot{display:inline-block;width:.5em;height:.5em;background:var(--braise);margin-right:.45em;animation:pulse 1.6s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.72)}}.crt:after{animation:drift 9s linear infinite}@keyframes drift{0%{background-position-y:0}to{background-position-y:4px}}@media(prefers-reduced-motion:no-preference){body{background-attachment:fixed}}@view-transition{navigation:auto}:root{--vt-dur: .32s;--vt-ease: cubic-bezier(.4, 0, .2, 1)}.menu-bar{view-transition-name:site-header}.status-bar{view-transition-name:site-status}.progress-rail{view-transition-name:site-progress}.section-rail{view-transition-name:site-section-rail}::view-transition-image-pair(root){isolation:auto}::view-transition-old(root){mix-blend-mode:normal;animation:vt-out var(--vt-dur) var(--vt-ease) both}::view-transition-new(root){mix-blend-mode:normal;animation:vt-in calc(var(--vt-dur) + .12s) var(--vt-ease) 60ms both}@keyframes vt-out{to{opacity:0;clip-path:inset(0 0 14% 0)}}@keyframes vt-in{0%{opacity:0;clip-path:inset(0 0 14% 0)}}@media(prefers-reduced-motion:reduce){.boot-overlay,.boot-cursor,.boot-bar i,.eyebrow:after,.pulse-dot,.crt:after{animation:none!important}.boot-bar i{width:100%}.crt:after{display:none}[data-anim=type] .ch{opacity:1;transform:none;animation:none!important}[data-anim=underline]:after{transform:scaleX(1);transition:none}.card,.card-grid[data-anim=tilt] .card,.card-row[data-anim=tilt] .card,.btn,.btn:before{transition:none!important}.btn:active{transform:none;box-shadow:var(--ombre)}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation-duration:1ms!important}}main:focus:not(:focus-visible){outline:none}.tty{position:relative;border:var(--filet) solid var(--grid);background:var(--papier);box-shadow:var(--ombre)}.tty-fit{width:fit-content;max-width:100%;margin-inline:auto}.tty-bar{position:absolute;top:calc(-1 * var(--filet));left:0;right:0;display:flex;align-items:center;gap:.6rem;padding:0 .6rem;font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.08em;color:var(--fort);pointer-events:none}.tty-title{background:var(--papier);padding:0 .5ch;color:var(--braise);text-shadow:var(--glow);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tty-title:before{content:"─ ";color:var(--faible)}.tty-title:after{content:" ─";color:var(--faible)}.tty-right{margin-left:auto;background:var(--papier);padding:0 .5ch;color:var(--faible);white-space:nowrap}.tty-body{padding:1.9rem 1rem 1rem;font-family:var(--font-mono);font-size:var(--fs-small);line-height:1.65;color:var(--encre)}.tty-body>:first-child{margin-top:0}.tty-body>:last-child{margin-bottom:0}.tty-prompt{color:var(--braise)}.tty-prompt .who{color:var(--encre)}.tty-prompt .sep{color:var(--faible)}.tty-prompt .path{color:var(--fort)}.tty-cmd{color:var(--creme);text-shadow:var(--glow)}.tty-out{color:var(--fort);white-space:pre-wrap;word-break:break-word}.tty-out .ok{color:var(--ok)}.tty-out .warn{color:var(--led-warn)}.tty-out .err{color:var(--erreur)}.tty-out .key{color:var(--braise)}.tty-out .dim{color:var(--faible)}.cursor{display:inline-block;width:.62em;height:1.05em;vertical-align:-.18em;margin-left:.08em;background:var(--encre);box-shadow:var(--glow);animation:cursor-blink 1.05s steps(1,end) infinite}@keyframes cursor-blink{0%,49%{opacity:1}50%,to{opacity:0}}.cursor.is-idle{background:var(--grid);box-shadow:none;animation:none;opacity:1}@media(prefers-reduced-motion:reduce){.cursor{animation:none}}.led{display:inline-block;width:.5rem;height:.5rem;flex:0 0 auto;background:var(--led-off);box-shadow:0 0 0 1px color-mix(in srgb,var(--led-off) 60%,transparent)}.led-on{background:var(--led-on);box-shadow:0 0 6px color-mix(in srgb,var(--led-on) 70%,transparent)}.led-warn{background:var(--led-warn);box-shadow:0 0 6px color-mix(in srgb,var(--led-warn) 70%,transparent)}.led-blink{animation:led-pulse 1.4s ease-in-out infinite}@keyframes led-pulse{0%,to{opacity:1}50%{opacity:.28}}@media(prefers-reduced-motion:reduce){.led-blink{animation:none}}.tty-leds{display:inline-flex;gap:.3rem;align-items:center;background:var(--papier);padding:0 .5ch}.meter{display:inline-flex;align-items:center;gap:.5rem;font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.06em;color:var(--fort)}.meter-track{color:var(--grid);letter-spacing:-.02em}.meter-fill{color:var(--braise);text-shadow:var(--glow)}.meter-value{color:var(--encre);font-variant-numeric:tabular-nums}.ls{font-family:var(--font-mono);font-size:var(--fs-small);line-height:1.75;color:var(--fort);overflow-x:auto}.ls-row{display:grid;grid-template-columns:11ch 6ch 12ch minmax(0,1fr);gap:0 1ch;align-items:baseline;white-space:nowrap}.tl-row{display:grid;gap:0 1ch;align-items:baseline;white-space:nowrap}.tl-row>:last-child{white-space:normal}.tl-row--dir{grid-template-columns:11ch 16ch minmax(0,1fr)}.tl-row--write{grid-template-columns:11ch 12ch minmax(0,1fr)}.tl-row--proj{grid-template-columns:11ch 6ch 24ch minmax(0,1fr)}.tl-mode,.tl-date,.tl-tags{color:var(--faible);font-variant-numeric:tabular-nums}.tl-name{color:var(--encre)}.tl-desc{color:var(--fort)}.tl-row--proj .tl-desc{overflow:hidden;text-overflow:ellipsis}.tl-row--dir .tl-name{color:var(--braise)}.ls-row>:last-child{white-space:normal}.ls-mode{color:var(--faible)}.ls-row.is-dir .ls-mode,.ls-row.is-dir .ls-name{color:var(--braise)}.ls-name{color:var(--encre)}.ls-row a.ls-name,.ls-row .ls-name a{color:inherit;text-decoration:none}.ls-row a.ls-name:hover,.ls-row .ls-name a:hover{color:var(--braise);text-decoration:underline;text-underline-offset:.2em}.ls-row.is-dir .ls-name a{color:var(--braise)}.ls-size,.ls-date{color:var(--faible);font-variant-numeric:tabular-nums}.ls-head{color:var(--faible);border-bottom:var(--filet) solid var(--grid);margin-bottom:.35rem;padding-bottom:.2rem}.ls-row--write{grid-template-columns:11ch 12ch 5ch minmax(0,1fr)}.ls-head .ls-name,.ls-head .ls-mode,.ls-head .ls-date,.ls-head .ls-size,.ls-head .ls-when,.ls-head .ls-cue{color:var(--faible)}.ls-row--cat{grid-template-columns:11ch 18ch minmax(0,1fr) 8ch;align-items:baseline;line-height:1.6}.ls-row--when{grid-template-columns:18ch minmax(0,1fr) 8ch;align-items:baseline;line-height:1.6}.ls-row--cat .ls-name,.ls-row--cat .ls-name a,.ls-row--when .ls-name,.ls-row--when .ls-name a{white-space:normal;overflow-wrap:break-word}.ls-when{color:var(--faible);font-size:var(--fs-label);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}.ls-cue{color:var(--faible);font-size:var(--fs-label);letter-spacing:.06em;white-space:nowrap}@media(max-width:52rem){.ls-row--cat,.ls-row--when{grid-template-columns:minmax(0,1fr)}.ls-row--cat .ls-mode{display:none}.ls-row--cat .ls-when,.ls-row--cat .ls-name,.ls-row--cat .ls-cue,.ls-row--when .ls-when,.ls-row--when .ls-name,.ls-row--when .ls-cue{white-space:normal}}.post-row{padding-block:.55rem;border-bottom:var(--filet) solid color-mix(in srgb,var(--grid) 55%,transparent)}.post-row:last-child{border-bottom:0}.post-row[hidden]{display:none}.post-title{margin:0;font-size:inherit;font-weight:inherit}.ls-row--post{grid-template-columns:11ch 11ch 4ch 13ch minmax(0,1fr);line-height:1.6}.ls-topic{color:var(--braise);font-size:var(--fs-label);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ls-row--post .ls-name{font-size:.92rem}.ls-row--post .ls-name a{color:var(--encre);text-decoration:none}.ls-row--post .ls-name a:hover{color:var(--braise);text-decoration:underline;text-underline-offset:.2em}.post-sum{margin:.2rem 0 0 2ch;font-family:var(--font-body);font-size:.86rem;line-height:1.5;color:var(--fort)}.post-tags{display:flex;flex-wrap:wrap;gap:.3rem;margin:.35rem 0 0 2ch}.post-tags .tag{padding:.05rem .4rem;border:var(--filet) solid var(--grid);background:var(--papier);color:var(--fort);font-family:var(--font-mono);font-size:.68rem;letter-spacing:.05em;text-transform:none;text-decoration:none}.post-tags .tag:hover{border-color:var(--braise);color:var(--braise)}@media(max-width:40rem){.post-tags .tag{padding:.7rem .6rem}}.card-flag{margin-left:.5ch;padding:0 .3rem;border:var(--filet) solid var(--grid);color:var(--faible);font-family:var(--font-mono);font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;vertical-align:.15em}@media(max-width:52rem){.ls-row--post{grid-template-columns:11ch 4ch minmax(0,1fr);grid-template-areas:"date min topic" "name name name";row-gap:.1rem}.ls-row--post .ls-mode{display:none}.ls-row--post .ls-date{grid-area:date}.ls-row--post .ls-size{grid-area:min}.ls-row--post .ls-topic{grid-area:topic}.ls-row--post .ls-name{grid-area:name}.post-sum,.post-tags{margin-left:0}}.rule{height:1px;border:0;margin:0;background-image:linear-gradient(to right,var(--grid) 0 3px,transparent 3px 6px);background-size:6px 1px;background-repeat:repeat-x}.tty-rule{height:0;margin:1.4rem 0;border:0;border-top:var(--filet) dashed var(--grid)}.tty-cmd-line{margin:0 0 .6rem}.tty-cont-line{margin-top:-.35rem}.tty-cont{color:var(--braise)}.key{display:inline-block;padding:.05em .45em;border:var(--filet) solid var(--grid);background:var(--rouille);color:var(--fort);font-family:var(--font-mono);font-size:.85em;line-height:1.4;white-space:nowrap}.hash{color:var(--faible);font-family:var(--font-mono);letter-spacing:.06em}.tree{list-style:none;margin:0;padding:0 0 0 2ch;font-family:var(--font-mono);font-size:var(--fs-small);line-height:1.7;color:var(--fort)}.tree li{position:relative}.tree li:before{content:"├─";position:absolute;left:-2ch;color:color-mix(in srgb,var(--fort) 55%,transparent);font-family:var(--font-art)}.tree li:last-child:before{content:"└─"}.frame{font-family:var(--font-art);font-size:var(--fs-small);line-height:1.35;color:var(--grid);white-space:pre;overflow-x:auto;margin:0}.frame .in{color:var(--fort);font-family:var(--font-art)}.banner{font-family:var(--font-art);font-weight:400;line-height:1.05;letter-spacing:0;color:var(--encre);text-shadow:var(--glow-strong);white-space:pre;overflow:hidden;margin:0}.chip{display:inline-flex;align-items:center;padding:.05rem .4rem;border:var(--filet) solid var(--grid);color:var(--fort);font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.06em;text-decoration:none;background:var(--papier)}a.chip:hover{border-color:var(--braise);color:var(--braise)}.mark{color:var(--braise);font-family:var(--font-mono)}.note{font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.1em;text-transform:uppercase;color:var(--faible)}.count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--braise)}.tty-status{display:flex;align-items:center;gap:.5rem;font-family:var(--font-mono);font-size:var(--fs-label);letter-spacing:.08em;text-transform:uppercase;color:var(--fort)}.tty-status .k{color:var(--faible)}.tty-status .v{color:var(--encre)}
