*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#07090d;--pane:#0e131acc;--pane-solid:#11161d;--pane-2:#161c25;--pane-3:#1e2632;--gut:#080b10c7;--line:#78b4dc24;--line-strong:#78b4dc47;--text:#e9f0f8;--text-2:#b0becf;--text-3:#8497ad;--cyan:#6fe3d9;--cyan-soft:#6fe3d924;--warn:#f0b86e;--mono:"IBM Plex Mono", ui-monospace, Menlo, monospace;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--r:12px}html{background:var(--bg);scroll-padding-top:70px}body{color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;background:0 0;min-height:100vh;padding:70px 14px 14px;font-size:15px;line-height:1.6}body.term-open{overflow:hidden}::selection{background:var(--cyan-soft);color:var(--cyan)}a{color:inherit}:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:4px}#scene{z-index:-2;width:100%;height:100%;display:block;position:fixed;inset:0}.vignette{z-index:-1;pointer-events:none;background:radial-gradient(at 50% 30%,#0000 0%,#07090d8c 70%,#07090de6 100%);position:fixed;inset:0}.no-webgl .vignette{display:none}.no-webgl body,html.no-webgl body{background:var(--bg)}.skip{background:var(--cyan);color:#0a1816;font-family:var(--mono);z-index:30;border-radius:6px;padding:8px 12px;font-size:12px;position:absolute;top:8px;left:-999px}.skip:focus{left:8px}.wrap{gap:12px;max-width:1120px;margin:0 auto;display:grid}.sr{position:absolute;left:-9999px}.kbtn{font-family:var(--mono);color:var(--text-2);background:var(--pane-2);border:1px solid var(--line-strong);cursor:pointer;border-radius:6px;padding:4px 9px;font-size:11.5px}.kbtn:hover{color:var(--cyan);border-color:var(--cyan)}.pane{background:var(--pane);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}.titlebar{background:var(--gut);border-bottom:1px solid var(--line);font-family:var(--mono);color:var(--text-3);letter-spacing:.03em;justify-content:space-between;align-items:center;gap:12px;padding:9px 16px;font-size:11.5px;display:flex}.titlebar .badge{color:var(--cyan)}.body{padding:24px 26px}h1,h2,h3{letter-spacing:-.015em;font-weight:600;line-height:1.15}.hero{background:#0e131a80;grid-template-columns:1fr 300px;display:grid}.hero .body{padding:34px 32px}.prompt{font-family:var(--mono);color:var(--cyan);font-size:12.5px}.prompt:before{content:"$ ";color:var(--text-3)}h1{margin:14px 0 8px;font-size:clamp(2.4rem,5.4vw,4rem)}.role{color:var(--text-2);margin-bottom:16px;font-size:clamp(1.05rem,2vw,1.3rem)}.role strong{color:var(--cyan);font-weight:600}.lede{color:var(--text-2);max-width:560px;margin-bottom:22px}.stats{border-top:1px solid var(--line);border-bottom:1px solid var(--line);grid-template-columns:repeat(3,1fr);margin-bottom:22px;display:grid}.stat{padding:14px 16px 14px 0}.stat+.stat{border-left:1px solid var(--line);padding-left:16px}.stat .n{color:var(--cyan);letter-spacing:-.02em;font-size:clamp(1.4rem,3vw,1.9rem);font-weight:600;line-height:1.1}.stat .l{font-family:var(--mono);color:var(--text-3);text-transform:uppercase;letter-spacing:.1em;margin-top:4px;font-size:10.5px}.ctas{flex-wrap:wrap;gap:8px;display:flex}.btn{font-family:var(--mono);cursor:pointer;border:1px solid var(--line-strong);color:var(--text);background:var(--pane-2);border-radius:6px;gap:8px;padding:10px 15px;font-size:12.5px;text-decoration:none;transition:border-color .2s,background .2s;display:inline-flex}.btn:before{content:">";color:var(--cyan)}.btn:hover{border-color:var(--cyan);background:var(--pane-3)}.btn.primary{background:var(--cyan);color:#0a1816;border-color:var(--cyan);font-weight:600}.btn.primary:before{color:#0a1816}.btn.primary:hover{filter:brightness(1.12)}.btn:disabled{opacity:.6;cursor:default}.hint{font-family:var(--mono);color:var(--text-3);margin-top:14px;font-size:11.5px}.hint kbd{font:inherit;border:1px solid var(--line-strong);color:var(--text-2);background:var(--pane-2);border-radius:4px;padding:1px 6px}.portrait{border-left:1px solid var(--line);min-height:320px;position:relative}.portrait img{object-fit:cover;object-position:50% 20%;filter:saturate(.9);width:100%;height:100%;position:absolute;inset:0}.portrait .cap{font-family:var(--mono);color:var(--text-2);background:linear-gradient(#0000,#0a0e12eb);padding:40px 16px 14px;font-size:11.5px;position:absolute;bottom:0;left:0;right:0}.portrait .cap b{font-family:var(--sans);color:var(--text);font-size:15px;font-weight:600;display:block}.job{border-top:1px solid var(--line);padding:20px 0}.job:first-child{border-top:none;padding-top:0}.job:last-child{padding-bottom:0}.job-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px 16px;display:flex}.job h3{font-size:1.15rem}.job .co{color:var(--cyan);margin-top:2px;font-size:14px}.job .date{font-family:var(--mono);color:var(--text-3);white-space:nowrap;font-size:12px}.job .sub{font-family:var(--mono);color:var(--text-3);margin-top:10px;font-size:12px}.job ul{color:var(--text-2);margin-top:10px;padding-left:18px}.job li{margin-bottom:6px;padding-left:4px}.job li::marker{color:var(--cyan)}.job.current{background:linear-gradient(90deg, var(--cyan-soft), transparent 40%);border-top:none;border-left:2px solid var(--cyan);margin:-4px -26px 0;padding:20px 26px}.job.current+.job{border-top:none}.projects{perspective:1100px;grid-template-columns:repeat(2,1fr);gap:12px;padding:12px;display:grid}.proj{--rx:0deg;--ry:0deg;--mx:50%;--my:50%;border:1px solid var(--line);transform:rotateX(var(--rx)) rotateY(var(--ry));transform-style:preserve-3d;background:#161c25b3;border-radius:10px;flex-direction:column;gap:8px;padding:22px 24px;transition:transform .18s ease-out,border-color .2s;display:flex;position:relative}.proj:after{content:"";border-radius:inherit;pointer-events:none;opacity:0;background:radial-gradient(260px circle at var(--mx) var(--my), var(--cyan-soft), transparent 70%);transition:opacity .2s;position:absolute;inset:0}.proj:hover{border-color:var(--line-strong)}.proj:hover:after{opacity:1}.proj .kicker{font-family:var(--mono);color:var(--text-3);text-transform:uppercase;letter-spacing:.12em;font-size:10.5px}.proj h3{font-size:1.1rem}.proj p{color:var(--text-2);flex:1;font-size:14.5px}.chips{flex-wrap:wrap;gap:5px;display:flex}.chip{font-family:var(--mono);background:var(--pane-3);color:var(--text-2);border-radius:4px;padding:2px 8px;font-size:11px}.proj .repo{font-family:var(--mono);color:var(--cyan);width:max-content;font-size:12px;text-decoration:none}.proj .repo:hover{text-decoration:underline}.two{grid-template-columns:1fr 1fr;gap:12px;display:grid}.kv{grid-template-columns:130px 1fr;gap:6px 14px;font-size:14px;display:grid}.kv dt{font-family:var(--mono);color:var(--text-3);padding-top:2px;font-size:12px}.kv dd{color:var(--text-2)}.list{list-style:none}.list li{border-top:1px solid var(--line);color:var(--text-2);padding:10px 0;font-size:14px}.list li:first-child{border-top:none;padding-top:0}.list li:last-child{padding-bottom:0}.list b{color:var(--text);font-weight:500;display:block}.list span{font-family:var(--mono);color:var(--text-3);font-size:12px}.contact{grid-template-columns:1fr 1.1fr;display:grid}.contact>div{padding:28px 30px}.contact>div+div{border-left:1px solid var(--line)}.contact h2{margin:12px 0;font-size:clamp(1.6rem,3vw,2.2rem)}.contact h2 em{color:var(--cyan);font-style:normal}.contact p.blurb{color:var(--text-2);max-width:400px;margin-bottom:18px}.links a{border-top:1px solid var(--line);font-family:var(--mono);color:var(--text-2);justify-content:space-between;gap:12px;padding:11px 0;font-size:13px;text-decoration:none;display:flex}.links a:hover{color:var(--cyan)}.links a span:last-child{color:var(--text-3);overflow-wrap:anywhere;text-align:right}form{gap:12px;display:grid}.row2{grid-template-columns:1fr 1fr;gap:10px;display:grid}label{font-family:var(--mono);color:var(--text-3);text-transform:uppercase;letter-spacing:.12em;margin-bottom:5px;font-size:11px;display:block}input,textarea{background:var(--pane-2);border:1px solid var(--line-strong);width:100%;color:var(--text);font-family:var(--sans);resize:vertical;border-radius:6px;padding:11px 13px;font-size:15px}input::placeholder,textarea::placeholder{color:var(--text-3)}input:focus,textarea:focus{border-color:var(--cyan);background:var(--pane-3);outline:none}textarea{min-height:110px}.hp{position:absolute;left:-9999px}.actions{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}#formStatus{font-family:var(--mono);color:var(--cyan);font-size:12px}#formStatus.err{color:var(--warn)}footer{font-family:var(--mono);color:var(--text-3);flex-wrap:wrap;justify-content:space-between;gap:8px;padding:4px 6px 0;font-size:11.5px;display:flex}.js .reveal{opacity:0;transform-origin:50% 0;transform:translateY(22px)rotateX(6deg)}.js .reveal.in{opacity:1;transition:opacity .7s ease var(--d,0s), transform .8s cubic-bezier(.2, .7, .2, 1) var(--d,0s);transform:none}.js .projects .proj.reveal.in{transition:opacity .7s ease var(--d,0s), transform .18s ease-out, border-color .2s}.term{z-index:40;background:#05070ab8;justify-content:center;align-items:flex-start;padding:10vh 14px 14px;display:flex;position:fixed;inset:0}.term[hidden]{display:none}.term-box{border:1px solid var(--line-strong);border-radius:var(--r);width:min(720px,100%);max-height:76vh;box-shadow:0 24px 80px #0009, 0 0 0 1px var(--cyan-soft);font-family:var(--mono);background:#0b0f15;flex-direction:column;font-size:13px;display:flex}.term-bar{border-bottom:1px solid var(--line);color:var(--text-3);justify-content:space-between;align-items:center;padding:9px 14px;font-size:11.5px;display:flex}.term-bar button{font:inherit;color:var(--text-2);cursor:pointer;background:0 0;border:none;padding:2px 6px}.term-bar button:hover{color:var(--cyan)}#term-out{min-height:120px;color:var(--text-2);padding:14px 16px 6px;overflow-y:auto}#term-out p{white-space:pre-wrap;overflow-wrap:anywhere;margin-bottom:3px;line-height:1.55}#term-out p.echo{color:var(--cyan);margin-top:10px}#term-out a{color:var(--cyan)}#term-form{border-top:1px solid var(--line);align-items:center;gap:8px;padding:10px 16px 14px;display:flex}#term-form span{color:var(--cyan)}#term-input{font-family:var(--mono);color:var(--text);background:0 0;border:none;flex:1;padding:4px 0;font-size:14px}#term-input:focus{background:0 0;outline:none}@media (max-width:900px){.hero{grid-template-columns:1fr}.portrait{border-left:none;border-top:1px solid var(--line);min-height:300px}.projects,.two,.contact{grid-template-columns:1fr}.contact>div+div{border-left:none;border-top:1px solid var(--line)}}@media (max-width:600px){body{padding:8px;font-size:14.5px}.body,.hero .body,.contact>div{padding:20px 18px}.job.current{margin:-4px -18px 0;padding:18px}.stat{padding:12px 8px 12px 0}.stat+.stat{padding-left:10px}.stat .n{font-size:1.15rem}.stat .l{letter-spacing:.06em;font-size:9.5px}.row2{grid-template-columns:1fr}.kv{grid-template-columns:1fr;gap:2px}.kv dd{margin-bottom:10px}.term{padding-top:6vh}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.proj,.reveal{transition:none!important;transform:none!important}}.pill{z-index:6;border:1px solid var(--line-strong);max-width:calc(100vw - 16px);font-family:var(--mono);-webkit-backdrop-filter:blur(12px);background:#0b0f15b8;border-radius:999px;align-items:center;gap:4px;padding:5px 6px 5px 14px;font-size:12px;display:flex;position:fixed;top:12px;left:50%;transform:translate(-50%)}.pill .mark{color:var(--cyan);margin-right:6px;font-weight:600;text-decoration:none}.pill nav{align-items:center;gap:2px;display:flex}.pill nav a{color:var(--text-2);border-radius:999px;padding:6px 10px;text-decoration:none;transition:color .15s,background .15s}.pill nav a:hover{color:var(--text)}.pill nav a.active{color:var(--cyan);background:var(--cyan-soft)}.kbtn{margin-left:4px}.spot{z-index:3;pointer-events:none;opacity:0;background:radial-gradient(600px circle at var(--sx,50%) var(--sy,30%), var(--cyan-soft), transparent 80%);transition:opacity .3s;position:fixed;inset:0}.spot.on{opacity:1}@media (hover:hover){.projects:hover .proj:not(:hover){opacity:.5}#experience .body:hover .job:not(:hover){opacity:.55}}.js .reveal.in.done{--d:0s}.js .projects .proj.reveal.in.done{transition:transform .18s ease-out,border-color .2s,opacity .25s}.js .job.reveal.in.done{transition:opacity .25s}.proj .more{font-family:var(--mono);color:var(--text-2);border:1px solid var(--line-strong);cursor:pointer;background:0 0;border-radius:6px;align-self:flex-start;margin-top:2px;padding:5px 10px;font-size:12px;transition:color .15s,border-color .15s}.proj .more:before{content:">_ ";color:var(--cyan)}.proj .more:hover{color:var(--cyan);border-color:var(--cyan)}.linkrow{border-top:1px solid var(--line);align-items:stretch;gap:8px;display:flex}.linkrow a{border-top:none;flex:1}.copy{font-family:var(--mono);color:var(--text-2);background:var(--pane-2);border:1px solid var(--line-strong);cursor:pointer;border-radius:6px;align-self:center;min-width:64px;padding:4px 10px;font-size:11.5px}.copy:hover,.copy.ok{color:var(--cyan);border-color:var(--cyan)}.links>a:first-child{border-top:none}footer .tag{color:var(--text-2)}.term-chips{border-top:1px solid var(--line);flex-wrap:wrap;gap:6px;padding:8px 16px 0;display:flex}.term-chips button{font-family:var(--mono);color:var(--text-2);background:var(--pane-2);border:1px solid var(--line-strong);cursor:pointer;border-radius:999px;padding:3px 10px;font-size:11.5px}.term-chips button:hover{color:var(--cyan);border-color:var(--cyan)}#term-form{border-top:none;padding-top:8px}@media (max-width:600px){body{padding-top:64px}.pill{padding-left:10px;font-size:11.5px}.pill nav a{padding:6px 7px}.pill .mark{margin-right:2px}footer .tag{order:3;width:100%}}
