:root{--sp-1: 0.25rem;--sp-2: 0.5rem;--sp-3: 0.75rem;--sp-4: 1rem;--sp-5: 1.5rem;--sp-6: 2rem;--sp-7: 3rem;--sp-8: 4rem;--sp-9: 6rem;--content-width: 720px;--wide-width: 960px;--nav-height: 64px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 16px}:root,[data-theme=dark]{--bg: hsl(220deg 20% 7%);--bg-surface: hsl(220deg 18% 11%);--bg-surface-hover: hsl(220deg 18% 15%);--bg-code: hsl(220deg 18% 13%);--border: hsl(220deg 15% 18%);--border-light: hsl(220deg 15% 14%);--text: hsl(220deg 10% 88%);--text-secondary: hsl(220deg 10% 60%);--text-tertiary: hsl(220deg 10% 42%);--accent: hsl(160deg 70% 50%);--accent-hover: hsl(160deg 70% 60%);--accent-subtle: hsl(160deg 70% 50% / 0.12);--accent-2: hsl(35deg 90% 58%);--gradient: linear-gradient(135deg, hsl(160deg 70% 50%), hsl(200deg 80% 60%), hsl(260deg 60% 65%));--gradient-warm: linear-gradient(135deg, hsl(160deg 70% 50%), hsl(35deg 90% 58%));--hero-glow: hsl(160deg 70% 50% / 0.08);--shadow-sm: 0 1px 3px hsl(0deg 0% 0% / 0.3);--shadow-md: 0 4px 12px hsl(0deg 0% 0% / 0.3);--callout-info-bg: hsl(210deg 60% 50% / 0.1);--callout-info-border: hsl(210deg 60% 50% / 0.4);--callout-warn-bg: hsl(40deg 80% 50% / 0.1);--callout-warn-border: hsl(40deg 80% 50% / 0.4);--callout-tip-bg: hsl(160deg 60% 50% / 0.1);--callout-tip-border: hsl(160deg 60% 50% / 0.4)}[data-theme=light]{--bg: hsl(30deg 20% 97%);--bg-surface: hsl(0deg 0% 100%);--bg-surface-hover: hsl(30deg 15% 94%);--bg-code: hsl(220deg 15% 95%);--border: hsl(30deg 12% 86%);--border-light: hsl(30deg 12% 91%);--text: hsl(20deg 20% 14%);--text-secondary: hsl(20deg 8% 40%);--text-tertiary: hsl(20deg 6% 56%);--accent: hsl(25deg 90% 52%);--accent-hover: hsl(25deg 90% 44%);--accent-subtle: hsl(25deg 90% 52% / 0.08);--accent-2: hsl(350deg 75% 55%);--gradient: linear-gradient(135deg, hsl(25deg 90% 52%), hsl(350deg 75% 55%), hsl(330deg 65% 50%));--gradient-warm: linear-gradient(135deg, hsl(25deg 90% 52%), hsl(350deg 75% 55%));--hero-glow: hsl(25deg 90% 52% / 0.07);--shadow-sm: 0 1px 3px hsl(0deg 0% 0% / 0.08);--shadow-md: 0 4px 12px hsl(0deg 0% 0% / 0.1);--callout-info-bg: hsl(210deg 55% 50% / 0.07);--callout-info-border: hsl(210deg 55% 50% / 0.3);--callout-warn-bg: hsl(350deg 75% 55% / 0.07);--callout-warn-border: hsl(350deg 75% 55% / 0.3);--callout-tip-bg: hsl(25deg 85% 52% / 0.07);--callout-tip-border: hsl(25deg 85% 52% / 0.35)}@font-face{font-family:"Plus Jakarta Sans";src:url("/fonts/PlusJakartaSans-Variable.woff2") format("woff2");font-weight:200 800;font-display:swap;font-style:normal}@font-face{font-family:"Source Serif 4";src:url("/fonts/SourceSerif4-Variable-latin.woff2") format("woff2");font-weight:200 900;font-display:swap;font-style:normal;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Source Serif 4";src:url("/fonts/SourceSerif4-Variable-latin-ext.woff2") format("woff2");font-weight:200 900;font-display:swap;font-style:normal;unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"JetBrains Mono";src:url("/fonts/JetBrainsMono-Variable.woff2") format("woff2");font-weight:400;font-display:swap;font-style:normal}:root{--font-heading: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-body: "Source Serif 4", "Georgia", "Times New Roman", serif;--font-mono: "JetBrains Mono", "Fira Code", "Consolas", monospace;--text-xs: 0.75rem;--text-sm: 0.875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 2rem;--text-4xl: 2.5rem;--leading-tight: 1.25;--leading-normal: 1.7}body{font-family:var(--font-body);font-size:var(--text-base);line-height:var(--leading-normal);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading);line-height:var(--leading-tight);font-weight:700;color:var(--text)}h1{font-size:var(--text-4xl)}h2{font-size:var(--text-3xl)}h3{font-size:var(--text-2xl)}h4{font-size:var(--text-xl)}a{color:var(--accent);text-decoration:none;transition:color .15s ease}a:hover{color:var(--accent-hover)}code,pre{font-family:var(--font-mono)}:not(pre)>code{background:var(--bg-code);padding:.15em .4em;border-radius:var(--radius-sm);font-size:.9em;border:1px solid var(--border-light)}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{background:var(--bg);min-height:100vh;display:flex;flex-direction:column;transition:background-color .3s ease,color .3s ease}body::after{content:"";position:fixed;top:var(--sp-9);right:var(--sp-7);width:120px;height:120px;pointer-events:none;z-index:0;opacity:.04;transition:opacity .3s ease;background-size:contain;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2340e0a0' stroke-width='1' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z'/%3E%3C/svg%3E")}[data-theme=light] body::after{opacity:.08;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23e07020' stroke-width='1' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='5'/%3E%3Cline x1='12' y1='1' x2='12' y2='3'/%3E%3Cline x1='12' y1='21' x2='12' y2='23'/%3E%3Cline x1='4.22' y1='4.22' x2='5.64' y2='5.64'/%3E%3Cline x1='18.36' y1='18.36' x2='19.78' y2='19.78'/%3E%3Cline x1='1' y1='12' x2='3' y2='12'/%3E%3Cline x1='21' y1='12' x2='23' y2='12'/%3E%3Cline x1='4.22' y1='19.78' x2='5.64' y2='18.36'/%3E%3Cline x1='18.36' y1='5.64' x2='19.78' y2='4.22'/%3E%3C/svg%3E")}.container{width:100%;max-width:var(--content-width);margin:0 auto;padding:0 var(--sp-5)}.container--wide{max-width:var(--wide-width)}main{flex:1;padding-top:var(--sp-7);padding-bottom:var(--sp-9)}.nav{position:sticky;top:0;z-index:100;height:var(--nav-height);background:var(--bg);border-bottom:none;backdrop-filter:blur(12px);font-family:var(--font-heading);transition:background-color .3s ease}.nav::after{content:"";position:absolute;bottom:0;left:0;right:0;height:1px;background:var(--gradient);opacity:.3}.nav__inner{max-width:var(--wide-width);margin:0 auto;padding:0 var(--sp-5);height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-5)}.nav__brand{display:flex;align-items:center;gap:var(--sp-2);font-weight:700;font-size:var(--text-lg);color:var(--text);text-decoration:none;letter-spacing:-.02em}.nav__brand:hover{color:var(--accent)}.nav__logo{width:28px;height:21px;transition:color .15s ease}.nav__links{display:flex;align-items:center;gap:var(--sp-5);list-style:none;margin-left:auto}.nav__links a{color:var(--text-secondary);font-size:var(--text-sm);font-weight:500;text-decoration:none;transition:color .15s ease}.nav__links a:hover{color:var(--text)}.footer{border-top:1px solid var(--border-light);padding:var(--sp-7) 0;font-family:var(--font-heading);transition:border-color .3s ease}.footer__inner{max-width:var(--wide-width);margin:0 auto;padding:0 var(--sp-5);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--sp-4)}.footer__text{color:var(--text-tertiary);font-size:var(--text-sm)}.footer__links{display:flex;gap:var(--sp-4);list-style:none}.footer__links a{color:var(--text-tertiary);font-size:var(--text-sm)}.footer__links a:hover{color:var(--accent)}@media (max-width: 640px){h1{font-size:var(--text-3xl)}h2{font-size:var(--text-2xl)}h3{font-size:var(--text-xl)}main{padding-top:var(--sp-6);padding-bottom:var(--sp-7)}.nav{height:auto;padding:var(--sp-3) 0}.nav__inner{flex-wrap:wrap;gap:var(--sp-2)}.nav__brand{order:1}.nav .theme-toggle{order:2;margin-left:auto}.nav__links{order:3;width:100%;margin-left:0;gap:var(--sp-3)}}.theme-toggle{background:none;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--sp-2);cursor:pointer;color:var(--text-secondary);display:flex;align-items:center;justify-content:center;width:36px;height:36px;transition:color .15s ease,border-color .15s ease,background-color .15s ease}.theme-toggle:hover{color:var(--accent);border-color:var(--accent);background:var(--accent-subtle)}.theme-toggle svg{width:18px;height:18px}.post-card{display:block;padding:var(--sp-5);border-radius:var(--radius-md);border:1px solid var(--border-light);background:var(--bg-surface);text-decoration:none;font-family:var(--font-heading);transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease}.post-card:hover{border-color:var(--border);box-shadow:var(--shadow-md);transform:translateY(-2px);color:inherit}.post-card__date{font-size:var(--text-sm);color:var(--text-tertiary);margin-bottom:var(--sp-2)}.post-card__title{font-size:var(--text-xl);font-weight:700;color:var(--text);margin-bottom:var(--sp-2);line-height:var(--leading-tight)}.post-card__excerpt{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-normal);margin-bottom:var(--sp-4)}.post-card+.post-card{margin-top:var(--sp-4)}.tags{display:flex;flex-wrap:wrap;gap:var(--sp-2)}.tag{display:inline-block;padding:.15em .6em;background:var(--accent-subtle);color:var(--accent);font-family:var(--font-heading);font-size:var(--text-xs);font-weight:600;border-radius:9999px;text-decoration:none;text-transform:lowercase;transition:background-color .15s ease}.tag:hover{background:var(--accent);color:var(--bg)}.post-header{margin-bottom:var(--sp-7)}.post-header__title{margin-bottom:var(--sp-4)}.post-header__meta{display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;color:var(--text-tertiary);font-family:var(--font-heading);font-size:var(--text-sm)}.post-header__reading-time{display:flex;align-items:center;gap:var(--sp-1)}.post-header .tags{margin-top:var(--sp-4)}.prose h2{margin-top:var(--sp-8);margin-bottom:var(--sp-4);padding-bottom:var(--sp-2);border-bottom:1px solid var(--border-light)}.prose h3{margin-top:var(--sp-6);margin-bottom:var(--sp-3)}.prose p{margin-bottom:var(--sp-4)}.prose ul,.prose ol{margin-bottom:var(--sp-4);padding-left:var(--sp-5)}.prose ul li,.prose ol li{margin-bottom:var(--sp-2)}.prose blockquote{border-left:3px solid var(--accent);padding-left:var(--sp-4);margin:var(--sp-5) 0;color:var(--text-secondary);font-style:italic}.prose img{max-width:100%;border-radius:var(--radius-md);margin:var(--sp-5) 0}.prose hr{border:none;border-top:1px solid var(--border-light);margin:var(--sp-7) 0}.prose table{width:100%;border-collapse:collapse;margin:var(--sp-5) 0;font-size:var(--text-sm)}.prose table th,.prose table td{padding:var(--sp-3) var(--sp-4);border:1px solid var(--border);text-align:left}.prose table th{background:var(--bg-surface);font-weight:600}.callout{padding:var(--sp-4) var(--sp-5);border-radius:var(--radius-md);border-left:4px solid;margin:var(--sp-5) 0;font-size:var(--text-sm)}.callout--info{background:var(--callout-info-bg);border-color:var(--callout-info-border)}.callout--warn{background:var(--callout-warn-bg);border-color:var(--callout-warn-border)}.callout--tip{background:var(--callout-tip-bg);border-color:var(--callout-tip-border)}.callout__title{font-family:var(--font-heading);font-weight:700;margin-bottom:var(--sp-2)}.callout p:last-child{margin-bottom:0}.page-header{margin-bottom:var(--sp-7);font-family:var(--font-heading)}.page-header__title{margin-bottom:var(--sp-2)}.page-header__description{color:var(--text-secondary);font-size:var(--text-lg)}.tag-cloud{display:flex;flex-wrap:wrap;gap:var(--sp-3)}.tag-cloud .tag{font-size:var(--text-sm);padding:var(--sp-2) var(--sp-4)}.hero{padding:var(--sp-8) 0 var(--sp-7);font-family:var(--font-heading);position:relative}.hero::before{content:"";position:absolute;top:-20%;left:-10%;width:60%;height:140%;background:radial-gradient(ellipse, var(--hero-glow) 0%, rgba(0,0,0,0) 70%);pointer-events:none;z-index:-1}.hero__greeting{font-size:var(--text-lg);color:var(--accent);font-weight:600;margin-bottom:var(--sp-3)}.hero__title{font-size:var(--text-4xl);font-weight:800;margin-bottom:var(--sp-4);letter-spacing:-.03em;background:var(--gradient-warm);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0)}.hero__description{font-size:var(--text-lg);color:var(--text-secondary);max-width:560px;line-height:var(--leading-normal)}.project-grid{display:grid;gap:var(--sp-5)}.project-card{padding:var(--sp-5) var(--sp-6);border-radius:var(--radius-md);border:1px solid var(--border-light);background:var(--bg-surface);transition:border-color .2s ease,box-shadow .2s ease}.project-card:hover{border-color:var(--border);box-shadow:var(--shadow-md)}.project-card__header{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-3)}.project-card__name{font-size:var(--text-xl);font-weight:700}.project-card__name a{color:var(--text);text-decoration:none;transition:color .15s ease}.project-card__name a:hover{color:var(--accent)}.project-card__language{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--accent);background:var(--accent-subtle);padding:.15em .6em;border-radius:9999px;white-space:nowrap}.project-card__description{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-normal);margin-bottom:var(--sp-4)}.project-card__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap}.project-card__links{display:flex;align-items:center;gap:var(--sp-3)}.project-card__links a{color:var(--text-tertiary);transition:color .15s ease}.project-card__links a:hover{color:var(--accent)}.section-title{font-size:var(--text-2xl);margin-bottom:var(--sp-5);display:flex;align-items:center;gap:var(--sp-3)}.section-title::after{content:"";flex:1;height:1px;background:var(--gradient);opacity:.4}pre{background:var(--bg-code);border:1px solid var(--border-light);border-radius:var(--radius-md);padding:var(--sp-4) var(--sp-5);overflow-x:auto;margin:var(--sp-5) 0;font-size:var(--text-sm);line-height:1.6;position:relative;tab-size:4}pre code{background:none;padding:0;border:none;font-size:inherit}pre[data-lang]{padding-top:var(--sp-7)}pre[data-lang]::before{content:attr(data-lang);position:absolute;top:0;left:var(--sp-4);padding:var(--sp-1) var(--sp-3);font-size:var(--text-xs);font-family:var(--font-body);font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.05em;background:var(--bg-surface);border-radius:0 0 var(--radius-sm) var(--radius-sm);border:1px solid var(--border-light);border-top:none}.code-copy{position:absolute;top:var(--sp-2);right:var(--sp-2);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-1) var(--sp-2);cursor:pointer;color:var(--text-tertiary);font-size:var(--text-xs);font-family:var(--font-body);opacity:0;transition:opacity .15s ease,color .15s ease}.code-copy:hover{color:var(--accent)}pre:hover .code-copy{opacity:1}.z-comment{color:#676f7e;font-style:italic}.z-keyword{color:#c886ea}.z-string{color:#97d279}.z-number{color:#f2b25a}.z-function{color:#7dc4e8}.z-type{color:#f0d175}.z-variable{color:#dddfe3}.z-operator{color:#70c9db}.z-punctuation{color:#8f96a3}.z-attribute{color:#5cd6ad}.z-tag{color:#e48191}.z-constant{color:#f2b25a}.z-builtin{color:#e48191}.z-meta{color:#8f96a3}[data-theme=light] pre{background:#231c1a;border-color:#322c29;color:#ddd9d4}[data-theme=light] pre code{color:#ddd9d4}[data-theme=light] :not(pre)>code{background:var(--bg-code);color:var(--text);border-color:var(--border-light)}[data-theme=light] pre[data-lang]::before{background:#2e2624;border-color:#38302e;color:#847a71}[data-theme=light] .code-copy{background:#2e2624;border-color:#3e3532;color:#847a71}[data-theme=light] .z-comment{color:#7c736a}[data-theme=light] .z-keyword{color:#c68de2}[data-theme=light] .z-string{color:#edb25e}[data-theme=light] .z-number{color:#f2995a}[data-theme=light] .z-function{color:#dd8d88}[data-theme=light] .z-type{color:#ebcc70}[data-theme=light] .z-variable{color:#ddd9d4}[data-theme=light] .z-operator{color:#79c4d2}[data-theme=light] .z-punctuation{color:#9c948b}[data-theme=light] .z-attribute{color:#6ca}[data-theme=light] .z-tag{color:#e08594}[data-theme=light] .z-constant{color:#f2995a}[data-theme=light] .z-builtin{color:#e08594}[data-theme=light] .z-meta{color:#9c948b}