:root{--paper:#f5f6fa;--surface:#fff;--ink:#0b1220;--ink2:#3a4458;--mute:#5f6779;--faint:#687084;--ghost:#8b93a5;--line:#e1e4ec;--line-soft:rgba(11,18,32,0.06);--chip:#eef0f6;--blue:#0a6fe6;--blue-rule:#0b7cff;--blue-soft:#e8f1ff;--violet:#7a3bff;--violet-soft:#f1eaff;--good:#0e7a3f;--good-bg:#e8f8ee;--warn:#a15c07;--warn-bg:#fff6e5;--bad:#b42318;--bad-bg:#fdecea;--grad:linear-gradient(90deg,#14b4ff,#0b7cff 35%,#4a4bff 70%,#7a3bff);--sans:"DM Sans","Helvetica Neue",Arial,sans-serif;--mono:"IBM Plex Mono","SFMono-Regular",Menlo,monospace;--gutter:clamp(16px,4vw,40px)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;position:relative;overflow-x:hidden;background:var(--paper);color:var(--ink2);font-family:var(--sans);font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}h1,h2,h3,h4{color:var(--ink);font-weight:700;margin:0}p{margin:0}#bottom,main{position:relative;z-index:1}.container{max-width:1180px;margin:0 auto;padding:0 var(--gutter)}.kind,.meta-text,.overline{font-family:var(--mono);font-weight:500;text-transform:uppercase}.overline{font-size:11.5px;letter-spacing:.12em;color:var(--mute);line-height:1.45}.glows{top:72px;left:0;right:0;height:320px;overflow:hidden;pointer-events:none;z-index:0}.glow,.glows{position:absolute}.glow{top:-220px;height:520px;border-radius:50%}.glow-blue{left:-160px;width:1080px;background:radial-gradient(closest-side,rgba(11,124,255,.26),rgba(11,124,255,0))}.glow-violet{right:-220px;width:1008px;background:radial-gradient(closest-side,rgba(122,59,255,.2),rgba(122,59,255,0))}.post-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}.kind{padding:3px 8px;border-radius:6px;background:var(--violet-soft);color:var(--violet)}.kind,.meta-text{font-size:11.5px;letter-spacing:.06em}.meta-text{color:var(--faint)}.author{display:flex;align-items:center;gap:10px}.avatar{width:36px;height:36px;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center;font-family:var(--mono);font-weight:500;font-size:12px}.avatar-branly{background:#fff url(/blog/brand/branly-mark.svg) 50%/60% no-repeat;border:1px solid var(--line)}.author-text{display:flex;flex-direction:column;line-height:1.3}.author-text strong{font-size:14.5px;font-weight:600;color:var(--ink)}.author-text small{font-size:13px;color:var(--faint)}.cover{position:relative;overflow:hidden;background:#0b1220}.cover img{width:100%;height:100%;object-fit:cover;transition:transform .4s}.cover-fallback{position:absolute;inset:0;background:radial-gradient(60% 60% at 70% 50%,rgba(74,75,255,.55),rgba(11,18,32,0) 70%),radial-gradient(40% 40% at 25% 70%,rgba(20,180,255,.3),rgba(11,18,32,0) 70%),#0b1220}.list-header{padding-top:72px;display:flex;flex-direction:column;align-items:flex-start;gap:20px}.list-header h1{font-size:clamp(34px,6vw,64px);line-height:1.04;letter-spacing:-.045em;max-width:1000px}.lede{font-size:19px;line-height:1.55;color:var(--ink2);max-width:640px}.filters{display:inline-flex;gap:4px;padding:4px;border-radius:999px;background:var(--chip);max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.filters a{padding:10px 16px;flex-shrink:0;border-radius:999px;font-weight:600;font-size:14.5px;line-height:1.45;color:var(--mute)}.filters a.is-active{background:#fff;color:var(--ink);box-shadow:0 2px 4px rgba(11,18,32,.1)}.list-posts{padding-top:40px}.empty{color:var(--mute);padding:24px 0 64px}.featured{display:flex;background:var(--surface);border:1px solid var(--line-soft);border-radius:24px;overflow:hidden;min-height:498px}.featured .cover{flex:0 0 53.3%}.card:hover .cover img,.featured:hover .cover img{transform:scale(1.04)}.featured-body{flex:1 1;display:flex;flex-direction:column;gap:16px;padding:40px;min-width:0}.featured-body h2{font-size:34px;line-height:1.14;letter-spacing:-.03em}.card:hover h3,.featured:hover h2,.post-paginator a:hover strong{color:var(--blue)}.featured-body p{font-size:16px;line-height:1.6;color:var(--ink2)}.featured-footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between}.round-btn{width:44px;height:44px;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center}.grid-heading{font-size:24px;letter-spacing:-.02em;margin:64px 0 24px}.featured+.grid-heading{margin-top:64px}.grid-heading:first-child{margin-top:0}.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}.card{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line-soft);border-radius:24px;overflow:hidden}.card .cover{aspect-ratio:4/3}.card-body{display:flex;flex-direction:column;gap:12px;padding:20px 22px 24px}.card h3{font-size:20px;line-height:1.28;letter-spacing:-.02em;-webkit-line-clamp:3;transition:color .2s}.card h3,.card-body p{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.card-body p{font-size:15px;line-height:1.55;color:var(--mute);-webkit-line-clamp:2}.list-end{display:flex;flex-direction:column;gap:28px;padding:48px 0 120px}.paginator{justify-content:space-between;gap:12px}.page-nums,.paginator{display:flex;align-items:center}.page-nums{gap:6px;margin:0;padding:0;list-style:none}.page-nums .gap,.page-nums a{display:grid;place-items:center;min-width:40px;height:40px;padding:0 8px;border-radius:999px;font-weight:600;font-size:14.5px;color:var(--ink)}.page-nums a:hover{background:#fff;color:var(--blue)}.page-nums a[aria-current=page]{background:var(--ink);color:#fff}.page-nums .gap{color:var(--mute)}.pill-btn.is-disabled{opacity:.4;pointer-events:none}@media (max-width:560px){.page-nums li:not(:has(a[aria-current=page])):not(.gap){display:none}.page-nums li.gap{display:none}}.pill-btn{display:inline-flex;align-items:center;gap:8px;padding:12px 18px;border-radius:999px;background:#fff;border:1px solid var(--line);font-weight:600;font-size:14.5px;color:var(--ink)}.pill-btn:hover{border-color:var(--blue);color:var(--blue)}.list-note{font-family:var(--mono);font-size:12px;line-height:1.6;color:var(--mute)}.reading-progress{position:fixed;top:0;left:0;height:3px;z-index:60;background:var(--grad)}.post-header{align-items:stretch;gap:48px;max-width:1180px;margin:0 auto;padding:64px var(--gutter) 0}.post-header,.post-header-inner{display:flex;flex-direction:column}.post-header-inner{width:100%;align-items:flex-start;gap:18px}.back{display:inline-flex;align-items:center;gap:8px;font-weight:600;font-size:14.5px;color:var(--mute)}.back:hover{color:var(--blue)}.post-header h1{max-width:960px;font-size:clamp(34px,5vw,54px);line-height:1.06;letter-spacing:-.04em}.post-lede{max-width:780px;font-size:20px;line-height:1.55;color:var(--ink2)}.byline{width:100%;display:flex;align-items:center;justify-content:space-between;padding-top:20px;border-top:1px solid var(--line)}.share{display:flex;gap:8px}.share button{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;background:#fff;border:1px solid var(--line);color:var(--ink);cursor:pointer}.share button:hover{border-color:var(--blue);color:var(--blue)}.post-cover{width:100%;aspect-ratio:1100/619;border-radius:24px}.post-main{display:grid;grid-template-columns:minmax(0,1fr) 260px;align-items:start;column-gap:72px;max-width:1180px;margin:0 auto;padding:64px var(--gutter) 96px}.article{width:100%;min-width:0}.toc-col{align-self:stretch}.toc{position:sticky;top:104px;display:flex;flex-direction:column;gap:12px}.toc ul{list-style:none;margin:0;padding:0;border-left:1px solid var(--line)}.toc li a{display:block;padding:8px 0 8px 16px;margin-left:-1px;border-left:2px solid transparent;font-size:14.5px;line-height:1.4;color:var(--mute)}.toc li.is-h3 a{padding:6px 0 6px 30px;font-size:13.5px;color:var(--ghost)}.toc li.is-active a{border-left-color:var(--blue-rule);color:var(--ink);font-weight:600}.toc li a:hover{color:var(--ink)}.tldr{display:flex;flex-direction:column;gap:12px;padding:28px;margin-bottom:30px;background:#fff;border:1px solid var(--line-soft);border-radius:24px}.tldr .overline{letter-spacing:.12em}.tldr-point{display:flex;gap:12px;align-items:flex-start}.tldr-point p{font-size:16.5px;line-height:1.55;color:var(--ink)}.check{flex:none;width:20px;height:20px;margin-top:3px;border-radius:50%;background:var(--good-bg);color:var(--good);display:grid;place-items:center}.prose{font-size:18px;line-height:1.75;color:var(--ink2)}.prose>*,.prose>div>*{margin:0 0 18px}.prose h2{font-size:30px;line-height:1.18;letter-spacing:-.03em;margin:30px 0 16px}.prose h2,.prose h3{scroll-margin-top:104px}.prose h3{font-size:24px;line-height:1.2;margin:26px 0 14px}.prose h3,.prose h4{letter-spacing:-.02em}.prose h4{font-size:20px;line-height:1.25;margin:14px 0 12px}.prose a{color:var(--blue);font-weight:600}.prose a:hover{text-decoration:underline}.prose ol,.prose ul{padding-left:24px}.prose li{margin-bottom:6px}.prose hr{border:0;border-top:1px solid var(--line);margin:36px 0}.prose img{border-radius:24px;height:auto}.prose blockquote{margin:12px 0 30px;padding-left:24px;border-left:3px solid var(--blue-rule);font-size:30px;font-weight:700;line-height:1.18;letter-spacing:-.03em;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.prose pre{background:#fff;border:1px solid var(--line);border-radius:18px;padding:16px 20px;overflow-x:auto;font-size:14px;line-height:1.6}.prose pre code{background:none;padding:0;font-size:inherit}.prose code{font-family:var(--mono);font-size:.85em;background:var(--chip);padding:2px 7px;border-radius:8px}.table-card{overflow-x:auto;background:#fff;border:1px solid var(--line);border-radius:18px;margin:12px 0 28px}.prose table{width:100%;border-collapse:collapse;font-size:15px;line-height:1.5}.prose td,.prose th{text-align:left;padding:13px 20px;border-top:1px solid var(--chip);vertical-align:top}.prose tr:first-child td,.prose tr:first-child th{border-top:0}.prose th{background:var(--paper);font-family:var(--mono);font-weight:500;font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--mute)}.prose td:first-child{font-weight:600;color:var(--ink)}.prose td p,.prose th p{margin:0}.admonition{display:flex;gap:14px;align-items:flex-start;padding:18px 22px 18px 18px;border:1px solid;border-radius:18px;margin:12px 0 28px}.admonition-icon{flex:none;width:32px;height:32px;border-radius:10px;background:#fff;display:grid;place-items:center}.admonition-label{font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.1em;text-transform:uppercase;line-height:1.5;margin:0 0 4px}.admonition-body{font-size:16px;line-height:1.55;color:var(--ink2)}.admonition-body>*{margin:0 0 8px}.admonition-body>:last-child{margin-bottom:0}.admonition-info{background:var(--blue-soft);border-color:rgba(10,111,230,.14);color:var(--blue)}.admonition-tip{background:var(--good-bg);border-color:rgba(14,122,63,.14);color:var(--good)}.admonition-warning{background:var(--warn-bg);border-color:rgba(161,92,7,.14);color:var(--warn)}.admonition-danger{background:var(--bad-bg);border-color:rgba(180,35,24,.14);color:var(--bad)}.admonition-note{background:var(--chip);border-color:var(--line);color:var(--ink)}.method-box{display:flex;gap:1px;margin-top:36px;border-radius:24px;overflow:hidden;background:var(--line)}.method-box>div{flex:1 1;display:flex;flex-direction:column;gap:6px;padding:18px 20px;background:#fff}.method-box p:last-child{font-size:15px;line-height:1.5}.post-footer{display:flex;flex-direction:column;gap:18px;margin-top:32px;padding-top:24px;border-top:1px solid var(--line)}.tags{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.tag{padding:6px 12px;border-radius:999px;background:#fff;border:1px solid var(--line);font-weight:600;font-size:13px;color:var(--ink2)}.edit-link{display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:14.5px;color:var(--blue)}.post-paginator{display:flex;gap:12px;margin-top:32px}.post-paginator>*{flex:1 1;min-width:0}.post-paginator a{display:flex;flex-direction:column;gap:8px;padding:20px 22px;background:#fff;border:1px solid var(--line);border-radius:18px}.post-paginator a .overline{display:flex;align-items:center;gap:6px;font-size:11.5px;letter-spacing:.1em}.post-paginator a.is-older{align-items:flex-end;text-align:right}.post-paginator strong{font-size:17px;line-height:1.3;letter-spacing:-.01em;color:var(--ink);transition:color .2s}.related{background:rgba(255,255,255,.6);border-top:1px solid var(--line);padding:96px 0 120px}.related h2{font-size:clamp(30px,4vw,40px);line-height:1.1;letter-spacing:-.035em;margin-bottom:36px}.related .card{background:transparent;border:0;border-radius:0;gap:16px;overflow:visible}.related .card .cover{border-radius:24px}.related .card-body{padding:0;gap:16px}.related .card h3{font-size:19px;line-height:1.3;letter-spacing:-.02em}.related .card-body p{display:none}@media (max-width:1099px){.toc-col{display:none}.post-main{grid-template-columns:minmax(0,1fr)}}@media (max-width:899px){.grid{grid-template-columns:repeat(2,minmax(0,1fr))}.featured{flex-direction:column;min-height:0}.featured .cover{flex:none;aspect-ratio:16/10}.featured-body{padding:28px}}@media (max-width:599px){body{font-size:16px}.list-header{padding-top:48px;gap:16px}.lede,.post-lede{font-size:17px}.grid{grid-template-columns:1fr}.featured-body{padding:22px}.featured-body h2{font-size:26px}.post-header{padding-top:40px;gap:32px}.post-cover{border-radius:18px;aspect-ratio:4/3}.post-main{padding-top:40px;padding-bottom:64px}.prose{font-size:17px}.prose h2{font-size:26px}.prose blockquote{font-size:24px}.tldr{padding:22px}.method-box,.post-paginator{flex-direction:column}.post-paginator a.is-older{align-items:flex-start;text-align:left}.related{padding:64px 0 80px}.list-end{padding-bottom:80px}}.preview-banner{position:sticky;top:88px;z-index:40;width:max-content;max-width:calc(100% - 2 * var(--gutter));margin:12px auto 0;padding:8px 16px;border-radius:999px;background:var(--warn-bg);border:1px solid rgba(161,92,7,.2);color:var(--warn);font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.04em;text-align:center}#bottom,.hdr{--paper:#f5f6fa;--white:#ffffff;--ink:#0b1220;--ink2:#3a4256;--line:rgba(11,18,32,0.08);--line2:rgba(11,18,32,0.05);--blue:#0b7cff}.wrap{max-width:1180px;margin:0 auto;padding-inline:var(--gutter)}.btn{display:inline-flex;align-items:center;gap:8px;height:48px;padding:0 22px;border-radius:999px;font-weight:600;font-size:15.5px;border:1px solid transparent;cursor:pointer;transition:background .2s,border-color .2s,transform .2s;font-family:var(--sans);white-space:nowrap}.btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.btn.primary{background:#0a6fe6;color:var(--white,#fff);box-shadow:0 8px 22px rgba(10,111,230,.28)}.btn.primary:hover{background:#0960cc}.btn.secondary{background:var(--white,#fff);color:var(--ink);border-color:var(--line)}.btn.secondary:hover{background:var(--paper)}.hdr{position:sticky;top:env(safe-area-inset-top,0);z-index:50;background:rgba(245,246,250,.86);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid transparent;transition:border-color .2s}.hdr.scrolled{border-bottom-color:var(--line)}.hdr .wrap{display:flex;align-items:center;justify-content:space-between;height:72px;gap:20px}.hdr .logo img{width:140px;height:auto;display:block}.hdr nav{display:flex;gap:28px;font-size:15px;font-weight:500;color:var(--ink2)}.hdr nav a:hover{color:var(--ink)}.hdr .btn{height:42px;padding:0 18px;font-size:14.5px}.hdr .actions{display:flex;align-items:center;gap:10px}.hdr .login{border-color:rgba(11,18,32,.16)}.hdr .menu,.hdr nav .nav-login{display:none}.hdr .menu{flex:none;width:42px;height:42px;padding:0;border:1px solid var(--line);border-radius:50%;background:var(--white);color:var(--ink);cursor:pointer;place-items:center}.hdr .menu svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round}.hdr .menu path{transition:transform .2s,opacity .2s;transform-origin:12px 12px}.hdr.open .menu .l1{transform:translateY(5px) rotate(45deg)}.hdr.open .menu .l2{opacity:0}.hdr.open .menu .l3{transform:translateY(-5px) rotate(-45deg)}@media (max-width:960px){.hdr .wrap{justify-content:flex-start}.hdr .actions{margin-left:auto}.hdr .menu{display:grid}.hdr .login{display:none}.hdr nav .nav-login{display:block}.hdr nav{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;gap:0;padding:8px var(--gutter) 16px;background:var(--paper);border-bottom:1px solid var(--line);box-shadow:0 16px 30px rgba(11,18,32,.08);font-size:17px}.hdr.open nav{display:flex}.hdr nav a{padding:12px 0;border-bottom:1px solid var(--line2)}.hdr nav a:last-child{border-bottom:0}}@media (max-width:480px){.hdr .wrap{gap:12px}.hdr .logo{flex:0 1 auto;min-width:0}.hdr .logo img{width:clamp(112px,36vw,140px)}.hdr .btn{flex:none;height:40px;gap:6px;padding-inline:12px;font-size:13px}.hdr .btn svg{width:14px;height:14px}}@media (max-width:360px){.hdr .wrap{height:64px;gap:8px}.hdr .logo img{width:108px}.hdr .btn{padding-inline:9px;font-size:12.5px}}.hdr nav{gap:clamp(16px,2.2vw,28px)}.hdr nav a{white-space:nowrap}.hdr .actions{flex:none}#bottom{margin-top:24px;padding-block:56px 40px;color:#fff;background:#070b16;border-radius:36px 36px 0 0;position:relative;overflow:hidden;background-image:radial-gradient(1100px 760px at 85% 8%,rgba(122,59,255,.3),transparent 62%),radial-gradient(1100px 820px at 10% 100%,rgba(11,124,255,.26),transparent 60%)}#bottom .wrap{position:relative;z-index:1;display:grid;grid-template-columns:1.1fr 2fr;gap:40px;align-items:start}#bottom img{width:128px;height:auto;display:block}#bottom img.lockup{width:180px}#bottom .tag{color:rgba(255,255,255,.62);margin-top:14px;font-size:15px;max-width:30ch}#bottom .cols{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}#bottom .cols h4{margin:0 0 12px;font-size:13px;font-weight:600;color:#fff}#bottom .cols a,#bottom .cols span{display:block;font-size:14.5px;color:rgba(255,255,255,.62);padding:4px 0}#bottom .cols a:hover{color:#fff}#bottom .legal{display:flex;flex-wrap:wrap;gap:8px 28px;padding-top:28px;border-top:1px solid rgba(255,255,255,.1);font-size:13px}#bottom .company,#bottom .legal{grid-column:1/-1;color:rgba(255,255,255,.45)}#bottom .company{margin:-28px 0 0;font-size:12.5px;line-height:1.6}@media (max-width:760px){#bottom .wrap{grid-template-columns:1fr}#bottom .cols{grid-template-columns:1fr 1fr}}#bottom a{color:inherit}#bottom a,.hdr a{text-decoration:none}.hdr nav a[aria-current=page]{color:var(--ink);font-weight:600}