@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/jetbrains-mono.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#0e100f;--fg:#c9d1c5;--dim:#7b857a;--line:#2a2f2a;--accent:#9ece6a;--font:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, "PingFang SC", monospace;--width:1120px;--gutter:24px}:root[data-theme=amber]{--bg:#110c05;--fg:#eab563;--dim:#9f7a41;--line:#3a2d19;--accent:#ffb000}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;scroll-padding-top:72px}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body{background:var(--bg);color:var(--fg);font-family:var(--font);-webkit-font-smoothing:antialiased;font-size:15px;line-height:1.75;overflow-x:clip}::selection{background:var(--accent);color:var(--bg)}a{color:inherit;text-decoration:none}a:focus-visible{outline:1px dashed var(--accent);outline-offset:3px}ul,ol{list-style:none}.top{z-index:10;max-width:calc(var(--width) + var(--gutter) * 2);padding:18px var(--gutter);background:var(--bg);justify-content:space-between;align-items:center;margin:0 auto;display:flex;position:sticky;top:0}.logo{font-weight:700}.logo:before{content:"> ";color:var(--accent)}.top nav{align-items:center;gap:1.5ch;display:flex}.top nav a{color:var(--dim);padding:0 .5ch}.top nav a:before{content:"[";margin-right:.5ch}.top nav a:after{content:"]";margin-left:.5ch}.top nav a:hover,.top nav a.active{color:var(--fg)}.top nav a.active:before,.top nav a.active:after{color:var(--accent)}.logo,.top nav a{white-space:nowrap}.menu{display:contents}.menu-toggle{display:none}@media (width<=720px){.js .menu-toggle{width:44px;height:44px;color:var(--fg);cursor:pointer;background:0 0;border:0;margin:-12px -12px -12px 0;display:block;position:relative}.js .menu-toggle:focus-visible{outline:1px dashed var(--accent);outline-offset:-6px}.menu-toggle span,.menu-toggle span:before,.menu-toggle span:after{background:currentColor;width:18px;height:2px;transition:transform .2s,background-color .2s;position:absolute;left:13px}.menu-toggle span{top:21px}.menu-toggle span:before,.menu-toggle span:after{content:"";left:0}.menu-toggle span:before{transform:translateY(-6px)}.menu-toggle span:after{transform:translateY(6px)}.menu-open .menu-toggle span{background-color:#0000}.menu-open .menu-toggle span:before{transform:rotate(45deg)}.menu-open .menu-toggle span:after{transform:rotate(-45deg)}.js .top nav .lang{order:-1}.js .menu{padding:4px var(--gutter) 12px;background:var(--bg);border-bottom:1px dashed var(--line);counter-reset:menu;visibility:hidden;opacity:0;transition:opacity .2s,transform .2s,visibility 0s .2s;display:block;position:absolute;top:100%;left:0;right:0;transform:translateY(-6px)}.menu-open .menu{visibility:visible;opacity:1;transition:opacity .2s,transform .2s;transform:none}.js .top .menu a{counter-increment:menu;padding:10px 0;display:block}.js .top .menu a:before{content:counter(menu, decimal-leading-zero);color:var(--accent);margin-right:2ch}.js .top .menu a:after{content:none}}@media (width<=720px) and (prefers-reduced-motion:reduce){.menu-toggle span,.menu-toggle span:before,.menu-toggle span:after,.js .menu{transition:none}}main,footer{max-width:calc(var(--width) + var(--gutter) * 2);padding:0 var(--gutter);margin:0 auto}section{padding:56px 0}.hero{padding:8px 0 40px}.ascii{cursor:crosshair;touch-action:pan-y;height:min(58vh,520px);min-height:240px;margin-inline:calc(50% - 50vw)}.ascii canvas{display:block}.tagline{font-size:inherit;color:var(--dim);font-weight:400}.tagline:before{content:"$ ";color:var(--accent)}.caret{color:var(--accent);animation:1.1s step-end infinite blink}@keyframes blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.caret{animation:none}}.rule{white-space:nowrap;gap:1.5ch;margin-bottom:28px;font-size:15px;font-weight:700;display:flex;overflow:hidden}.rule .num{color:var(--accent)}.rule:after{content:"────────────────────────────────────────────────────────────────────────────────────────────────────────";color:var(--line);font-weight:400;overflow:hidden}section p{max-width:62ch}section p+p{margin-top:1em}.about{grid-template-columns:minmax(0,62ch) minmax(0,1fr);gap:32px 8ch;display:grid}.sub{font-size:inherit;color:var(--dim);font-weight:400}.now li:before{content:"- ";color:var(--dim)}.works{border-top:1px dashed var(--line)}.works a{border-bottom:1px dashed var(--line);grid-template-columns:4ch 14ch 1fr auto;gap:2ch;padding:14px 1ch;display:grid}.works .idx,.works .year{color:var(--dim)}.works .name{font-weight:700}.works a:hover,.works a:focus-visible{background:var(--accent);color:var(--bg);outline:none}.works a:hover span,.works a:focus-visible span{color:inherit}.preview{z-index:20;pointer-events:none;background:var(--bg);border:1px solid var(--line);opacity:0;transition:opacity .15s;position:fixed;top:0;left:0}.preview.visible{opacity:1}.preview-label{border-bottom:1px solid var(--line);color:var(--dim);padding:4px 8px;font-size:12px}.preview-canvas canvas{display:block}.preview.inline{width:max-content;max-width:100%;margin:0 1ch 14px;display:none;position:static;overflow:hidden}.works li.open .preview.inline{display:block}.preview.inline canvas{width:100%!important;height:auto!important}.works li.open>a .year:after{content:var(--open-hint)}:root{--open-hint:" tap again to open"}:root[lang=zh-CN]{--open-hint:" 再点一次打开"}.top nav a.lang{padding:0}.top nav a.lang:before,.top nav a.lang:after{content:none}.lang span[aria-current=true]{color:var(--accent)}.copied{color:var(--accent);margin-left:2ch}.contact{grid-template-columns:max-content 1fr;gap:8px 4ch;display:grid}.contact dt{color:var(--dim)}.contact a{border-bottom:1px dashed var(--dim)}.contact a:hover{color:var(--accent);border-color:var(--accent)}footer{color:var(--dim);justify-content:space-between;padding-top:40px;padding-bottom:48px;font-size:13px;display:flex}footer a:hover{color:var(--fg)}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (width<=900px){.about{grid-template-columns:1fr}}@media (width<=640px){:root{--gutter:16px}body{font-size:14px}.top nav{gap:.5ch}.top nav a:before,.top nav a:after{margin:0}.works a{grid-template-columns:4ch 1fr auto;row-gap:2px}.works .desc{color:var(--dim);grid-area:2/2/auto/-1}.contact{column-gap:2ch}.top nav a:before,.top nav a:after{content:none}}.status{border-top:1px dashed var(--line);grid-template-columns:max-content 1fr;column-gap:2ch;margin-top:20px;padding-top:16px;display:grid}.status dt{color:var(--dim)}.mrr .fill{color:var(--accent)}.mrr .empty{color:var(--line)}.clock .colon{animation:2s step-end infinite blink}.clock .dot{color:var(--accent);animation:2.4s ease-in-out infinite pulse}.clock .state{color:var(--dim)}@keyframes pulse{50%{opacity:.25}}.reveal .rule:after{clip-path:inset(0 100% 0 0);transition:clip-path 1s cubic-bezier(.2,.7,.2,1) .1s}.reveal section.in .rule:after{clip-path:inset(0)}.reveal section:not(.hero)>:not(.rule,.preview),.reveal .works li{opacity:0;transition:opacity .6s .2s,transform .6s cubic-bezier(.2,.7,.2,1) .2s;transform:translateY(14px)}.reveal .works li{transition-delay:calc(.3s + var(--i,0) * 80ms);transform:translate(-12px)}.reveal section.in>:not(.rule,.preview),.reveal section.in .works li{opacity:1;transform:none}:root:not(.no-crt) body{text-shadow:0 0 .4em color-mix(in srgb, currentColor 30%, transparent)}:root:not(.no-crt) body:after,:root:not(.no-crt) body:before{content:"";z-index:100;pointer-events:none;position:fixed;inset:0}:root:not(.no-crt) body:after{background:radial-gradient(#0000 55%,#0006 100%),repeating-linear-gradient(#0003 0 1px,#0000 1px 3px);animation:7s step-end infinite flicker}:root:not(.no-crt) body:before{background:linear-gradient(#0000,#ffffff06,#0000);height:18vh;animation:9s linear infinite roll;bottom:auto}@keyframes flicker{0%,to{opacity:1}41%{opacity:.82}42%{opacity:1}88%{opacity:.9}89%{opacity:1}}@keyframes roll{0%{transform:translateY(-20vh)}to{transform:translateY(100vh)}}@media (prefers-reduced-motion:reduce){:root:not(.no-crt) body:after,:root:not(.no-crt) body:before,.clock .colon,.clock .dot{animation:none}}.crt-toggle{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0}.crt-toggle:hover{color:var(--fg)}.crt-toggle[aria-pressed=true] span{color:var(--accent)}.crt-toggle:focus-visible{outline:1px dashed var(--accent);outline-offset:3px}.toast{right:var(--gutter);bottom:calc(24px + env(safe-area-inset-bottom,0px));z-index:90;background:var(--bg);border:1px solid var(--accent);color:var(--accent);opacity:0;pointer-events:none;padding:6px 12px;transition:opacity .2s,transform .2s;position:fixed;transform:translateY(8px)}.toast.show{opacity:1;transform:none}.egg-matrix{z-index:95;pointer-events:none;width:100vw;height:100vh;position:fixed;inset:0}.egg-ship{z-index:95;color:var(--accent);font:inherit;pointer-events:none;font-size:13px;line-height:1.15;position:fixed;top:100vh}.egg-coffee{right:var(--gutter);bottom:calc(24px + env(safe-area-inset-bottom,0px));z-index:90;background:var(--bg);border:1px solid var(--line);opacity:0;padding:10px 16px 12px;transition:opacity .25s,transform .25s;position:fixed;transform:translateY(12px)}.egg-coffee.show{opacity:1;transform:none}.egg-coffee pre{font:inherit;color:var(--fg);line-height:1.2}.egg-coffee p{color:var(--dim);margin-top:6px;font-size:12px}.crt-power-off,.crt-power-on{background:#000}.crt-power-off body,.crt-power-on body{transform-origin:50% var(--power-y,50vh)}.crt-power-off body{animation:.6s cubic-bezier(.6,0,.8,.4) forwards power-off}.crt-power-on body{animation:.6s cubic-bezier(.2,.6,.4,1) reverse power-off}@keyframes power-off{0%{filter:brightness();transform:scale(1)}55%{filter:brightness(4);transform:scaleY(.004)}to{filter:brightness(8);transform:scale(0,.004)}}@media (prefers-reduced-motion:reduce){.crt-power-off body{opacity:0;animation:none}.crt-power-on body{animation:none}}.posts{border-top:1px dashed var(--line)}.posts a{border-bottom:1px dashed var(--line);grid-template-columns:12ch 1fr;column-gap:2ch;padding:14px 1ch;display:grid}.posts time,.posts .desc{color:var(--dim)}.posts .title{font-weight:700}.posts .desc{grid-column:2}.posts a:hover,.posts a:focus-visible{background:var(--accent);color:var(--bg);outline:none}.posts a:hover span,.posts a:hover time,.posts a:focus-visible span,.posts a:focus-visible time{color:inherit}.post{max-width:72ch;margin:0 auto;padding:32px 0 24px}.back{color:var(--dim)}.back:before{content:"$ ";color:var(--accent)}.back:hover{color:var(--fg)}.post-title{margin:28px 0 10px;font-size:26px;font-weight:700;line-height:1.35}.post-meta{color:var(--dim);flex-wrap:wrap;gap:0 2ch;font-size:13px;display:flex}.post-meta>*+:before{content:"· ";margin-right:.5ch}.prose{margin-top:40px}.prose>*+*{margin-top:1.1em}.prose h2,.prose h3{font-size:inherit;margin-top:2.4em;font-weight:700}.prose h2:before{content:"## ";color:var(--accent)}.prose h3:before{content:"### ";color:var(--dim)}.prose strong{font-weight:700}.prose a{border-bottom:1px dashed var(--dim)}.prose a:hover{color:var(--accent);border-color:var(--accent)}.prose ul>li,.prose ol>li{padding-left:3ch;position:relative}.prose li+li{margin-top:.35em}.prose ul>li:before{content:"-";color:var(--dim);position:absolute;left:1ch}.prose ol{counter-reset:item}.prose ol>li:before{counter-increment:item;content:counter(item) ".";color:var(--dim);position:absolute;left:0}.prose blockquote{border-left:2px solid var(--accent);color:var(--fg);padding:2px 0 2px 2ch}.prose code{color:var(--accent);font-family:inherit}.prose pre{border:1px dashed var(--line);padding:12px 2ch;line-height:1.5;overflow-x:auto}.prose pre code{color:var(--fg)}.prose hr{border:0;border-top:1px dashed var(--line);margin:2.4em 0}.prose table{border-collapse:collapse;max-width:100%;font-size:14px;display:block;overflow-x:auto}.prose th,.prose td{border:1px dashed var(--line);text-align:left;vertical-align:top;padding:6px 1.5ch}.prose th{color:var(--dim);font-weight:400}.post-end{color:var(--dim);margin:56px 0 16px}@media (width<=640px){.posts a{grid-template-columns:1fr}.posts .desc{grid-column:1}.post-title{font-size:21px}.prose table{font-size:13px}}
