@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600;1,700;1,800&display=swap"layer(base);.flicker-link{position:relative;display:inline-block;text-decoration-line:underline;--flicker-underline-color: #0f7a3b;text-decoration-color:var(--flicker-underline-color);text-decoration-thickness:2px;text-underline-offset:.18em;transition:text-decoration-color .16s ease;cursor:inherit}[data-theme=dark] .flicker-link{--flicker-underline-color: #22c55e}.flicker-link:hover,.flicker-link:focus-visible{text-decoration-color:transparent}.flicker-link.is-active,.flicker-link[data-active=true]{text-decoration-color:transparent}.flicker-link .flicker-underline{position:absolute;left:0;right:0;bottom:-.22em;height:4px;display:flex;align-items:flex-end;gap:var(--cell-gap, 0px);opacity:0;pointer-events:none;filter:blur(.25px);mix-blend-mode:multiply;transition:opacity .16s ease;will-change:opacity}[data-theme=dark] .flicker-link .flicker-underline{mix-blend-mode:screen}.flicker-link:hover .flicker-underline,.flicker-link:focus-visible .flicker-underline{opacity:1}.flicker-link.is-active .flicker-underline,.flicker-link[data-active=true] .flicker-underline{opacity:1}.flicker-square{flex:0 0 auto;width:3px;height:var(--h, 3px);background:var(--g, hsl(140, 80%, 50%));opacity:0;border-radius:1px;animation:flicker-pulse var(--d, 1.1s) ease-in-out infinite;animation-delay:var(--delay, -.2s);animation-play-state:paused;will-change:opacity}.flicker-link:hover .flicker-square,.flicker-link:focus-visible .flicker-square{animation-play-state:running}.flicker-link.is-active .flicker-square,.flicker-link[data-active=true] .flicker-square{animation-play-state:running;opacity:var(--o, .7)}@keyframes flicker-pulse{0%,16%{opacity:0}24%{opacity:var(--o, .7)}38%{opacity:0}54%{opacity:var(--o, .7)}70%{opacity:0}84%{opacity:var(--o, .7)}to{opacity:0}}@media(prefers-reduced-motion:reduce){.flicker-link:hover .flicker-square,.flicker-link:focus-visible .flicker-square{animation-play-state:paused;opacity:var(--o, .4)}.flicker-link.is-active .flicker-square,.flicker-link[data-active=true] .flicker-square{animation-play-state:paused;opacity:var(--o, .4)}.flicker-link .flicker-underline{transition-duration:0ms}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-leading:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer base{:root{--font-family:"JetBrains Mono",monospace;--line-height:1.2rem;--border-thickness:2px;--text-color:#000;--text-color-alt:#666;--background-color:#fff;--background-color-alt:#eee;--font-weight-normal:500;--font-weight-medium:600;--font-weight-bold:800;font-family:var(--font-family);font-optical-sizing:auto;font-weight:var(--font-weight-normal);font-variant-numeric:tabular-nums lining-nums;font-size:16px;font-style:normal}[data-theme=dark]{--text-color:#fff;--text-color-alt:#aaa;--background-color:#000;--background-color-alt:#111}*{box-sizing:border-box}*+*{margin-top:var(--line-height)}html{background:var(--background-color);width:100%;color:var(--text-color);scrollbar-gutter:stable;flex-direction:column;align-items:center;margin:0;padding:0;display:flex}body{width:100%;padding:var(--line-height)2ch;max-width:min(80ch,round(down,100%,1ch));line-height:var(--line-height);margin:0;position:relative;overflow:hidden scroll}@media screen and (max-width:480px){:root{font-size:14px}body{padding:var(--line-height)1ch}}h1,h2,h3,h4,h5,h6{font-weight:var(--font-weight-bold);margin:calc(var(--line-height)*2)0 var(--line-height);line-height:var(--line-height)}h1{font-size:2rem;line-height:calc(2*var(--line-height));margin-bottom:calc(var(--line-height)*2);text-transform:uppercase}h2{text-transform:uppercase;font-size:1rem}hr{height:var(--line-height);margin:calc(var(--line-height)*1.5)0;color:var(--text-color);border:none;display:block;position:relative}hr:after{content:"";top:calc(var(--line-height)/2 - var(--border-thickness));border-top:calc(var(--border-thickness)*3)double var(--text-color);width:100%;height:0;display:block;position:absolute;left:0}a{text-decoration-thickness:var(--border-thickness)}a:link,a:visited{color:var(--text-color)}p{margin-bottom:var(--line-height)}strong{font-weight:var(--font-weight-bold)}em{font-style:italic}sub{vertical-align:sub;width:1.33333ch;margin:0;font-size:.75rem;line-height:0;display:inline-block;position:relative}table{top:calc(var(--line-height)/2);border-collapse:collapse;width:round(down,100%,1ch);margin:0 0 calc(var(--line-height)*2);position:relative}th,td{border:var(--border-thickness)solid var(--text-color);padding:calc((var(--line-height)/2))calc(1ch - var(--border-thickness)/2)calc((var(--line-height)/2) - (var(--border-thickness)));line-height:var(--line-height);vertical-align:top;text-align:left}table tbody tr:first-child>*{padding-top:calc((var(--line-height)/2) - var(--border-thickness))}th{font-weight:700}.width-min{width:0%}.width-auto{width:100%}.header{margin-bottom:calc(var(--line-height)*2)}.header h1{margin:0}.header tr td:last-child{text-align:right}p{word-break:break-word;word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}img,video{-o-object-fit:contain;object-fit:contain;width:100%;display:block;overflow:hidden}img{color:var(--text-color-alt);font-style:italic}details{border:var(--border-thickness)solid var(--text-color);padding:calc(var(--line-height) - var(--border-thickness))1ch;margin-bottom:var(--line-height)}summary{font-weight:var(--font-weight-medium);cursor:pointer}details[open] summary{margin-bottom:var(--line-height)}details ::marker{content:"▶";margin:0;display:inline-block}details[open] ::marker{content:"▼"}details :last-child{margin-bottom:0}pre{white-space:pre;margin:var(--line-height)0;overflow:auto hidden}figure pre{margin:0}pre,code{font-family:var(--font-family)}code{font-weight:var(--font-weight-medium)}figure{margin:calc(var(--line-height)*2)3ch;overflow:auto hidden}figcaption{margin-top:var(--line-height);font-style:italic;display:block}ul,ol{margin:0 0 var(--line-height);padding:0}ul{padding:0 0 0 2ch;list-style-type:square}ol{counter-reset:item;padding:0;list-style-type:none}ol ul,ol ol,ul ol,ul ul{margin:0;padding:0 0 0 3ch}ol li:before{content:counters(item,".")". ";counter-increment:item;font-weight:var(--font-weight-medium)}li{margin:0;padding:0}li::marker{line-height:0}::-webkit-scrollbar{height:var(--line-height)}input,button,textarea{border:var(--border-thickness)solid var(--text-color);padding:calc(var(--line-height)/2 - var(--border-thickness))calc(1ch - var(--border-thickness));font:inherit;font-weight:inherit;height:calc(var(--line-height)*2);background:var(--background-color);width:auto;color:var(--text-color);-webkit-font-smoothing:inherit;-moz-osx-font-smoothing:inherit;-webkit-appearance:none;margin:0;line-height:normal;overflow:visible}input[type=checkbox],input[type=radio]{vertical-align:top;width:2ch;height:var(--line-height);cursor:pointer;place-content:center;display:inline-grid}input[type=checkbox]:checked:before,input[type=radio]:checked:before{content:"";width:1ch;height:calc(var(--line-height)/2);background:var(--text-color)}input[type=radio],input[type=radio]:before{border-radius:100%}button:focus,input:focus{--border-thickness:3px;outline:none}input{width:round(down,100%,1ch)}::-moz-placeholder{color:var(--text-color-alt);opacity:1}::placeholder{color:var(--text-color-alt);opacity:1}::-moz-placeholder{color:var(--text-color-alt)}button::-moz-focus-inner{border:0;padding:0}button{text-transform:uppercase;font-weight:var(--font-weight-medium);cursor:pointer}button:hover{background:var(--background-color-alt)}button:active{transform:translate(2px,2px)}label{width:round(down,100%,1ch);height:auto;line-height:var(--line-height);font-weight:var(--font-weight-medium);margin:0;display:block}label input{width:100%}.tree,.tree ul{line-height:var(--line-height);padding-left:0;list-style-type:none;position:relative}.tree ul{margin:0}.tree ul li{border-left:var(--border-thickness)solid var(--text-color);margin-left:1.5ch;padding-left:1.5ch;position:relative}.tree ul li:before{top:calc(var(--line-height)/2);content:"";border-bottom:var(--border-thickness)solid var(--text-color);width:1ch;display:block;position:absolute;left:0}.tree ul li:last-child{border-left:none}.tree ul li:last-child:after{content:"";height:calc(var(--line-height)/2);border-left:var(--border-thickness)solid var(--text-color);display:block;position:absolute;top:0;left:0}.grid{--grid-cells:0;width:round(down,100%,(1ch*var(--grid-cells)) - (1ch*var(--grid-cells) - 1));margin-bottom:var(--line-height);gap:1ch;display:flex}.grid>*,.grid>input{flex:0 0 round(down,(100% - (1ch*(var(--grid-cells) - 1)))/var(--grid-cells),1ch)}.grid:has(>:last-child:first-child){--grid-cells:1}.grid:has(>:last-child:nth-child(2)){--grid-cells:2}.grid:has(>:last-child:nth-child(3)){--grid-cells:3}.grid:has(>:last-child:nth-child(4)){--grid-cells:4}.grid:has(>:last-child:nth-child(5)){--grid-cells:5}.grid:has(>:last-child:nth-child(6)){--grid-cells:6}.grid:has(>:last-child:nth-child(7)){--grid-cells:7}.grid:has(>:last-child:nth-child(8)){--grid-cells:8}.grid:has(>:last-child:nth-child(9)){--grid-cells:9}.debug .debug-grid{--color:var(--text-color)}@supports (color:color-mix(in lab,red,red)){.debug .debug-grid{--color:color-mix(in srgb,var(--text-color)10%,var(--background-color)90%)}}.debug .debug-grid{z-index:-1;background-image:repeating-linear-gradient(var(--color)0 1px,transparent 1px 100%),repeating-linear-gradient(90deg,var(--color)0 1px,transparent 1px 100%);background-size:1ch var(--line-height);margin:0;position:absolute;inset:0}.debug .off-grid{background:#ff00001a}.debug-toggle-label{text-align:right}h2.normal-case{text-transform:none}:root{--accent-color:#111;--accent-color-soft:#e6e6e6;--shadow-color:#00000026}[data-theme=dark]{--accent-color:#f5f5f5;--accent-color-soft:#1a1a1a;--shadow-color:#ffffff26}html{transition:background-color .2s,color .2s}html,body{font-family:var(--font-family)}body{padding-top:0;padding-bottom:0;overflow-y:auto}a{transition:color .15s}}.contents{display:contents}.flex{display:flex}.aspect-square{aspect-ratio:1}.h-\[131px\]{height:131px}.w-\[131px\]{width:131px}.max-w-none{max-width:none}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.translate-y-\[30px\]{--tw-translate-y:30px;translate:var(--tw-translate-x)var(--tw-translate-y)}.list-none{list-style-type:none}.flex-col{flex-direction:column}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-\[1ch\]{gap:1ch}.gap-\[2ch\]{gap:2ch}.gap-\[2px\]{gap:2px}.object-cover{-o-object-fit:cover;object-fit:cover}.text-\[24\.5px\]{font-size:24.5px}.text-\[26px\]{font-size:26px}.text-\[54\.4px\]{font-size:54.4px}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.whitespace-nowrap{white-space:nowrap}.text-\[color\:var\(--text-color-alt\)\]{color:var(--text-color-alt)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}.duration-200{--tw-duration:.2s;transition-duration:.2s}@media(hover:hover){.hover\:grayscale-0:hover{--tw-grayscale:grayscale(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}@layer components{.no-flow>*+*{margin-top:0}.nav-link{align-items:center;gap:.35rem;text-decoration:none;transition:color .15s;display:inline-flex;position:relative}.nav-link:after{content:none;display:none}.nav-link:hover{color:inherit}.header-nav-table{margin-bottom:calc(var(--line-height)*2)}.header-title{margin:0}.header-nav{align-items:center;gap:2ch;margin-top:0;margin-bottom:0;display:flex}.header-toggle-cell{text-align:right;vertical-align:middle;white-space:nowrap}.theme-toggle{border:var(--border-thickness)solid var(--text-color);width:calc(var(--line-height)*2);height:calc(var(--line-height)*2);background:var(--background-color);text-transform:none;justify-content:center;align-items:center;gap:.5rem;padding:0;transition:background .15s,box-shadow .15s;display:inline-flex;box-shadow:0 0 0 2px #0000}.theme-toggle.absolute{position:absolute;top:0;left:auto;right:0}.theme-toggle:hover{background:var(--background-color-alt);box-shadow:0 0 0 2px var(--shadow-color)}.theme-toggle:active{transform:none}.surface-card{border:var(--border-thickness)solid var(--text-color);background:var(--background-color);box-shadow:4px 4px 0 var(--text-color);padding:1.25rem 1.5rem;transition:box-shadow .15s,transform .15s}.surface-card:hover{box-shadow:6px 6px 0 var(--text-color-alt);transform:translate(-2px,-2px)}.tag-list{white-space:nowrap;opacity:0;pointer-events:none;flex-wrap:nowrap;justify-content:flex-start;align-items:center;gap:.75rem;width:100%;max-height:0;transition:max-height .2s,opacity .2s,transform .2s;display:flex;overflow:hidden;transform:translateY(-2px)}.tag-list[data-open=true]{opacity:1;pointer-events:auto;max-height:600px;overflow-x:auto;transform:translateY(0)}.tag-list>*{margin-top:0}.tag-item{opacity:0;pointer-events:none;color:#666;transition:opacity .2s,transform .2s;transform:translateY(4px);margin-top:0!important}.tag-link,.tag-link:link,.tag-link:visited{color:var(--text-color-alt);background-image:linear-gradient(currentColor,currentColor);background-position:0 100%;background-repeat:no-repeat;background-size:100% 1px;padding-bottom:.05em;text-decoration:none}.tag-link:hover{color:var(--text-color-alt);text-decoration-color:currentColor}.post-title{padding-bottom:.75rem}.blog-page>*+*{margin-top:.75rem}.blog-header{margin-top:calc(var(--line-height)*1.5);display:block}.blog-header h1{margin:0}.blog-header>*,.blog-header>*+*{margin-top:0}.blog-tags{margin-top:.25rem}.category-toggle{color:var(--text-color);font-size:.875rem;font-weight:var(--font-weight-medium);text-transform:none;cursor:pointer;background:0 0;border:0;align-items:center;gap:.45rem;height:1.5rem;padding:0;line-height:1;display:inline-flex}.category-toggle svg{flex-shrink:0;width:1rem;height:1rem;display:block;transform:none}.category-toggle span{align-items:center;line-height:1;display:inline-flex;transform:translateY(-9px)}.category-toggle:focus{box-shadow:none;outline:none}.tag-list[data-open=true] .tag-item{opacity:1;pointer-events:auto;transform:translateY(0)}.blog-title-link{background:linear-gradient(to right,var(--text-color),var(--text-color));background-position:0 100%;background-repeat:no-repeat;background-size:0% 2px;text-decoration:none;transition:background-size .3s ease-out;display:inline-block}.blog-title-link:hover{background-size:100% 2px}.animated-gradient-underline{text-decoration:none;display:inline-block;position:relative}.animated-gradient-underline:after{content:"";background:linear-gradient(90deg,#ff6b6b,#feca57,#48dbfb,#ff9ff3,#54a0ff,#5f27cd,#ff6b6b) 0 0/200% 100%;width:100%;height:2px;animation:3s linear infinite gradient-flow;position:absolute;bottom:-2px;left:0}.project-row{align-items:flex-start;gap:1rem;display:flex}.project-row>*{margin-top:0}.project-text{flex-direction:column;justify-content:space-between;height:131px;display:flex}.project-text>*{margin-top:0}.app-shell{flex-direction:column;min-height:100vh;display:flex}.app-main{flex:1}.footer{padding:calc(var(--line-height)/2)0;margin-top:auto}.footer-content{flex-direction:column;gap:1.4rem;display:flex}.footer-top{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:1rem;line-height:1;display:flex}.footer-social>*+*,.footer-top>*+*,.footer-bottom>*+*{margin-top:0}.footer-find{letter-spacing:.05em;text-transform:none;color:var(--text-color);margin:0;font-size:.9rem}.footer-social{align-items:center;gap:.9rem;display:flex}.footer-bottom{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1.5rem;line-height:1;display:flex}.footer-copy{letter-spacing:.02em;color:var(--text-color);margin:0;font-size:.8rem}.footer-nav{margin-top:0}.footer-nav-list{letter-spacing:.02em;flex-wrap:wrap;align-items:center;gap:1.2ch;margin:0;padding:0;font-size:.8rem;line-height:1;list-style:none;display:flex}.footer-nav-list>*+*{margin-top:0}.footer-nav-item{align-items:center;gap:.6ch;margin-top:0;line-height:1;display:inline-flex}.footer-link{color:var(--text-color);text-decoration:none;transition:color .15s}.footer-link:hover{color:var(--text-color)}.footer-social-link{--ai-icon-muted:var(--text-color);border-radius:.4rem;justify-content:center;align-items:center;width:28px;height:28px;line-height:1;transition:color .15s;display:inline-flex}@property --angle{syntax: "<angle>"; inherits: false; initial-value: 0deg;}.ai-icon{width:var(--ai-icon-size,18px);height:var(--ai-icon-size,18px);justify-content:center;align-items:center;line-height:0;display:inline-flex;position:relative}.ai-icon>*{margin-top:0}.ai-icon__stroke{stroke:var(--ai-icon-muted,var(--text-color));transition:opacity .2s}.ai-icon__gradient-svg{opacity:0;width:100%;height:100%;transition:opacity .2s,filter .2s;position:absolute;inset:0;transform:translateZ(0)}.ai-icon__gradient{background:conic-gradient(from var(--angle),#0e3b22,#1b6f3a,#36c46a,#1f8f4a,#0e3b22);filter:brightness();width:100%;height:100%;animation:2.8s linear infinite paused ai-rotate}.footer-social-link:hover .ai-icon__gradient-svg{opacity:1;filter:brightness(1.12)}.footer-social-link:hover .ai-icon__gradient{animation-play-state:running}.footer-social-link:hover .ai-icon__stroke{opacity:0}@media screen and (max-width:640px){.footer-top{justify-content:flex-start}.footer-bottom{flex-direction:column;align-items:flex-start}}@keyframes gradient-flow{0%{background-position:0%}to{background-position:200%}}@keyframes ai-rotate{0%{--angle:0deg}to{--angle:360deg}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}
