@import url("https://fonts.googleapis.com/css2?family=Tilt+Warp&family=Pixelify+Sans:wght@400;500;600&display=swap");:root{--paper:#fbf8f1;--paper-2:#ffffff;--ink:#141414;--ink-68:rgba(20,20,20,0.68);--ink-40:rgba(20,20,20,0.40);--line:rgba(20,20,20,0.15);--blue:#2162c1;--orange:#f76c3f;--disp:"Tilt Warp","Helvetica Neue",Helvetica,Arial,sans-serif;--grotesk:"Helvetica Neue",Helvetica,Arial,sans-serif;--pixel:"Pixelify Sans",ui-monospace,monospace;--maxw:820px;--ease:cubic-bezier(0.16,1,0.3,1)}*{box-sizing:border-box}body,html{margin:0;padding:0}body{background-color:var(--paper);color:var(--ink);font-family:var(--grotesk);font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased;background-image:linear-gradient(90deg,rgba(20,20,20,.045) 1px,transparent 0),linear-gradient(180deg,rgba(20,20,20,.045) 1px,transparent 0);background-size:42px 42px}a{color:var(--blue);text-decoration:none}a:hover{text-decoration:underline}.nav{position:-webkit-sticky;position:sticky;top:0;z-index:50;background:var(--paper);border-bottom:1px solid var(--line)}.nav-in{max-width:1120px;margin:0 auto;padding:.8rem clamp(20px,5vw,48px);display:flex;align-items:center;justify-content:space-between;gap:1rem}.nav-mark{font-family:var(--disp);font-size:1.12rem;color:var(--ink);letter-spacing:-.01em}.nav-mark b{color:var(--blue)}.nav-mark:hover{text-decoration:none}.nav-right{display:flex;align-items:center;gap:clamp(16px,4vw,28px)}.nav-link{font-weight:600;font-size:.95rem;color:var(--ink);opacity:.72}.nav-link:hover{opacity:1;color:var(--blue);text-decoration:none}.nav-login{opacity:.5}.nav-login:hover{opacity:1}@media (max-width:520px){.nav-login{display:none}}.wrap{max-width:var(--maxw);margin:0 auto;padding:clamp(2.5rem,6vw,4.5rem) clamp(20px,5vw,32px)}.wrap-wide{max-width:1120px}.page-kicker{font-family:var(--pixel);font-size:.82rem;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-68);margin:0 0 .8rem}.page-title{font-family:var(--disp);font-weight:400;letter-spacing:-.02em;line-height:1.02;font-size:clamp(2.2rem,5vw,3.4rem);margin:0 0 2.5rem}.postlist{list-style:none;margin:0;padding:0}.postlist li{border-top:1px solid var(--line)}.postlist li:last-child{border-bottom:1px solid var(--line)}.post-item{display:block;padding:clamp(1.5rem,3vw,2.2rem) 0}.post-item:hover{text-decoration:none}.post-item:hover .post-item-title{color:var(--blue)}.post-item-meta{font-family:var(--pixel);font-size:.76rem;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-68)}.post-item-title{font-family:var(--disp);font-weight:400;letter-spacing:-.01em;line-height:1.1;font-size:clamp(1.4rem,3vw,2rem);color:var(--ink);margin:.5rem 0 .6rem;transition:color .18s var(--ease)}.post-item-excerpt{color:var(--ink-68);margin:0;max-width:60ch}.tags{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.9rem}.tag{font-family:var(--pixel);font-size:.72rem;letter-spacing:.03em;text-transform:uppercase;color:var(--blue);border:1px solid var(--line);border-radius:999px;padding:.15rem .6rem}.empty{color:var(--ink-68);padding:2rem 0}.article-head{margin-bottom:clamp(1.8rem,4vw,2.6rem)}.article-title{font-family:var(--disp);font-weight:400;letter-spacing:-.02em;line-height:1.03;font-size:clamp(2rem,5vw,3.2rem);margin:.8rem 0}.article-meta{font-family:var(--pixel);font-size:.8rem;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-68)}.article-cover{width:100%;border-radius:12px;border:1px solid var(--line);margin:1.5rem 0 0}.back{font-family:var(--pixel);font-size:.8rem;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-68)}.prose{font-size:1.08rem;line-height:1.7;color:var(--ink)}.prose>:first-child{margin-top:0}.prose h2{font-family:var(--disp);font-weight:400;font-size:1.7rem;margin:2.2rem 0 .8rem}.prose h2,.prose h3{letter-spacing:-.01em}.prose h3{font-family:var(--grotesk);font-weight:700;font-size:1.3rem;margin:1.8rem 0 .6rem}.prose p{margin:0 0 1.2rem}.prose a{color:var(--blue);text-decoration:underline;text-underline-offset:2px}.prose ol,.prose ul{margin:0 0 1.2rem;padding-left:1.4rem}.prose li{margin:.3rem 0}.prose blockquote{margin:1.4rem 0;padding:.4rem 0 .4rem 1.2rem;border-left:3px solid var(--orange);color:var(--ink-68)}.prose img{max-width:100%;border-radius:10px;border:1px solid var(--line)}.prose hr{border:none;border-top:1px solid var(--line);margin:2rem 0}.prose code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;background:rgba(20,20,20,.06);padding:.1em .35em;border-radius:4px}.prose pre{margin:1.4rem 0;padding:1.1rem 1.2rem;border-radius:12px;background:#0f1115;border:1px solid var(--line)}.prose pre code{background:none;padding:0;font-size:.86rem;line-height:1.6}.prose table{width:100%;margin:1.4rem 0;font-size:.95rem}.prose td,.prose th{border:1px solid var(--line);padding:.5rem .7rem;text-align:left}.btn{display:inline-flex;align-items:center;gap:.4em;font-family:var(--grotesk);font-weight:600;font-size:.95rem;line-height:1;cursor:pointer;border-radius:999px;padding:.7em 1.3em;border:1.5px solid var(--ink);color:var(--ink);background:transparent;transition:background .18s var(--ease),color .18s var(--ease),transform .1s var(--ease)}.btn,.btn:hover{text-decoration:none}.btn:hover{background:var(--ink);color:var(--paper)}.btn:active{transform:translateY(1px)}.btn-fill{background:var(--ink);color:var(--paper)}.btn-fill:hover{background:var(--blue);border-color:var(--blue)}.btn-sm{padding:.5em .9em;font-size:.85rem}.btn-danger{border-color:var(--orange);color:var(--orange)}.btn-danger:hover{background:var(--orange);color:#fff;border-color:var(--orange)}.btn-ghost{border-color:var(--line);color:var(--ink-68)}.btn-ghost:hover{background:rgba(20,20,20,.05);color:var(--ink);border-color:var(--line)}.field{display:block;margin:0 0 1.2rem}.field label{display:block;font-family:var(--pixel);font-size:.78rem;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-68);margin:0 0 .4rem}.field input,.field select,.field textarea{width:100%;font-family:var(--grotesk);font-size:1rem;color:var(--ink);background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:.65rem .8rem}.field textarea{min-height:340px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9rem;line-height:1.6;resize:vertical}.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--blue);outline-offset:-1px;border-color:var(--blue)}.field-hint{font-size:.82rem;color:var(--ink-68);margin:.35rem 0 0}.row{display:flex;gap:1rem;flex-wrap:wrap}.row>.field{flex:1 1 200px}.alert{border:1px solid var(--orange);background:rgba(247,108,63,.08);color:var(--ink);border-radius:10px;padding:.7rem 1rem;margin:0 0 1.4rem;font-size:.95rem}.admin-bar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin-bottom:2rem}.admin-title{font-family:var(--disp);font-weight:400;font-size:2rem;letter-spacing:-.02em;margin:0}.admin-who{font-size:.9rem;color:var(--ink-68)}.table{width:100%;border-collapse:collapse}.table th{text-align:left;font-family:var(--pixel);font-size:.74rem;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-68);padding:.6rem .5rem}.table td,.table th{border-bottom:1px solid var(--line)}.table td{padding:.8rem .5rem;vertical-align:middle}.table td .t{font-weight:600}.pill{display:inline-block;font-family:var(--pixel);font-size:.72rem;letter-spacing:.03em;text-transform:uppercase;padding:.12rem .55rem;border-radius:999px}.pill-pub{background:rgba(33,98,193,.12);color:var(--blue)}.pill-draft{background:rgba(20,20,20,.08);color:var(--ink-68)}.actions{display:flex;gap:.4rem;flex-wrap:wrap}.inline-form{display:inline}.login-wrap{max-width:380px;margin:0 auto;padding:clamp(3rem,10vw,6rem) 20px}.login-card{background:var(--paper-2);border:1px solid var(--line);border-radius:16px;padding:2rem;box-shadow:0 6px 30px rgba(20,20,20,.05)}@media (max-width:640px){.table thead{display:none}.table,.table tbody,.table td,.table tr{display:block;width:100%}.table tr{border-bottom:1px solid var(--line);padding:.6rem 0}.table td{border:none;padding:.2rem 0}}.ed-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin:0 0 .4rem}.ed-head label{margin:0}.ed-modes{display:inline-flex;gap:2px;padding:2px;border:1px solid var(--line);border-radius:999px;background:var(--paper-2)}.ed-mode{font-family:var(--grotesk);font-size:.78rem;font-weight:600;line-height:1;cursor:pointer;border:0;background:transparent;color:var(--ink-68);padding:.45em .9em;border-radius:999px;transition:background .18s var(--ease),color .18s var(--ease)}.ed-mode:hover{color:var(--ink)}.ed-mode[data-on=true]{background:var(--ink);color:var(--paper)}.ed-mode:focus-visible{outline:2px solid var(--blue);outline-offset:2px}.ed{border:1px solid var(--line);border-radius:10px;background:var(--paper-2);overflow:hidden}.ed:focus-within{border-color:var(--blue);box-shadow:inset 0 0 0 1px var(--blue)}.tb{gap:.5rem;padding:.4rem .5rem;border-bottom:1px solid var(--line);background:var(--paper);overflow-x:auto;scrollbar-width:thin}.tb,.tb-group{display:flex;align-items:center}.tb-group{gap:2px;padding-right:.5rem;border-right:1px solid var(--line)}.tb-group:last-child{border-right:0;padding-right:0}.tb-end{margin-left:auto;padding-left:.5rem}.tb-btn{min-width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;padding:0 .45em;font-family:var(--grotesk);font-size:.85rem;line-height:1;cursor:pointer;color:var(--ink-68);background:transparent;border:0;border-radius:7px;transition:background .15s var(--ease),color .15s var(--ease)}.tb-btn:hover:not(:disabled){background:rgba(20,20,20,.06);color:var(--ink)}.tb-btn:active:not(:disabled){transform:translateY(1px)}.tb-btn[data-active]{background:var(--ink);color:var(--paper)}.tb-btn:disabled{opacity:.3;cursor:default}.tb-btn:focus-visible{outline:2px solid var(--blue);outline-offset:1px}.ed-body .tiptap{min-height:340px;max-height:60vh;overflow-y:auto;padding:1.4rem 1.5rem;font-family:var(--grotesk);font-size:1.02rem;line-height:1.7;color:var(--ink);outline:none}.ed-body .tiptap>*+*{margin-top:.9em}.ed-body .tiptap h1,.ed-body .tiptap h2,.ed-body .tiptap h3{font-family:var(--disp);font-weight:400;letter-spacing:-.02em;line-height:1.2;margin-top:1.6em}.ed-body .tiptap h1{font-size:1.7rem}.ed-body .tiptap h2{font-size:1.4rem}.ed-body .tiptap h3{font-size:1.15rem}.ed-body .tiptap ol,.ed-body .tiptap ul{padding-left:1.4em}.ed-body .tiptap li+li{margin-top:.3em}.ed-body .tiptap blockquote{border-left:3px solid var(--blue);padding-left:1em;color:var(--ink-68)}.ed-body .tiptap a{color:var(--blue);text-decoration:underline;text-underline-offset:2px}.ed-body .tiptap code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88em;background:rgba(20,20,20,.06);padding:.15em .4em;border-radius:4px}.ed-body .tiptap pre{background:#141414;color:#fbf8f1;border-radius:8px;padding:1rem 1.1rem;overflow-x:auto}.ed-body .tiptap pre code{background:none;padding:0;font-size:.85rem;color:inherit}.ed-body .tiptap hr{border:0;border-top:1px solid var(--line);margin:1.6em 0}.ed-body .tiptap img{max-width:100%;height:auto;border-radius:8px;display:block}.ed-body .tiptap p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;height:0;pointer-events:none;color:var(--ink-40)}.ed-source{display:block;width:100%;min-height:380px;max-height:60vh;padding:1.2rem 1.3rem;border:1px solid var(--line);border-radius:10px;background:var(--paper-2);color:var(--ink);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9rem;line-height:1.6;resize:vertical}.ed-source:focus{outline:2px solid var(--blue);outline-offset:-1px;border-color:var(--blue)}.ed-foot{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin:.5rem 0 0;font-size:.82rem;color:var(--ink-68)}.ed-foot-right{display:inline-flex;align-items:center;gap:.6rem}.ed-upload{cursor:pointer;text-decoration:underline;text-underline-offset:2px}.ed-upload:hover{color:var(--ink)}.ed-upload input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.ed-upload:focus-within{outline:2px solid var(--blue);outline-offset:2px;border-radius:3px}.ed-loaded{font-family:var(--pixel);font-size:.75rem}@media (max-width:560px){.ed-head{flex-direction:column;align-items:flex-start;gap:.5rem}.ed-body .tiptap{padding:1.1rem 1rem}}:root{--x-ease:cubic-bezier(0.16,1,0.3,1);--x-rise:14px;--x-blur:4px;--x-stagger:70ms;--dur-reveal:500ms}.js .xr{opacity:0;transform:translateY(var(--x-rise));filter:blur(var(--x-blur));transition:opacity var(--dur-reveal) var(--x-ease),transform var(--dur-reveal) var(--x-ease),filter var(--dur-reveal) var(--x-ease);transition-delay:calc(var(--x-stagger) * var(--i, 0));will-change:transform,opacity,filter}.js .xr.is-in{opacity:1;transform:none;filter:blur(0)}.js .xr-stagger>*{opacity:0;transform:translateY(var(--x-rise));filter:blur(var(--x-blur));transition:opacity var(--dur-reveal) var(--x-ease),transform var(--dur-reveal) var(--x-ease),filter var(--dur-reveal) var(--x-ease);will-change:transform,opacity,filter}.js .xr-stagger.is-in>*{opacity:1;transform:none;filter:blur(0)}.js .xr-stagger.is-in>:nth-child(2){transition-delay:calc(var(--x-stagger))}.js .xr-stagger.is-in>:nth-child(3){transition-delay:calc(var(--x-stagger) * 2)}.js .xr-stagger.is-in>:nth-child(4){transition-delay:calc(var(--x-stagger) * 3)}.js .xr-stagger.is-in>:nth-child(5){transition-delay:calc(var(--x-stagger) * 4)}.js .xr-stagger.is-in>:nth-child(6){transition-delay:calc(var(--x-stagger) * 5)}.js .xr-stagger.is-in>:nth-child(7){transition-delay:calc(var(--x-stagger) * 6)}.js .xr-stagger.is-in>:nth-child(8){transition-delay:calc(var(--x-stagger) * 7)}@media (prefers-reduced-motion:reduce){.js .xr,.js .xr-stagger>*{opacity:1!important;transform:none!important;filter:none!important;transition:none!important}}body,html{overflow-x:clip}.article-title,.page-title,.post-item-title,.prose h2,.prose h3{overflow-wrap:anywhere;min-width:0}.prose pre{-webkit-overflow-scrolling:touch}.prose pre,.prose table{overflow-x:auto;max-width:100%}.prose table{display:block;border-collapse:collapse}.article-cover,.prose img{max-width:100%;height:auto}.nav-right .nav-link{display:inline-flex;align-items:center;min-height:44px;padding-inline:2px}.nav-right .btn{min-height:44px}@media (max-width:520px){.nav-right .nav-login{display:none}}.nav-in{padding-block:.35rem}.back{display:inline-flex;align-items:center;min-height:44px;padding-right:.5rem}@media (max-width:560px){.nav-right{gap:12px;flex-wrap:nowrap}.nav-in{gap:8px;padding-inline:16px}.nav-right .btn{font-size:.86rem;padding:.55em .95em;white-space:nowrap}.nav-mark img{height:18px}.wrap{padding-inline:22px}.prose{font-size:1.02rem}.prose h2{font-size:1.42rem}.prose h3{font-size:1.18rem}.prose blockquote{padding-left:.9rem;margin-inline:0}.tags{flex-wrap:wrap}}@media (max-width:380px){.nav-right .nav-link[href="/blog"][target],.nav-right .nav-link[href="/general"]{display:none}}@media (max-width:340px){.nav-mark img{height:16px}.nav-right{gap:10px}.nav-in{gap:6px}}.pill-sched{background:rgba(247,108,63,.14);color:var(--orange)}.sched-when{font-family:var(--pixel);font-size:.76rem;color:var(--orange)}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}
/*!
  Theme: GitHub Dark
  Description: Dark theme as seen on github.com
  Author: github.com
  Maintainer: @Hirse
  Updated: 2021-05-15

  Outdated base version: https://github.com/primer/github-syntax-dark
  Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}