:root{--bg: #fafafa;--bg-alt: #f0f1f3;--bg-sink: #e4e5ea;--ink: #383a42;--ink-soft: #4f525e;--muted: #8b8f9d;--accent: #2563eb;--accent-dk: #1d4ed8;--teal: #0d9488;--teal-dk: #0f766e;--gold: #d97706;--border: #e2e3e8;--border-dk: #c9ccd4;--c1: #ef4444;--c2: #2563eb;--c3: #d97706;--c4: #a21caf;--c5: #15803d;--sel: #2563eb30;--code-bg: #f3f3f5;--code-fg: #383a42;--sy-c: #9a9daa;--sy-k: #a21caf;--sy-s: #15803d;--sy-n: #b45309;--sy-f: #2563eb;--sy-t: #dc2626;--sy-a: #b45309;--sy-o: #0e7490;--sy-cp: #a21caf;--font-sans: "Karla", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-display: "Space Grotesk", var(--font-sans);--font-mono: "Space Mono", "SF Mono", "JetBrains Mono", monospace;--measure: 720px;--wide: 860px}html[data-theme=dark]{--bg: #282c34;--bg-alt: #2f343e;--bg-sink: #1e222a;--ink: #e7ebf2;--ink-soft: #b4bccb;--muted: #8b94a5;--accent: #4da3ff;--accent-dk: #7cc0ff;--teal: #2fd6c8;--teal-dk: #6fe8dd;--gold: #ffd23f;--border: #3a4050;--border-dk: #545d70;--c1: #ff5370;--c2: #4da3ff;--c3: #ffd23f;--c4: #c861f2;--c5: #3ddc84;--sel: #4da3ff30;--code-bg: #1e222a;--code-fg: #c9d0dc;--sy-c: #5c6370;--sy-k: #c861f2;--sy-s: #3ddc84;--sy-n: #ffab40;--sy-f: #4da3ff;--sy-t: #ff5370;--sy-a: #ffab40;--sy-o: #2fd6c8;--sy-cp: #c861f2}body{transition:background .3s ease,color .3s ease}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}::selection{background:var(--sel);color:var(--ink)}html{font-size:17px;scroll-behavior:smooth;scrollbar-color:var(--border-dk) transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--border-dk);border-radius:6px;border:2px solid var(--bg)}body{font-family:var(--font-sans);background:var(--bg);color:var(--ink);line-height:1.7;min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-dk);text-decoration:underline;text-underline-offset:3px}:focus-visible{outline:2px solid var(--teal);outline-offset:3px;border-radius:2px}h1,h2,h3,h4{font-family:var(--font-display);color:var(--ink);line-height:1.15;font-weight:700}strong{font-weight:700}em{font-style:italic}hr{border:none;border-top:1px dashed var(--border-dk);margin:2.5rem 0}.site-nav{width:100%;border-bottom:2px solid var(--ink);background:var(--bg)}.nav-inner{max-width:var(--wide);margin:0 auto;padding:1.1rem 1.5rem;display:flex;align-items:baseline;flex-wrap:wrap;gap:.3rem 1.1rem}.brand{font-family:var(--font-display);font-weight:700;font-size:1.15rem;color:var(--ink);margin-right:auto;letter-spacing:-.02em}.brand:hover{color:var(--accent);text-decoration:none}.nav-links{display:flex;flex-wrap:wrap;gap:.2rem 1.1rem;align-items:baseline}.nav-links a{font-size:.95rem;color:var(--ink-soft);font-weight:500;padding-bottom:2px;border-bottom:2px solid transparent}.nav-links a:hover{color:var(--accent);text-decoration:none;border-bottom-color:var(--accent)}.nav-links a.active{color:var(--accent);border-bottom-color:var(--accent)}.nav-toggle{display:none;background:none;border:none;cursor:pointer;font-size:1.3rem;color:var(--ink);line-height:1}.container{flex:1;width:100%;max-width:var(--wide);margin:0 auto;padding:2.5rem 1.5rem 4rem}.container.narrow{max-width:var(--measure)}.hero{margin-bottom:3rem}.hero .greeting{font-family:var(--font-mono);font-size:.85rem;color:var(--teal);margin-bottom:.5rem}.hero h1{font-size:clamp(2.4rem,6vw,3.6rem);letter-spacing:-.03em;margin-bottom:.6rem}.hero .subtitle{font-size:1.2rem;color:var(--ink-soft);font-weight:500;margin-bottom:1.6rem}.hero p{margin-bottom:1.1rem;color:var(--ink-soft)}.hero p:last-child{margin-bottom:0}.page-header{margin-bottom:2.5rem}.page-header h1{font-size:clamp(2rem,5vw,2.8rem);letter-spacing:-.02em}.page-header .sub{color:var(--muted);font-size:.98rem;margin-top:.4rem}.page-header .sub a{font-weight:500}.section{margin-bottom:3.25rem}.section-heading{font-family:var(--font-display);font-size:1.45rem;margin-bottom:1.2rem;display:flex;align-items:center;gap:.7rem}.section-heading:before{content:"";width:1.4rem;height:3px;background:var(--accent);border-radius:2px}.section-link{font-family:var(--font-mono);font-size:.85rem;margin-left:auto}.dash-list{list-style:none}.dash-list li{position:relative;padding-left:1.3rem;margin-bottom:.6rem;color:var(--ink-soft)}.dash-list li:before{content:"";position:absolute;left:0;top:.62em;width:.4em;height:.4em;background:var(--teal);border-radius:2px}.skill-row{display:flex;gap:1rem;margin-bottom:.7rem;align-items:baseline}.skill-row .label{flex:0 0 7rem;font-family:var(--font-mono);font-size:.82rem;color:var(--teal-dk);font-weight:700}.skill-row .items{display:flex;flex-wrap:wrap;gap:.35rem}.skill-chip{font-family:var(--font-mono);font-size:.78rem;padding:.16rem .6rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:20px;color:var(--ink-soft)}.post-entry{padding:1.1rem 0;border-bottom:1px dashed var(--border-dk)}.post-entry:last-child{border-bottom:none}.post-entry-head{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;flex-wrap:wrap}.post-entry-head a{font-family:var(--font-display);font-size:1.2rem;font-weight:700;color:var(--ink)}.post-entry-head a:hover{color:var(--accent);text-decoration:none}.post-entry-head time{font-family:var(--font-mono);font-size:.8rem;color:var(--muted);white-space:nowrap}.post-entry-desc{color:var(--ink-soft);margin:.35rem 0 .5rem}.year{font-family:var(--font-mono);font-size:1rem;color:var(--accent);margin:2rem 0 .3rem;padding-bottom:.3rem;border-bottom:2px solid var(--ink)}.year:first-of-type{margin-top:0}.tags{display:flex;flex-wrap:wrap;gap:.4rem}.tag{font-family:var(--font-mono);font-size:.78rem;color:var(--teal-dk)}.tag:hover{color:var(--teal);text-decoration:none}a.tag:before{content:""}.tag-cloud{display:flex;flex-wrap:wrap;gap:.5rem .9rem;margin-bottom:2.5rem}.tag-cloud .tag{font-size:.95rem}.post{max-width:var(--measure);margin:0 auto}.post-back{font-family:var(--font-mono);font-size:.85rem}.post-title{font-size:clamp(2rem,5vw,2.9rem);letter-spacing:-.02em;margin:1rem 0 .6rem}.post-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem 1rem;margin-bottom:2rem}.post-meta time{font-family:var(--font-mono);font-size:.85rem;color:var(--muted)}.post-tags{display:flex;flex-wrap:wrap;gap:.6rem}.post-rule{margin:3rem 0 1.5rem}.post-body{font-size:1.06rem}.post-body>*+*{margin-top:1.15rem}.post-body h2{font-size:1.6rem;margin-top:2.5rem}.post-body h3{font-size:1.3rem;margin-top:2rem}.post-body ul,.post-body ol{padding-left:1.4rem}.post-body li{margin-bottom:.4rem}.post-body a{font-weight:500;text-decoration:underline;text-underline-offset:2px}.post-body blockquote{border-left:4px solid var(--teal);padding:.2rem 0 .2rem 1.2rem;color:var(--ink-soft);font-style:italic}.post-body img{max-width:100%;border-radius:8px}.post-body code{font-family:var(--font-mono);font-size:.86em;background:var(--bg-sink);padding:.12em .4em;border-radius:5px}.post-body pre{background:var(--code-bg);color:var(--code-fg);border:1px solid var(--border);padding:1.1rem 1.2rem;border-radius:10px;overflow-x:auto;font-size:.88rem;line-height:1.55}.post-body pre code{background:none;padding:0;font-size:inherit;color:inherit}.post-body .astro-code{background:#0d1117!important;border:1px solid var(--border);padding:1.1rem 1.2rem;border-radius:10px;overflow-x:auto;font-size:.88rem;line-height:1.55}.post-body .astro-code code{background:none;padding:0;font-size:inherit;color:inherit}.post-body table{width:100%;border-collapse:collapse;font-size:.95rem}.post-body th,.post-body td{border:1px solid var(--border-dk);padding:.5rem .7rem;text-align:left}.post-body th{background:var(--bg-alt)}.timeline-item{padding-left:1.3rem;border-left:3px solid var(--border-dk)}.timeline-item:hover{border-left-color:var(--accent)}.timeline-item .role{font-family:var(--font-display);font-weight:700;font-size:1.05rem}.timeline-item .date{font-family:var(--font-mono);font-size:.8rem;color:var(--muted);font-weight:400}.timeline-item .org{color:var(--teal-dk);font-size:.92rem;margin-bottom:.4rem}.timeline-item ul{list-style:none}.timeline-item li{position:relative;padding-left:1.1rem;margin-bottom:.3rem;color:var(--ink-soft);font-size:.96rem}.timeline-item li:before{content:"·";position:absolute;left:.2rem;color:var(--accent);font-weight:700}.pub-list{display:flex;flex-direction:column;gap:.9rem}.pub-item{padding:1rem 1.2rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:10px;transition:transform .15s,border-color .15s}.pub-item:hover{border-color:var(--accent);transform:translate(3px)}.pub-item .title{font-family:var(--font-display);font-weight:700;font-size:1rem;margin-bottom:.2rem}.pub-item .venue{font-size:.88rem;color:var(--muted)}.pub-item .venue strong{color:var(--teal-dk)}.pub-item .abstract{font-size:.88rem;color:var(--ink-soft);margin-top:.4rem}.pub-note{font-family:var(--font-mono);font-size:.68rem;color:var(--teal-dk);background:var(--bg-sink);border:1px solid var(--border);border-radius:20px;padding:.08rem .55rem;margin-left:.3rem;white-space:nowrap}.project-section .section-heading{margin-bottom:.8rem}.project-count{font-family:var(--font-mono);font-size:.78rem;color:var(--muted);margin-left:auto;font-weight:400}.project-list{display:flex;flex-direction:column}.project-row{display:flex;gap:.5rem;padding:.5rem .2rem;border-bottom:1px dashed var(--border-dk)}.project-row:last-child{border-bottom:none}.project-row:hover{background:var(--bg-alt)}.project-row .p-nm{flex:0 0 11.5rem;min-width:0;font-family:var(--font-display);font-weight:700;font-size:.96rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-row .p-nm a{color:var(--ink)}.project-row .p-nm a:hover{color:var(--accent);text-decoration:none}.project-row .p-lg{flex:0 0 8.5rem;font-family:var(--font-mono);font-size:.76rem;color:var(--teal-dk)}.project-row .p-desc{flex:1;min-width:0;font-size:.92rem;color:var(--ink-soft)}.search-bar{margin-bottom:1.5rem}.search-bar input{width:100%;padding:.7rem 1rem;font-family:var(--font-mono);font-size:.9rem;background:var(--bg-alt);border:1.5px solid var(--border-dk);border-radius:10px;color:var(--ink);outline:none}.search-bar input:focus{border-color:var(--accent)}.search-bar input::placeholder{color:var(--muted)}.writings-list{display:flex;flex-direction:column;gap:.6rem}.writing-item{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;padding:.9rem 1.2rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:10px;transition:border-color .15s}.writing-item:hover{border-color:var(--accent)}.writing-title a{font-family:var(--font-display);font-weight:700;font-size:1rem;color:var(--ink)}.writing-title a:hover{color:var(--accent)}.writing-link{font-family:var(--font-mono);font-size:.78rem;white-space:nowrap}.writings-empty{display:none;text-align:center;padding:3rem 0;color:var(--muted);font-family:var(--font-mono)}.site-footer{border-top:2px solid var(--ink);background:var(--bg-alt)}.footer-inner{max-width:var(--wide);margin:0 auto;padding:1.6rem 1.5rem;display:flex;flex-wrap:wrap;gap:.5rem 1.2rem;align-items:center}.footer-inner a{font-family:var(--font-mono);font-size:.85rem;font-weight:700}.footer-meta{font-family:var(--font-mono);font-size:.78rem;color:var(--muted);flex-basis:100%;margin-top:.3rem}.tag-cloud .tag:nth-of-type(5n+1),.tags .tag:nth-of-type(5n+1){color:var(--c1)}.tag-cloud .tag:nth-of-type(5n+2),.tags .tag:nth-of-type(5n+2){color:var(--c2)}.tag-cloud .tag:nth-of-type(5n+3),.tags .tag:nth-of-type(5n+3){color:var(--c3)}.tag-cloud .tag:nth-of-type(5n+4),.tags .tag:nth-of-type(5n+4){color:var(--c4)}.tag-cloud .tag:nth-of-type(5n+5),.tags .tag:nth-of-type(5n+5){color:var(--c5)}.tag:hover{filter:brightness(1.15);text-decoration:underline;text-underline-offset:3px}.section:nth-of-type(5n+1) .section-heading:before{background:var(--c1)}.section:nth-of-type(5n+2) .section-heading:before{background:var(--c2)}.section:nth-of-type(5n+3) .section-heading:before{background:var(--c3)}.section:nth-of-type(5n+4) .section-heading:before{background:var(--c4)}.section:nth-of-type(5n+5) .section-heading:before{background:var(--c5)}.pub-list .pub-item{border-left:4px solid var(--c1)}.pub-list .pub-item:nth-of-type(5n+2){border-left-color:var(--c2)}.pub-list .pub-item:nth-of-type(5n+3){border-left-color:var(--c3)}.pub-list .pub-item:nth-of-type(5n+4){border-left-color:var(--c4)}.pub-list .pub-item:nth-of-type(5n+5){border-left-color:var(--c5)}.pub-item:hover{border-left-color:var(--accent)}.timeline .timeline-item:nth-of-type(5n+1){border-left-color:var(--c1)}.timeline .timeline-item:nth-of-type(5n+2){border-left-color:var(--c2)}.timeline .timeline-item:nth-of-type(5n+3){border-left-color:var(--c3)}.timeline .timeline-item:nth-of-type(5n+4){border-left-color:var(--c4)}.timeline .timeline-item:nth-of-type(5n+5){border-left-color:var(--c5)}.year-group:nth-of-type(5n+1) .year{color:var(--c1)}.year-group:nth-of-type(5n+2) .year{color:var(--c2)}.year-group:nth-of-type(5n+3) .year{color:var(--c3)}.year-group:nth-of-type(5n+4) .year{color:var(--c4)}.year-group:nth-of-type(5n+5) .year{color:var(--c5)}.brand{background:linear-gradient(90deg,var(--c1),var(--c5));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.brand:hover{-webkit-text-fill-color:transparent;filter:brightness(1.1)}.theme-btn{background:none;border:1.5px solid var(--border-dk);border-radius:50%;width:2rem;height:2rem;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink-soft);padding:0;flex-shrink:0;align-self:center;transition:color .15s,border-color .15s,transform .15s}.nav-toggle{align-self:center}.theme-btn:hover{color:var(--gold);border-color:var(--gold);transform:rotate(20deg)}.theme-btn svg{width:1rem;height:1rem;display:block}.theme-btn .icon-sun,html[data-theme=dark] .theme-btn .icon-moon{display:none}html[data-theme=dark] .theme-btn .icon-sun{display:block}@media(max-width:640px){html{font-size:16px}.nav-toggle{display:block;order:2}.theme-btn{order:1}.nav-links{display:none;order:3;width:100%;flex-direction:column;gap:.6rem;padding-top:.8rem}.nav-links.open{display:flex}.skill-row{flex-direction:column;gap:.1rem}.skill-row .label{flex-basis:auto}.project-row{flex-direction:column;align-items:flex-start;gap:.1rem}.project-row .p-nm,.project-row .p-lg{flex-basis:auto}.post-entry-head{flex-direction:column;gap:.1rem}.footer-meta{margin-left:0;width:100%}}@media print{.site-nav,.site-footer{display:none}body{background:#fff;color:#000}a{color:#000}}
