:root{--bg: #f0f1ef;--surface: #fcfcfb;--text: #171918;--muted: #585d5a;--accent: #197a2e;--accent-soft: #e8f4ea;--border: #1f2422;--shadow: 8px 8px 0 #121413;--max-width: 1480px;--radius-sm: 8px;--radius-md: 12px}*{box-sizing:border-box}html,body{margin:0;padding:0;background:radial-gradient(circle at top right,#f7f8f5,#e6e8e3 70%);color:var(--text);font-family:Space Grotesk,Segoe UI,Tahoma,Geneva,Verdana,sans-serif;text-rendering:optimizeLegibility}html{scroll-padding-top:3rem}#top,#projects,#publication,#skills,#contact{scroll-margin-top:3rem}a{color:inherit;text-decoration:none}.page{max-width:var(--max-width);margin:0 auto;padding:5rem 1rem}.cookie-banner{position:fixed;left:50%;bottom:1rem;transform:translate(-50%);z-index:260;width:min(96vw,1020px);border:2px solid var(--border);border-radius:14px;box-shadow:10px 10px #121413,0 18px 36px #0f181247;background:linear-gradient(160deg,#fcfdfb,#eef3ee);display:flex;gap:1rem;align-items:center;justify-content:space-between;padding:1rem 1.05rem}.cookie-banner[hidden]{display:none!important}.cookie-banner-copy{min-width:0}.cookie-banner-eyebrow{margin:0 0 .2rem;font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;font-family:JetBrains Mono,Consolas,monospace;color:#2f6339}.cookie-banner-title{margin:0;font-size:1.12rem;line-height:1.15;letter-spacing:-.01em}.cookie-banner-text{margin:.35rem 0 0;color:#28302b;line-height:1.4;font-size:.9rem;max-width:70ch}.cookie-banner-actions{display:inline-flex;gap:.55rem;flex-shrink:0}.cookie-btn{border:2px solid #1f2422;border-radius:999px;font-family:JetBrains Mono,Consolas,monospace;font-size:.72rem;letter-spacing:.02em;text-transform:uppercase;font-weight:700;padding:.52rem .9rem;cursor:pointer}.cookie-btn-accept{background:#1c7a31;color:#f3fff4}.cookie-btn-accept:hover,.cookie-btn-accept:focus-visible{background:#165f27;outline:none}.cookie-btn-decline{background:#f0f2ef;color:#1e2721}.cookie-btn-decline:hover,.cookie-btn-decline:focus-visible{background:#e2e8e2;outline:none}.cookie-feedback{position:fixed;left:50%;bottom:7rem;transform:translate(-50%);z-index:261;border:2px solid #1f2422;border-radius:999px;padding:.5rem .95rem;background:#fffdfa;box-shadow:6px 6px #121413;font-family:JetBrains Mono,Consolas,monospace;font-size:.72rem;font-weight:700}.cookie-feedback[hidden]{display:none!important}.cookie-burst-item{position:fixed;left:0;top:0;z-index:262;pointer-events:none;user-select:none;font-size:1.2rem;line-height:1;transform:translate(-50%,-50%);animation-name:cookieBurstPop;animation-timing-function:linear;animation-fill-mode:forwards}@keyframes cookieBurstPop{0%{opacity:0;transform:translate(-50%,-50%) scale(.45) rotate(0)}9%{opacity:1}34%{opacity:1;transform:translate(calc(-50% + var(--cookie-drift-start)),calc(-50% - var(--cookie-apex))) scale(1.05) rotate(calc(var(--cookie-rotate) * .45))}72%{opacity:.9;transform:translate(calc(-50% + calc((var(--cookie-drift-start) + var(--cookie-drift-end)) / 2)),calc(-50% + calc(var(--cookie-drop) * .35))) scale(.96) rotate(calc(var(--cookie-rotate) * .9))}to{opacity:0;transform:translate(calc(-50% + var(--cookie-drift-end)),calc(-50% + var(--cookie-drop))) scale(.82) rotate(calc(var(--cookie-rotate) * 1.2))}}@media(max-width:900px){.cookie-banner{flex-direction:column;align-items:stretch;gap:.75rem}.cookie-banner-actions{width:100%;justify-content:flex-end}.cookie-feedback{width:min(92vw,560px);text-align:center;border-radius:12px}}.topbar{position:fixed;top:0;left:0;right:0;width:100%;z-index:120;display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom:1px solid #c4c8c3;background:#f0f1efeb;backdrop-filter:blur(6px);padding:.55rem 1rem .75rem}.brand{font-family:JetBrains Mono,Consolas,monospace;font-weight:700;letter-spacing:.03em;color:var(--accent);font-size:.95rem}.nav-links{display:flex;flex-wrap:wrap;gap:.72rem;font-size:.88rem;color:var(--muted)}.nav-links a{display:inline-flex;align-items:center;gap:.33rem;border-bottom:2px solid transparent;transition:border-color .2s ease,color .2s ease}.top-link-icon{width:1.08rem;height:1.08rem;flex:0 0 auto}.nav-links a:hover,.nav-links a:focus-visible{color:var(--text);border-color:var(--accent);outline:none}.nav-links a.is-highlight{border:1px solid #8eb59a;border-radius:999px;padding:.42rem;color:#145c24;background:#edf6ef;font-weight:700}.nav-links a.is-icon-only{min-width:1.95rem;min-height:1.95rem;justify-content:center}.nav-links a.is-highlight:hover,.nav-links a.is-highlight:focus-visible{border-color:#2a7d41;background:#e2f1e6}.hero{display:grid;grid-template-columns:1.1fr .9fr;gap:2rem;align-items:end;margin-bottom:3rem}.hero h1{margin:0;line-height:.98;font-size:clamp(2.4rem,5vw,4.3rem);font-weight:700;letter-spacing:-.03em}.accent{color:var(--accent)}.lede{margin-top:1.2rem;border-left:4px solid var(--accent);padding:.3rem 0 .3rem 1rem;max-width:62ch;color:var(--muted);line-height:1.6}.terminal{background:#f8f8f7;border:2px solid var(--border);box-shadow:var(--shadow);border-radius:var(--radius-sm);overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease;animation:rise .7s ease-out}.terminal:focus-within{border-color:#1c7a31;box-shadow:8px 8px #121413,0 0 0 2px #1c7a3133}.terminal-head{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.5rem;font-family:JetBrains Mono,Consolas,monospace;font-size:.76rem;color:#3f4340;padding:.45rem .75rem;background:#e8ebe6;border-bottom:2px solid var(--border)}.terminal-head>span{min-width:0}@media(max-width:480px){.terminal-head{flex-direction:column;align-items:flex-start}.terminal-head #terminal-clock{font-size:.72rem;color:#6a716d}}.terminal-body{margin:0;padding:1rem;font-family:JetBrains Mono,Consolas,monospace;font-size:.86rem;line-height:1.85;white-space:pre-wrap}.terminal-body .green{color:var(--accent);font-weight:700}.terminal-shell{display:flex;flex-direction:column;height:clamp(320px,42vh,400px);font-family:JetBrains Mono,Consolas,monospace;font-size:.83rem}.terminal-output{padding:.9rem .95rem .6rem;overflow-y:auto;min-height:0;overscroll-behavior:contain;line-height:1.58;flex:1}.line{white-space:pre-wrap;word-break:break-word}.line+.line{margin-top:.18rem}.line.command{color:#0f1411}.line.result{color:#2d3a31}.line.error{color:#9a2f2f}.line.hint{color:#3e7b4d}.tk-prompt{color:#1f7d33;font-weight:700}.tk-cmd{color:#1f3b85;font-weight:700}.tk-arg{color:#2d3a31}.tk-flag{color:#7a4b0f;font-weight:700}.tk-path{color:#136a47}.tk-dir{color:#0f5fb8;font-weight:700}.tk-key{color:#6f2aa8}.tk-string{color:#1d8c3d}.tk-number{color:#0d7f98}.tk-bool{color:#b24a0d;font-weight:700}.tk-punc{color:#666d69}.tk-log-ok{color:#14813a;font-weight:700}.tk-log-warn{color:#a56a00;font-weight:700}.tk-log-error{color:#a12a2a;font-weight:700}.terminal-prompt{display:grid;grid-template-columns:auto 1fr;gap:.6rem;align-items:center;padding:.55rem .95rem .85rem;border-top:1px dashed #cad1cb;background:#f5f7f4}.prompt-label{color:#1c7a31;font-weight:700}.prompt-input{border:none;background:transparent;color:#0f1411;font:inherit;caret-color:#1c7a31;caret-shape:block}.prompt-input:focus{outline:none}.prompt-input::placeholder{color:#7c827e}.prompt-input{position:relative}.prompt-input:not(:focus){opacity:.92}.terminal-meta{grid-column:2;margin-top:-.2rem;color:#6a716d;font-family:JetBrains Mono,Consolas,monospace;font-size:.66rem;letter-spacing:.01em;text-transform:lowercase}.terminal-restart{margin:.5rem .95rem .95rem;border:1.5px solid #1f2422;border-radius:999px;background:#eef2ee;color:#162018;font-family:JetBrains Mono,Consolas,monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em;padding:.4rem .85rem;cursor:pointer;align-self:flex-end}.terminal-restart:hover,.terminal-restart:focus-visible{background:#dfe8df;outline:none}.terminal.terminal-crashed{border-color:#0a2d8f;box-shadow:8px 8px #081a4d;background:#0b2ea3}.terminal.terminal-crashed .terminal-head{color:#e4ebff;background:#1742c2;border-bottom-color:#6f90f0}.terminal.terminal-crashed .terminal-shell,.terminal.terminal-crashed .terminal-output,.terminal.terminal-crashed .terminal-prompt{background:#0b2ea3}.terminal.terminal-crashed .terminal-output{overflow:hidden;scrollbar-width:none}.terminal.terminal-crashed .terminal-output::-webkit-scrollbar{display:none}.terminal.terminal-crashed .line.command,.terminal.terminal-crashed .line.result,.terminal.terminal-crashed .line.error,.terminal.terminal-crashed .line.hint,.terminal.terminal-crashed .prompt-label,.terminal.terminal-crashed .terminal-meta,.terminal.terminal-crashed .prompt-input,.terminal.terminal-crashed .prompt-input::placeholder,.terminal.terminal-crashed .tk-prompt,.terminal.terminal-crashed .tk-cmd,.terminal.terminal-crashed .tk-arg,.terminal.terminal-crashed .tk-flag,.terminal.terminal-crashed .tk-path,.terminal.terminal-crashed .tk-dir,.terminal.terminal-crashed .tk-key,.terminal.terminal-crashed .tk-string,.terminal.terminal-crashed .tk-number,.terminal.terminal-crashed .tk-bool,.terminal.terminal-crashed .tk-punc,.terminal.terminal-crashed .tk-log-ok,.terminal.terminal-crashed .tk-log-warn,.terminal.terminal-crashed .tk-log-error{color:#ecf2ff}.section{margin-top:2.4rem}.section-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.85rem}.section-head h2{margin:0;font-size:1.5rem;letter-spacing:-.02em}.section-head span{color:var(--muted);font-size:.8rem}.section-intro{margin:0 0 1rem;color:#2b2f2d;line-height:1.6}.cards{display:grid;gap:1rem}.card{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--radius-md);padding:1.2rem;transition:transform .2s ease,box-shadow .2s ease}.card:hover,.card:focus-within{transform:translate(-3px,-3px);box-shadow:5px 5px #131614}.role{display:inline-block;border:1px solid #8bb694;border-radius:999px;color:var(--accent);padding:.1rem .6rem;font-size:.78rem;margin-bottom:.4rem}.card h3{margin:.2rem 0 .8rem;font-size:1.7rem;letter-spacing:-.02em}.card ul{margin:0;padding-left:1rem;color:#2b2f2d;line-height:1.5}.card ul:not(.tag-list) li+li{margin-top:.55rem}.meta-line{margin:.15rem 0 .8rem;color:var(--muted);font-size:.9rem}.inline-link{color:#0f5fb8;font-weight:700;text-decoration:underline;text-underline-offset:.15rem}.inline-link:hover,.inline-link:focus-visible{color:#124a8c;outline:none}.skills-list{margin:0;padding-left:1rem;line-height:1.6}.publication-plots{margin-top:1rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:.75rem}.publication-plot-button{border:1.5px solid #cad0cb;border-radius:10px;margin:0;padding:.45rem;background:linear-gradient(180deg,#f9faf8,#f0f3ee);display:grid;gap:.4rem;text-align:left;cursor:zoom-in;transition:transform .18s ease,border-color .18s ease}.publication-plot-button:hover,.publication-plot-button:focus-visible{transform:translateY(-2px);border-color:#8ca597;outline:none}.publication-plot-image{width:100%;aspect-ratio:16 / 10;object-fit:contain;border:1.5px solid #1f2422;border-radius:8px;background:#fff}.publication-plot-title{font-size:.8rem;color:#3e4441;line-height:1.4}.skills-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.skills-intro{display:grid;gap:.35rem}.lang-tags{margin:.2rem 0 0}.lang-tags li{display:inline-flex;align-items:center;gap:.4rem}.lang-level{color:#5c635f;font-size:.7rem;border-left:1px solid #b8beb9;padding-left:.35rem}.skill-card h3{font-size:1.25rem;text-transform:lowercase;margin:0 0 .5rem}.skill-card{display:flex;flex-direction:column;align-items:flex-start}.skill-card p{margin:0 0 .4rem}.skill-card .tag-list{margin-top:.4rem;margin-bottom:0;align-self:flex-start;padding-left:0;margin-left:0}.project-grid{grid-template-columns:repeat(3,minmax(0,1fr));align-items:start}.project-card{display:flex;flex-direction:column;height:100%;padding:1.05rem}.project-grid>.card:nth-child(1){grid-column:1;grid-row:1}.project-grid>.card:nth-child(2){grid-column:1;grid-row:2}.project-grid>.card:nth-child(3){grid-column:2;grid-row:1 / span 2}.project-grid>.card:nth-child(4){grid-column:3;grid-row:1 / span 2}.project-shot{margin:.75rem 0 .95rem;border:1.5px dashed #9fa7a0;border-radius:10px;background:linear-gradient(140deg,#eef1ec,#f8faf7);min-height:140px;display:grid;place-items:center;text-align:center;padding:.75rem}.project-shot-placeholder{min-height:278px}.project-media{margin:.62rem 0 .78rem;display:grid;gap:0;padding:.48rem;border:1.5px solid #cad0cb;border-radius:12px;background:linear-gradient(180deg,#f9faf8,#f0f3ee)}.project-shot-button{border:0;margin:0;padding:0;background:transparent;border-radius:10px;cursor:zoom-in}.project-shot-button:focus-visible{outline:3px solid #2f7d47;outline-offset:2px}.project-shot-main,.project-shot-mini{width:100%;object-fit:contain;border:1.5px solid #1f2422;border-radius:10px;background:#111;padding:0;margin:.15rem 0}.project-shot-main{aspect-ratio:16 / 9;box-shadow:0 2px 8px #0d13101f}.project-shot-strip{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.3rem}.project-shot-mini{aspect-ratio:16 / 9;transition:transform .18s ease}.project-shot-button:hover .project-shot-mini{transform:translateY(-2px)}.project-zoom-hint{margin:.2rem 0 0;color:#55615a;font-family:JetBrains Mono,monospace;font-size:.68rem;letter-spacing:.01em;text-transform:uppercase}.project-summary{margin-top:0;display:grid;gap:.6rem;line-height:1.45}.project-summary-after-media{margin-bottom:.5rem}.project-summary-tag{display:inline-flex;margin:0;width:fit-content;max-width:100%;border:1px solid #86ab90;border-radius:999px;padding:.2rem .55rem;background:#eaf4ec;color:#175927;font-family:JetBrains Mono,monospace;font-size:.72rem;font-weight:700;letter-spacing:.01em;text-transform:lowercase}.project-head-block{display:grid;gap:.32rem;margin-bottom:.12rem}.project-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:.62rem;flex-wrap:wrap}.project-title-row h3{margin:0}.project-inspiration{margin:0;color:#57615b;font-size:.82rem}.project-summary-body{display:grid;gap:.48rem}.project-summary-line{margin:0;color:#1f2422}.project-summary-lead{font-size:1.03rem;font-weight:700;line-height:1.3}.project-keyword,.publication-keyword{background:#e7f2e9;color:#124e22;border-radius:4px;padding:0 .2rem;font-weight:700}.project-links{display:flex;flex-wrap:wrap;gap:.6rem}.project-links-top,.project-link-top{margin:0}.project-meta-block{margin-top:auto;padding-top:.58rem;border-top:1px dashed #cfd5d0;display:grid;gap:.28rem}.project-stack-line{margin:0;font-size:.84rem}.project-source-placeholder{margin:0;visibility:hidden}.project-shot span{font-family:JetBrains Mono,monospace;font-size:.73rem;color:#5f6661}.labs{margin-top:1rem;padding-top:1rem;border-top:1px dashed #aeb4ae}.tag-list{display:flex;flex-wrap:wrap;gap:.5rem;margin:0 0 .6rem;padding:0;list-style:none}.tag-list li{border:1px solid #aac6b0;border-radius:4px;padding:.1rem .45rem;font-size:.75rem;color:#0f5f22;font-family:JetBrains Mono,monospace}.ethos{display:grid;grid-template-columns:1.2fr .8fr;gap:1rem}.principles{margin:0;padding:0;list-style:none}.principles li{display:grid;grid-template-columns:2.2rem 1fr;gap:.7rem;padding:.8rem 0;border-bottom:1px solid #d8dbd6}.principles li:last-child{border-bottom:none}.principles .index{color:var(--accent);font-family:JetBrains Mono,monospace;font-weight:700}.principles h4{margin:0;font-size:1.08rem}.principles p{margin:.35rem 0 0;color:var(--muted)}.quote{border:1.5px solid var(--border);border-radius:var(--radius-md);padding:1.2rem;background:#f9faf8;box-shadow:var(--shadow);align-self:start}.quote p{margin:0;font-size:1.3rem;line-height:1.4;letter-spacing:-.01em}.cta{margin-top:2.8rem;background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow);text-align:center;padding:2.8rem 1rem}.cta h2{margin:0 0 .75rem;font-size:clamp(2rem,5vw,3rem);letter-spacing:-.03em}.cta p{margin:0 auto 1.5rem;max-width:56ch;color:var(--muted)}.actions{display:flex;justify-content:center;gap:.75rem;flex-wrap:wrap}.btn{display:inline-flex;align-items:center;gap:.42rem;padding:.65rem 1.15rem;border:2px solid var(--border);border-radius:6px;font-size:.82rem;font-weight:700;font-family:JetBrains Mono,monospace;letter-spacing:.01em;text-transform:uppercase;transition:transform .2s ease,background-color .2s ease,color .2s ease}.btn-icon{width:.95rem;height:.95rem;flex:0 0 auto}.btn:hover,.btn:focus-visible{transform:translateY(-2px);outline:none}.btn.primary{background:var(--accent);color:#f7fff8;border-color:#0f5f22}.btn.primary:hover,.btn.primary:focus-visible{background:#126426}.btn.ghost{background:#fff}.btn.ghost:hover,.btn.ghost:focus-visible{background:#edf1ed}.reveal{animation:rise .7s ease-out}.lightbox-open,html.terminal-panicked,body.terminal-panicked{overflow:hidden}body.terminal-panicked:before{content:"";position:fixed;inset:0;z-index:900;background:#7e838ab3;backdrop-filter:grayscale(1) saturate(0) brightness(.72);pointer-events:none}html.terminal-panicked *,html.terminal-panicked *:before,html.terminal-panicked *:after{animation:none!important;transition:none!important;cursor:default!important;user-select:none!important}html.terminal-panicked a,html.terminal-panicked button,html.terminal-panicked [role=button],html.terminal-panicked input,html.terminal-panicked textarea,html.terminal-panicked select,html.terminal-panicked summary{pointer-events:none!important}html.terminal-panicked .page,html.terminal-panicked .topbar{pointer-events:none!important}html.terminal-panicked .terminal,html.terminal-panicked .terminal *,html.terminal-panicked .terminal *:before,html.terminal-panicked .terminal *:after{filter:none!important}html.terminal-panicked .terminal{position:relative;z-index:1000}html.terminal-panicked .terminal-restart{pointer-events:auto!important;cursor:pointer!important}html.terminal-panicked .card:hover,html.terminal-panicked .card:focus-within{transform:none!important;box-shadow:none!important}.lightbox{position:fixed;inset:0;z-index:50;display:grid;place-items:center}.lightbox[hidden]{display:none!important}.lightbox-backdrop{position:absolute;inset:0;border:0;background:#0a0e0cb8}.lightbox-panel{position:relative;margin:0;width:min(94vw,1080px);max-height:90vh;display:grid;gap:.45rem;padding:.65rem;border:2px solid #1f2422;border-radius:14px;background:#f7f9f6;box-shadow:0 16px 52px #0000004d}.lightbox-image{width:100%;max-height:calc(90vh - 120px);object-fit:contain;border-radius:10px;border:1.5px solid #1f2422;background:#111}.lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);border:1.5px solid #1f2422;border-radius:999px;min-width:60px;padding:.35rem .55rem;background:#f0f4efe6;font-family:JetBrains Mono,monospace;font-size:.68rem;text-transform:uppercase;cursor:pointer}.lightbox-nav:hover,.lightbox-nav:focus-visible{background:#e0e7e0;outline:none}.lightbox-nav:disabled{opacity:.45;cursor:not-allowed}.lightbox-nav-prev{left:.95rem}.lightbox-nav-next{right:.95rem}.lightbox-caption{margin:0;color:#4f5953;font-size:.86rem}.lightbox-close{order:-1;justify-self:end;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:0;width:auto;height:auto;padding:0 .1rem;background:transparent;color:#5e6761;font-family:JetBrains Mono,monospace;font-size:.95rem;line-height:1;text-transform:none;cursor:pointer}.lightbox-close:hover,.lightbox-close:focus-visible{color:#2f3832;background:transparent;text-decoration:none;outline:none}@keyframes rise{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}@media(max-width:920px){.hero,.ethos{grid-template-columns:1fr}.project-grid{grid-template-columns:repeat(2,minmax(260px,1fr))}.project-grid>.card{grid-column:auto;grid-row:auto}.quote{margin-top:.5rem}}@media(max-width:1220px){.project-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.project-grid>.card,.project-grid>.card:nth-child(1),.project-grid>.card:nth-child(2),.project-grid>.card:nth-child(3),.project-grid>.card:nth-child(4){grid-column:auto;grid-row:auto}.project-card{height:auto}}@media(max-width:760px){.project-grid,.project-shot-strip{grid-template-columns:1fr}}@media(max-width:620px){html{scroll-padding-top:7.4rem}#top,#projects,#publication,#skills,#contact{scroll-margin-top:7.4rem}.page{padding-top:6.8rem}.topbar{flex-direction:column;align-items:flex-start;padding-bottom:.6rem}.hero h1{font-size:clamp(2.2rem,12vw,3.3rem)}.section-head{flex-direction:column;align-items:flex-start;gap:.35rem}.terminal-shell{height:clamp(290px,50vh,360px)}.project-grid{grid-template-columns:1fr}.project-shot-main,.project-shot-mini{aspect-ratio:16 / 10}.project-shot-placeholder{min-height:220px}.lightbox-panel{width:min(96vw,1080px);padding:.5rem}.lightbox-caption{font-size:.8rem}.lightbox-nav{top:auto;bottom:.85rem;transform:none}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
