@charset "UTF-8";.main-content:has(.post-layout){max-width:none;padding:0}.post-layout{max-width:680px;margin:0 auto;padding:0 24px;position:relative}.reading-progress{display:none}.post-toc{position:fixed;left:40px;top:160px;width:160px}@media(max-width:1100px){.post-toc{display:none}}.toc-label{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:10px;color:#444;text-transform:uppercase;letter-spacing:.05em;margin-bottom:12px}.toc-nav{display:flex;flex-direction:column}.toc-link{font-size:11px;color:#444;text-decoration:none;line-height:1.5;padding:3px 0;transition:color .15s}.toc-link:hover{color:#a1a1a1}.toc-link.active{color:#fff}.toc-link.toc-sub{padding-left:10px;font-size:10px}.post{padding:64px 0 80px;min-width:0}@media(max-width:768px){.post{padding:48px 0 64px}}.post-header{margin-bottom:48px}.post-header h1{font-family:georgia,times new roman,serif;font-size:2.25rem;font-weight:400;color:#fff;letter-spacing:-.02em;line-height:1.2;margin-bottom:16px;font-style:italic}@media(max-width:768px){.post-header h1{font-size:1.75rem}}.post-category{margin-bottom:16px}.category-tag{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:10px;color:#444;text-transform:lowercase;letter-spacing:.02em}.category-tag::before{content:'// ';opacity:.5}.post-summary{font-size:1rem;color:#666;line-height:1.6;margin-bottom:20px}.post-meta{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:11px;color:#444}.meta-separator{margin:0 8px;opacity:.3}.post-date,.reading-time{color:#444}.post-body{font-size:.9375rem;line-height:1.8;color:#a1a1a1}.post-body>*+*{margin-top:1.4em}.post-body p{margin-bottom:0}.post-body h2{font-family:georgia,times new roman,serif;font-size:1.375rem;font-weight:400;color:#fff;margin-top:3rem;margin-bottom:.875rem;letter-spacing:-.01em;line-height:1.3}.post-body h2:first-child{margin-top:0}@media(max-width:768px){.post-body h2{font-size:1.25rem}}.post-body h3{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:.75rem;font-weight:500;color:#666;text-transform:uppercase;letter-spacing:.05em;margin-top:2rem;margin-bottom:.5rem}.post-body h4{font-size:1rem;font-weight:600;color:#a1a1a1;margin-top:2rem;margin-bottom:.5rem}.post-body strong{color:#fff;font-weight:500}.post-body a{color:#fff;text-decoration:underline;text-decoration-color:rgba(255,255,255,.3);text-underline-offset:3px;transition:text-decoration-color .15s}.post-body a:hover{text-decoration-color:rgba(255,255,255,.6)}.post-body ul,.post-body ol{padding-left:1.5em;margin:1.5em 0}.post-body ul li,.post-body ol li{margin-bottom:.5em;color:#a1a1a1}.post-body ul li::marker,.post-body ol li::marker{color:#444}.post-body ul{list-style:disc}.post-body ol{list-style:decimal}.post-body code{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:.875em;padding:.15em .4em;background:rgba(255,255,255,6%);border-radius:3px;color:#fff}.post-body pre{margin:1.75em 0;padding:1.25rem 1.5rem;background:#0d0d0d;border:1px solid rgba(255,255,255,6%);border-radius:8px;overflow-x:auto;position:relative}@media(max-width:768px){.post-body pre{margin-left:-24px;margin-right:-24px;border-radius:0;border-left:none;border-right:none;padding:1rem 24px}}.post-body pre code{background:0 0;padding:0;font-size:.8125rem;line-height:1.6;color:#abb2bf}.post-body .copy-btn{position:absolute;top:12px;right:12px;padding:8px;background:rgba(255,255,255,5%);border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#444;cursor:pointer;opacity:0;transition:all .15s}.post-body .copy-btn:hover{background:rgba(255,255,255,.1);color:#a1a1a1}.post-body .copy-btn svg{display:block}.post-body pre:hover .copy-btn{opacity:1}.post-body blockquote{margin:2em 0;padding-left:1.5rem;border-left:2px solid rgba(255,255,255,.15)}.post-body blockquote p{font-family:georgia,times new roman,serif;font-style:italic;color:#666;margin:0}.post-body img{max-width:100%;height:auto;border-radius:12px;margin-top:2em;margin-bottom:2em}@media(max-width:768px){.post-body img{border-radius:8px}}.post-body hr{margin:3.5em 0;border:none;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.1),transparent)}.post-body table{width:100%;margin:2em 0;border-collapse:collapse;font-size:.875rem}.post-body thead{border-bottom:1px solid rgba(255,255,255,.12)}.post-body th{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:.6875rem;font-weight:500;color:#444;text-transform:uppercase;letter-spacing:.05em;text-align:left;padding:0 16px 12px 0}.post-body td{padding:12px 16px 12px 0;color:#a1a1a1;border-bottom:1px solid rgba(255,255,255,4%);vertical-align:top}.post-body tr:last-child td{border-bottom:none}.post-body tbody tr{transition:background .15s}.post-body tbody tr:hover{background:rgba(255,255,255,2%)}.post-body .highlight{margin:2em 0}@media(max-width:768px){.post-body .highlight{margin-left:-24px;margin-right:-24px}}.post-body .highlight pre{margin:0}@media(max-width:768px){.post-body .highlight pre{border-radius:0}}.post-actions{position:fixed;right:40px;top:140px;display:flex;flex-direction:column;gap:8px}@media(max-width:1200px){.post-actions{right:20px;bottom:20px;top:auto;flex-direction:row}}.action-btn{width:40px;height:40px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,3%);border:1px solid rgba(255,255,255,8%);border-radius:10px;color:#444;cursor:pointer;transition:all .15s}.action-btn:hover{background:rgba(255,255,255,6%);color:#a1a1a1;border-color:rgba(255,255,255,.12)}.post-footer{margin-top:64px;padding-top:32px;border-top:1px solid rgba(255,255,255,6%)}.post-tags{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:32px}.tag{display:inline-block;font-size:12px;color:#444;padding:6px 12px;background:rgba(255,255,255,3%);border:1px solid rgba(255,255,255,6%);border-radius:6px;text-decoration:none;transition:all .15s}.tag:hover{background:rgba(255,255,255,6%);color:#a1a1a1}.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:600px){.post-nav{grid-template-columns:1fr}}.nav-link{display:flex;flex-direction:column;gap:6px;text-decoration:none;padding:20px 24px;border-radius:12px;background:rgba(255,255,255,2%);border:1px solid rgba(255,255,255,6%);transition:all .15s}.nav-link:hover{background:rgba(255,255,255,4%);border-color:rgba(255,255,255,.1)}.nav-link:hover .nav-title{color:#fff}.nav-direction{font-size:11px;color:#444;font-family:ibm plex mono,sf mono,Consolas,monospace;text-transform:uppercase;letter-spacing:.05em}.nav-title{font-size:15px;color:#a1a1a1;font-weight:500;line-height:1.4;transition:color .15s}.next-post{text-align:right}@media(max-width:600px){.next-post{text-align:left}}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:plus jakarta sans,-apple-system,BlinkMacSystemFont,sans-serif;font-size:16px;line-height:1.6;color:#a1a1a1;background:#0a0a0a;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}ul,ol{list-style:none}img{max-width:100%;height:auto}.page-wrapper{min-height:100vh}.main-content{max-width:640px;margin:0 auto;padding:0 24px}.hero{padding:48px 0 40px}.hero-top{display:flex;align-items:center;gap:12px;margin-bottom:20px}.avatar{width:48px;height:48px;border-radius:50%;filter:grayscale(20%)}.hero-meta{flex:1}.hero-name{font-size:18px;font-weight:600;color:#fff;line-height:1.2}.hero-role{font-size:12px;color:#444;letter-spacing:.02em}.availability{display:flex;align-items:center;gap:6px;font-size:11px;color:#444;letter-spacing:.02em}.availability .dot{width:5px;height:5px;background:#22c55e;border-radius:50%}.hero-bio{font-size:15px;line-height:1.65;color:#a1a1a1;margin-bottom:16px}.hero-links{display:flex;gap:16px}.hero-links a{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:12px;color:#444;transition:color .15s}.hero-links a:hover{color:#a1a1a1}.section{padding:40px 0}.section-label{font-size:11px;font-weight:600;color:#444;text-transform:uppercase;letter-spacing:.1em;margin-bottom:20px}.featured-posts{display:flex;flex-direction:column;gap:24px;margin-bottom:40px}.featured-post{display:flex;gap:16px;align-items:flex-start}.featured-post:hover .post-title{color:#fff}.post-preview{flex-shrink:0;width:72px;height:72px;border-radius:6px;overflow:hidden;background:#111}.post-preview img{width:100%;height:100%;object-fit:cover}.post-preview .preview-placeholder{width:100%;height:100%;background:linear-gradient(135deg,rgba(255,255,255,4%) 0%,rgba(255,255,255,2%) 100%)}.post-content{flex:1;min-width:0}.post-title{display:block;font-size:15px;font-weight:500;color:#a1a1a1;transition:color .15s;margin-bottom:6px;line-height:1}.post-desc{display:block;font-size:13px;color:#666;line-height:1.5;margin-bottom:8px}.post-meta{display:flex;align-items:center;gap:6px;font-size:11px;color:#444}.post-meta .sep{opacity:.5}.archive{padding-top:24px}.archive-label{font-size:11px;font-weight:500;color:#444;text-transform:uppercase;letter-spacing:.08em;margin-bottom:12px}.archive-list{display:flex;flex-direction:column}.archive-item{display:flex;justify-content:space-between;align-items:baseline;padding:8px 0;font-size:14px;color:#666;transition:color .15s}.archive-item:hover{color:#a1a1a1}.archive-year{font-size:12px;color:#444}.featured-projects{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:32px}@media(max-width:500px){.featured-projects{grid-template-columns:1fr}}.project-card{display:flex;flex-direction:column;gap:10px}.project-card:hover .project-title{color:#fff}.project-card:hover .project-preview img,.project-card:hover .preview-placeholder{transform:scale(1.02)}.project-preview{width:100%;aspect-ratio:16/10;border-radius:6px;overflow:hidden;background:#111}.project-preview img{width:100%;height:100%;object-fit:cover;transition:transform .2s}.project-preview .preview-placeholder{width:100%;height:100%;background:linear-gradient(135deg,rgba(255,255,255,4%) 0%,rgba(255,255,255,1%) 100%);transition:transform .2s}.project-content{display:flex;flex-direction:column;gap:2px}.project-title{font-size:14px;font-weight:500;color:#a1a1a1;transition:color .15s}.project-desc{font-size:12px;color:#444;line-height:1.4}.opensource{padding-top:24px}.opensource-label{font-size:11px;font-weight:500;color:#444;text-transform:uppercase;letter-spacing:.08em;margin-bottom:12px}.opensource-list{display:flex;flex-direction:column}.opensource-item{display:flex;align-items:baseline;gap:12px;padding:8px 0;font-size:14px;color:#666;transition:color .15s}.opensource-item:hover{color:#a1a1a1}.opensource-name{color:#a1a1a1}.opensource-desc{flex:1;font-size:13px;color:#444}.opensource-stars{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:12px;color:#444}.opensource-stars::before{content:"★ "}.work-section .work-text{font-size:15px;line-height:1.65;color:#a1a1a1;margin-bottom:16px}.work-section .contact-link{font-size:14px;color:#666;transition:color .15s}.work-section .contact-link:hover{color:#fff}.site-footer{margin-top:40px;padding:40px 0}.footer-inner{max-width:640px;margin:0 auto;padding:0 24px}.subscribe{margin-bottom:24px}.subscribe p{font-size:13px;color:#666;margin-bottom:10px}.subscribe form{display:flex;gap:8px}.subscribe input[type=email]{flex:1;max-width:200px;padding:8px 10px;background:0 0;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#fff;font-size:13px;outline:none}.subscribe input[type=email]::placeholder{color:#444}.subscribe input[type=email]:focus{border-color:#666}.subscribe button{padding:8px 14px;background:0 0;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#666;font-size:13px;cursor:pointer;transition:all .15s}.subscribe button:hover{border-color:#666;color:#fff}.footer-links{display:flex;gap:20px}.footer-links a{font-size:12px;color:#444;transition:color .15s}.footer-links a:hover{color:#666}@media(max-width:640px){.main-content,.footer-inner{padding:0 20px}.hero{padding:40px 0 32px}.featured-post{flex-direction:column;gap:10px}.post-preview{width:100%;height:140px}.subscribe form{flex-direction:column}.subscribe form input[type=email]{max-width:100%}}code{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:.9em}:not(pre)>code{padding:2px 5px;background:rgba(255,255,255,4%);border-radius:3px}.taxonomy-title{font-size:24px;font-weight:600;color:#fff;margin-bottom:32px;text-transform:capitalize}.terms-list{display:flex;flex-direction:column}.term-item{display:flex;justify-content:space-between;align-items:baseline;padding:12px 0;border-bottom:1px solid rgba(255,255,255,4%);transition:color .15s}.term-item:hover{color:#fff}.term-item:last-child{border-bottom:none}.term-name{font-size:15px;color:#a1a1a1;text-transform:capitalize}.term-count{font-family:ibm plex mono,sf mono,Consolas,monospace;font-size:12px;color:#444}/*!
  Theme: Zenburn
  Author: elnawe
  License: ~ MIT (or more permissive) [via base16-schemes-source]
  Maintainer: @highlightjs/core-team
  Version: 2021.09.0
*/
pre code.hljs {
  display: block;
  overflow-x: auto;
  padding: 1em;
  border-radius: 8px;
}
code.hljs {
  padding: 8px;
}

pre {
  background: rgba(17, 17, 17, 0.87) !important;
  border-radius: 8px;
}
.hljs {
  color: #dcdccc;
}
.hljs ::selection,
.hljs::selection {
  background-color: #606060;
  color: #dcdccc;
}
.hljs-comment {
  color: #6f6f6f;
}
.hljs-tag {
  color: grey;
}
.hljs-operator,
.hljs-punctuation,
.hljs-subst {
  color: #dcdccc;
}
.hljs-operator {
  opacity: 0.7;
}
.hljs-bullet,
.hljs-deletion,
.hljs-name,
.hljs-selector-tag,
.hljs-template-variable,
.hljs-variable {
  color: #dca3a3;
}
.hljs-attr,
.hljs-link,
.hljs-literal,
.hljs-number,
.hljs-symbol,
.hljs-variable.constant_ {
  color: #dfaf8f;
}
.hljs-class .hljs-title,
.hljs-title,
.hljs-title.class_ {
  color: #e0cf9f;
}
.hljs-strong {
  font-weight: 700;
  color: #e0cf9f;
}
.hljs-addition,
.hljs-code,
.hljs-string,
.hljs-title.class_.inherited__ {
  color: #5f7f5f;
}
.hljs-built_in,
.hljs-doctag,
.hljs-keyword.hljs-atrule,
.hljs-quote,
.hljs-regexp {
  color: #93e0e3;
}
.hljs-attribute,
.hljs-function .hljs-title,
.hljs-section,
.hljs-title.function_,
.ruby .hljs-property {
  color: #7cb8bb;
}
.diff .hljs-meta,
.hljs-keyword,
.hljs-template-tag,
.hljs-type {
  color: #dc8cc3;
}
.hljs-emphasis {
  color: #dc8cc3;
  font-style: italic;
}
.hljs-meta,
.hljs-meta .hljs-keyword,
.hljs-meta .hljs-string {
  color: #000;
}
.hljs-meta .hljs-keyword,
.hljs-meta-keyword {
  font-weight: 700;
}
