:root{--ctp-rosewater: #f5e0dc;--ctp-flamingo: #f2cdcd;--ctp-pink: #f5c2e7;--ctp-mauve: #cba6f7;--ctp-red: #f38ba8;--ctp-maroon: #eba0ac;--ctp-peach: #fab387;--ctp-yellow: #f9e2af;--ctp-green: #a6e3a1;--ctp-teal: #94e2d5;--ctp-sky: #89dceb;--ctp-sapphire: #74c7ec;--ctp-blue: #89b4fa;--ctp-lavender: #b4befe;--ctp-text: #cdd6f4;--ctp-subtext1: #bac2de;--ctp-subtext0: #a6adc8;--ctp-overlay2: #9399b2;--ctp-overlay1: #7f849c;--ctp-overlay0: #6c7086;--ctp-surface2: #585b70;--ctp-surface1: #45475a;--ctp-surface0: #313244;--ctp-base: #1e1e2e;--ctp-mantle: #181825;--ctp-crust: #11111b;color-scheme:dark;--font-color: var(--ctp-text);--heading-color: var(--ctp-lavender);--dark-font-color: var(--ctp-text);--medium-font-color: var(--ctp-subtext1);--light-font-color: var(--ctp-subtext0);--background: var(--ctp-base);--light-background: var(--ctp-mantle);--light-background-hover: var(--ctp-surface0);--border: var(--ctp-surface0);--link-color: var(--ctp-sapphire);--link-hover-color: var(--ctp-mauve);--navbar-color: var(--ctp-base);--blockquote-bg: var(--ctp-mantle);--blockquote-border: var(--ctp-mauve);--accent-primary: var(--ctp-mauve);--accent-secondary: var(--ctp-teal);--input-color: var(--ctp-text);--font-sans: "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;--font-mono: "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", 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: 1.875rem;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--font-bold: 700}@font-face{font-family:"Geist";font-style:normal;font-weight:100 900;font-display:swap;src:url("/fonts/Geist-Variable.woff2") format("woff2-variations"),url("/fonts/Geist-Variable.woff2") format("woff2")}@font-face{font-family:"Geist Mono";font-style:normal;font-weight:100 900;font-display:swap;src:url("/fonts/GeistMono-Variable.woff2") format("woff2-variations"),url("/fonts/GeistMono-Variable.woff2") format("woff2")}*,*::before,*::after{box-sizing:border-box}*{margin:0;padding:0}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:5rem}@media(prefers-reduced-motion: reduce){html{scroll-behavior:auto}}body{min-height:100vh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--font-sans);font-weight:400;font-size:1rem;line-height:1.75;color:var(--font-color);background:var(--background)}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit;color:inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}ul,ol{list-style:none}button{background:none;border:none;cursor:pointer}a{color:var(--link-color);text-decoration:none;font-weight:600;border-bottom:2px solid rgba(0,0,0,0)}a:hover{border-bottom-color:currentColor;color:var(--link-hover-color)}:focus-visible{outline:2px solid var(--accent-primary);outline-offset:2px}::selection{background:var(--ctp-mauve);color:var(--ctp-base)}.skip-link{position:absolute;top:-100%;left:50%;transform:translateX(-50%);z-index:9999;padding:.5rem 1.5rem;background:var(--accent-primary);color:var(--ctp-base);font-weight:600;border-radius:0 0 8px 8px;transition:top .2s;white-space:nowrap}.skip-link:focus{top:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--ctp-surface0)}::-webkit-scrollbar-thumb{background:var(--ctp-surface2);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--ctp-overlay0)}*{scrollbar-width:thin;scrollbar-color:var(--ctp-surface2) var(--ctp-surface0)}p,ol,ul,dl,table,blockquote{font-size:1.05rem;margin:0 0 1.5rem}ul{padding:0 1rem;list-style-type:disc}ol{padding:0 1rem;list-style-type:decimal}li{margin-bottom:.5rem;line-height:1.625}ul li p{margin:0}ul li ul{padding-left:1rem;margin:0}blockquote{margin:2rem 0;padding:1rem;background:var(--blockquote-bg);border-left:5px solid var(--blockquote-border);font-weight:400}blockquote p{margin:0}code:not(pre code){font-family:var(--font-mono);font-size:.9em;padding:.2em .4em;background:var(--ctp-mantle);border-radius:4px;color:var(--ctp-mauve)}kbd{font-family:var(--font-mono);font-size:.85em;padding:.2em .5em;background:var(--ctp-surface0);border:1px solid var(--border);border-radius:4px;box-shadow:0 2px 0 var(--border)}hr{margin:2rem 0;border:none;height:1px;background:linear-gradient(to right, transparent, var(--border), transparent)}table{width:100%;margin:1.5rem 0;border-collapse:collapse;font-size:var(--text-sm)}th,td{padding:.75rem 1rem;text-align:left;border-bottom:1px solid var(--border)}th{font-weight:var(--font-semibold);background:var(--ctp-surface0)}tr:hover td{background:var(--ctp-mantle)}img{border-radius:8px;display:inline-block;max-width:100%;height:auto}figure{margin:1.5rem 0}figure figcaption{font-size:var(--text-sm);color:var(--light-font-color);text-align:center;margin-top:.5rem}mark{background:rgba(249,226,175,.3);color:inherit;padding:.1em .3em;border-radius:2px}sup,sub{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}@media screen and (min-width: 800px){p,ol,ul,dl,table,blockquote{font-size:1.125rem}ul{padding:0 2rem}blockquote{padding:2rem 0 2rem 2rem}}.container{max-width:830px;padding:0 1.5rem;margin-left:auto;margin-right:auto}@media screen and (min-width: 800px){.container{padding:0 2rem}}.navbar{width:100%;position:sticky;top:0;background:var(--ctp-base);z-index:60;padding:.75rem .5rem;border-bottom:1px solid var(--border)}.navbar .flex{display:flex;justify-content:space-between;align-items:center}.navbar .nav-links{display:none}.navbar a{border-radius:.35rem;color:var(--font-color);font-weight:500;font-size:.9rem;border:1px solid rgba(0,0,0,0);padding:.5rem .65rem;background:rgba(0,0,0,0)}.navbar a:first-of-type{margin-left:-0.5rem}.navbar a.brand{font-weight:500;color:var(--font-color);white-space:nowrap;border:none;display:flex;align-items:center;gap:.5rem;line-height:1;background:rgba(0,0,0,0);padding:.25rem}.navbar a.brand .brand-logo{height:28px;width:28px;border-radius:6px;object-fit:contain}.navbar a.brand .brand-text{font-weight:600;letter-spacing:-0.01em}@media screen and (min-width: 800px){.navbar{padding:1rem 0;background:var(--ctp-base)}.navbar .flex{max-width:830px;padding:0 2rem;margin:0 auto}.navbar .nav-links{display:flex;align-items:center}.navbar a{padding:.75rem 1.25rem;margin:0 .25rem;font-size:1.2rem;font-weight:400}.navbar a:first-of-type{margin-left:-1.5rem}.navbar a:hover{background:var(--light-background);color:var(--dark-font-color)}.navbar a[aria-current=page]{background:var(--light-background);border-bottom:2px solid var(--accent-primary)}.navbar a.brand{font-size:1.3rem;margin-right:3rem;border:none;background:rgba(0,0,0,0) !important}.navbar a.brand:hover{background:var(--light-background) !important}.navbar a.brand .brand-logo{height:32px;width:32px}.navbar a.brand .brand-text{font-weight:700}}@media print{.navbar{display:none}}.mobile-menu-button{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;background:var(--light-background);color:var(--font-color);transition:all .2s}.mobile-menu-button:hover{background:var(--light-background-hover)}.mobile-menu-button:active{transform:scale(0.95)}.mobile-menu-button .menu-icon{display:block}.mobile-menu-button .close-icon{display:none}.mobile-menu-button[aria-expanded=true] .menu-icon{display:none}.mobile-menu-button[aria-expanded=true] .close-icon{display:block}@media screen and (min-width: 800px){.mobile-menu-button{display:none}}.mobile-menu-overlay{position:fixed;inset:0;background:var(--background);z-index:50;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1)}.mobile-menu-overlay.active{opacity:1;visibility:visible}.mobile-menu-content{display:flex;flex-direction:column;align-items:center;gap:.5rem;transform:translateY(20px);opacity:0;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);transition-delay:.1s}.mobile-menu-overlay.active .mobile-menu-content{transform:translateY(0);opacity:1}.mobile-menu-content a{font-size:1.5rem;font-weight:500;color:var(--font-color);padding:1rem 2rem;border-radius:12px;border:none;transition:all .2s}.mobile-menu-content a:hover{background:var(--light-background);color:var(--accent-primary)}@media screen and (min-width: 800px){.mobile-menu-overlay{display:none}}.search-toggle{display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;background:rgba(0,0,0,0);border:none;color:var(--font-color);border-radius:10px;cursor:pointer;transition:all .2s}.search-toggle svg{width:20px;height:20px}.search-toggle:hover{background:var(--light-background)}@media screen and (min-width: 800px){.search-toggle:not(.mobile-search-toggle){width:48px;height:48px;border:2px solid var(--border);border-radius:50%;background:var(--light-background)}.search-toggle:not(.mobile-search-toggle):hover{border-color:var(--accent-primary);transform:scale(1.05)}}.mobile-search-toggle{display:flex;align-items:center;gap:1rem;margin-top:2rem;padding:1rem 1.5rem;width:auto;height:auto;border:2px solid var(--border);border-radius:16px;background:var(--light-background)}.mobile-search-toggle svg{width:24px;height:24px}.mobile-search-toggle .search-label{font-size:1rem;font-weight:500;color:var(--font-color)}.search-overlay{position:fixed;inset:0;background:rgba(0,0,0,.7);backdrop-filter:blur(8px);display:flex;align-items:flex-start;justify-content:center;padding:10vh 1rem 1rem;opacity:0;visibility:hidden;transition:all .3s;z-index:1000}.search-overlay.open{opacity:1;visibility:visible}.search{width:100%;max-width:600px;background:var(--background);border:1px solid var(--border);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,.25);overflow:hidden;transform:translateY(-20px) scale(0.95);transition:transform .3s cubic-bezier(0.34, 1.56, 0.64, 1)}.search-overlay.open .search{transform:translateY(0) scale(1)}.search__input-wrapper{display:flex;align-items:center;padding:1rem 1.25rem;border-bottom:1px solid var(--border)}.search__icon{flex-shrink:0;margin-right:.75rem;color:var(--font-color);opacity:.5}.search__icon svg{width:20px;height:20px}.search__input{flex:1;font-size:1rem;background:none;border:none;color:var(--font-color);outline:none}.search__input::placeholder{color:var(--font-color);opacity:.5}.search__shortcut{display:none;padding:.25rem .5rem;font-family:var(--font-mono);font-size:.75rem;color:var(--font-color);opacity:.5;background:var(--light-background);border:1px solid var(--border);border-radius:4px}@media(min-width: 768px){.search__shortcut{display:block}}.search__close{display:flex;align-items:center;justify-content:center;width:32px;height:32px;margin-left:.5rem;color:var(--font-color);opacity:.5;background:rgba(0,0,0,0);border:none;border-radius:6px;cursor:pointer}.search__close svg{width:18px;height:18px}.search__close:hover{background:var(--light-background);opacity:1}.search__results{max-height:60vh;overflow-y:auto}.search__result{display:block;padding:1rem 1.25rem;color:var(--font-color);text-decoration:none;transition:background .15s;border:none;font-weight:400}.search__result:hover{background:var(--light-background)}.search__result.selected{background:rgba(203,166,247,.1)}.search__result-title{font-weight:600;margin-bottom:.25rem}.search__result-title mark{background:rgba(249,226,175,.4);color:inherit;padding:0 .15em;border-radius:2px}.search__result-path{font-size:.875rem;color:var(--font-color);opacity:.6}.search__result-preview{font-size:.875rem;color:var(--font-color);opacity:.8;margin-top:.5rem;line-height:1.5}.search__result-preview mark{background:rgba(249,226,175,.3);color:inherit}.search__no-results{padding:2rem 1.25rem;text-align:center;color:var(--font-color);opacity:.6}.search__footer{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;border-top:1px solid var(--border);font-size:.75rem;color:var(--font-color);opacity:.5}.search__hints{display:flex;gap:1rem}.search__hint{display:flex;align-items:center;gap:.4rem}.search__hint kbd{padding:.15rem .4rem;font-size:.65rem;background:var(--light-background);border:1px solid var(--border);border-radius:3px}.hero{margin:3rem 0;padding-bottom:0}.hero p{font-size:1.25rem;line-height:1.6;margin-bottom:.75rem;color:var(--font-color);max-width:800px;font-weight:400}.hero p:first-of-type{font-weight:600;color:var(--heading-color)}.hero .hero-meta{margin-top:1rem}.hero .hero-meta .bio-social{display:flex;gap:1rem}.hero .hero-meta .bio-social a{color:var(--font-color);opacity:.8;border:none;font-weight:400}.hero .hero-meta .bio-social a:hover{color:var(--accent-primary);opacity:1;transform:translateY(-2px)}@media screen and (min-width: 800px){.hero{margin:4rem 0 3rem}.hero p{font-size:1.4rem}.hero .hero-meta{margin-top:1rem}.hero .hero-meta .bio-social{gap:1.5rem}}.section{margin:2rem 0}.section:first-of-type{margin-top:0}.section__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.section__title{font-size:1.6rem;font-weight:var(--font-semibold);margin:0;color:var(--font-color);border-bottom:none}@media screen and (min-width: 800px){.section{margin:3.5rem 0}.section__title{font-size:2rem}}.view-all-link{display:inline-block;margin-top:0;padding:.75rem 1.5rem;font-weight:500;color:var(--accent-primary);background:var(--light-background);border-radius:999px;border:none;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1)}.view-all-link:hover{background:var(--accent-primary);color:var(--background);transform:translateY(-2px);box-shadow:0 4px 12px rgba(203,166,247,.15)}.post-row{display:flex;align-items:center;width:100%}.post-row time{display:block;flex:0 0 100px;font-size:.85rem;color:var(--font-color);opacity:.7;font-variant-numeric:tabular-nums}.post-row h3{flex:1}.posts .post:last-of-type a{border-bottom-width:0}.post a{display:flex;flex-direction:column;padding:1rem 0;border-bottom:1px solid rgba(0,0,0,.04);transition:all .2s cubic-bezier(0.4, 0, 0.2, 1);border-left:none;border-right:none;border-top:none;font-weight:400}.post a:hover{transform:translateX(4px)}.post h3{margin:0;font-size:1.05rem;font-weight:500;color:var(--heading-color)}@media screen and (min-width: 800px){.post a{padding:1.25rem 1rem;border-radius:12px}.post a:hover{background:var(--light-background);border-bottom-color:rgba(0,0,0,0)}.post h3{font-size:1.2rem}.post-row time{flex:0 0 110px;font-size:.9rem}}.tag{display:inline-block;padding:.35rem .85rem;font-size:.75rem;font-weight:500;background:var(--light-background);border:none;border-radius:999px;color:var(--font-color);text-decoration:none;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);opacity:.85}.tag:hover{background:var(--accent-primary);color:var(--background);opacity:1;transform:translateY(-1px)}.post-tags{display:flex;gap:.5rem;margin-top:.5rem;flex-wrap:wrap}.blog-header{padding:2rem 0;border-bottom:4px solid var(--border);text-align:center}.blog-header__title{font-size:var(--text-2xl);font-weight:var(--font-bold);color:var(--font-color);margin-bottom:.5rem}.blog-header__description{font-size:var(--text-lg);color:var(--light-font-color);max-width:600px;margin:0 auto}.blog-posts{margin:0}.blog-card{padding:2rem;margin-bottom:1.5rem;background:var(--ctp-surface0);border-radius:12px;border:1px solid var(--ctp-surface1);transition:all .2s ease}.blog-card:hover{border-color:var(--ctp-mauve);transform:translateY(-2px)}.blog-card__title{font-size:1.5rem;font-weight:600;margin:0 0 .75rem;border-bottom:none;padding-bottom:0}.blog-card__title a{color:var(--ctp-text);text-decoration:none;border:none}.blog-card__title a:hover{color:var(--ctp-mauve)}.blog-card__description{color:var(--ctp-subtext0);line-height:1.6;margin-bottom:1rem}.blog-card__meta{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;font-size:.875rem;color:var(--ctp-subtext1)}.blog-card__meta time{color:var(--ctp-subtext0)}.blog-card__tags{display:flex;gap:.5rem;flex-wrap:wrap}@media screen and (min-width: 800px){.blog-header__title{font-size:var(--text-3xl)}}.pagination{display:flex;justify-content:center;align-items:center;gap:2rem;padding:3rem 0}.pagination__link{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:999px;font-weight:500;color:var(--accent-primary);background:var(--light-background);border:none;transition:all .3s}.pagination__link:hover{background:var(--accent-primary);color:var(--background);transform:translateY(-2px)}.pagination__link svg{width:20px;height:20px}.pagination__info{font-size:var(--text-sm);color:var(--light-font-color)}.article-header{padding-top:2rem;margin-bottom:.5rem}.article-header .thumb{display:flex;flex-direction:column}.article-header h1{font-weight:700;font-size:1.8rem;margin:0}.post-meta{margin-top:1rem;color:var(--light-font-color);font-size:.9rem}.post-meta a{color:var(--font-color);border-width:0;font-weight:500}.post-meta time{font-size:.9rem}.post-meta .meta-line{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.post-meta .meta-line .author{font-weight:600}.post-meta .meta-line .separator{opacity:.5}.post-meta .meta-line .reading-time{font-family:var(--font-mono);font-size:.85rem}.post-meta .article-taxonomies{margin-top:1rem;display:flex;gap:1rem;flex-wrap:wrap}.post-meta .tags{display:flex;gap:.5rem;flex-wrap:wrap}.post-meta .tags a{text-decoration:none}.article-post{margin-bottom:2rem;font-family:var(--font-sans)}.article-post img{border-radius:5px;display:block;margin:0 auto}.article-post a{color:var(--link-color);text-decoration:none;border:none;box-shadow:none;transition:color .2s}.article-post a:hover{color:var(--ctp-mauve);box-shadow:none}.article-post code{overflow-x:auto}.article-post h1,.article-post h2,.article-post h3,.article-post h4,.article-post h5,.article-post h6{position:relative}.article-post h1 .anchor,.article-post h2 .anchor,.article-post h3 .anchor,.article-post h4 .anchor,.article-post h5 .anchor,.article-post h6 .anchor{position:absolute;left:-2.5rem;top:50%;transform:translateY(-50%);color:var(--accent-primary);font-weight:600;opacity:0;transition:all .2s;padding:.25rem .5rem;border-radius:6px;font-size:.9em;border:none;box-shadow:none}.article-post h1 .anchor::before,.article-post h2 .anchor::before,.article-post h3 .anchor::before,.article-post h4 .anchor::before,.article-post h5 .anchor::before,.article-post h6 .anchor::before{content:"#"}.article-post h1 .anchor:hover,.article-post h2 .anchor:hover,.article-post h3 .anchor:hover,.article-post h4 .anchor:hover,.article-post h5 .anchor:hover,.article-post h6 .anchor:hover{background:var(--light-background);opacity:1 !important;box-shadow:none}.article-post h1:hover .anchor,.article-post h2:hover .anchor,.article-post h3:hover .anchor,.article-post h4:hover .anchor,.article-post h5:hover .anchor,.article-post h6:hover .anchor{opacity:.6}.article-post .highlight{position:relative;margin:1.5rem 0;border-radius:8px;overflow:hidden;background:var(--ctp-mantle)}.article-post .highlight pre{margin:0;padding:1rem;overflow-x:auto;font-family:var(--font-mono);font-size:.875rem;line-height:1.6;background:rgba(0,0,0,0) !important}.article-post .highlight code{background:rgba(0,0,0,0);color:inherit;padding:0;font-size:inherit}.article-post .highlight table{width:100%;margin:0;border-collapse:collapse}.article-post .highlight table td{padding:0;border:none}.article-post .highlight table td:first-child pre{padding-right:.5rem;color:var(--ctp-overlay0);user-select:none}.article-post .highlight table tr:hover td{background:rgba(0,0,0,0)}.post-thumbnail{display:block !important;width:100%;height:auto;margin:1.5rem 0;border-radius:8px}@media screen and (min-width: 800px){.article-post{margin-bottom:3rem}.post-meta{margin-top:.5rem;padding:.5rem 0}.article-header{padding-top:3rem}.article-header h1{font-size:2.5rem}.article-header .thumb{flex-direction:row}}.suggested{display:flex;flex-direction:column;gap:1rem;margin:3rem 0;padding:0}.suggested a{display:block;padding:1rem;background:var(--light-background);border-radius:8px;border:none;font-weight:400;transition:all .2s}.suggested a span{font-size:.85rem;color:var(--light-font-color)}.suggested a strong{display:block;margin-top:.25rem;color:var(--heading-color);font-weight:600}.suggested a:hover{background:var(--light-background-hover);transform:translateY(-2px)}@media screen and (min-width: 600px){.suggested{flex-direction:row;justify-content:space-between}.suggested a{flex:1;max-width:48%}}.taxonomy-list,.taxonomy-single{padding:2rem 0}.taxonomy-list__items{display:flex;flex-wrap:wrap;gap:.75rem;margin:2rem 0}.taxonomy-item{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:var(--light-background);border-radius:999px;color:var(--font-color);font-size:.9rem;font-weight:500;border:none;transition:all .2s}.taxonomy-item:hover{background:var(--accent-primary);color:var(--background);transform:translateY(-1px)}.taxonomy-item .taxonomy-item__count{background:var(--background);padding:0 .5rem;border-radius:999px;font-size:.7rem;min-width:1.5em;text-align:center}.taxonomy-item:hover .taxonomy-item__count{background:var(--ctp-base)}.project-card__main{display:flex;gap:1.5rem;align-items:flex-start}.project-card__text{flex:1;min-width:0}.project-card__image{flex-shrink:0}.project-card__image img{width:80px;height:80px;object-fit:contain;border-radius:8px;background:var(--ctp-surface0);padding:.25rem}@media screen and (min-width: 800px){.project-card__image img{width:128px;height:128px}}.project-card__code{display:inline-flex;align-items:center;gap:.4rem;margin-top:.75rem;padding:.35rem .85rem;font-size:.8rem;font-weight:500;color:var(--accent-primary);background:var(--ctp-surface0);border:1px solid var(--ctp-surface1);border-radius:999px;text-decoration:none;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1)}.project-card__code:hover{background:var(--accent-primary);color:var(--background);border-color:var(--accent-primary);box-shadow:0 4px 12px rgba(203,166,247,.15)}.project-card__code svg{width:14px;height:14px}.project-card__active{display:inline-block;padding:.15rem .6rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ctp-green);background:rgba(166,227,161,.1);border-radius:999px;margin-left:.5rem}.footer{margin-top:4rem;padding:2rem 0;border-top:1px solid var(--border)}.footer__inner{display:flex;justify-content:space-between;align-items:center}.footer__copyright{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--light-font-color)}.footer__copyright span{white-space:nowrap}.footer__cc{display:flex;color:var(--light-font-color);border:none}.footer__cc:hover{color:var(--accent-primary)}.footer__cc svg{width:18px;height:18px}.footer__social{display:flex;gap:1rem}.footer__social a{color:var(--light-font-color);opacity:.8;border:none;font-weight:400;transition:all .2s}.footer__social a:hover{color:var(--accent-primary);opacity:1}.footer__social a svg{width:18px;height:18px}.error-page{display:flex;align-items:center;justify-content:center;min-height:60vh;text-align:center;flex-direction:column;padding:4rem 1rem}.error-page__code{font-size:8rem;font-weight:700;line-height:1;background:linear-gradient(135deg, var(--ctp-mauve), var(--ctp-pink));-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text;margin-bottom:1rem}.error-page__message{font-size:var(--text-2xl);font-weight:var(--font-semibold);margin-bottom:.5rem}.error-page__hint{color:var(--ctp-subtext1);margin-bottom:2rem}.scroll-to-top,.fab.scroll-to-top{position:fixed;right:1.5rem;bottom:1.5rem;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:var(--light-background);color:var(--font-color);border:1px solid var(--border);border-radius:50%;opacity:0;visibility:hidden;transform:translateY(20px);transition:all .3s cubic-bezier(0.34, 1.56, 0.64, 1);z-index:50;box-shadow:0 4px 12px rgba(0,0,0,.25)}.scroll-to-top.visible,.fab.scroll-to-top.visible{opacity:1;visibility:visible;transform:translateY(0)}.scroll-to-top:hover,.fab.scroll-to-top:hover{background:var(--accent-primary);color:var(--background);transform:translateY(-2px)}.scroll-to-top svg,.fab.scroll-to-top svg{width:20px;height:20px}.aside{position:relative;margin:2rem 0;padding:1.25rem 1.25rem .5rem;border:1px solid var(--border);border-left-width:4px;border-radius:8px;background:var(--light-background)}.aside__label{position:absolute;top:-0.7rem;left:1rem;padding:.15rem .6rem;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;border-radius:4px;color:var(--ctp-base)}.aside__body p:last-child{margin-bottom:.75rem}.aside--note{border-left-color:var(--ctp-teal)}.aside--note .aside__label{background:var(--ctp-teal)}.aside--tip{border-left-color:var(--ctp-green)}.aside--tip .aside__label{background:var(--ctp-green)}.aside--warning{border-left-color:var(--ctp-yellow)}.aside--warning .aside__label{background:var(--ctp-yellow)}.aside--caution{border-left-color:var(--ctp-red)}.aside--caution .aside__label{background:var(--ctp-red)}.aside--important{border-left-color:var(--ctp-mauve)}.aside--important .aside__label{background:var(--ctp-mauve)}.article-image{margin:1.5rem 0;text-align:center}.article-image img{border-radius:8px;height:auto;max-width:100%}.article-image figcaption{margin-top:.5rem;font-size:.875rem;color:var(--light-font-color)}.chroma{background-color:rgba(0,0,0,0);color:var(--ctp-text)}.chroma .err{color:var(--ctp-red)}.chroma .lntd{vertical-align:top;padding:0}.chroma .lntable{border-collapse:collapse;width:100%}.chroma .ln,.chroma .lnt{color:var(--ctp-overlay0);padding-right:.75rem;user-select:none}.chroma .hl{background-color:rgba(203,166,247,.12);display:block}.chroma .k,.chroma .kc,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr,.chroma .kt{color:var(--ctp-mauve)}.chroma .n{color:var(--ctp-text)}.chroma .na{color:var(--ctp-blue)}.chroma .nb{color:var(--ctp-peach)}.chroma .nc{color:var(--ctp-yellow)}.chroma .nd{color:var(--ctp-peach)}.chroma .nf,.chroma .fm{color:var(--ctp-blue)}.chroma .nt{color:var(--ctp-mauve)}.chroma .nv{color:var(--ctp-text)}.chroma .s,.chroma .s1,.chroma .s2,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .se,.chroma .sh,.chroma .si,.chroma .sx,.chroma .sr,.chroma .ss{color:var(--ctp-green)}.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo,.chroma .il{color:var(--ctp-peach)}.chroma .o,.chroma .ow{color:var(--ctp-sky)}.chroma .p{color:var(--ctp-overlay2)}.chroma .c,.chroma .ch,.chroma .cm,.chroma .c1,.chroma .cs,.chroma .cp,.chroma .cpf{color:var(--ctp-overlay1);font-style:italic}.chroma .gd{color:var(--ctp-red)}.chroma .gi{color:var(--ctp-green)}.chroma .gh{color:var(--ctp-blue);font-weight:bold}.chroma .gu{color:var(--ctp-sapphire);font-weight:bold}.chroma .gs{font-weight:bold}.chroma .ge{font-style:italic}.cv{max-width:700px;margin:auto;text-align:left;line-height:1.6;color:var(--ctp-text)}h1.cv{text-align:center;line-height:1.2;font-weight:700;font-size:2rem;border-bottom:none;padding-bottom:0;margin-top:4rem;margin-bottom:.5rem}.cv-contact{text-align:center;opacity:.8;padding-top:6px;padding-bottom:6px;border-top:1px solid var(--border);font-size:.9rem}.cv-contact .column{float:left;width:33.33%}.cv-contact svg{display:inline-block;vertical-align:-0.125em;margin-right:.3em}.cv-contact::after{content:"";display:table;clear:both}.cv-links{text-align:center;opacity:.8;padding-top:0;padding-bottom:6px;font-size:.9rem}.cv-links .column{float:left;width:50%}.cv-links svg{display:inline-block;vertical-align:-0.125em;margin-right:.3em}.cv-links a{color:inherit;text-decoration:none;border:none;font-weight:400}.cv-links a:hover{color:var(--accent-primary)}.cv-links::after{content:"";display:table;clear:both}.cv svg{display:inline-block;vertical-align:-0.125em;width:1em;height:1em}.cv>.content>h2{font-weight:600;margin-top:1.5em;margin-bottom:min(1em,12px);line-height:normal;border-bottom:none;padding-bottom:0}.cv>.content>h3{font-weight:400;margin-bottom:0;padding-top:24px;line-height:normal}.cv>.content>h4{font-size:1.125rem;font-weight:400;margin-top:1.125rem;margin-bottom:0;line-height:normal}.cv>.content>p{margin-top:0;margin-bottom:0}.cv>.content>ul{margin-top:0;margin-left:0;padding-top:min(.5em,6px);padding-left:1.25em;list-style-type:disc;list-style-position:outside}.cv>.content>ul>li{padding-left:1em;display:list-item}.cv table{width:100%;border-collapse:collapse;margin:1em 0}.cv td,.cv th{padding:.5em;text-align:left}.cv thead tr{border-bottom:2px solid rgba(161,161,170,.3)}.cv tbody tr{border-top:1px solid rgba(161,161,170,.2)}.cv a{color:var(--link-color);text-decoration:none;border:none}.cv a:hover{color:var(--accent-primary)}.cv strong{font-weight:bold}@media(max-width: 768px){.cv-contact{padding-bottom:0}.cv-contact .column{float:none;width:100%;margin-bottom:.15em}.cv-contact .column:nth-child(3){display:none}.cv-links .column{float:none;width:100%;margin-bottom:.15em}}@media print{@page{margin:2.5cm;size:A4}.navbar,.footer,.scroll-to-top,.fab,.search-overlay,.mobile-menu-overlay,.mobile-menu-button,.skip-link{display:none !important;height:0 !important;overflow:hidden !important}a.anchor,a.anchor svg{display:none !important}html{font-size:10pt !important}body{font-size:10pt !important;line-height:1.2 !important;color:#000 !important;background:#fff !important;margin:0 !important;padding:0 !important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif !important}main,.container,.cv,.content{max-width:100% !important;width:100% !important;margin:0 !important;padding:0 !important}.cv{text-align:justify !important;line-height:1.2 !important}p,li,td,th,span,time,strong,em,a,h1,h2,h3,h4,h5,h6{color:#000 !important}h1,h1.cv{font-size:20pt !important;font-weight:700 !important;text-align:center !important;margin:2pt 0 4pt !important;padding:0 0 4pt !important;border:none !important;line-height:1.1 !important;page-break-after:avoid}h2{font-size:13pt !important;font-weight:600 !important;margin:10pt 0 3pt !important;padding:0 !important;border:none !important;line-height:1.1 !important;letter-spacing:.03em !important;page-break-after:avoid}h3{font-size:10.5pt !important;font-weight:400 !important;margin:8pt 0 0 !important;padding:0 !important;line-height:1.1 !important;page-break-after:avoid}h4{font-size:9.5pt !important;font-weight:400 !important;margin:8pt 0 0 !important;padding:0 !important;line-height:1.1 !important;page-break-after:avoid}p{font-size:10pt !important;margin:0 !important;padding:0 !important;line-height:1.2 !important}strong{font-weight:bold !important}ul{font-size:10pt !important;margin:3pt 0 8pt 6pt !important;padding-left:12pt !important;line-height:1.2 !important;list-style-type:disc !important}li{font-size:10pt !important;margin-bottom:0 !important;padding-left:6pt !important;line-height:1.2 !important;display:list-item !important}.cv-contact{opacity:1 !important;text-align:center !important;padding:3pt 0 6pt !important;border-top:1px solid #000 !important;font-size:9pt !important;line-height:1.3 !important;page-break-inside:avoid}.cv-contact .column{float:left !important;width:33.33% !important;display:block !important}.cv-contact::after{content:"";display:table;clear:both}.cv-links{opacity:1 !important;text-align:center !important;padding:2pt 30pt 14pt !important;font-size:9pt !important;line-height:1.3 !important;page-break-inside:avoid}.cv-links .column{float:left !important;width:50% !important}.cv-links::after{content:"";display:table;clear:both}.cv-contact svg,.cv-links svg{display:inline-block !important;visibility:visible !important;opacity:1 !important;width:10pt !important;height:10pt !important;stroke:#000 !important;stroke-width:2 !important;fill:none !important}.cv-contact svg path,.cv-contact svg polyline,.cv-contact svg circle,.cv-contact svg rect,.cv-links svg path,.cv-links svg polyline,.cv-links svg circle,.cv-links svg rect{stroke:#000 !important;fill:none !important;opacity:1 !important}table{border-collapse:collapse;width:100%;page-break-inside:avoid}td,th{padding:4pt 6pt !important;font-size:10pt !important}thead tr{border-bottom:3px double #000}tbody tr{border-top:1px solid #000}tr td:nth-child(2){padding-left:10pt}a{text-decoration:none !important;border:none !important;box-shadow:none !important}a[href^=http]::after{content:" (" attr(href) ")";font-size:8pt;font-style:italic}a[href^="#"]::after,a[href^="mailto:"]::after,.cv-links a::after{content:"" !important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}ul,ol{page-break-inside:avoid}}@media screen and (min-width: 800px){.navbar .flex{padding-right:0rem;margin:0 0 0 auto}}