@font-face{font-family:Instrument Sans Variable;font-style:normal;font-display:swap;font-weight:400 700;src:url(/assets/instrument-sans-latin-ext-wght-normal-B5bTHO_g.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:Instrument Sans Variable;font-style:normal;font-display:swap;font-weight:400 700;src:url(/assets/instrument-sans-latin-wght-normal-BbzFLZTg.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,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)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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 Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper:#11111b;--panel:#181825;--bg-2:#1e1e2e;--n-1:#313244;--n-2:#45475a;--n-3:#585b70;--n-4:#6c7086;--n-5:#7f849c;--n-6:#9399b2;--ink:#cdd6f4;--ink-2:#a6adc8;--accent:#cba6f7;--red:#f38ba8;--green:#a6e3a1;--yellow:#f9e2af;--blue:#89b4fa;--purple:#cba6f7;--aqua:#94e2d5;--hairline:color-mix(in srgb, var(--ink) 18%, transparent);--shadow:#000c;--paper-on-dark:var(--ink);--ink-2-on-dark:var(--ink-2);--rule-on-dark:color-mix(in srgb, var(--ink) 18%, transparent);--sans:"Instrument Sans Variable", system-ui, sans-serif;--mono:"JetBrains Mono Variable", ui-monospace, monospace;--t-mono:12px;--t-sm:13px;--t-ui:14px;--t-body:16px;--t-lg:19px;--t-xl:23px;--t-2xl:29px;--t-display:clamp(25px, 3.2vw, 38px);--t-hero:clamp(31px, 4.5vw, 66px);--track-tight:0em;--track-tighter:-.01em;--track-display:-.02em;--section-y:clamp(4rem, 4rem + 10vw, 14rem);--container:1040px;--prose:720px;--gutter:clamp(20px, 5vw, 64px);--r-pill:999px;--r:4px;--ease:cubic-bezier(.4, 0, .2, 1);--hover:.15s var(--ease);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light]{--paper:#eff1f5;--panel:#e6e9ef;--bg-2:#dce0e8;--n-1:#ccd0da;--n-2:#bcc0cc;--n-3:#acb0be;--n-4:#686b80;--n-5:#5a5d72;--n-6:#4e5167;--ink:#2c2e45;--ink-2:#484b62;--accent:#7326d9;--red:#c00d33;--green:#277016;--yellow:#8f5400;--blue:#1a52cc;--purple:#7326d9;--aqua:#0e6a70;--hairline:color-mix(in srgb, var(--ink) 16%, transparent);--shadow:#4c4f6940;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box;margin:0}html{-webkit-text-size-adjust:100%}body{background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:var(--t-body);-webkit-font-smoothing:antialiased;line-height:1.6}img{max-width:100%;display:block}a{color:inherit}::selection{background:var(--ink);color:var(--paper)}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}h1,h2,h3{font-family:var(--mono);letter-spacing:var(--track-tighter);font-weight:700;line-height:1.15}.display{font-family:var(--mono);font-size:var(--t-display);letter-spacing:var(--track-display);font-weight:700;line-height:1.1}.lead{font-size:var(--t-lg);color:var(--ink-2);max-width:46ch;letter-spacing:var(--track-tight)}.label{font-family:var(--mono);font-size:var(--t-mono);color:var(--ink-2);letter-spacing:0}time,.tabular{font-variant-numeric:tabular-nums}.container{max-width:var(--container);padding-inline:var(--gutter);margin-inline:auto}.section{padding-block:var(--section-y)}.band{background:var(--ink);color:var(--paper-on-dark)}.band .label{color:var(--ink-2-on-dark)}.band a{color:var(--paper-on-dark)}.tag{border:1px solid var(--hairline);font-family:var(--mono);font-size:var(--t-mono);color:var(--ink-2);border-radius:999px;padding:3px 10px;display:inline-block}.band .tag{border-color:var(--rule-on-dark);color:var(--ink-2-on-dark)}.btn{border:1px solid var(--ink);background:var(--ink);height:44px;color:var(--paper);font:500 var(--t-sm) / 1 var(--sans);cursor:pointer;transition:background var(--hover), color var(--hover), border-color var(--hover);border-radius:999px;align-items:center;gap:8px;padding:0 20px;text-decoration:none;display:inline-flex}.btn:hover{color:var(--ink);background:0 0}.btn-ghost{color:var(--ink);border-color:var(--hairline);background:0 0}.btn-ghost:hover{border-color:var(--ink);color:var(--ink);background:0 0}.band .btn{background:var(--paper-on-dark);color:var(--ink);border-color:var(--paper-on-dark)}.band .btn:hover{color:var(--paper-on-dark);background:0 0}.available{font-family:var(--mono);font-size:var(--t-mono);color:var(--ink-2);align-items:center;gap:9px;display:inline-flex}.band .available{color:var(--ink-2-on-dark)}.link-arrow{font-size:var(--t-sm);transition:gap var(--hover), opacity var(--hover);border-bottom:1px solid;align-items:center;gap:7px;padding-bottom:2px;font-weight:500;text-decoration:none;display:inline-flex}.link-arrow:hover{gap:12px}.reveal{opacity:0;transform:translateY(16px)}.reveal.in{opacity:1;transition:opacity .3s var(--ease), transform .3s var(--ease);transform:none}.proto{z-index:100;background:var(--ink);color:var(--paper);font:500 12px/1 var(--mono);border-radius:999px;align-items:center;gap:4px;padding:5px;display:flex;position:fixed;bottom:18px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px -10px #00000073}.proto button{all:unset;cursor:pointer;border-radius:999px;padding:7px 12px}.proto button[aria-pressed=true]{background:var(--paper);color:var(--ink)}.proto span{opacity:.6;padding:0 10px 0 6px}@media (prefers-reduced-motion:reduce){.reveal,.reveal.in{opacity:1;transition:none;transform:none}*{animation-duration:.01ms!important;animation-iteration-count:1!important}::view-transition-group(*){animation:none!important}::view-transition-old(*){animation:none!important}::view-transition-new(*){animation:none!important}}.skill-rows,.exp-rows{border-top:1px solid var(--hairline)}.band .skill-rows,.band .exp-rows{border-color:var(--rule-on-dark)}.skill-row,.exp-row{border-bottom:1px solid var(--hairline);grid-template-columns:170px 1fr;gap:20px;padding:16px 0;display:grid}.band .skill-row,.band .exp-row{border-color:var(--rule-on-dark)}.skill-row dt{padding-top:3px}.skill-row dd{color:var(--ink-2);margin:0}.band .skill-row dd,.band .exp-place,.band .exp-detail{color:var(--ink-2-on-dark)}.exp-row h3{font-size:var(--t-body);font-weight:500}.exp-place{color:var(--ink-2);font-size:var(--t-sm)}.exp-detail{color:var(--ink-2);font-size:var(--t-sm);max-width:56ch;margin-top:6px}.archive{border-collapse:collapse;width:100%}.archive th{text-align:left;border-bottom:1px solid var(--hairline);padding:0 0 12px;font-weight:400}.band .archive th,.band .archive td{border-color:var(--rule-on-dark)}.archive td{border-bottom:1px solid var(--hairline);font-size:var(--t-sm);vertical-align:baseline;padding:16px 0}.archive td:first-child{width:70px}.archive-stack{color:var(--ink-2)}.band .archive-stack{color:var(--ink-2-on-dark)}.actions{flex-wrap:wrap;gap:10px;display:flex}@media (width<=720px){.skill-row,.exp-row{grid-template-columns:1fr;gap:4px}.archive-stack{display:none}}html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-vertical],.lenis [data-lenis-prevent-horizontal]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-behavior:allow-discrete;transition-property:overflow;transition-duration:1ms}html{scrollbar-color:var(--n-3) var(--paper);scroll-padding-top:88px;overflow-y:scroll}body{background:var(--paper)}.portfolio{--motion-ease:cubic-bezier(.16, 1, .3, 1);color:var(--ink)}.portfolio h1,.portfolio h2,.portfolio h3{text-wrap:balance}.portfolio a{text-underline-offset:5px}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-link{z-index:100;background:var(--bg-2);border:1px solid var(--hairline);padding:12px;position:fixed;top:8px;left:8px;transform:translateY(-150%)}.skip-link:focus{transform:none}.case-page{padding:96px max(20px,50% - 620px)}.back-link{min-height:44px;font:13px/1 var(--mono);color:var(--ink-2);transition:color var(--hover);align-items:center;text-decoration:none;display:inline-flex}.back-link:before{content:"../";color:var(--accent);margin-right:1ch}.back-link:hover{color:var(--accent)}.case-hero{grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);align-items:center;gap:clamp(32px,5vw,88px);min-height:calc(100svh - 124px);padding-bottom:48px;display:grid}.case-intro h1{font-size:clamp(48px, min(calc(34vw / (var(--chars) * .6)), 17vh), 150px);letter-spacing:-.04em;margin-top:20px;font-weight:700;line-height:.92}.case-kind{font:12px/1.4 var(--mono);color:var(--ink-2);margin-top:18px}.case-summary{max-width:42ch;margin-top:16px;font-size:clamp(17px,1.3vw,19px);line-height:1.6}.case-actions{flex-wrap:wrap;align-items:center;gap:8px 18px;margin-top:30px;display:flex}.case-note{font:12px/1 var(--mono);color:var(--ink-2)}.case-intro>*{animation:case-rise .7s var(--motion-ease) both}.case-intro>:nth-child(2){animation-delay:50ms}.case-intro>:nth-child(3){animation-delay:.15s}.case-intro>:nth-child(4){animation-delay:.2s}.case-intro>:nth-child(5){animation-delay:.25s}.case-hero .duo{animation:case-lift 1.1s var(--motion-ease) .1s both}@keyframes case-rise{0%{opacity:0;transform:translateY(24px)}}@keyframes case-lift{0%{opacity:0;transform:perspective(1600px)translateZ(-320px)rotateY(-18deg)}}.repo{border-top:1px solid var(--hairline);grid-template-columns:220px minmax(0,1fr);align-items:start;gap:clamp(32px,5vw,88px);padding-top:56px;display:grid}.tree{font:13px/1 var(--mono);position:sticky;top:88px}.tree-root{color:var(--blue);margin-bottom:14px;font-weight:700}.tree ol{margin:0;padding:0;list-style:none}.tree a{border-radius:var(--r);min-height:36px;color:var(--ink-2);white-space:nowrap;transition:color var(--hover), background-color var(--hover);align-items:center;margin-left:-8px;padding:0 8px;text-decoration:none;display:flex}.tree a:hover{color:var(--ink)}.tree a.is-on{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent)}.tree-branch{color:var(--n-4);white-space:pre;margin-right:1ch}.files{gap:clamp(72px,10vh,120px);min-width:0;display:grid}.file{scroll-margin-top:88px}.file-name{font:12px/1 var(--mono);color:var(--accent);margin-bottom:14px}[data-layer=api] .file-name{color:var(--yellow)}[data-layer=db] .file-name{color:var(--aqua)}.file h2{letter-spacing:-.04em;max-width:20ch;font-size:clamp(32px,4vw,60px);font-weight:700;line-height:1}.file-lead{max-width:56ch;color:var(--ink-2);margin-top:22px;font-size:clamp(17px,1.3vw,20px);line-height:1.6}.readme-facts{border-top:1px solid var(--hairline);font:13px/1.4 var(--mono);flex-wrap:wrap;gap:12px 40px;margin:28px 0 0;padding-top:20px;display:flex}.readme-facts dt{color:var(--ink-2);margin-bottom:4px}.readme-facts dd{color:var(--ink);margin:0}.checklist.big{border-top:1px solid var(--hairline);gap:0;margin-top:28px;font-size:clamp(15px,1.2vw,18px)}.checklist.big li{border-bottom:1px solid var(--hairline);padding:18px 0}.shots{gap:40px;margin-top:32px;display:grid}.shots figure{margin:0}.shots figcaption{font:12px/1.6 var(--mono);color:var(--ink-2);margin-top:12px}.shots figcaption:before{content:"# ";color:var(--n-5)}.shots-arsafe{grid-template-columns:auto auto;justify-content:start;align-items:start}.shots-arsafe .window img{width:auto;height:min(68vh,600px)}#stack .json{border-top:0;margin-top:0;padding-top:0}#stack .window{max-width:720px;margin-top:32px}.next-project{border-top:1px solid var(--hairline);margin-top:120px}.next-project a{grid-template-columns:minmax(0,1fr) minmax(0,.7fr);align-items:center;gap:48px;padding-block:56px;text-decoration:none;display:grid}.next-copy{gap:14px;display:grid}.next-label{font:13px/1 var(--mono);color:var(--accent)}.next-name{font:700 clamp(44px, 7vw, 112px)/.92 var(--mono);letter-spacing:-.04em;color:var(--ink);transition:color var(--hover)}.next-project a:hover .next-name{color:var(--accent)}.next-sub{max-width:48ch;color:var(--ink-2)}.next-thumb{aspect-ratio:16/10;border:1px solid color-mix(in srgb, var(--ink) 14%, transparent);transition:transform .7s var(--motion-ease);border-radius:6px;overflow:hidden;transform:perspective(1600px)rotateY(-10deg)}.next-thumb img{object-fit:cover;object-position:top;width:100%;height:100%}.next-project a:hover .next-thumb{transform:perspective(1600px)rotateY(-3deg)scale(1.02)}.contact-strip{border-top:1px solid var(--hairline);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:32px;padding-block:48px;display:grid}.contact-strip h2{letter-spacing:-.03em;font-size:clamp(26px,3vw,40px)}.strip-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.missing-page{padding:160px max(20px,50% - 560px) 96px}.missing-page h1{letter-spacing:-.04em;margin-bottom:32px;font-size:clamp(36px,5vw,64px)}@view-transition{navigation:auto}@media (width<=760px){.case-page{padding:80px 20px 72px}.case-hero,.repo,.next-project a,.contact-strip{grid-template-columns:minmax(0,1fr)}.case-hero{min-height:0}.case-intro h1{font-size:clamp(40px, calc(86vw / (var(--chars) * .6)), 76px)}.tree{position:static;overflow-x:auto}.tree-root{display:none}.tree ol{gap:4px;display:flex}.tree-branch{display:none}.tree a{border:1px solid var(--hairline);margin:0}.shots-arsafe{grid-template-columns:1fr 1fr}.shots-arsafe .window img{width:100%;height:auto}.next-thumb{transform:none}.missing-page{padding:120px 20px 72px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto!important}.portfolio *,.portfolio :before,.portfolio :after{transition:none!important;animation:none!important}::view-transition-group(*){animation:none!important}::view-transition-old(*){animation:none!important}::view-transition-new(*){animation:none!important}}.descent-layer{z-index:0;pointer-events:none;position:fixed;inset:0;overflow:hidden}.descent-layer canvas{width:100%;height:100%;display:block}.scene-stage{z-index:1;position:relative;overflow-x:clip}.pin-spacer,.scene-stage.is-pinned{max-width:100%}.scene-stage.is-pinned{height:100svh;overflow:clip}.scene{--edge:max(48px, calc((100% - 1240px) / 2));min-height:100svh;padding:112px var(--edge) 96px;position:relative}.is-pinned .scene{min-height:0;padding-block:clamp(12px,3vh,40px);position:absolute;inset:56px 0 28px}.scene h1,.scene h2{letter-spacing:-.04em;font-weight:700;line-height:.92}.line{margin-bottom:-.14em;padding-bottom:.14em;display:block;overflow:clip}.line-in{will-change:transform;display:block}[data-type]{width:fit-content;display:block}.topbar{z-index:50;height:56px;font:13px/1 var(--mono);background:color-mix(in srgb, var(--paper) 90%, transparent);border-bottom:1px solid var(--hairline);justify-content:space-between;align-items:center;gap:20px;padding-inline:max(20px,50% - 620px);display:flex;position:fixed;inset:0 0 auto}body:has(.scene-stage.is-pinned) .topbar{background:0 0;border-bottom-color:#0000}.brand{white-space:nowrap;align-items:center;min-width:0;min-height:44px;text-decoration:none;display:inline-flex}.p-user{color:var(--green)}.p-dim{color:var(--ink-2)}.p-host{color:var(--ink)}.p-path{text-overflow:ellipsis;color:var(--blue);display:inline-block;overflow:hidden}.p-caret{color:var(--accent);margin-left:8px}.p-caret:after{content:"";vertical-align:-.2em;background:var(--ink);width:.55em;height:1.1em;margin-left:8px;animation:1.1s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.topbar-cta{border-radius:var(--r);background:var(--accent);min-height:36px;color:var(--paper);font:600 12px/1 var(--mono);transition:background-color var(--hover), opacity .3s var(--ease), visibility .3s var(--ease);align-items:center;padding:0 14px;text-decoration:none;display:inline-flex}.topbar-cta:hover{background:var(--yellow)}.topbar-end{align-items:center;gap:8px;display:flex}.theme-toggle{border:1px solid var(--hairline);border-radius:var(--r);min-height:36px;color:var(--ink-2);font:12px/1 var(--mono);cursor:pointer;transition:color var(--hover), border-color var(--hover);background:0 0;padding:0 12px}.theme-toggle:hover{color:var(--ink);border-color:var(--ink-2)}.theme-toggle:before{content:"$ theme ";color:var(--n-5)}.topbar-cta,.theme-toggle{white-space:nowrap}@media (width<=480px){.theme-toggle:before{content:none}}html[data-theme=light] .theme-dark,html:not([data-theme=light]) .theme-light{display:none}html[data-layer=surface] .topbar-cta{opacity:0;visibility:hidden}.tmux{z-index:50;background:var(--n-1);height:28px;font:12px/28px var(--mono);color:var(--ink-2);align-items:stretch;display:flex;position:fixed;inset:auto 0 0}.tmux-session{background:var(--green);color:var(--paper);padding:0 12px;font-weight:700}.tmux-tabs{margin:0;padding:0 0 0 6px;list-style:none;display:flex}.tmux-tabs a{color:var(--ink-2);transition:color var(--hover), background-color var(--hover);padding:0 10px;text-decoration:none;display:block}.tmux-tabs a:hover{color:var(--ink);background:var(--n-2)}.tmux-tabs a:focus-visible{outline-offset:-2px}.tmux-tabs a.is-on{background:var(--accent);color:var(--paper);font-weight:700}.tab-index{opacity:.7}.tmux-tabs a.is-on .tab-flag:after{content:"*"}.tmux-right{margin-left:auto;display:flex}.tmux-layer,.tmux-count{color:var(--ink);padding:0 12px}.tmux-layer{background:var(--n-2)}.tmux-count{background:var(--n-3);font-variant-numeric:tabular-nums}.btn-primary,.btn-quiet,.btn-line{border-radius:var(--r);min-height:46px;font:600 13px/1 var(--mono);cursor:pointer;transition:background-color var(--hover), color var(--hover), border-color var(--hover), transform var(--hover);justify-content:center;align-items:center;padding:0 20px;text-decoration:none;display:inline-flex}.btn-primary{background:var(--accent);color:var(--paper);border:0}.btn-primary:hover{background:var(--yellow)}.btn-quiet{border:1px solid var(--hairline);color:var(--ink);background:0 0;font-weight:500}.btn-quiet:hover{border-color:var(--accent);color:var(--accent)}.btn-quiet.is-small{min-height:32px;padding:0 10px;font-size:11px}.btn-line{border:1px solid var(--accent);color:var(--accent);background:0 0}.btn-line:hover{background:var(--accent);color:var(--paper)}.btn-primary:active,.btn-quiet:active,.btn-line:active{transform:translateY(1px)}.link-quiet{min-height:44px;font:13px/1 var(--mono);color:var(--ink-2);text-decoration:underline;-webkit-text-decoration-color:var(--hairline);text-decoration-color:var(--hairline);text-underline-offset:6px;transition:color var(--hover), text-decoration-color var(--hover);align-items:center;padding:0 6px;display:inline-flex}.link-quiet:hover{color:var(--accent);text-decoration-color:currentColor}.checklist{font:13px/1.45 var(--mono);color:var(--ink);gap:8px;margin:22px 0 0;padding:0;list-style:none;display:grid}.checklist li:before{content:"[x]";color:var(--green);margin-right:1ch}.window{background:var(--panel);border:1px solid color-mix(in srgb, var(--ink) 14%, transparent);box-shadow:0 44px 80px -36px var(--shadow);border-radius:6px;position:relative;overflow:hidden}.window-bar{background:var(--bg-2);border-bottom:1px solid var(--hairline);height:30px;font:11px/1 var(--mono);color:var(--ink-2);white-space:nowrap;justify-content:space-between;align-items:center;gap:16px;padding:0 12px;display:flex}.window-bar>span:first-child{text-overflow:ellipsis;overflow:hidden}.window-tag{color:var(--accent)}[data-layer=api] .window-tag{color:var(--yellow)}[data-layer=db] .window-tag{color:var(--aqua)}[data-layer=bedrock] .window-tag{color:var(--ink-2)}.window-body img{width:100%;height:auto;display:block}.hero{grid-template-columns:minmax(0,40rem);align-content:center;display:grid}.hero h1{font-size:clamp(56px,min(9.4vw,15vh),150px)}.hero h1 .line-in>span{color:var(--ink-2)}.hero-pitch{max-width:27ch;color:var(--ink);text-wrap:pretty;margin-top:clamp(20px,3.6vh,36px);font-size:clamp(18px,1.55vw,23px);line-height:1.45}.hero-pitch em{font-style:normal}.w-interface{color:var(--accent)}.w-db{color:var(--aqua)}.hero-status{font:12px/1.5 var(--mono);color:var(--green);margin-top:14px}.hero-status:before{content:"> ";color:var(--ink-2)}.hero-actions{flex-wrap:wrap;align-items:center;gap:10px;margin-top:clamp(24px,4.4vh,44px);display:flex}.hero-cue{left:var(--edge);font:11px/1 var(--mono);color:var(--ink-2);align-items:center;gap:12px;display:flex;position:absolute;bottom:clamp(16px,3vh,32px)}.hero-cue:before{content:"";background:linear-gradient(var(--accent), var(--accent)) 0 -12px / 1px 12px no-repeat, var(--hairline);width:1px;height:34px;animation:drip 2.2s var(--ease) infinite}@keyframes drip{to{background-position:0 34px,0 0}}.css-stack{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.no-3d .css-stack{clip-path:none;white-space:normal;width:auto;height:auto;margin-top:40px;display:grid;position:static;overflow:visible}.cs-row{--c:var(--accent);grid-template-columns:72px auto minmax(0,1fr);align-items:center;column-gap:14px;margin-top:-14px;display:grid}.cs-row:first-child{margin-top:0}.cs-row[data-l=api]{--c:var(--yellow)}.cs-row[data-l=db]{--c:var(--aqua)}.cs-slab{aspect-ratio:1;border:1px solid color-mix(in srgb, var(--c) 70%, transparent);background:repeating-linear-gradient(0deg, color-mix(in srgb, var(--c) 55%, transparent) 0 2px, transparent 2px 7px);justify-self:center;width:46px;transform:rotateX(58deg)rotate(45deg)}.cs-row dt{font:700 12px/1 var(--mono);color:var(--c)}.cs-row dd{font:12px/1.4 var(--mono);color:var(--ink-2);margin:0}.slab-label{font:11.5px/1.3 var(--mono);color:var(--ink-2);white-space:nowrap;opacity:0;will-change:transform, opacity;position:absolute;top:0;left:0;translate:18px -50%}.slab-label:before{content:"";background:var(--n-4);width:12px;height:1px;position:absolute;top:50%;right:calc(100% + 4px)}.slab-label b{margin-right:10px;font-weight:700}.slab-label.is-wrapped b{margin-right:0;display:block}.slab-label[data-l=interface] b{color:var(--accent)}.slab-label[data-l=api] b{color:var(--yellow)}.slab-label[data-l=db] b{color:var(--aqua)}.index{align-content:center;gap:clamp(28px,5vh,56px);display:grid}.index h2{font-size:clamp(56px,min(9vw,15vh),144px)}.index h2 .line-in>span{color:var(--accent)}.ls{max-width:1100px;font:13px/1.4 var(--mono)}.ls-cmd{color:var(--ink-2);margin-bottom:12px}.ls-cmd:before{content:"$ ";color:var(--accent)}.ls-list{border-top:1px solid var(--hairline);margin:0;padding:0;list-style:none}.ls-list li{border-bottom:1px solid var(--hairline)}.ls-row{color:var(--ink);transition:background-color var(--hover);grid-template-columns:11ch 5ch minmax(0,26ch) minmax(0,1fr);align-items:baseline;column-gap:24px;padding:15px 12px;text-decoration:none;display:grid}a.ls-row:hover{background:color-mix(in srgb, var(--ink) 6%, transparent)}a.ls-row:hover .ls-name{color:var(--accent)}.ls-perm{color:var(--n-4)}.ls-year{color:var(--ink-2);font-variant-numeric:tabular-nums}.ls-name{color:var(--blue);overflow-wrap:anywhere;transition:color var(--hover);font-weight:700}.ls-row.is-file .ls-name{color:var(--ink-2);font-weight:500}.ls-desc{font:15px/1.45 var(--sans);color:var(--ink-2)}.ls-tag{font:11px/1 var(--mono);color:var(--n-5);white-space:nowrap;margin-top:6px;display:block}.project{grid-template-columns:minmax(0,.78fr) minmax(0,1.22fr);align-items:center;gap:clamp(32px,5vw,88px);display:grid}.project-name{font-size:clamp(44px, min(calc(34vw / (var(--chars) * .6)), 16vh), 150px)}.scramble{display:block}.project-kind{font:12px/1.4 var(--mono);color:var(--ink-2);margin-top:18px}.project-summary{max-width:40ch;color:var(--ink);margin-top:16px;font-size:clamp(16px,1.2vw,18px);line-height:1.6}.project-stack{font:12px/1.5 var(--mono);color:var(--ink-2);margin-top:20px}.project-links{flex-wrap:wrap;align-items:center;gap:8px 18px;margin-top:26px;display:flex}.project-note{font:12px/1 var(--mono);color:var(--ink-2)}.project-stage{position:relative}.tilt{transform:perspective(1800px) rotateY(calc(-8deg + var(--px,0) * 5deg)) rotateX(calc(3deg - var(--py,0) * 4deg));transition:transform .9s var(--motion-ease)}.duo{aspect-ratio:var(--duo,1.3);position:relative}.duo .window{position:absolute}.w-main{width:86%;top:0;right:0}.w-extra{width:48%;bottom:0;left:0}.project-arsafe .duo{--duo:1.32}.project-arsafe .w-main{width:58%}.project-arsafe .w-extra{width:31%}.project-crystal-toyota .duo{--duo:1.26}.project-crystal-toyota .w-extra{width:50%}.project-job-application-agent .duo{--duo:1.5}.project-job-application-agent .w-extra{width:62%}.split{grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr);align-items:center;gap:clamp(32px,4vw,72px);display:grid}.split-head{container-type:inline-size}.split h2{font-size:min(104px, 13vh, calc(96cqi / (var(--chars) * .6)))}.skills h2 .line-in>span{color:var(--yellow)}.experience h2 .line-in>span{color:var(--aqua)}.api .window-body,.sql .window-body{padding:18px 22px 22px}.http-line{font:clamp(12px, .95vw, 14px)/1.8 var(--mono);color:var(--ink)}.m-get{color:var(--green);margin-right:.4ch}.http-status{color:var(--ink-2)}.http-status b{color:var(--aqua)}.json{border-top:1px solid var(--hairline);counter-reset:line;font:clamp(11.5px, .9vw, 13.5px)/1.95 var(--mono);margin:14px 0 0;padding:14px 0 0;list-style:none}.json li{counter-increment:line;padding-left:4.5ch;position:relative}.json li:before{content:counter(line);text-align:right;width:2.5ch;color:var(--n-4);position:absolute;left:0}.json .j-in{grid-template-columns:15ch minmax(0,1fr);padding-left:6.5ch;display:grid}.j-key{color:var(--blue)}.j-val{color:var(--ink-2)}.j-str{color:var(--green);white-space:nowrap}.sql-line{font:13px/1.75 var(--mono);color:var(--ink);white-space:pre}.sql-prompt{color:var(--green)}.k{color:var(--accent);font-weight:700}.t{color:var(--yellow)}.sql-table{border-collapse:collapse;width:100%;font:12.5px/1.5 var(--mono);margin-top:16px}.sql-table th,.sql-table td{border:1px solid var(--hairline);text-align:left;vertical-align:top;padding:10px 12px}.sql-table th{color:var(--ink-2);background:color-mix(in srgb, var(--ink) 4%, transparent);font-weight:600}.sql-table td:first-child{color:var(--aqua);white-space:nowrap;font-variant-numeric:tabular-nums}.sql-table td:nth-child(2){color:var(--ink);font-weight:700}.sql-table td:nth-child(3){color:var(--ink)}.sql-table td:nth-child(4){font:14px/1.5 var(--sans);color:var(--ink-2)}.sql-foot{font:12px/1 var(--mono);color:var(--ink-2);margin-top:12px}.contact{grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);align-items:center;gap:clamp(32px,5vw,88px);display:grid}.contact h2{font-size:clamp(44px,min(6.4vw,10.5vh),108px)}.contact h2 .line-in span{color:var(--accent)}.contact-status{font:12px/1.5 var(--mono);color:var(--green);margin-top:18px}.mail{background:var(--panel);border:1px solid color-mix(in srgb, var(--ink) 14%, transparent);max-width:560px;font:13px/1.4 var(--mono);border-radius:6px;margin-top:28px;padding:4px 20px 18px}.mail-cmd{color:var(--ink-2);padding:12px 0}.mail-cmd:before{content:"$ ";color:var(--accent)}.mail-row{border-top:1px solid var(--hairline);grid-template-columns:8ch minmax(0,1fr) auto;align-items:center;gap:12px;min-height:50px;display:grid}.mail-label{color:var(--ink-2)}.mail-to{overflow-wrap:anywhere;color:var(--accent);text-decoration:none}.mail-to:hover{text-decoration:underline}.mail-row input{border-radius:var(--r);min-width:0;min-height:44px;color:var(--ink);font:inherit;caret-color:var(--accent);background:0 0;border:0;grid-column:2/-1;margin-left:-8px;padding:0 8px}.mail-row input::placeholder{color:var(--n-5)}.mail-send{border-top:1px solid var(--hairline);align-items:center;gap:16px;padding-top:16px;display:flex}.mail-hint{color:var(--ink-2);font-size:11px}.contact-links{gap:22px;margin-top:18px;display:flex}.contact-links a{min-height:44px;font:13px/1 var(--mono);color:var(--ink-2);-webkit-text-decoration-color:var(--hairline);text-decoration-color:var(--hairline);text-underline-offset:6px;transition:color var(--hover);align-items:center;display:inline-flex}.contact-links a:hover{color:var(--accent)}.photo{justify-self:center;width:min(100%,460px,60svh)}.photo img{aspect-ratio:1;object-fit:cover}.colophon{left:var(--edge);font:11px/1.4 var(--mono);color:var(--n-5);position:absolute;bottom:10px}@media (width>=761px){.no-3d .hero{grid-template-columns:minmax(0,40rem) minmax(0,1fr);align-items:center}.no-3d .css-stack{grid-area:1/2;justify-self:center;margin:0}}@media (width>=761px) and (prefers-reduced-motion:reduce),(width>=761px) and (height<=619px){.hero{grid-template-columns:minmax(0,40rem) minmax(0,1fr);align-items:center}.css-stack{clip-path:none;white-space:normal;grid-area:1/2;justify-self:center;width:auto;height:auto;display:grid;position:static;overflow:visible}}@media (width<=1100px) and (width>=761px){.ls-row{grid-template-columns:5ch minmax(0,24ch) minmax(0,1fr)}.ls-perm{display:none}.split{grid-template-columns:minmax(0,.62fr) minmax(0,1.38fr)}}@media (width<=760px){.topbar{height:52px;font-size:12px}.p-host,.p-at{display:none}.tmux{height:44px;font-size:11px;line-height:44px}.tmux-session,.tmux-right,.tab-index{display:none}.tmux-tabs{justify-content:space-between;width:100%;padding:0 4px}.tmux-tabs a{padding:0 8px}.scene{min-height:0;padding:88px 20px 64px}.hero{min-height:calc(100svh - 44px);padding-top:112px}.hero h1{font-size:clamp(52px,15vw,76px)}.hero-cue{display:none}.css-stack{clip-path:none;white-space:normal;width:auto;height:auto;margin-top:40px;display:grid;position:static;overflow:visible}.index h2{font-size:clamp(52px,15vw,80px)}.ls-row{grid-template-columns:minmax(0,1fr) auto;row-gap:6px;padding:14px 4px}.ls-perm{display:none}.ls-name{grid-area:1/1}.ls-year{grid-area:1/2}.ls-desc{grid-column:1/-1;font-size:14px}.project,.split,.contact{grid-template-columns:minmax(0,1fr)}.project-name{font-size:clamp(40px, calc(86vw / (var(--chars) * .6)), 76px)}.tilt{transform:none}.duo{aspect-ratio:auto;gap:14px;display:grid}.duo .window{width:100%;position:static}.project-arsafe .duo{grid-template-columns:1.7fr 1fr;align-items:start}.project-arsafe .duo .window{width:100%}.contact h2{font-size:clamp(44px,13vw,68px)}.api .window-body,.sql .window-body{padding:14px}.json{font-size:12.5px;line-height:1.75}.json li{padding-left:4ch}.json .j-in{grid-template-columns:minmax(0,1fr);padding-left:5ch}.json li.j-in+li.j-in{margin-top:8px}.j-val{padding-left:2ch}.sql-line{white-space:pre-wrap;font-size:11.5px}.sql-table thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.sql-table,.sql-table tbody,.sql-table tr,.sql-table td{display:block}.sql-table tr{border:1px solid var(--hairline);margin-bottom:10px}.sql-table td{border:0;padding:6px 12px}.sql-table td:before{content:attr(data-label);font:10px/1.2 var(--mono);color:var(--n-5);margin-bottom:2px;display:block}.mail{padding:4px 14px 14px}.mail-row{grid-template-columns:8ch minmax(0,1fr)}.mail-row .btn-quiet{grid-column:2;justify-self:start;margin-bottom:10px}.photo{width:100%}.colophon{grid-column:1/-1;position:static}}@media (width<=360px){.tmux{font-size:10px}.tmux-tabs a{padding:0 5px}}@media (width>=1800px){.scene,.topbar,.tmux,.case-page,.missing-page{zoom:1.2}}@media (width>=2200px){.scene,.topbar,.tmux,.case-page,.missing-page{zoom:1.4}}@media (width>=3000px){.scene,.topbar,.tmux,.case-page,.missing-page{zoom:1.8}}
