:root{--text-primary:#1a1a1a;--text-secondary:#666666;--bg-primary:#ffffff;--bg-secondary:#f8f8f8;--accent:#0055aa;--accent-hover:#003d7a;--border:#e5e5e5;--font-serif:Georgia, 'Times New Roman', Times, serif;--font-sans:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;--font-mono:'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;--max-width:720px;--font-size-base:18px;--font-size-small:14px;--font-size-xs:12px;--line-height:1.6;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--spacing-2xl:3rem;--spacing-3xl:4rem}[data-theme=dark]{--text-primary:#e5e5e5;--text-secondary:#999999;--bg-primary:#1a1a1a;--bg-secondary:#252525;--accent:#6fa8dc;--accent-hover:#8fbfea;--border:#333333}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--text-primary:#e5e5e5;--text-secondary:#999999;--bg-primary:#1a1a1a;--bg-secondary:#252525;--accent:#6fa8dc;--accent-hover:#8fbfea;--border:#333333}}*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}html{font-size:var(--font-size-base);-webkit-text-size-adjust:100%}body{font-family:var(--font-serif);font-size:1rem;line-height:var(--line-height);color:var(--text-primary);background-color:var(--bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.2;letter-spacing:-.02em}h1{font-size:2rem;margin-bottom:var(--spacing-xl)}h2{font-size:1.5rem;margin-top:var(--spacing-2xl);margin-bottom:var(--spacing-md)}h3{font-size:1.25rem;margin-top:var(--spacing-xl);margin-bottom:var(--spacing-md)}p{margin-bottom:var(--spacing-lg)}a{color:var(--accent);text-decoration:none;transition:color .2s ease}a:hover{color:var(--accent-hover)}strong{font-weight:600}blockquote{border-left:3px solid var(--border);padding-left:var(--spacing-lg);margin:var(--spacing-xl)0;color:var(--text-secondary);font-style:italic}code{font-family:var(--font-mono);font-size:.9em;background:var(--bg-secondary);padding:.2em .4em;border-radius:3px}pre{background:var(--bg-secondary);padding:var(--spacing-md);border-radius:4px;overflow-x:auto;margin:var(--spacing-xl)0}pre code{background:0 0;padding:0}ul,ol{margin:var(--spacing-md)0 var(--spacing-lg)var(--spacing-lg)}li{margin-bottom:var(--spacing-sm)}hr{border:none;border-top:1px solid var(--border);margin:var(--spacing-xl)0}img{max-width:100%;height:auto}.site-header{border-bottom:1px solid var(--border);background:var(--bg-primary)}.nav{max-width:var(--max-width);margin:0 auto;padding:var(--spacing-xl)var(--spacing-lg);display:flex;justify-content:space-between;align-items:center;font-family:var(--font-sans);font-size:15px}.site-name{font-weight:600;text-decoration:none;color:var(--text-primary);letter-spacing:-.02em}.site-name:hover{color:var(--text-primary)}.nav-links{display:flex;gap:var(--spacing-xl);list-style:none;align-items:center;margin:0;padding:0}.nav-links li{margin:0}.nav-link{text-decoration:none;color:var(--text-secondary);transition:color .2s ease}.nav-link:hover,.nav-link.active{color:var(--text-primary)}.external-indicator::after{content:" ↗";font-size:.75em}main{max-width:var(--max-width);margin:0 auto;padding:var(--spacing-3xl)var(--spacing-lg);min-height:calc(100vh - 200px)}.site-footer{border-top:1px solid var(--border);padding:var(--spacing-xl)var(--spacing-lg);font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);text-align:center}.menu-toggle{display:none;background:0 0;border:none;cursor:pointer;padding:var(--spacing-sm);margin:calc(var(--spacing-sm) * -1)}.menu-toggle span{display:block;width:20px;height:2px;background:var(--text-primary);margin:4px 0;transition:.3s ease}@media(max-width:640px){.nav{flex-wrap:wrap;padding:var(--spacing-lg)}.menu-toggle{display:block}.nav-links{width:100%;flex-direction:column;gap:var(--spacing-md);margin-top:var(--spacing-lg);padding-top:var(--spacing-lg);border-top:1px solid var(--border);display:none}.nav-links.active{display:flex}h1{font-size:1.75rem}}.theme-toggle{background:0 0;border:none;cursor:pointer;padding:var(--spacing-xs);color:var(--text-secondary);display:flex;align-items:center;justify-content:center;transition:color .2s ease}.theme-toggle:hover{color:var(--text-primary)}.theme-toggle .icon-sun,.theme-toggle .icon-moon{width:18px;height:18px}.theme-toggle .icon-sun{display:none}.theme-toggle .icon-moon{display:block}[data-theme=dark] .theme-toggle .icon-sun{display:block}[data-theme=dark] .theme-toggle .icon-moon{display:none}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .theme-toggle .icon-sun{display:block}:root:not([data-theme=light]) .theme-toggle .icon-moon{display:none}}.article-list{list-style:none;margin:0;padding:0}.article-item{padding:var(--spacing-xl)0;border-bottom:1px solid var(--border)}.article-item:first-child{padding-top:0}.article-date{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin-bottom:var(--spacing-sm)}.article-title{font-size:1.3rem;font-weight:400;margin:0 0 var(--spacing-sm)}.article-title a{color:var(--text-primary);text-decoration:none}.article-title a:hover{color:var(--accent)}.article-excerpt{color:var(--text-secondary);font-size:16px;line-height:1.5;margin:0}.post-header{margin-bottom:var(--spacing-2xl);padding-bottom:var(--spacing-md);border-bottom:1px solid var(--border)}.post-meta{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin-bottom:var(--spacing-md)}.meta-separator{margin:0 var(--spacing-sm)}.post-content{font-size:19px;line-height:1.7}.post-content img{margin:var(--spacing-xl)0}.post-nav{display:flex;justify-content:space-between;gap:var(--spacing-xl);margin-top:var(--spacing-3xl);padding-top:var(--spacing-xl);border-top:1px solid var(--border);font-family:var(--font-sans);font-size:var(--font-size-small)}.post-nav-prev,.post-nav-next{display:flex;flex-direction:column;gap:var(--spacing-xs);text-decoration:none;color:var(--text-secondary);max-width:45%}.post-nav-next{text-align:right;margin-left:auto}.post-nav-prev:hover,.post-nav-next:hover{color:var(--accent)}.post-nav-label{font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em}.post-nav-title{color:var(--text-primary)}.post-nav-placeholder{flex:1}.tag-list{display:flex;flex-wrap:wrap;gap:var(--spacing-sm);margin-top:var(--spacing-sm)}.tag{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);text-decoration:none}.tag:hover{color:var(--accent)}.tag::before{content:"#"}.tags-cloud{display:flex;flex-wrap:wrap;gap:var(--spacing-md)}.tag-cloud-item{font-family:var(--font-sans);text-decoration:none;color:var(--text-primary)}.tag-cloud-item:hover{color:var(--accent)}.tag-count{color:var(--text-secondary);font-size:var(--font-size-small)}.tag-section{margin-bottom:var(--spacing-2xl)}.tag-section h2{font-size:1.2rem;margin-top:0;margin-bottom:var(--spacing-md);padding-bottom:var(--spacing-sm);border-bottom:1px solid var(--border)}.tag-list-items{list-style:none;margin:0;padding:0}.tag-list-items li{margin-bottom:var(--spacing-sm);font-family:var(--font-sans);font-size:var(--font-size-small)}.tag-list-items time{color:var(--text-secondary);margin-right:var(--spacing-md);display:inline-block;min-width:70px}.work-type-badge{font-size:var(--font-size-xs);color:var(--text-secondary);background:var(--bg-secondary);padding:.1em .4em;border-radius:3px;margin-left:var(--spacing-sm)}.tag-back{margin-top:var(--spacing-xl);font-family:var(--font-sans);font-size:var(--font-size-small)}.projects-pinned{margin-bottom:var(--spacing-3xl)}.projects-pinned-grid{display:grid;grid-template-columns:1fr;gap:var(--spacing-lg)}@media(min-width:640px){.projects-pinned-grid{grid-template-columns:repeat(2,1fr);gap:var(--spacing-xl)}}.projects-pinned-expanded{width:100vw;position:relative;left:50%;transform:translateX(-50%);padding-left:var(--spacing-lg);padding-right:var(--spacing-lg);box-sizing:border-box}@media(min-width:640px){.projects-pinned-expanded{padding-left:var(--spacing-xl);padding-right:var(--spacing-xl)}}@media(min-width:960px){.projects-pinned-expanded{width:min(100vw,1200px);padding-left:var(--spacing-2xl);padding-right:var(--spacing-2xl)}.projects-pinned-expanded .projects-pinned-grid{grid-template-columns:repeat(3,1fr);gap:var(--spacing-xl)}}@media(min-width:1200px){.projects-pinned-expanded{padding-left:var(--spacing-3xl);padding-right:var(--spacing-3xl)}.projects-pinned-expanded .projects-pinned-grid{gap:var(--spacing-2xl)}}.project-card{padding:var(--spacing-lg);border:1px solid var(--border);border-radius:4px;transition:border-color .2s ease;display:flex;flex-direction:column}@media(min-width:960px){.project-card{padding:var(--spacing-xl)}}.project-card:hover{border-color:var(--text-secondary)}.project-card-title{font-size:1.1rem;font-weight:400;margin:0 0 var(--spacing-sm);line-height:1.3}@media(min-width:960px){.project-card-title{font-size:1.2rem}}.project-card-stack{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-sm);line-height:1.4}.project-card-contributors{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-md);font-style:italic}.project-card-summary{font-size:15px;line-height:1.5;margin:0 0 var(--spacing-md);flex-grow:1}@media(min-width:960px){.project-card-summary{font-size:16px}}.project-card-link{font-family:var(--font-sans);font-size:var(--font-size-small);text-decoration:none;margin-top:auto}.projects-list-section{border-top:1px solid var(--border);padding-top:var(--spacing-2xl)}.projects-list{display:flex;flex-direction:column}.project-list-item{padding:var(--spacing-xl)0;border-bottom:1px solid var(--border)}.project-list-item:first-child{padding-top:0}.project-list-item:last-child{border-bottom:none}.project-list-item-title{font-size:1.1rem;font-weight:400;margin:0 0 var(--spacing-sm)}.project-list-item-title a{color:var(--text-primary);text-decoration:none}.project-list-item-title a:hover{color:var(--accent)}.project-list-item-title .external-indicator::after{content:"↗";font-size:.75em;margin-left:.25em;opacity:.7}.project-list-item-stack{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-sm)}.project-list-item-meta{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-md)}.project-list-item-details{margin:var(--spacing-md)0}.project-list-item-details summary{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--accent);cursor:pointer;user-select:none}.project-list-item-details summary:hover{color:var(--accent-hover)}.project-list-item-details p{margin-top:var(--spacing-md);padding:var(--spacing-md);background:var(--bg-secondary);border-radius:4px;font-size:15px;line-height:1.6}.project-list-item-links{display:flex;gap:var(--spacing-sm);font-family:var(--font-sans);font-size:var(--font-size-small)}.project-link{color:var(--accent);text-decoration:none}.project-link:hover{color:var(--accent-hover)}.project-grid{display:grid;grid-template-columns:1fr;gap:var(--spacing-xl);margin-top:var(--spacing-2xl)}@media(min-width:640px){.project-grid{grid-template-columns:repeat(2,1fr)}}.project-header{margin-bottom:var(--spacing-2xl);padding-bottom:var(--spacing-xl);border-bottom:1px solid var(--border)}.project-summary{font-size:1.2rem;line-height:1.6;margin:var(--spacing-lg)0;color:var(--text-primary)}.project-meta{display:flex;flex-wrap:wrap;gap:var(--spacing-xl);font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin-top:var(--spacing-lg)}.project-meta-item{display:flex;flex-direction:column;gap:var(--spacing-xs)}.project-meta-label{font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}.project-meta-value{color:var(--text-primary)}.project-tags{display:flex;flex-wrap:wrap;gap:var(--spacing-sm)}.project-tag{padding:.2rem .5rem;background:var(--bg-secondary);border-radius:3px;font-size:13px;color:var(--text-primary);text-decoration:none}.project-tag:hover{color:var(--accent)}.project-hero{margin:var(--spacing-xl)0}.project-hero img{width:100%;border-radius:4px;background:var(--bg-secondary)}.project-hero figcaption{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);text-align:center;margin-top:var(--spacing-sm)}.project-content{font-size:18px;line-height:1.6}.project-content ul,.project-content ol{margin:var(--spacing-md)0 var(--spacing-lg)var(--spacing-lg)}.project-content li{margin-bottom:var(--spacing-sm)}.project-stack{margin-top:var(--spacing-2xl)}.project-stack h2{font-size:1.2rem;margin-top:0}.stack-grid{display:flex;flex-wrap:wrap;gap:var(--spacing-sm)}.stack-item{font-family:var(--font-sans);font-size:var(--font-size-small);padding:var(--spacing-sm)var(--spacing-md);background:var(--bg-secondary);border-radius:4px}.project-links{margin-top:var(--spacing-xl)}.project-links h2{font-size:1.2rem;margin-top:0}.links-list{display:flex;gap:var(--spacing-lg);font-family:var(--font-sans)}.project-nav{display:flex;justify-content:space-between;align-items:center;margin-top:var(--spacing-3xl);padding-top:var(--spacing-xl);border-top:1px solid var(--border);font-family:var(--font-sans);font-size:var(--font-size-small)}.project-nav a{text-decoration:none;color:var(--text-secondary)}.project-nav a:hover{color:var(--accent)}@media(max-width:640px){.project-meta{gap:var(--spacing-md)}.project-nav{flex-direction:column;gap:var(--spacing-md);text-align:center}}.works-filter{display:flex;align-items:center;gap:var(--spacing-md);margin-bottom:var(--spacing-xl);font-family:var(--font-sans);font-size:var(--font-size-small)}.filter-label{color:var(--text-secondary)}.filter-btn{padding:var(--spacing-xs)var(--spacing-sm);color:var(--text-secondary);text-decoration:none;border-radius:3px;transition:all .2s ease}.filter-btn:hover,.filter-btn.active{color:var(--text-primary);background:var(--bg-secondary)}.works-year-group{margin-bottom:var(--spacing-2xl)}.works-year{font-size:1.1rem;font-weight:600;margin:0 0 var(--spacing-lg);padding-bottom:var(--spacing-sm);border-bottom:1px solid var(--border)}.work-item{margin-bottom:var(--spacing-xl);padding-bottom:var(--spacing-xl);border-bottom:1px solid var(--border)}.work-item:last-child{border-bottom:none}.work-item-title{font-size:1.1rem;font-weight:400;margin:0 0 var(--spacing-sm)}.work-item-authors{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-sm)}.work-item-meta{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--text-secondary);margin:0 0 var(--spacing-md)}.work-venue{font-style:italic}.work-award{color:var(--accent)}.work-item-abstract{margin:var(--spacing-md)0}.work-item-abstract summary{font-family:var(--font-sans);font-size:var(--font-size-small);color:var(--accent);cursor:pointer;user-select:none}.work-item-abstract summary:hover{color:var(--accent-hover)}.work-item-abstract p{margin-top:var(--spacing-md);padding:var(--spacing-md);background:var(--bg-secondary);border-radius:4px;font-size:16px;line-height:1.6}.work-item-links{display:flex;gap:var(--spacing-sm);font-family:var(--font-sans);font-size:var(--font-size-small)}.work-link{color:var(--accent);text-decoration:none}.work-link:hover{color:var(--accent-hover)}.work-item-doi{margin-top:var(--spacing-sm);font-family:var(--font-sans);color:var(--text-secondary)}.about-content{max-width:600px}.about-content p:first-of-type{font-size:1.2rem;line-height:1.6}.pagination{display:flex;justify-content:space-between;margin-top:var(--spacing-2xl);padding-top:var(--spacing-xl);border-top:1px solid var(--border);font-family:var(--font-sans);font-size:var(--font-size-small)}.pagination a{text-decoration:none;color:var(--text-secondary)}.pagination a:hover{color:var(--accent)}.page-404{text-align:center;padding:var(--spacing-3xl)0}.page-404 h1{font-size:4rem;margin-bottom:var(--spacing-md)}.chroma{background-color:var(--bg-secondary)}.chroma .ln{color:#7f7f7f}.chroma .k{color:#00f}.chroma .kc{color:#00f}.chroma .kd{color:#00f}.chroma .kn{color:#00f}.chroma .kp{color:#00f}.chroma .kr{color:#00f}.chroma .kt{color:#2b91af}.chroma .s{color:#a31515}.chroma .sa{color:#a31515}.chroma .sb{color:#a31515}.chroma .sc{color:#a31515}.chroma .dl{color:#a31515}.chroma .sd{color:#a31515}.chroma .s2{color:#a31515}.chroma .se{color:#a31515}.chroma .sh{color:#a31515}.chroma .si{color:#a31515}.chroma .sx{color:#a31515}.chroma .sr{color:#a31515}.chroma .s1{color:#a31515}.chroma .ss{color:#a31515}.chroma .c{color:green}.chroma .ch{color:green}.chroma .cd{color:green}.chroma .cm{color:green}.chroma .c1{color:green}.chroma .cs{color:green}.chroma .cp{color:#00f}.chroma .cpf{color:#00f}.chroma .na{color:red}.chroma .nf{color:#74531f}.chroma .fm{color:#74531f}.chroma .nl{color:#2b91af}.chroma .nn{color:#2b91af}.chroma .nt{color:maroon}[data-theme=dark] .chroma .k{color:#569cd6}[data-theme=dark] .chroma .kc{color:#569cd6}[data-theme=dark] .chroma .kd{color:#569cd6}[data-theme=dark] .chroma .kn{color:#569cd6}[data-theme=dark] .chroma .kp{color:#569cd6}[data-theme=dark] .chroma .kr{color:#569cd6}[data-theme=dark] .chroma .kt{color:#4ec9b0}[data-theme=dark] .chroma .s{color:#ce9178}[data-theme=dark] .chroma .sa{color:#ce9178}[data-theme=dark] .chroma .sb{color:#ce9178}[data-theme=dark] .chroma .sc{color:#ce9178}[data-theme=dark] .chroma .dl{color:#ce9178}[data-theme=dark] .chroma .sd{color:#ce9178}[data-theme=dark] .chroma .s2{color:#ce9178}[data-theme=dark] .chroma .se{color:#ce9178}[data-theme=dark] .chroma .sh{color:#ce9178}[data-theme=dark] .chroma .si{color:#ce9178}[data-theme=dark] .chroma .sx{color:#ce9178}[data-theme=dark] .chroma .sr{color:#ce9178}[data-theme=dark] .chroma .s1{color:#ce9178}[data-theme=dark] .chroma .ss{color:#ce9178}[data-theme=dark] .chroma .c{color:#6a9955}[data-theme=dark] .chroma .ch{color:#6a9955}[data-theme=dark] .chroma .cd{color:#6a9955}[data-theme=dark] .chroma .cm{color:#6a9955}[data-theme=dark] .chroma .c1{color:#6a9955}[data-theme=dark] .chroma .cs{color:#6a9955}[data-theme=dark] .chroma .cp{color:#569cd6}[data-theme=dark] .chroma .cpf{color:#569cd6}[data-theme=dark] .chroma .na{color:#9cdcfe}[data-theme=dark] .chroma .nf{color:#dcdcaa}[data-theme=dark] .chroma .fm{color:#dcdcaa}[data-theme=dark] .chroma .nl{color:#4ec9b0}[data-theme=dark] .chroma .nn{color:#4ec9b0}[data-theme=dark] .chroma .nt{color:#569cd6}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .chroma .k{color:#569cd6}:root:not([data-theme=light]) .chroma .kc{color:#569cd6}:root:not([data-theme=light]) .chroma .kd{color:#569cd6}:root:not([data-theme=light]) .chroma .kn{color:#569cd6}:root:not([data-theme=light]) .chroma .kp{color:#569cd6}:root:not([data-theme=light]) .chroma .kr{color:#569cd6}:root:not([data-theme=light]) .chroma .kt{color:#4ec9b0}:root:not([data-theme=light]) .chroma .s{color:#ce9178}:root:not([data-theme=light]) .chroma .sa{color:#ce9178}:root:not([data-theme=light]) .chroma .sb{color:#ce9178}:root:not([data-theme=light]) .chroma .sc{color:#ce9178}:root:not([data-theme=light]) .chroma .dl{color:#ce9178}:root:not([data-theme=light]) .chroma .sd{color:#ce9178}:root:not([data-theme=light]) .chroma .s2{color:#ce9178}:root:not([data-theme=light]) .chroma .se{color:#ce9178}:root:not([data-theme=light]) .chroma .sh{color:#ce9178}:root:not([data-theme=light]) .chroma .si{color:#ce9178}:root:not([data-theme=light]) .chroma .sx{color:#ce9178}:root:not([data-theme=light]) .chroma .sr{color:#ce9178}:root:not([data-theme=light]) .chroma .s1{color:#ce9178}:root:not([data-theme=light]) .chroma .ss{color:#ce9178}:root:not([data-theme=light]) .chroma .c{color:#6a9955}:root:not([data-theme=light]) .chroma .ch{color:#6a9955}:root:not([data-theme=light]) .chroma .cd{color:#6a9955}:root:not([data-theme=light]) .chroma .cm{color:#6a9955}:root:not([data-theme=light]) .chroma .c1{color:#6a9955}:root:not([data-theme=light]) .chroma .cs{color:#6a9955}:root:not([data-theme=light]) .chroma .cp{color:#569cd6}:root:not([data-theme=light]) .chroma .cpf{color:#569cd6}:root:not([data-theme=light]) .chroma .na{color:#9cdcfe}:root:not([data-theme=light]) .chroma .nf{color:#dcdcaa}:root:not([data-theme=light]) .chroma .fm{color:#dcdcaa}:root:not([data-theme=light]) .chroma .nl{color:#4ec9b0}:root:not([data-theme=light]) .chroma .nn{color:#4ec9b0}:root:not([data-theme=light]) .chroma .nt{color:#569cd6}}