:root{--paper:#f3f0e8;--paper-2:#e9e5da;--ink:#16150f;--ink-2:#5b584d;--ink-3:#8f8b7d;--rule:#d6d1c3;--signal:#e8461e;--ok:#1f7a4d;--warn:#b07a0a;--b1:#e8461e;--b2:#2f5fd0;--b3:#1f7a4d;--b4:#9a3fb5;--mono:"IBM Plex Mono", ui-monospace, monospace;--sans:"IBM Plex Sans", system-ui, sans-serif}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--paper:#121210;--paper-2:#1b1b18;--ink:#ece8dc;--ink-2:#a9a596;--ink-3:#6f6c62;--rule:#2b2a25;--signal:#ff6a3d;--ok:#4cc38a;--warn:#e0a83a;--b1:#ff6a3d;--b2:#7c9cff;--b3:#4cc38a;--b4:#d08bf0}}:root[data-theme=dark]{--paper:#121210;--paper-2:#1b1b18;--ink:#ece8dc;--ink-2:#a9a596;--ink-3:#6f6c62;--rule:#2b2a25;--signal:#ff6a3d;--ok:#4cc38a;--warn:#e0a83a;--b1:#ff6a3d;--b2:#7c9cff;--b3:#4cc38a;--b4:#d08bf0}*{box-sizing:border-box;margin:0;padding:0}html,body{overflow-x:clip;max-width:100%}html{scroll-behavior:smooth}body{background:var(--paper);color:var(--ink);font:16px/1.6 var(--sans);padding-bottom:40px}::selection{background:var(--signal);color:var(--paper)}a{color:inherit;text-underline-offset:3px}.mono{font-family:var(--mono)}.wrap{max-width:1180px;margin:0 auto;padding:0 20px}.skip{position:absolute;left:-999px;top:8px;z-index:70;background:var(--ink);color:var(--paper);padding:6px 10px;font:13px var(--mono)}.skip:focus{left:8px}.spacer{height:48px}.sec-head h2.small{font-size:1.4rem}.touch-only{display:none}@media(hover:none),(pointer:coarse){.touch-only{display:block}}:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.top{display:flex;justify-content:space-between;align-items:center;padding:18px 0;font:13px var(--mono);color:var(--ink-2);border-bottom:1px solid var(--rule)}.top nav{display:flex;gap:18px}.top nav a{text-decoration:none}.top nav a:hover{color:var(--signal)}.top nav a span{color:var(--ink-3)}.hero{display:grid;grid-template-columns:1fr auto;gap:40px;padding:40px 0 64px;align-items:end}.hero h1{font:600 clamp(3rem,7.4vw,6.4rem)/.9 var(--sans);letter-spacing:-.045em}.hero h1 .cursor{display:inline-block;width:.08em;height:.78em;background:var(--signal);margin-left:.06em;vertical-align:-.02em;animation:blink 1.1s steps(1) infinite}@keyframes blink{50%{opacity:0}}.whoami{font:14px var(--mono);color:var(--ink-2);margin-bottom:22px}.whoami b{color:var(--signal);font-weight:500}.intro{font-size:1.15rem;max-width:34ch;margin:26px 0 30px;color:var(--ink-2)}.intro strong{color:var(--ink);font-weight:500}.facts{display:grid;grid-template-columns:repeat(3,auto);gap:6px 28px;font:13px var(--mono);justify-content:start}.facts dt{color:var(--ink-3)}.facts dd{color:var(--ink)}.photo{position:relative;width:min(46vw,calc((100svh - 170px)*.75));border:1px solid var(--ink);background:var(--paper-2);cursor:crosshair;user-select:none}.photo canvas,.photo img{display:block;width:100%;height:auto;aspect-ratio:3/4}.photo img{position:absolute;inset:0;object-fit:cover;opacity:0;transition:opacity .25s;pointer-events:none}.photo,.photo *{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.photo.dev img{opacity:1}.photo-bar{display:flex;justify-content:space-between;padding:8px 10px;border-top:1px solid var(--ink);font:12px var(--mono);color:var(--ink-2);background:var(--paper)}.photo-bar kbd{font:inherit;border:1px solid var(--rule);padding:0 5px}section{padding:72px 0;border-top:1px solid var(--rule);position:relative}.wrap,.status,.cmdline{position:relative;z-index:1}.status,.cmdline{position:fixed}.degree,.course,.targets,.list .item,.gitlog,.contact{background:var(--paper)}#binbg{position:fixed;inset:0;width:100%;height:100%;z-index:0;pointer-events:none}body.xray .wrap *{outline:1px dashed color-mix(in srgb,var(--signal) 45%,transparent);outline-offset:-1px}.xlabel{position:fixed;z-index:60;pointer-events:none;font:11px/1.4 var(--mono);background:var(--signal);color:#fff;padding:2px 6px;display:none;white-space:nowrap}body.xray .xlabel{display:block}.status button{font:inherit;color:inherit;background:none;border:0;border-left:1px solid color-mix(in srgb,var(--paper) 20%,transparent);padding:0 12px;cursor:pointer}.status button[aria-pressed=true]{background:var(--signal);color:#fff}.sec-head{display:flex;align-items:baseline;justify-content:space-between;gap:20px;flex-wrap:wrap;margin-bottom:36px}.sec-head h2{font:600 clamp(1.8rem,3.4vw,2.6rem)/1.05 var(--sans);letter-spacing:-.03em}.sec-head h2 .n{font:500 .5em var(--mono);color:var(--signal);vertical-align:.7em;margin-right:8px;letter-spacing:0}.sec-head p{font:13px var(--mono);color:var(--ink-3)}.degree{border:1px solid var(--ink)}.sem-track{display:grid;grid-template-columns:repeat(8,1fr)}.sem{border-right:1px solid var(--rule);padding:12px 12px 14px;font:12px var(--mono);position:relative;min-height:96px}.sem:last-child{border-right:0}.sem .lbl{color:var(--ink-3)}.sem .yr{font-size:15px;color:var(--ink);margin-top:2px;white-space:nowrap}@media(max-width:520px){.gitlog{font-size:12px;padding:14px}.gl-row .d{display:none}.sem{padding:10px 8px 12px;min-height:76px}.sem .yr{font-size:13px}}.sem .fill{position:absolute;left:0;bottom:0;height:6px;background:var(--signal)}.sem.now{background:var(--paper-2)}.sem.now .lbl{color:var(--signal)}.sem.future .yr{color:var(--ink-3)}.degree-foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;border-top:1px solid var(--ink);padding:10px 12px;font:13px var(--mono)}.degree-foot b{color:var(--signal);font-weight:500}.gitlog{font:14px/1.75 var(--mono);border:1px solid var(--ink);padding:20px 22px;overflow-x:auto;background:var(--paper)}.gl-row{display:flex;gap:14px;white-space:pre}.gl-row .g{flex:0 0 auto}.gl-row .h{color:var(--warn)}.gl-row .m{color:var(--ink)}.gl-row .d{color:var(--ink-3)}.gl-row .ref{color:var(--signal)}.gl-row.merge .m{font-weight:600}.c1{color:var(--b1)}.c2{color:var(--b2)}.c3{color:var(--b3)}.c4{color:var(--b4)}.gl-row.hide{display:none}.gl-tools{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}.chip{font:12px var(--mono);border:1px solid var(--rule);background:none;color:var(--ink-2);padding:5px 10px;cursor:pointer}.chip[aria-pressed=true]{border-color:var(--ink);color:var(--ink);background:var(--paper-2)}.chip i{font-style:normal}.courses{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));border-left:1px solid var(--ink);border-top:1px solid var(--ink)}.course{border-right:1px solid var(--ink);border-bottom:1px solid var(--ink);padding:18px;display:flex;flex-direction:column;gap:12px}.course .code{font:500 13px var(--mono);display:flex;justify-content:space-between}.course .code .wk{color:var(--ink-3);font-weight:400}.course h3{font:600 1.15rem/1.25 var(--sans);letter-spacing:-.01em}.bar{height:8px;border:1px solid var(--ink);position:relative}.bar span{position:absolute;inset:0 auto 0 0;background:var(--ink)}.course ul{list-style:none;font-size:14px;color:var(--ink-2);display:grid;gap:4px}.course li:before{content:"✓ ";color:var(--ok);font-family:var(--mono)}.course li.doing:before{content:"… ";color:var(--warn)}.course .stuck{font:12px var(--mono);color:var(--ink-3);border-top:1px dashed var(--rule);padding-top:10px;margin-top:auto}.targets{display:grid;grid-template-columns:repeat(3,1fr);gap:0;border:1px solid var(--ink)}.col{border-right:1px solid var(--ink)}.col:last-child{border-right:0}.col h3{font:500 12px var(--mono);text-transform:uppercase;letter-spacing:.08em;padding:10px 14px;border-bottom:1px solid var(--ink);display:flex;justify-content:space-between}.col h3 span{color:var(--ink-3)}.issue{padding:14px;border-bottom:1px solid var(--rule);font-size:15px}.issue:last-child{border-bottom:0}.issue .meta{font:12px var(--mono);color:var(--ink-3);margin-top:4px;display:flex;gap:10px;flex-wrap:wrap}.issue .lab{border:1px solid currentColor;padding:0 5px}.done .issue>p:first-child{text-decoration:line-through;text-decoration-color:var(--ink-3);color:var(--ink-2)}.list{border-top:1px solid var(--ink)}.item{display:grid;grid-template-columns:120px 1fr auto;gap:20px;padding:18px 0;border-bottom:1px solid var(--rule);align-items:baseline;text-decoration:none}.item:hover .t{color:var(--signal)}.item .y{font:13px var(--mono);color:var(--ink-3)}.item .t{font:600 1.15rem var(--sans)}.item .d{color:var(--ink-2);font-size:15px}.item .s{font:12px var(--mono);color:var(--ink-2)}.contact{display:flex;flex-wrap:wrap;gap:10px 28px;font:15px var(--mono)}.contact a{text-decoration:none;border-bottom:1px solid var(--rule)}.contact a:hover{color:var(--signal);border-color:var(--signal)}.status{position:fixed;left:0;right:0;bottom:0;z-index:50;display:flex;font:12px/28px var(--mono);background:var(--ink);color:var(--paper)}.status>span{padding:0 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status .mode{background:var(--signal);color:#fff;font-weight:600}.status .file{flex:1}.status .dim{opacity:.6}.cmdline{position:fixed;left:0;right:0;bottom:28px;z-index:49;background:var(--paper);border-top:1px solid var(--ink);font:14px var(--mono);display:none}.cmdline.open{display:block}.cmdline form{display:flex;padding:8px 12px;gap:2px}.cmdline input{flex:1;border:0;background:none;font:inherit;color:var(--ink);outline:none}.cmdline pre{padding:10px 12px 0;color:var(--ink-2);font:13px/1.6 var(--mono);white-space:pre-wrap;max-height:40vh;overflow:auto}section.flash{animation:flash .6s}@keyframes flash{0%{background:var(--paper-2)}}@media(max-width:860px){.hero{grid-template-columns:1fr;padding-top:24px}.hero .photo{order:-1;width:100%}.hero .photo canvas,.hero .photo img{aspect-ratio:16/10;object-fit:cover;object-position:50% 66%}.hero .photo img{bottom:auto;height:auto}.facts{grid-template-columns:repeat(2,auto)}.sem-track{grid-template-columns:repeat(4,1fr)}.sem:nth-child(4){border-right:0}.sem:nth-child(-n+4){border-bottom:1px solid var(--rule)}.targets{grid-template-columns:1fr}.col{border-right:0;border-bottom:1px solid var(--ink)}.col:last-child{border-bottom:0}.item{grid-template-columns:1fr;gap:2px}.top nav{display:none}.status .hint,.status .pct{display:none}}.status button{white-space:nowrap;flex:0 0 auto}.status .mode{flex:0 0 auto}@media(max-width:520px){.status .file{display:none}.status .clock{flex:1;padding:0 10px}.status>span,.status button{padding:0 9px}.photo-bar span:first-child{display:none}.photo-bar{justify-content:flex-end}}@media(prefers-reduced-motion:reduce){*{animation:none!important;scroll-behavior:auto!important}}html.opening-on{overflow:hidden}.top-wrap{position:sticky;top:0;z-index:20;background:var(--paper)}.top nav a[aria-current=true],.top nav a[aria-current=true] span{color:var(--signal)}.reveal{opacity:0;transform:translateY(18px);transition:opacity .7s cubic-bezier(.2,.8,.2,1),transform .7s cubic-bezier(.2,.8,.2,1)}.reveal.in{opacity:1;transform:none}.hero h1 .ch{display:inline-block;transition:color .2s}.hero h1 .ch.hot{color:var(--signal)}.photo.lens img{opacity:1;transition:none;-webkit-mask-image:radial-gradient(circle 90px at var(--x,50%) var(--y,50%),#000 96%,transparent 100%);mask-image:radial-gradient(circle 90px at var(--x,50%) var(--y,50%),#000 96%,transparent 100%)}.photo.dev img{opacity:1;-webkit-mask-image:none;mask-image:none}.facts dd{font-variant-numeric:tabular-nums}button.sem{cursor:pointer;text-align:left;color:inherit;background:none;border:0;border-right:1px solid var(--rule);transition:background .2s}button.sem .lbl,button.sem .yr{display:block}button.sem:hover{background:var(--paper-2)}button.sem[aria-pressed=true]{box-shadow:inset 0 0 0 2px var(--ink)}.sem-detail{border-top:1px solid var(--rule);padding:12px;font:14px/1.5 var(--sans);display:flex;gap:12px;align-items:baseline;min-height:46px}.sem-detail b{font:500 12px var(--mono);color:var(--signal);white-space:nowrap}.gitlog.typing .gl-row{opacity:0}.gitlog.typing .gl-row.shown{opacity:1;transition:opacity .12s}button.gl-row{font:inherit;color:inherit;background:none;border:0;text-align:left;cursor:pointer;width:100%}button.gl-row:hover .m{color:var(--signal)}button.gl-row .m:after{content:" +";color:var(--ink-3)}button.gl-row[aria-expanded=true] .m:after{content:" −"}.gl-diff{display:none;margin:2px 0 8px;padding:6px 12px;border-left:2px solid var(--ok);background:var(--paper-2);white-space:pre-wrap;font-size:13px}.gl-diff.open{display:block;animation:drop .25s ease-out}.gl-diff .add{color:var(--ok)}.gl-diff .del{color:var(--signal)}@keyframes drop{0%{opacity:0;transform:translateY(-4px)}}.gitlog.focus .gl-row:not(.lit){opacity:.22}.course{transition:background .2s}.course:hover{background:var(--paper-2)}.weeks{display:grid;grid-template-columns:repeat(var(--n,14),1fr);gap:3px}.weeks i{height:10px;border:1px solid var(--ink)}.weeks i.on{background:var(--ink);transform:scaleY(0);transform-origin:bottom}.in .weeks i.on{transform:none;transition:transform .3s calc(var(--i) * 45ms) cubic-bezier(.2,.8,.2,1)}.weeks i.cur{background:var(--signal);border-color:var(--signal);animation:pulse 1.6s ease-in-out infinite}@keyframes pulse{50%{opacity:.35}}.course .go{align-self:flex-start;font:12px var(--mono);color:var(--ink-2);background:none;border:0;border-bottom:1px solid var(--rule);padding:0;cursor:pointer}.course .go:hover{color:var(--signal);border-color:var(--signal)}.t-tools{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}details.issue{padding:0}details.issue summary{list-style:none;cursor:pointer;padding:14px;display:block;transition:background .2s}details.issue summary::-webkit-details-marker{display:none}details.issue summary:hover{background:var(--paper-2)}.issue .ttl{display:flex;justify-content:space-between;gap:10px}.issue .ttl:after{content:"+";font-family:var(--mono);color:var(--ink-3)}.issue[open] .ttl:after{content:"−"}.issue .mini{height:3px;background:var(--rule);margin-top:10px}.issue .mini span{display:block;height:100%;background:var(--signal);width:0;transition:width .9s cubic-bezier(.2,.8,.2,1)}.in .issue .mini span{width:var(--w)}.issue ul{list-style:none;padding:0 14px 14px;font:13px/1.8 var(--mono);color:var(--ink-2);animation:drop .25s ease-out}.issue li:before{content:"[ ] ";color:var(--ink-3)}.issue li.d:before{content:"[x] ";color:var(--ok)}.issue li.d{text-decoration:line-through;text-decoration-color:var(--ink-3)}.issue.hide{display:none}.done .issue .ttl{text-decoration:line-through;text-decoration-color:var(--ink-3);color:var(--ink-2)}.done .issue>p:first-child{text-decoration:none}details.item{display:block;padding:0}details.item summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:120px 1fr auto;gap:20px;padding:18px 0;align-items:baseline}details.item summary::-webkit-details-marker{display:none}details.item summary:hover .t{color:var(--signal)}details.item .more{padding:0 0 20px 140px;display:grid;gap:12px;animation:drop .25s ease-out}details.item .more ul{list-style:none;display:grid;gap:4px;color:var(--ink-2);font-size:15px}details.item .more li:before{content:"→ ";color:var(--signal);font-family:var(--mono)}.pill{position:fixed;left:0;top:0;z-index:40;pointer-events:none;font:12px var(--mono);background:var(--ink);color:var(--paper);padding:4px 10px;opacity:0;transition:opacity .15s}.pill.show{opacity:1}.contact-card{display:grid;grid-template-columns:1.3fr 1fr;border:1px solid var(--ink);background:var(--paper)}.contact-main{padding:28px;border-right:1px solid var(--ink);display:grid;gap:18px;align-content:start}.avail{font:13px var(--mono);display:flex;align-items:center;gap:10px;color:var(--ink-2)}.avail i{width:9px;height:9px;border-radius:50%;background:var(--ok);animation:ring 2s infinite}.avail.away i{background:var(--warn);animation:none}@keyframes ring{0%{box-shadow:0 0 color-mix(in srgb,var(--ok) 60%,transparent)}70%,to{box-shadow:0 0 0 9px transparent}}.email{font:600 clamp(1.2rem,2.6vw,2rem)/1.2 var(--sans);letter-spacing:-.02em;text-decoration:none;word-break:break-all}.email:hover{color:var(--signal)}.contact-actions{display:flex;gap:8px;flex-wrap:wrap}.btn{font:13px var(--mono);border:1px solid var(--ink);background:var(--paper);color:var(--ink);padding:9px 14px;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,transform .15s}.btn:hover{background:var(--ink);color:var(--paper)}.btn:active{transform:translateY(1px)}.btn.primary{background:var(--ink);color:var(--paper)}.btn.primary:hover{background:var(--signal);border-color:var(--signal);color:#fff}.socials{display:grid;align-content:start}.socials a{display:flex;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--rule);text-decoration:none;font:15px var(--mono);transition:padding .2s,background .2s,color .2s}.socials a:last-child{border-bottom:0}.socials a:after{content:"↗";transition:transform .2s}.socials a:hover{background:var(--paper-2);padding-left:28px;color:var(--signal)}.socials a:hover:after{transform:translate(3px,-3px)}.toast{position:fixed;left:50%;bottom:44px;z-index:80;transform:translate(-50%,10px);opacity:0;pointer-events:none;font:13px var(--mono);background:var(--ink);color:var(--paper);padding:9px 14px;transition:opacity .25s,transform .25s}.toast.show{opacity:1;transform:translate(-50%)}@media(max-width:860px){.contact-card{grid-template-columns:1fr}.contact-main{border-right:0;border-bottom:1px solid var(--ink)}details.item summary{grid-template-columns:1fr;gap:2px}details.item .more{padding-left:0}.sem-track button.sem:nth-child(4){border-right:0}}@media(prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none}.weeks i.on{transform:none}.opening{display:none}.gitlog.typing .gl-row{opacity:1}}section:before{content:"";position:absolute;left:0;top:-1px;height:1px;width:100%;background:var(--ink);transform:scaleX(0);transform-origin:left;transition:transform 1.1s cubic-bezier(.7,0,.2,1);z-index:1}section.seen:before{transform:scaleX(1)}.wm{position:absolute;right:12px;top:-28px;font:600 clamp(6rem,16vw,13rem)/1 var(--sans);letter-spacing:-.06em;color:transparent;-webkit-text-stroke:1px var(--rule);pointer-events:none;user-select:none;z-index:-1;transform:translateY(var(--py,0px));opacity:0;transition:opacity 1s}.seen .wm{opacity:1}.sec-head h2 .txt{display:inline-block}#heroName{cursor:pointer;position:relative;user-select:none}#heroName .ch{transition:transform .9s cubic-bezier(.2,1.4,.3,1),color .2s;will-change:transform}#heroName.split{cursor:default}#heroName.split .ch{cursor:grab;touch-action:none}#heroName.split .ch:hover{color:var(--signal)}#heroName .ch.drag{transition:none;cursor:grabbing;color:var(--signal);z-index:5;position:relative}.name-tools{display:flex;align-items:center;gap:10px;margin-top:14px;font:12px var(--mono);color:var(--ink-3);min-height:30px}.name-tools .btn{padding:5px 10px;font-size:12px;display:none}.name-tools.on .btn{display:inline-flex}.name-tools.on .hint{display:none}.hint{animation:nudge 2.4s ease-in-out infinite}@keyframes nudge{50%{transform:translate(4px)}}.cmap-stats{display:grid;grid-template-columns:repeat(3,auto) 1fr;gap:10px 32px;align-items:end;margin-bottom:18px;font:12px var(--mono);color:var(--ink-3)}.cmap-stats b{display:block;font:600 2rem/1 var(--sans);color:var(--ink);letter-spacing:-.03em}.cmap-meter{height:10px;border:1px solid var(--ink);display:flex;background:var(--paper)}.cmap-meter span{display:block;height:100%;transform:scaleX(0);transform-origin:left;transition:transform 1.2s .2s cubic-bezier(.2,.8,.2,1)}.in .cmap-meter span{transform:none}.m-done{background:var(--ink)}.m-now{background:var(--signal)}.cmap-tools{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}.cmap-tools .chips{display:flex;gap:8px;flex-wrap:wrap}.tk{display:inline-block;width:8px;height:8px;margin-right:6px;vertical-align:0}.tk-core{--tk:var(--b2)}.tk-ic{--tk:var(--b1)}.tk-fyp{--tk:var(--b4)}i.tk{background:var(--tk)}.cmap-search{display:flex;align-items:center;gap:6px;border:1px solid var(--rule);padding:4px 10px;font:12px var(--mono);color:var(--ink-3);background:var(--paper)}.cmap-search:focus-within{border-color:var(--ink)}.cmap-search input{border:0;background:none;font:inherit;color:var(--ink);outline:none;width:220px}.cmap{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));border:1px solid var(--ink);background:var(--paper)}.cmap-col{border-right:1px solid var(--rule);padding:8px;display:flex;flex-direction:column;gap:6px;transition:background .3s}.cmap-col:last-child{border-right:0}.cmap-col.now{background:var(--paper-2)}.cmap-col.sel{background:color-mix(in srgb,var(--signal) 8%,var(--paper))}.cmap-head{display:flex;justify-content:space-between;font:11px var(--mono);color:var(--ink-3);padding-bottom:6px;border-bottom:1px solid var(--rule)}.cmap-col.now .cmap-head{color:var(--signal)}.tile{text-align:left;background:var(--paper);color:var(--ink);border:1px solid var(--rule);border-left:3px solid var(--tk);padding:6px 7px;cursor:pointer;display:grid;gap:2px;opacity:0;transform:translateY(8px);transition:opacity .4s calc(var(--k) * 25ms),transform .4s calc(var(--k) * 25ms),background .2s,box-shadow .2s}.in .tile{opacity:1;transform:none}.tile .code{font:500 11px var(--mono);color:var(--tk)}.tile .name{font:12px/1.3 var(--sans)}.tile:hover{box-shadow:0 0 0 1px var(--ink)}.tile.future{border-style:dashed;border-left-style:solid}.tile.now{background:color-mix(in srgb,var(--tk) 10%,var(--paper))}.tile.now:after{content:"now";font:10px var(--mono);color:var(--signal)}.tile.dim{opacity:.15!important}.tile.hit{box-shadow:0 0 0 2px var(--signal)}.tile[aria-pressed=true]{background:var(--ink);color:var(--paper)}.tile[aria-pressed=true] .code{color:var(--paper)}.cmap-detail{border:1px solid var(--ink);border-top:0;padding:10px 12px;font:14px/1.5 var(--sans);min-height:44px;background:var(--paper)}.cmap-detail b{font:500 13px var(--mono)}.cmap-detail .tag{font:11px var(--mono);border:1px solid currentColor;padding:0 5px;margin-left:6px;color:var(--tk)}kbd{font:11px var(--mono);border:1px solid var(--rule);padding:0 5px}.sem-detail .chip-link{font:12px var(--mono);background:none;border:0;border-bottom:1px dashed var(--ink-3);color:var(--ink);cursor:pointer;margin-right:8px;padding:0}.sem-detail .chip-link:hover{color:var(--signal);border-color:var(--signal)}.journey{display:grid;grid-template-columns:1fr 1fr;gap:28px}.tl{position:relative;border:1px solid var(--ink);background:var(--paper);padding-bottom:6px}.tl-head{font:500 12px var(--mono);text-transform:uppercase;letter-spacing:.08em;padding:10px 14px;border-bottom:1px solid var(--ink);display:flex;justify-content:space-between}.tl-head span:last-child{color:var(--ink-3)}.tl-line{position:absolute;left:25px;top:44px;bottom:16px;width:1px;background:var(--rule)}.tl-line span{position:absolute;inset:0;background:var(--signal);transform:scaleY(var(--p,0));transform-origin:top}.tl-item summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:auto 1fr auto;column-gap:12px;padding:14px 14px 14px 44px;position:relative;transition:background .2s}.tl-item summary::-webkit-details-marker{display:none}.tl-item summary:hover{background:var(--paper-2)}.tl-dot{position:absolute;left:20px;top:19px;width:11px;height:11px;border:2px solid var(--ink);background:var(--paper);border-radius:50%;transition:background .3s,transform .3s}.tl-item[open] .tl-dot,.tl-item summary:hover .tl-dot{background:var(--signal);border-color:var(--signal);transform:scale(1.2)}.tl-date{grid-column:1 / -1;font:12px var(--mono);color:var(--ink-3)}.tl-title{grid-column:1 / 3;font:600 1.02rem/1.3 var(--sans)}.tl-org{grid-column:1 / 3;color:var(--ink-2);font-size:14px}.tl-tag{grid-row:2 / 4;grid-column:3;align-self:start;font:11px var(--mono);color:var(--ink-2);border:1px solid var(--rule);padding:1px 6px}.tl-body{padding:0 14px 16px 44px;color:var(--ink-2);font-size:15px;animation:drop .25s ease-out;display:grid;gap:10px}.tl-live{font:12px var(--mono);display:flex;align-items:center;gap:10px;color:var(--ink-3)}.tl-live .bar{flex:0 0 140px;height:6px;border:1px solid var(--ink);position:relative}.tl-live .bar span{position:absolute;inset:0 auto 0 0;background:var(--signal)}.tl-item{opacity:0;transform:translate(-10px);transition:opacity .5s calc(var(--i) * 90ms + .3s),transform .5s calc(var(--i) * 90ms + .3s)}.in .tl-item{opacity:1;transform:none}.next-slot{color:var(--ink-3)}.next-slot .t{color:var(--ink-2)}.dots i{font-style:normal;animation:dot 1.4s infinite}.dots i:nth-child(2){animation-delay:.2s}.dots i:nth-child(3){animation-delay:.4s}@keyframes dot{0%,60%,to{opacity:.2}30%{opacity:1}}.icon{display:inline-flex;flex:0 0 auto}.icon svg{display:block}.btn{display:inline-flex;align-items:center;gap:8px}.email{display:inline-flex;align-items:center;gap:12px}.email .icon{color:var(--signal)}.socials a{align-items:center;gap:14px}.socials a:after{content:none}.socials .s-txt{flex:1;display:grid}.socials .s-txt small{font:12px var(--mono);color:var(--ink-3)}.socials a>.icon:first-child{width:38px;height:38px;border:1px solid var(--ink);display:grid;place-items:center;transition:background .2s,color .2s,transform .3s cubic-bezier(.2,1.4,.3,1)}.socials a:hover>.icon:first-child{background:var(--ink);color:var(--paper);transform:rotate(-8deg) scale(1.08)}.socials a>.icon:last-child{transition:transform .2s}.socials a:hover>.icon:last-child{transform:translate(3px,-3px)}.sheet{position:fixed;inset:0;z-index:90;background:color-mix(in srgb,var(--ink) 55%,transparent);display:none;place-items:center;padding:20px}.sheet.open{display:grid;animation:fade .2s}@keyframes fade{0%{opacity:0}}.sheet-card{background:var(--paper);border:1px solid var(--ink);width:min(560px,100%);max-height:80vh;overflow:auto}.sheet-card header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--ink);font:500 13px var(--mono)}.sheet-card header button{font:inherit;background:none;border:0;color:var(--ink-2);cursor:pointer}.sheet-card dl{display:grid;grid-template-columns:auto 1fr;gap:8px 18px;padding:16px;font:13px var(--mono)}.sheet-card dt kbd{font-size:12px}.sheet-card dd{color:var(--ink-2)}::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}@media(max-width:1000px){.cmap{grid-template-columns:repeat(4,minmax(0,1fr))}.cmap-col:nth-child(4){border-right:0}.cmap-col:nth-child(-n+4){border-bottom:1px solid var(--rule)}}@media(max-width:860px){.journey{grid-template-columns:1fr}.cmap-stats{grid-template-columns:repeat(3,auto)}.cmap-meter{grid-column:1 / -1}.cmap-search input{width:160px}}@media(max-width:520px){.cmap{grid-template-columns:repeat(2,minmax(0,1fr))}.cmap-col:nth-child(4){border-right:1px solid var(--rule)}.cmap-col:nth-child(2n){border-right:0}.cmap-col:nth-child(-n+6){border-bottom:1px solid var(--rule)}.wm{font-size:5.5rem;top:-14px}}@media(prefers-reduced-motion:reduce){.tile,.tl-item{opacity:1;transform:none}section:before{transform:scaleX(1)}#heroName .ch{transition:none}}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.skills-band{display:grid;grid-template-columns:auto 1fr;align-items:stretch;border:1px solid var(--ink);background:var(--paper);margin-bottom:8px}.skills-cap{display:flex;align-items:center;gap:10px;padding:0 22px;background:var(--ink);color:var(--paper);font:500 13px var(--mono);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}.skills-cap:before{content:"";width:8px;height:8px;background:var(--signal);animation:pulse 1.6s ease-in-out infinite}.ticker{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}.ticker-track{display:flex;width:max-content;animation:ticker 40s linear infinite}.ticker:hover .ticker-track{animation-play-state:paused}.ticker-item{display:inline-flex;align-items:center;gap:10px;padding:16px 26px;border-right:1px solid var(--rule);font:13px var(--mono);color:var(--ink-2);transition:color .2s,transform .2s}.ticker-item b{font-weight:400}.ticker-item:hover{color:var(--brand);transform:translateY(-2px)}@keyframes ticker{to{transform:translate(-50%)}}@media(max-width:520px){.skills-band{grid-template-columns:1fr}.skills-cap{padding:8px 14px}.ticker-item{padding:12px 18px}}@media(prefers-reduced-motion:reduce){.ticker{overflow-x:auto}.ticker-track{animation:none}}.cmap-more{display:none;width:100%;justify-content:center;border-top:0}@media(max-width:640px){.cmap-more{display:flex}.cmap:not(.expanded){grid-template-columns:1fr}.cmap:not(.expanded) .cmap-col:not(.now){display:none}.cmap:not(.expanded) .cmap-col.now{border-right:0;border-bottom:0}.cmap:not(.expanded) .tile{padding:10px 12px}.cmap:not(.expanded) .tile .name{font-size:14px}.cmap.expanded .cmap-col{animation:fade .35s ease-out}}.reveal[class*=anim-]{opacity:1;transform:none;transition:none}:root{--spring:cubic-bezier(.2,1.3,.3,1);--glide:cubic-bezier(.2,.8,.2,1)}.anim-rise .skills-cap{transform:scaleX(0);transform-origin:left;transition:transform .6s var(--glide)}.anim-rise .ticker{opacity:0;transform:translate(60px);transition:opacity .7s .35s,transform .9s .35s var(--glide)}.in.anim-rise .skills-cap{transform:none}.in.anim-rise .ticker{opacity:1;transform:none}.anim-flip{perspective:900px}.anim-flip .sem{transform:rotateX(-92deg);transform-origin:top;opacity:0;transition:transform .55s calc(var(--i) * 70ms) var(--spring),opacity .3s calc(var(--i) * 70ms)}.anim-flip .sem-detail,.anim-flip .degree-foot{opacity:0;transition:opacity .5s .7s}.in.anim-flip .sem{transform:none;opacity:1}.in.anim-flip .sem-detail,.in.anim-flip .degree-foot{opacity:1}.anim-scan{position:relative}.anim-scan:before{content:"";position:absolute;inset:-1px;z-index:3;pointer-events:none;background:var(--paper);transform-origin:bottom;transition:transform 1.1s var(--glide)}.anim-scan:after{content:"";position:absolute;left:-1px;right:-1px;top:0;height:2px;z-index:4;pointer-events:none;background:var(--signal);box-shadow:0 0 14px var(--signal);opacity:0}.in.anim-scan:before{transform:scaleY(0)}.in.anim-scan:after{animation:scanline 1.1s var(--glide) forwards}@keyframes scanline{0%{top:0;opacity:1}90%{opacity:1}to{top:100%;opacity:0}}.reveal.anim-deal{opacity:0;transform:translateY(70px) rotate(var(--rot,0deg)) scale(.92);transition:opacity .4s calc(var(--i) * .11s),transform .7s calc(var(--i) * .11s) var(--spring)}.anim-deal:nth-child(4n+1){--rot:-7deg}.anim-deal:nth-child(4n+2){--rot:5deg}.anim-deal:nth-child(4n+3){--rot:-4deg}.anim-deal:nth-child(4n){--rot:8deg}.reveal.anim-deal.in{opacity:1;transform:none}.anim-drop .col{opacity:0;transform:translateY(-46px);transition:opacity .4s,transform .7s var(--spring)}.anim-drop .col:nth-child(2){transition-delay:.12s}.anim-drop .col:nth-child(3){transition-delay:.24s}.anim-drop .issue{opacity:0;transition:opacity .4s .5s}.in.anim-drop .col{opacity:1;transform:none}.in.anim-drop .issue{opacity:1}.anim-unfold{perspective:900px}.anim-unfold>*{opacity:0;transform:rotateX(-75deg);transform-origin:top;transition:opacity .4s,transform .6s var(--glide)}.anim-unfold>*:nth-child(2){transition-delay:.1s}.anim-unfold>*:nth-child(3){transition-delay:.2s}.anim-unfold>*:nth-child(4){transition-delay:.3s}.in.anim-unfold>*{opacity:1;transform:none}.reveal.anim-left{opacity:0;transform:translate(-80px) rotate(-1.5deg);transition:opacity .5s,transform .8s var(--spring)}.reveal.anim-right{opacity:0;transform:translate(80px) rotate(1.5deg);transition:opacity .5s .12s,transform .8s .12s var(--spring)}.reveal.anim-left.in,.reveal.anim-right.in{opacity:1;transform:none}.reveal.anim-zoom{opacity:0;transform:scale(.88);filter:blur(8px);transition:opacity .6s,transform .8s var(--spring),filter .6s}.anim-zoom .socials a{opacity:0;transform:translate(40px);transition:opacity .4s,transform .5s var(--glide),background .2s,padding .2s,color .2s}.anim-zoom .socials a:nth-child(1){transition-delay:.35s}.anim-zoom .socials a:nth-child(2){transition-delay:.45s}.reveal.anim-zoom.in{opacity:1;transform:none;filter:none}.in.anim-zoom .socials a{opacity:1;transform:none}.in.anim-zoom .socials a:hover{transition-delay:0s}.live-now{display:inline-flex;align-items:center;gap:6px;color:var(--signal);font-weight:500}.live-now i{width:7px;height:7px;border-radius:50%;background:var(--signal);animation:blink-now 1.2s steps(1) infinite}.live-now{animation:blink-text 1.2s ease-in-out infinite}@keyframes blink-now{50%{opacity:0}}@keyframes blink-text{50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.anim-rise .skills-cap,.anim-rise .ticker,.anim-flip .sem,.anim-flip .sem-detail,.anim-flip .degree-foot,.reveal.anim-deal,.anim-drop .col,.anim-drop .issue,.anim-unfold>*,.reveal.anim-left,.reveal.anim-right,.reveal.anim-zoom,.anim-zoom .socials a{opacity:1;transform:none;filter:none;transition:none}.anim-scan:before,.anim-scan:after{display:none}.live-now,.live-now i{animation:none}}.hero .whoami,.hero h1,.hero .intro,.hero .facts,.name-tools .hint,.sec-head p{text-shadow:0 0 2px var(--paper),0 0 8px var(--paper),0 0 14px var(--paper)}@property --hole{syntax:"<length>"; inherits:false; initial-value:0px;}.opening{position:fixed;inset:0;z-index:100;overflow:hidden;background:#0f0f0d;color:#ece8dc;font:13px/1.5 var(--mono);--hole:0px;-webkit-mask:radial-gradient(circle at 50% 50%,transparent var(--hole),#000 calc(var(--hole) + 1px));mask:radial-gradient(circle at 50% 50%,transparent var(--hole),#000 calc(var(--hole) + 1px));transition:--hole .95s cubic-bezier(.7,0,.2,1)}.no-opening .opening{display:none}.opening.leave{--hole:150vmax}:root{--op-out:cubic-bezier(.55,0,.8,.25);--op-in:cubic-bezier(.2,.9,.25,1.15);--op-glide:cubic-bezier(.76,0,.24,1)}.op-slide{position:absolute;inset:0;display:grid;place-items:center;padding:0 clamp(24px,8vw,120px);visibility:hidden}.op-slide.on{visibility:visible}.op-slide>div{position:relative;width:min(980px,100%)}.op-kicker{font-size:11px;letter-spacing:.26em;text-transform:uppercase;color:#ff6a3d;margin-bottom:18px;opacity:0;transition:opacity .45s .1s}.op-big{font:600 clamp(2.4rem,8vw,7rem)/1 var(--sans);letter-spacing:-.04em}.op-big em{font-style:normal;color:#ff6a3d}.op-sub{margin-top:22px;font-size:13px;letter-spacing:.05em;color:#a9a596;max-width:52ch;opacity:0;transform:translateY(8px);transition:opacity .5s .55s,transform .6s .55s var(--op-in)}.op-slide.show .op-kicker{opacity:1}.op-slide.show .op-sub{opacity:1;transform:none}.op-slide.out .op-kicker,.op-slide.out .op-sub{opacity:0;transition-delay:0s;transform:none}.op-big .wd{display:inline-block;white-space:nowrap}.op-big .c{display:inline-block;will-change:transform,opacity}.s1 .op-big .c{transform:translateY(.9em);opacity:0;transition:transform .8s var(--op-in),opacity .5s}.s1.show .op-big .c{transform:none;opacity:1}.s1 .op-rule{height:1px;background:#3a3833;margin-top:24px;transform:scaleX(0);transform-origin:left;transition:transform .9s .3s var(--op-glide)}.s1.show .op-rule{transform:none}.s1.out .op-rule{transform:scaleX(0);transform-origin:right;transition:transform .45s var(--op-glide)}.op-big.scatter .c{transition:transform .75s var(--op-out),opacity .6s .1s}.s2>div{display:grid;place-items:center;text-align:center}.op-sil{position:absolute;left:50%;top:50%;height:min(86vh,760px);aspect-ratio:294/900;opacity:0;transform:translate(-50%,-38%);background:linear-gradient(180deg,#ece8dc38,#ece8dc0d 80%);-webkit-mask:url(/images/silhouette.png) center / contain no-repeat;mask:url(/images/silhouette.png) center / contain no-repeat;transition:opacity .9s .2s,transform 1.3s .2s var(--op-in)}.s2.show .op-sil{opacity:1;transform:translate(-50%,-46%)}.s2 .op-big{position:relative}.s2 .op-big .c{transition:transform .85s var(--op-in),opacity .4s}.s2 .ln{display:block;transition:transform .7s var(--op-glide),opacity .5s .15s}.s2.out .ln:first-child{transform:translate(-75vw) skew(18deg);opacity:0}.s2.out .ln:last-child{transform:translate(75vw) skew(-18deg);opacity:0}.s2.out .op-sil{opacity:0;transform:translate(-50%,-20%);transition:opacity .5s,transform .7s var(--op-glide)}.s3>div{display:flex;align-items:center;gap:clamp(20px,4vw,44px)}.s3 img{width:clamp(84px,13vw,150px);height:auto;flex:0 0 auto;opacity:0;transform:translateY(-70vh) rotate(-35deg);transition:transform .9s var(--op-in),opacity .3s}.s3.show img{opacity:1;transform:none}.s3 .op-big{font-size:clamp(2rem,5.6vw,4.8rem)}.s3 .ln{display:block;clip-path:inset(0 100% 0 0);transition:clip-path .7s var(--op-glide)}.s3.show .ln:first-child{clip-path:inset(0 0 0 0);transition-delay:.35s}.s3.show .ln:last-child{clip-path:inset(0 0 0 0);transition-delay:.5s}.op-iris{position:absolute;z-index:3;left:var(--ix,50%);top:var(--iy,50%);width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;background:#ff6a3d;transform:scale(0);pointer-events:none}.op-iris.grow{transform:scale(var(--iscale,150));transition:transform .55s var(--op-glide)}.op-iris.close{transform:scale(0);transition:transform .6s var(--op-glide)}.s4>div{text-align:center}.s4 .op-sub{margin-left:auto;margin-right:auto}.s4 .op-big .c{transform:translateY(.6em) scale(.6);opacity:0;transition:transform .55s var(--op-in),opacity .3s}.s4.show .op-big .c{transform:none;opacity:1}.op-big.fall .c{transition:transform .7s var(--op-out),opacity .5s .2s}.op-dots{position:absolute;left:50%;bottom:54px;transform:translate(-50%);display:flex;gap:8px;z-index:4}.op-dots i{width:28px;height:2px;background:#2b2a25;position:relative;overflow:hidden}.op-dots i:after{content:"";position:absolute;inset:0;background:#ff6a3d;transform:scaleX(0);transform-origin:left}.op-dots i.done:after{transform:none}.op-dots i.on:after{transform:none;transition:transform var(--d, 1s) linear}.op-skip{position:absolute;bottom:22px;left:0;right:0;text-align:center;font-size:11px;letter-spacing:.12em;color:#5b584d;z-index:4}.opening.leave .op-dots,.opening.leave .op-skip{opacity:0;transition:opacity .2s}@media(max-width:640px){.s3>div{flex-direction:column;align-items:flex-start}.op-sil{height:78vh}}@media(prefers-reduced-motion:reduce){.opening{display:none}}
